Пример #1
0
 /**
  * Action index
  */
 public function action_index()
 {
     // Get order
     $query = $this->request->query();
     $order_column = Arr::get($query, 'order_column', 'created');
     $order_direction = Arr::get($query, 'order_direction', 'DESC');
     /*
      * Build columns
      */
     // <editor-fold defaultstate="collapsed" desc="uild columns">
     $columns = array(array('name' => 'id', 'order_column' => 'id', 'order_direction' => 'ASC'), array('name' => 'email segment', 'order_column' => 'email_segment', 'order_direction' => 'ASC'), array('name' => 'created', 'order_column' => 'created', 'order_direction' => 'ASC'));
     foreach ($columns as &$column) {
         if (isset($column['order_column'])) {
             if ($column['order_column'] == $order_column) {
                 $column['current'] = TRUE;
                 if ($order_direction == 'ASC') {
                     $column['order_direction'] = 'DESC';
                     $column['current_asc'] = TRUE;
                 } else {
                     $column['order_direction'] = 'ASC';
                     $column['current_desc'] = TRUE;
                 }
             }
             $column['url'] = URL::base(TRUE) . Request::current()->uri() . URL::query(array('order_column' => $column['order_column'], 'order_direction' => $column['order_direction']), FALSE);
         }
     }
     // </editor-fold>
     /*
      * If delete
      */
     // <editor-fold defaultstate="collapsed" desc="If delete">
     if ($this->request->post('delete')) {
         // Database transaction start
         Database::instance()->begin();
         // Try
         try {
             // Get delete received email ids
             $delete_received_email_ids = Arr::get($this->request->post(), 'delete_received_email_id', array());
             // Iterate and chack and delete
             foreach ($delete_received_email_ids as $delete_received_email_id) {
                 // Get received email
                 $received_email = Tbl::factory('received_emails')->get($delete_received_email_id);
                 // Delete
                 $received_email->delete();
             }
             // Database commit
             Database::instance()->commit();
             // Add success notice
             if ($delete_received_email_ids) {
                 Notice::add(Notice::SUCCESS, Kohana::message('general', 'delete_success'));
             } else {
                 Notice::add(Notice::SUCCESS, Kohana::message('general', 'no_delete'), array(':text' => 'emil'));
             }
         } catch (HTTP_Exception_302 $e) {
             $this->redirect($e->location());
         } catch (Warning_Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add
             Notice::add(Notice::WARNING, $e->getMessage());
         } catch (Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add error notice
             Notice::add(Notice::ERROR, $e->getMessage() . $e->getFile() . $e->getLine());
         }
     }
     // </editor-fold>
     /*
      * Get received emails
      */
     // <editor-fold defaultstate="collapsed" desc="Get received emails">
     $all_received_emails = Tbl::factory('received_emails')->order_by($order_column, $order_direction)->read()->as_array();
     $pagenate = Pgn::factory(array('total_items' => count($all_received_emails), 'items_per_page' => $this->settings->pagenate_items_per_page_for_received_emails, 'follow' => $this->settings->pagenate_items_follow_for_received_emails));
     // Paginated items
     $received_emails = array_slice($all_received_emails, $pagenate->offset, $pagenate->items_per_page);
     foreach ($received_emails as $received_email) {
         $received_email->objects = array();
         $json = json_decode($received_email->json);
         foreach ($json as $key => $value) {
             $received_email->objects[] = array('key' => str_replace('_', ' ', $key), 'value' => $value);
         }
         $email_name = Tbl::factory('emails')->select('name')->where('segment', '=', $received_email->email_segment)->read(TRUE)->name;
         $received_email->email_name = $email_name;
         $received_email->created = Date::formatted_time($received_email->created, 'Y-n-j h:i');
         $received_email->delete_url = URL::site("{$this->settings->backend_name}/received_emails/delete/{$received_email->id}", 'http');
     }
     // </editor-fold>
     /**
      * View
      */
     // <editor-fold defaultstate="collapsed" desc="View">
     $this->partials['pagenate'] = Tpl::get_file('pagenate', $this->settings->back_tpl_dir);
     $content_file = Tpl::get_file('index', $this->settings->back_tpl_dir . '/received_emails', $this->partials);
     $this->content = Tpl::factory($content_file)->set('columns', $columns)->set('received_emails', $received_emails)->set('pagenate', $pagenate)->set('post', $this->request->post());
     // </editor-fold>
 }
Пример #2
0
 /**
  * Action index
  */
 public function action_index()
 {
     /*
      * Build columns
      */
     // <editor-fold defaultstate="collapsed" desc="Build columns">
     // Get order
     $query = $this->request->query();
     $order_column = Arr::get($query, 'order_column', 'created');
     $order_direction = Arr::get($query, 'order_direction', 'DESC');
     // Build columns
     $columns = array(array('name' => 'id', 'order_column' => 'id', 'order_direction' => 'ASC'), array('name' => 'item segment', 'order_column' => 'item_segment', 'order_direction' => 'ASC'), array('name' => 'item title', 'order_column' => 'item_title', 'order_direction' => 'ASC'), array('name' => 'item id', 'order_column' => 'item_id', 'order_direction' => 'ASC'), array('name' => 'user id', 'order_column' => 'user_id', 'order_direction' => 'ASC'), array('name' => 'replay id', 'order_column' => 'replay_id', 'order_direction' => 'ASC'), array('name' => 'display name', 'order_column' => 'display_name', 'order_direction' => 'ASC'), array('name' => 'subject', 'order_column' => 'subject', 'order_direction' => 'ASC'), array('name' => 'created', 'order_column' => 'created', 'order_direction' => 'ASC'), array('name' => 'is accept', 'order_column' => 'is_accept', 'order_direction' => 'ASC'));
     foreach ($columns as &$column) {
         if (isset($column['order_column'])) {
             if ($column['order_column'] == $order_column) {
                 $column['current'] = TRUE;
                 if ($order_direction == 'ASC') {
                     $column['order_direction'] = 'DESC';
                     $column['current_asc'] = TRUE;
                 } else {
                     $column['order_direction'] = 'ASC';
                     $column['current_desc'] = TRUE;
                 }
             }
             $column['url'] = URL::base(TRUE) . Request::current()->uri() . URL::query(array('order_column' => $column['order_column'], 'order_direction' => $column['order_direction']), FALSE);
         }
     }
     // </editor-fold>
     /*
      * If delete
      */
     // <editor-fold defaultstate="collapsed" desc="If delete">
     if ($this->request->post('delete')) {
         // Database transaction start
         Database::instance()->begin();
         // Try
         try {
             // Get delete received comment ids
             $delete_received_comment_ids = Arr::get($this->request->post(), 'delete_received_comment_id', array());
             // Iterate and chack and delete
             foreach ($delete_received_comment_ids as $delete_received_comment_id) {
                 // Get received comment
                 $received_comment = Tbl::factory('received_comments')->get($delete_received_comment_id);
                 // Delete
                 $received_comment->delete();
             }
             // Database commit
             Database::instance()->commit();
             // Add success notice
             if ($delete_received_comment_ids) {
                 Notice::add(Notice::SUCCESS, Kohana::message('general', 'delete_success'));
             } else {
                 Notice::add(Notice::SUCCESS, Kohana::message('general', 'no_delete'), array(':text' => 'emil'));
             }
         } catch (HTTP_Exception_302 $e) {
             $this->redirect($e->location());
         } catch (Warning_Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add
             Notice::add(Notice::WARNING, $e->getMessage());
         } catch (Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add error notice
             Notice::add(Notice::ERROR, $e->getMessage() . $e->getFile() . $e->getLine());
         }
     }
     // </editor-fold>
     /*
      * Get received_comments
      */
     // <editor-fold defaultstate="collapsed" desc="Get received_comments">
     $all_received_comments = Tbl::factory('received_comments')->select('received_comments.*')->select(array('items.segment', 'item_segment'))->select(array('items.title', 'item_title'))->join('items')->on('received_comments.item_id', '=', 'items.id')->order_by($order_column, $order_direction)->read()->as_array();
     $pagenate = Pgn::factory(array('total_items' => count($all_received_comments), 'items_per_page' => $this->settings->pagenate_items_per_page_for_received_comments, 'follow' => $this->settings->pagenate_items_follow_for_received_comments));
     // Paginated items
     $received_comments = array_slice($all_received_comments, $pagenate->offset, $pagenate->items_per_page);
     foreach ($received_comments as $received_comment) {
         $received_comment->delete_url = URL::site("{$this->settings->backend_name}/received_comments/delete/{$received_comment->id}", 'http') . URL::query();
     }
     // </editor-fold>
     /*
      * If update
      */
     // <editor-fold defaultstate="collapsed" desc="If update">
     if ($this->request->post('update')) {
         $post = $this->request->post();
         // Set post to tag
         foreach ($received_comments as $received_comment) {
             $received_comment->is_accept = isset($post['is_accept'][$received_comment->id]) ? $post['is_accept'][$received_comment->id] : 0;
         }
         // Database transaction start
         Database::instance()->begin();
         // Try
         try {
             // Update
             foreach ($received_comments as $received_comment) {
                 Tbl::factory('received_comments')->get($received_comment->id)->update(array('is_accept' => isset($post['is_accept'][$received_comment->id]) ? $post['is_accept'][$received_comment->id] : 0));
             }
             // Database commit
             Database::instance()->commit();
             // Add success notice
             Notice::add(Notice::SUCCESS, Kohana::message('general', 'update_success'));
         } catch (HTTP_Exception_302 $e) {
             $this->redirect($e->location());
         } catch (Validation_Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add validation notice
             Notice::add(Notice::VALIDATION, Kohana::message('general', 'update_success'), NULL, $e->errors('validation'));
         } catch (Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add error notice
             Notice::add(Notice::ERROR, $e->getMessage());
         }
     }
     // </editor-fold>
     /**
      * View
      */
     // <editor-fold defaultstate="collapsed" desc="View">
     $this->partials['pagenate'] = Tpl::get_file('pagenate', $this->settings->back_tpl_dir);
     $content_file = Tpl::get_file('index', $this->settings->back_tpl_dir . '/received_comments', $this->partials);
     $this->content = Tpl::factory($content_file)->set('columns', $columns)->set('received_comments', $received_comments)->set('pagenate', $pagenate)->set('post', $this->request->post());
     // </editor-fold>
 }
Пример #3
0
 /**
  * Get items
  *
  * @param array $params
  * 	array(
  * 		'id' => array(1,2,3),
  * 		'segment' => array(segment1,segment2),
  * 		'division' => array(division_segment1),
  * 		'user' => array(username1,username2,username3),
  * 		'category' => array(category_segment1,category_segment2,category_segment3),
  * 		'tag' => array(tag_segment1,tag_segment2,tag_segment3),
  * 		'parrent_id' => array(parrent_id1,parrent_id2),
  * 		'order_column' => 'order_column',
  * 		'order_direction' => 'order_direction',
  * 		'offset' => '2',
  * 		'limit' => '5',
  * 		'xn' => '4',
  * 		'paginate' => 'true',
  * 		'items_per_page' => 4,
  * 		'follow' => 2,
  * 		'flags' => array('images','fields','comments'),
  * 		'get_one' => 'true'
  * 	);
  *
  * 	get
  * 		?issued=2013 2013-5 2013-5-5
  * 		?page=1
  *
  * @return \stdClass
  *
  * 	{{item.total}} itemの数
  * 	{{item.items}} itemの配列、keyはsegment、ループできる
  * 	itemのitems配列のキーxxxがあった場合
  * 	{{item.items.xxx.id}}
  * 	{{item.items.xxx.segment}}
  * 	{{item.items.xxx.division_id}}
  * 	{{item.items.xxx}}
  * 	{{item.items.xxx}}
  * 	{{item.items.xxx}}
  * 	{{item.items.count}}
  * 	{{item.prev}}
  * 	{{item.curr}}
  * 	{{item.next}}
  * 	{{item.paginate}}
  *
  * 		currentpage
  * 		total_item
  * 		items_per_page
  * 		total_pages
  * 		current_first_item
  * 		current_last_item
  * 		first_page, prev_page, next_page, last_page
  * 			index
  * 			url
  * 			current
  * 		offset
  * 		limit
  * 		pages
  * 			index
  * 			url
  * 			current
  * 		exist
  * 		follow
  * 		follow_pre
  * 		follow_suf
  * 		follow_pages
  * 			index
  * 			url
  * 			current
  */
 public static function get_items(array $params)
 {
     /**
      * Build results
      */
     $return = new stdClass();
     $return->total = NULL;
     $return->items = NULL;
     $return->prev = NULL;
     $return->curr = NULL;
     $return->next = NULL;
     $return->paginate = NULL;
     // Get param
     $id = Arr::get($params, 'id');
     $segment = Arr::get($params, 'segment');
     $division = Arr::get($params, 'division');
     $user = Arr::get($params, 'user');
     $category = Arr::get($params, 'category');
     $tag = Arr::get($params, 'tag');
     $parent_id = Arr::get($params, 'parent_id');
     $order_column = Arr::get($params, 'order_column');
     $order_direction = Arr::get($params, 'order_direction', 'ASC');
     $offset = Arr::get($params, 'offset');
     $limit = Arr::get($params, 'limit');
     $paginate = strtolower(Arr::get($params, 'paginate')) == 'true' ? TRUE : FALSE;
     $items_per_page = Arr::get($params, 'items_per_page');
     $follow = Arr::get($params, 'follow');
     $xn = Arr::get($params, 'xn', 2);
     $flags = Arr::get($params, 'flags', array());
     $images_flag = in_array('images', $flags);
     $fields_flag = in_array('fields', $flags);
     $comments_flag = in_array('comments', $flags);
     $get_one = strtolower(Arr::get($params, 'get_one')) == 'true' ? TRUE : FALSE;
     // カレンダーとかの日付でフィルタするときに使う ?issued = 2013-7-7 or ?issued = 2013-7 or ?issued = 2013
     $issued = Request::current()->query('issued');
     /**
      * Get items id and segment:パラメータからsqlを作って実行、キーはsegmentでidとsegmentを取得
      */
     // <editor-fold defaultstate="collapsed" desc="Get items id and segment">
     $sql = Tbl::factory('items')->select('items.id')->select('items.segment')->join('divisions')->on('items.division_id', '=', 'divisions.id')->join('items_categories', 'LEFT')->on('items.id', '=', 'items_categories.item_id')->join('categories', 'LEFT')->on('items_categories.category_id', '=', 'categories.id')->join('items_tags', 'LEFT')->on('items.id', '=', 'items_tags.item_id')->join('tags', 'LEFT')->on('items_tags.tag_id', '=', 'tags.id')->join('users', 'LEFT')->on('items.user_id', '=', 'users.id');
     // エディターから上位の時はすべて表示
     if (!(Auth::instance()->logged_in('direct') or Auth::instance()->logged_in('admin') or Auth::instance()->logged_in('edit'))) {
         //アクティブのみを選択
         $sql->where('is_active', '=', 1);
     }
     if ($id) {
         $sql->where('items.id', 'IN', $id);
     }
     if ($segment) {
         $sql->where('items.segment', 'IN', $segment);
     }
     if ($division) {
         $sql->where('divisions.segment', 'IN', $division);
     }
     if ($user) {
         $sql->where('users.username', 'IN', $user);
     }
     if ($category) {
         $sql->where('categories.segment', 'IN', $category);
     }
     if ($tag) {
         $sql->where('tags.segment', 'IN', $tag);
     }
     if ($parent_id) {
         $sql->where('items.parent_id', 'IN', $parent_id);
     }
     // カレンダーとかの日付でフィルタするときに使う ?issued = 2013-7-7 or ?issued = 2013-7 or ?issued = 2013
     if ($issued) {
         $strings = explode('-', $issued);
         $count = count($strings);
         if ($count == 1) {
             $start = Date::formatted_time("{$strings[0]}-01-01");
             $end = Date::formatted_time("{$strings[0]}-01-01 +1year -1day");
         } elseif ($count == 2) {
             $start = Date::formatted_time("{$strings[0]}-{$strings[1]}-01");
             $end = Date::formatted_time("{$strings[0]}-{$strings[1]}-01 +1month -1day");
         } elseif ($count == 3) {
             $start = Date::formatted_time("{$strings[0]}-{$strings[1]}-{$strings[2]}");
             $end = Date::formatted_time("{$strings[0]}-{$strings[1]}-{$strings[2]} +1day -1sec");
         }
         $sql->where('items.issued', '>=', $start);
         $sql->where('items.issued', '<=', $end);
     }
     // バックエンドの時はissueが来てなくても表示
     if (Request::current()->controller() !== 'Backend') {
         $sql->where('items.issued', '<=', Date::formatted_time('now'));
     }
     $sql->group_by('items.id');
     // if there is order_column
     if ($order_column) {
         $sql->order_by('items.' . $order_column, $order_direction);
     }
     // if there is offset
     if ($offset) {
         $sql->offset($offset);
     }
     // if there is limit
     if ($limit) {
         $sql->limit($limit);
     }
     // Items sqlを実行
     $items = $sql->read()->as_array('segment');
     // count, xn
     $c = 0;
     foreach ($items as &$item) {
         // countの追加
         $item->count = ++$c;
         $item->xn_start = $item->count % $xn == 1 ? TRUE : FALSE;
         $item->xn_end = $item->count % $xn == 0 ? TRUE : FALSE;
     }
     // </editor-fold>
     /**
      * Get total items:トータルを追加
      */
     // <editor-fold defaultstate="collapsed" desc="Get total items">
     $return->total = count($items);
     // </editor-fold>
     /**
      * Pagenate:ページネートを作成、itemsをフィルター
      */
     // <editor-fold defaultstate="collapsed" desc="Pagenate">
     if ($paginate) {
         // Paginate
         $paginate = Pgn::factory(array('total_items' => $return->total, 'items_per_page' => $items_per_page, 'follow' => $follow));
         // Paginated items
         $items = array_slice($items, $paginate->offset, $paginate->items_per_page);
         // Set return
         $return->paginate = $paginate;
         // paginate number
         $return->{'paginate' . $paginate->current_page} = TRUE;
     }
     // </editor-fold>
     /**
      * Get each item:itemの内容を取得して、現在開かれてるitemのcurrentをTRUEにする
      */
     // <editor-fold defaultstate="collapsed" desc="Get each item">
     // 現在開かれているitemを取得
     $current_item = Tbl::factory('items')->select('id')->select('parent_id')->where('segment', '=', Request::current()->param('segment'))->read(1);
     // Todo:: これカレントがないときエラーにならないように作っとく、これでよい?
     if (!$current_item) {
         $current_item = new stdClass();
         $current_item->id = false;
         $current_item->parent_id = false;
     }
     // itemsが0じゃないとき
     if ($items) {
         // itemの内容を取得
         foreach ($items as $key => &$item) {
             // cms item の get item でそれぞれのitemを取得
             $item_details = self::get_item($item->segment, $images_flag, $fields_flag, $comments_flag);
             // itemとitem_detailsをマージ
             $item = (object) array_merge((array) $item, (array) $item_details);
             // 現在開かれているItemのidかparent_idと一致する場合
             if ($item->id == $current_item->id or $item->id == $current_item->parent_id) {
                 $item->current = TRUE;
             }
         }
     }
     // Set return Itemを追加
     $return->items = $items;
     // </editor-fold>
     /**
      * Get prev next:itemのページでget_imagesで取得したなかのprevとnextを取得する
      */
     // <editor-fold defaultstate="collapsed" desc="Get prev next">
     $temp_items = array_values($items);
     foreach ($temp_items as $key => $value) {
         if ($value->id == $current_item->id) {
             if (isset($temp_items[$key - 1])) {
                 $return->prev = $temp_items[$key - 1];
             }
             if (isset($temp_items[$key])) {
                 $return->curr = $value;
             }
             if (isset($temp_items[$key + 1])) {
                 $return->next = $temp_items[$key + 1];
             }
         }
     }
     // </editor-fold>
     /**
      * Return get_oneの時は一個だけとる
      *
      * Todo:: これでOK?
      * 削除
      */
     return $get_one == 1 ? reset($return->items) : $return;
     //		return $return;
 }
Пример #4
0
 /**
  * Action index
  */
 public function action_index()
 {
     /*
      * build column
      */
     // <editor-fold defaultstate="collapsed" desc="column">
     // Get order
     $query = $this->request->query();
     $order_column = Arr::get($query, 'order_column', 'id');
     $order_direction = Arr::get($query, 'order_direction', 'ASC');
     // Build columns
     $columns = array(array('name' => 'id', 'order_column' => 'id', 'order_direction' => 'ASC'), array('name' => 'role', 'order_column' => 'role', 'order_direction' => 'ASC'), array('name' => 'username', 'order_column' => 'username', 'order_direction' => 'ASC'), array('name' => 'email', 'order_column' => 'email', 'order_direction' => 'ASC'), array('name' => 'is block', 'order_column' => 'is_block', 'order_direction' => 'ASC'), array('name' => ''));
     foreach ($columns as &$column) {
         if (isset($column['order_column'])) {
             if ($column['order_column'] == $order_column) {
                 $column['current'] = TRUE;
                 if ($order_direction == 'ASC') {
                     $column['order_direction'] = 'DESC';
                     $column['current_asc'] = TRUE;
                 } else {
                     $column['order_direction'] = 'ASC';
                     $column['current_desc'] = TRUE;
                 }
             }
             $column['url'] = URL::base(TRUE) . Request::current()->uri() . URL::query(array('order_column' => $column['order_column'], 'order_direction' => $column['order_direction']), FALSE);
         }
     }
     // </editor-fold>
     /*
      * If post create
      */
     // <editor-fold defaultstate="collapsed" desc="If post create">
     $create = array();
     // If there are post create
     if ($this->request->post('create')) {
         // Build data
         $create['username'] = $this->request->post('create_username');
         $create['email'] = $this->request->post('create_email');
         $create['password'] = $this->request->post('create_password');
         $create['avatar'] = $_FILES['create_avatar'];
         $create['is_block'] = $this->request->post('create_is_block') ?: 0;
         // Database transaction start
         Database::instance()->begin();
         // Try
         try {
             // If there is not avatar アバターがない時
             if (!Upload::not_empty($create['avatar'])) {
                 $user = Tbl::factory('users')->create($create)->add_roles('login');
                 // Create users_details
                 $detail_ids = Tbl::factory('details')->read()->as_array(NULL, 'id');
                 foreach ($detail_ids as $detail_id) {
                     Tbl::factory('users_details')->create(array('user_id' => $user->id, 'detail_id' => $detail_id, 'value' => NULL));
                 }
                 // Make user dir
                 Cms_Helper::make_dir($user->username, $this->settings->image_dir . '/user');
             } else {
                 // Get image type
                 $create['ext'] = NULL;
                 switch ($create['avatar']['type']) {
                     case 'image/jpeg':
                         $create['ext'] = '.jpg';
                         break;
                     case 'image/png':
                         $create['ext'] = '.png';
                         break;
                     case 'image/gif':
                         $create['ext'] = '.gif';
                         break;
                     default:
                         $create['ext'] = NULL;
                         break;
                 }
                 // Create
                 $user = Tbl::factory('users')->create($create, 'validate_with_avatar')->add_roles('login');
                 // Make user dir
                 Cms_Helper::make_dir($user->username, $this->settings->image_dir . '/user');
                 // Image division directory // イメージを入れるディレクトリ
                 $dir_path = 'application/' . $this->settings->image_dir . '/user/' . $user->username . '/';
                 // Upload image イメージをアップロード
                 $filename = Upload::save($create['avatar'], 'avatar' . $user->ext, $dir_path);
                 // Build sizes
                 $sizes = array('_v' => explode(',', str_replace(' ', '', $this->settings->image_v)), '_h' => explode(',', str_replace(' ', '', $this->settings->image_h)), '_s' => explode(',', str_replace(' ', '', $this->settings->image_s)));
                 // Resize image 他のサイズを作成
                 foreach ($sizes as $key => $value) {
                     Image::factory($filename)->resize($value[0], $value[1], Image::INVERSE)->crop($value[0], $value[1])->save($dir_path . 'avatar' . $key . $user->ext);
                 }
             }
             // Database commit
             Database::instance()->commit();
             // Clear create
             $create['username'] = NULL;
             $create['email'] = NULL;
             $create['password'] = NULL;
             $create['thumb'] = NULL;
             $create['is_block'] = NULL;
             // Add success notice
             Notice::add(Notice::SUCCESS, Kohana::message('general', 'create_success'));
         } catch (HTTP_Exception_302 $e) {
             $this->redirect($e->location());
         } catch (Validation_Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add validation notice
             Notice::add(Notice::VALIDATION, Kohana::message('general', 'create_failed'), NULL, $e->errors('validation'));
         } catch (Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add error notice
             Notice::add(Notice::ERROR, $e->getMessage(), NULL, array($e->getFile(), $e->getLine()));
         }
     }
     // </editor-fold>
     /*
      * Get users
      */
     // <editor-fold defaultstate="collapsed" desc="Get users">
     // Get users
     $all_users = Tbl::factory('users')->read()->as_array();
     foreach ($all_users as $all_user) {
         // Get user role
         $role = Tbl::factory('roles_users')->select('roles.*')->join('roles')->on('roles_users.role_id', '=', 'roles.id')->where('roles_users.user_id', '=', $all_user->id)->where('roles.name', '!=', 'login')->read('name');
         $all_user->role = $role ?: 'login';
         // Get avatar
         $all_user->avatar = new stdClass();
         $all_user->avatar->path = URL::site("imagefly", 'http') . '/user/' . $all_user->username . '/';
         $all_user->avatar->file = '/' . 'avatar' . $all_user->ext;
         if (!is_file('application/' . $this->settings->image_dir . '/user/' . $all_user->username . '/' . 'avatar' . $all_user->ext)) {
             $all_user->avatar = FALSE;
         }
     }
     // sort
     foreach ($all_users as $key => $value) {
         $key_id[$key] = $value->{$order_column};
     }
     $sort = $order_direction == 'ASC' ? SORT_ASC : SORT_DESC;
     array_multisort($key_id, $sort, $all_users);
     /*
      * Pagenate
      */
     // <editor-fold defaultstate="collapsed" desc="Pagenate">
     $pagenate = Pgn::factory(array('total_items' => count($all_users), 'items_per_page' => $this->settings->pagenate_items_per_page_for_users, 'follow' => $this->settings->pagenate_items_follow_for_users));
     // Paginated items
     $users = array_slice($all_users, $pagenate->offset, $pagenate->items_per_page);
     // </editor-fold>
     // add edit
     foreach ($users as $user) {
         $user->edit_url = URL::site("{$this->settings->backend_name}/users/edit/{$user->id}", 'http');
     }
     // </editor-fold>
     /**
      * If post update
      */
     // <editor-fold defaultstate="collapsed" desc="If post update">
     if ($this->request->post('update')) {
         $post = $this->request->post();
         // Set post to user
         foreach ($users as $user) {
             $user->is_block = isset($post['is_block'][$user->id]) ?: 0;
         }
         // Database transaction start
         Database::instance()->begin();
         // Try
         try {
             // Update
             foreach ($users as $user) {
                 Tbl::factory('users')->get($user->id)->update(array('is_block' => isset($post['is_block'][$user->id]) ?: 0));
             }
             // Database commit
             Database::instance()->commit();
             // Add success notice
             Notice::add(Notice::SUCCESS, Kohana::message('general', 'update_success'));
             // Redirect to wrapper edit
             $this->redirect(URL::site("{$this->settings->backend_name}/users", 'http') . URL::query());
         } catch (HTTP_Exception_302 $e) {
             $this->redirect($e->location());
         } catch (Validation_Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add validation notice
             Notice::add(Notice::VALIDATION, Kohana::message('general', 'update_success'), NULL, $e->errors('validation'));
         } catch (Exception $e) {
             // Database rollback
             Database::instance()->rollback();
             // Add error notice
             Notice::add(Notice::ERROR, $e->getMessage());
         }
     }
     // </editor-fold>
     /**
      * View
      */
     // <editor-fold defaultstate="collapsed" desc="View">
     // local_menusの修正
     $this->local_menus = array($this->local_menus['index']);
     $this->partials['pagenate'] = Tpl::get_file('pagenate', $this->settings->back_tpl_dir);
     $content_file = Tpl::get_file('index', $this->settings->back_tpl_dir . '/users', $this->partials);
     $this->content = Tpl::factory($content_file)->set('columns', $columns)->set('users', $users)->set('pagenate', $pagenate)->set('create', $create);
     // </editor-fold>
 }
Пример #5
0
 /**
  * Action index
  */
 public function action_index()
 {
     /*
      * Get order
      */
     $string = Arr::get($this->request->query(), 'string', '');
     $and_or = Arr::get($this->request->query(), 'and_or', 'and');
     $divisions = Arr::get($this->request->query(), 'divisions', array());
     $categories = Arr::get($this->request->query(), 'categories', array());
     $tags = Arr::get($this->request->query(), 'tags', array());
     $order_column = Arr::get($this->request->query(), 'order_column', 'id');
     $order_direction = Arr::get($this->request->query(), 'order_direction', 'ASC');
     $get = array('string' => $string, 'and_or' => $and_or, 'divisions' => $divisions, 'categories' => $categories, 'tags' => $tags, 'order_column' => $order_column, 'order_direction' => $order_direction);
     /*
      * Get lists
      */
     $division_list = Tbl::factory('divisions')->read()->as_array();
     $category_list = Tbl::factory('categories')->read()->as_array();
     $tag_list = Tbl::factory('tags')->read()->as_array();
     /*
      * Build columns
      */
     // <editor-fold defaultstate="collapsed" desc="Build columns">
     $columns = array('id' => array('name' => 'id', 'order_column' => 'id', 'order_direction' => 'ASC'), 'title' => array('name' => 'title', 'order_column' => 'title', 'order_direction' => 'ASC'), 'segment' => array('name' => 'segment', 'order_column' => 'segment', 'order_direction' => 'ASC'), 'division' => array('name' => 'division', 'order_column' => 'division_name', 'order_direction' => 'ASC'), 'username' => array('name' => 'username', 'order_column' => 'username', 'order_direction' => 'ASC'), 'issued' => array('name' => 'issued', 'order_column' => 'issued', 'order_direction' => 'ASC'), 'created' => array('name' => 'created', 'order_column' => 'created', 'order_direction' => 'ASC'), 'order' => array('name' => 'order', 'order_column' => 'order', 'order_direction' => 'ASC'), 'activate' => array('name' => 'activate', 'order_column' => 'is_active', 'order_direction' => 'ASC'));
     foreach ($columns as &$column) {
         if (isset($column['order_column'])) {
             if ($column['order_column'] == $order_column) {
                 $column['current'] = TRUE;
                 if ($order_direction == 'ASC') {
                     $column['order_direction'] = 'DESC';
                     $column['current_asc'] = TRUE;
                 } else {
                     $column['order_direction'] = 'ASC';
                     $column['current_desc'] = TRUE;
                 }
             }
             $column['url'] = URL::base(TRUE) . Request::current()->uri() . URL::query(array('order_column' => $column['order_column'], 'order_direction' => $column['order_direction']), TRUE);
         }
     }
     // </editor-fold>
     /*
      * Search items
      */
     // <editor-fold defaultstate="collapsed" desc="Get items">
     $sql = DB::select('items.id', 'items.segment')->from('items')->select('items.*')->select('users.username')->select(array('divisions.segment', 'division_segment'))->select(array('divisions.name', 'division_name'))->join('users', 'LEFT')->on('items.user_id', '=', 'users.id')->join('divisions')->on('items.division_id', '=', 'divisions.id')->join('items_categories', 'LEFT')->on('items.id', '=', 'items_categories.item_id')->join('categories', 'LEFT')->on('items_categories.category_id', '=', 'categories.id')->join('items_tags', 'LEFT')->on('items.id', '=', 'items_tags.item_id')->join('tags', 'LEFT')->on('items_tags.tag_id', '=', 'tags.id');
     // authority is edit
     if ($this->logged_in_user->role == 'edit') {
         $sql->where('users.id', '=', $this->logged_in_user->id);
     }
     // Divisionsがある場合
     if ($divisions) {
         $sql->where_open();
         foreach ($divisions as $division) {
             $sql->or_where('divisions.segment', '=', $division);
         }
         $sql->where_close();
     }
     // Categoriesがある場合
     if ($categories) {
         $sql->where_open();
         foreach ($categories as $category) {
             $sql->or_where('categories.segment', '=', $category);
         }
         $sql->where_close();
     }
     // Tagsがある場合
     if ($tags) {
         $sql->where_open();
         foreach ($tags as $tag) {
             $sql->or_where('tags.segment', '=', $tag);
         }
         $sql->where_close();
     }
     // string タブスペースなんかを半角に置き換えてexplodeで分ける
     if ($string) {
         $strings = array_filter(explode(' ', preg_replace(array('/\\s+/', '/,/', '/、/'), array(' ', ' ', ' '), mb_convert_kana($string, "s"))));
         // AND検索のとき
         if ($and_or == 'and') {
             $sql->where_open();
             foreach ($strings as $string) {
                 $sql->and_where(DB::expr("concat(ifnull(items.segment, ''), ' ', ifnull(items.title, ''), ' ', ifnull(items.catch, ''), ' ', ifnull(items.keywords, ''), ' ', ifnull(items.description, ''), ' ', ifnull(items.summary, ''))"), 'like', "%{$string}%");
             }
             $sql->where_close();
         } else {
             $sql->where_open();
             foreach ($strings as $string) {
                 $sql->or_where(DB::expr("concat(items.segment, ' ', items.title, ' ', items.catch, ' ', items.keywords, ' ', items.description, ' ', items.summary)"), 'like', "%{$string}%");
             }
             $sql->where_close();
         }
     }
     $all_items = $sql->group_by('items.id')->order_by($order_column, $order_direction)->as_object()->execute()->as_array('segment');
     // Pagenate
     $pagenate = Pgn::factory(array('total_items' => count($all_items), 'items_per_page' => $this->settings->pagenate_items_per_page_for_items, 'follow' => $this->settings->pagenate_items_follow_for_items));
     // Paginated items
     $items = array_slice($all_items, $pagenate->offset, $pagenate->items_per_page);
     foreach ($items as $item) {
         // Get division
         $division = Tbl::factory('divisions')->where('id', '=', $item->division_id)->read(1);
         // Get main image
         $item->main_image = Tbl::factory('images')->where('id', '=', $item->image_id)->read(1);
         if ($item->main_image) {
             $item->main_image->path = URL::site("imagefly", 'http') . '/item/' . $division->segment . '/' . $item->segment . '/';
             $item->main_image->file = '/' . $item->main_image->segment . $item->main_image->ext;
         }
         // Get categories
         $item->categories = Tbl::factory('categories')->select('categories.*')->join('items_categories')->on('categories.id', '=', 'items_categories.category_id')->where('items_categories.item_id', '=', $item->id)->read()->as_array();
         // Get received comments
         $item->received_commnets_count = count(Tbl::factory('received_comments')->where('item_id', '=', $item->id)->read()->as_array(NULL, 'id'));
         // Set to item
         $item->issued = $item->issued ? Date::formatted_time($item->issued, 'Y-n-j h:i') : $item->issued;
         $item->created = $item->created ? Date::formatted_time($item->created, 'Y-n-j h:i') : $item->created;
         $item->summary = $item->summary;
         $item->edit_url = URL::site("{$this->settings->backend_name}/items/{$item->division_segment}/edit/{$item->id}", 'http');
     }
     // </editor-fold>
     /**
      * View
      */
     // <editor-fold defaultstate="collapsed" desc="View">
     $this->partials['pagenate'] = Tpl::get_file('pagenate', $this->settings->back_tpl_dir);
     $content_file = Tpl::get_file('index', $this->settings->back_tpl_dir . '/item_search', $this->partials);
     $this->content = Tpl::factory($content_file)->set('columns', $columns)->set('division_list', $division_list)->set('category_list', $category_list)->set('tag_list', $tag_list)->set('items', $items)->set('pagenate', $pagenate)->set('get', $get);
     // </editor-fold>
 }
Пример #6
0
 /**
  * search
  *
  * @return object
  * 					query
  * 					total
  * 					pagenate
  * 					items
  *
  * <form action="{{host}}test_search" method="GET">
  * <input type="text" name="string" value="{{search_result.get.string}}" placeholder="string">
  * <input type="hidden" name="and_or" value="and">デフォルトはand
  *
  * <input type="hidden" name="divisions" value="page, article">
  * 又は
  * <input type="hidden" name="divisions[]" value="page">
  * <input type="hidden" name="divisions[]" value="shop">
  *
  * <input type="hidden" name="categories" value="aaa, bbb">
  * 又は
  * <input type="hidden" name="categories[]" value="aaa">
  * <input type="hidden" name="categories[]" value="bbb">
  *
  * <input type="hidden" name="tag" value="aaa, bbb">
  * 又は
  * <input type="hidden" name="tag[]" value="aaa">
  * <input type="hidden" name="tag[]" value="bbb">
  *
  * <input type="hidden" name="xn" value="3">
  *
  * <input type="hidden" name="paginate" value="4, 2"> [items_per_page, follow]
  * <input type="hidden" name="order" value="name, DESC"> [order_column, order_direction]
  *
  * <input type="hidden" name="flags" value="images, fields, comments, children"> itemの何をとるか、デフォルトはfalse
  *
  * <button type="submit" name="search" value="search">search</button> nameはsearchで固定
  * </form>
  */
 public static function search($get)
 {
     // get filter
     $get = self::post_filter($get);
     // Build result
     $result = new stdClass();
     // kohanaのqueryだけどgetに入れる
     $result->get = $get;
     $result->total = NULL;
     $result->pagenate = NULL;
     $result->items = NULL;
     // パラメータを準備
     $string = Arr::get($get, 'string', '');
     $and_or = Arr::get($get, 'and_or', 'and');
     $divisions = Arr::get($get, 'divisions');
     $categories = Arr::get($get, 'categories');
     $tags = Arr::get($get, 'tags');
     $xn = Arr::get($get, 'xn');
     $paginate = Arr::get($get, 'paginate');
     $order = Arr::get($get, 'order');
     $flags = Arr::get($get, 'flags');
     // string タブスペースなんかを半角に置き換えてexplodeで分ける
     $strings = array_filter(explode(' ', preg_replace(array('/\\s+/', '/,/', '/、/'), array(' ', ' ', ' '), mb_convert_kana($string, "s"))));
     // divisions
     if ($divisions) {
         $divisions = !is_array($divisions) ? explode(',', str_replace(' ', '', $divisions)) : $divisions;
     }
     // categories
     if ($categories) {
         $categories = !is_array($categories) ? explode(',', str_replace(' ', '', $categories)) : $categories;
     }
     // tags
     if ($tags) {
         $tags = !is_array($tags) ? explode(',', str_replace(' ', '', $tags)) : $tags;
     }
     // flags
     if ($flags) {
         $flags = !is_array($flags) ? explode(',', str_replace(' ', '', $flags)) : $flags;
     } else {
         $flags = array();
     }
     $images_flag = in_array('images', $flags);
     $fields_flag = in_array('fields', $flags);
     $comments_flag = in_array('comments', $flags);
     // sqlを作って実行
     // ストリングが有るとき時
     if ($strings) {
         // selectはitems.id, items.segmentのみ
         $sql = DB::select('items.id', 'items.segment')->from('items')->join('divisions')->on('items.division_id', '=', 'divisions.id')->join('items_categories', 'LEFT')->on('items.id', '=', 'items_categories.item_id')->join('categories', 'LEFT')->on('items_categories.category_id', '=', 'categories.id')->join('items_tags', 'LEFT')->on('items.id', '=', 'items_tags.item_id')->join('tags', 'LEFT')->on('items_tags.tag_id', '=', 'tags.id');
         // エディターから上位の時はすべて表示
         if (!(Auth::instance()->logged_in('direct') or Auth::instance()->logged_in('admin') or Auth::instance()->logged_in('edit'))) {
             //アクティブのみを選択
             $sql->where('is_active', '=', 1);
         }
         // Divisionsがある場合
         if ($divisions) {
             $sql->where_open();
             foreach ($divisions as $division) {
                 $sql->or_where('divisions.segment', '=', $division);
             }
             $sql->where_close();
         }
         // Categoriesがある場合
         if ($categories) {
             $sql->where_open();
             foreach ($categories as $category) {
                 $sql->or_where('categories.segment', '=', $category);
             }
             $sql->where_close();
         }
         // Tagsがある場合
         if ($tags) {
             $sql->where_open();
             foreach ($tags as $tag) {
                 $sql->or_where('tags.segment', '=', $tag);
             }
             $sql->where_close();
         }
         // AND検索のとき
         if ($and_or == 'and') {
             $sql->where_open();
             foreach ($strings as $string) {
                 $sql->and_where(DB::expr("concat(items.segment, ' ', items.title, ' ', items.catch, ' ', items.keywords, ' ', items.description, ' ', items.summary)"), 'like', "%{$string}%");
             }
             $sql->where_close();
         } else {
             $sql->where_open();
             foreach ($strings as $string) {
                 $sql->or_where(DB::expr("concat(items.segment, ' ', items.title, ' ', items.catch, ' ', items.keywords, ' ', items.description, ' ', items.summary)"), 'like', "%{$string}%");
             }
             $sql->where_close();
         }
         $sql->group_by('items.id');
         if ($order) {
             $order = explode(',', str_replace(' ', '', $order));
             $sql->order_by($order[0], $order[1]);
         }
         $items = $sql->as_object()->execute()->as_array('segment');
     } else {
         // ストリングが無いときは0配列を戻す
         $items = array();
     }
     // count, xn
     $c = 0;
     foreach ($items as &$item) {
         // countの追加
         $item->count = ++$c;
         // xn
         if ($xn) {
             $item->xn_start = $item->count % $xn == 1 ? TRUE : FALSE;
             $item->xn_end = $item->count % $xn == 0 ? TRUE : FALSE;
         }
     }
     /**
      * Get total items:トータルを追加
      */
     $result->total = count($items);
     /**
      * Paginate があるとき
      */
     if ($paginate) {
         $items_per_page = $paginate ? explode(',', str_replace(' ', '', $paginate))[0] : NULL;
         $follow = $paginate ? explode(',', str_replace(' ', '', $paginate))[1] : NULL;
         // Paginate resultに入れる
         //items_per_pageとfollow(前後のリンクの数)もgetでおくる
         $result->pagenate = Pgn::factory(array('total_items' => $result->total, 'items_per_page' => $items_per_page, 'follow' => $follow));
         // Paginated items resultに入れる
         $result->items = array_slice($items, $result->pagenate->offset, $result->pagenate->items_per_page);
     } else {
         $result->items = $items;
     }
     // itemsが0じゃないとき
     if ($result->items) {
         foreach ($result->items as &$item) {
             // cms item の get item でそれぞれのitemを取得
             $item_details = Cms_Functions::get_item($item->segment, $images_flag, $fields_flag, $comments_flag);
             // itemとitem_detailsをマージ
             $item = (object) array_merge((array) $item, (array) $item_details);
         }
     }
     // Set return
     Session::instance()->set('search_result', $result);
 }