/** * 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> }
/** * 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> }
/** * 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; }
/** * 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> }
/** * 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> }
/** * 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); }