/** * Action edit */ public function action_edit() { // Get id from param, if there is nothing then throw to 404 $id = $this->request->param('key'); if (!$id) { throw HTTP_Exception::factory(404); } // Get user, if there is nothing then throw to 404 $user = Tbl::factory('users')->get($id); if (!$user) { throw HTTP_Exception::factory(404); } // Get user role $user->role = Tbl::factory('roles_users')->select('roles.*')->join('roles')->on('roles_users.role_id', '=', 'roles.id')->where('roles_users.user_id', '=', $user->id)->where('roles.name', '!=', 'login')->read('name'); $user->avatar_delete_url = URL::site("{$this->settings->backend_name}/users/avatar_delete/{$user->id}", 'http'); $user->delete_url = URL::site("{$this->settings->backend_name}/users/delete/{$user->id}", 'http'); $user->avatar = new stdClass(); $user->avatar->path = URL::site("imagefly", 'http') . '/user/' . $user->username . '/'; $user->avatar->file = '/' . 'avatar' . $user->ext; if (!is_file('application/' . $this->settings->image_dir . '/user/' . $user->username . '/avatar' . $user->ext)) { $user->avatar = FALSE; } // Get roles ラジオボタンのため $roles = Tbl::factory('roles')->where('roles.name', '!=', 'login')->read()->as_array(); // Save old file $oldname = $user->username; // Build post $post = array('username' => $user->username, 'email' => $user->email, 'role' => $user->role, 'is_block' => $user->is_block ?: 0); // If there are post if ($this->request->post()) { // Database transaction start Database::instance()->begin(); // Try try { // Get roles users id $roles_users_id = Tbl::factory('roles_users')->select('roles_users.*')->join('roles')->on('roles_users.role_id', '=', 'roles.id')->where('roles_users.user_id', '=', $user->id)->where('roles.name', '!=', 'login')->read('id'); // if there is roles users id then delete 一回消してあとで入れなおす if ($roles_users_id) { Tbl::factory('roles_users')->where('id', '=', $roles_users_id)->get()->delete(); } // Set post $post['username'] = $this->request->post('username'); $post['email'] = $this->request->post('email'); $post['role'] = $this->request->post('role'); $post['is_block'] = $this->request->post('is_block') ?: 0; // Build data $data = array('username' => $post['username'], 'email' => $post['email'], 'is_block' => $post['is_block']); // If there is password if ($this->request->post('password')) { $data['password'] = $this->request->post('password'); } /* * If there is not avatar アバターがない時 */ if (!Upload::not_empty($_FILES['avatar'])) { // Update $user = Tbl::factory('users')->get($user->id)->update($data)->add_roles($post['role']); // New name $newname = $user->username; // Rename image user dir Cms_Helper::rename_dir($oldname, $newname, $this->settings->image_dir . '/user'); } else { // Set post $data['avatar'] = $_FILES['avatar']; // Get image type $data['ext'] = NULL; switch ($data['avatar']['type']) { case 'image/jpeg': $data['ext'] = '.jpg'; break; case 'image/png': $data['ext'] = '.png'; break; case 'image/gif': $data['ext'] = '.gif'; break; default: $data['ext'] = NULL; break; } // Update $user = Tbl::factory('users')->get($user->id)->update($data, 'validate_with_avatar')->add_roles($post['role']); // New name $newname = $user->username; // Rename image user dir Cms_Helper::rename_dir($oldname, $newname, $this->settings->image_dir . '/user'); // Image division directory // イメージを入れるディレクトリ $dir_path = 'application/' . $this->settings->image_dir . '/user/' . $user->username . '/'; // Upload image イメージをアップロード $filename = Upload::save($data['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); } } // reload $user->role = Tbl::factory('roles_users')->select('roles.*')->join('roles')->on('roles_users.role_id', '=', 'roles.id')->where('roles_users.user_id', '=', $user->id)->where('roles.name', '!=', 'login')->read('name'); $user->avatar_delete_url = URL::site("{$this->settings->backend_name}/users/avatar_delete/{$user->id}", 'http'); $user->delete_url = URL::site("{$this->settings->backend_name}/users/delete/{$user->id}", 'http'); $user->avatar = new stdClass(); $user->avatar->path = URL::site("imagefly", 'http') . '/user/' . $user->username . '/'; $user->avatar->file = '/' . 'avatar' . $user->ext; // 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_failed'), NULL, $e->errors('validation')); } catch (Exception $e) { // Database rollback Database::instance()->rollback(); // Add error notice Notice::add(Notice::ERROR, $e->getMessage() . '/' . $e->getFile() . '/' . $e->getLine()); } } /** * View */ $content_file = Tpl::get_file('edit', $this->settings->back_tpl_dir . '/users', $this->partials); $this->content = Tpl::factory($content_file)->set('user', $user)->set('roles', $roles)->set('post', $post); }
/** * Action edit */ public function action_edit() { /** * Get item etc */ // <editor-fold defaultstate="collapsed" desc="Get item etc"> // Get division $division = Tbl::factory('divisions')->where('id', '=', $this->item->division_id)->read(1); // Direct set to division $this->item->division_segment = $division->segment; $this->item->division_name = $division->name; $this->item->issued = $this->item->issued ? Date::formatted_time($this->item->issued, 'Y-n-j h:i') : $this->item->issued; $this->item->created = $this->item->created ? Date::formatted_time($this->item->created, 'Y-n-j h:i') : $this->item->created; $this->item->send_comment_is_on = $this->item->send_comment_is_on ?: 0; // Get content from file and direct set to $this->item $this->item->delete_url = URL::site("{$this->settings->backend_name}/items/{$division->segment}/delete/{$this->item->id}", 'http'); // Save old file $oldname = $this->item->segment; // Get item category_ids $item_category_ids = Tbl::factory('items_categories')->where('item_id', '=', $this->item->id)->read()->as_array(NULL, 'category_id'); $this->item->category_ids = implode(', ', $item_category_ids); // Get categories $categories = Tbl::factory('categories')->where('division_id', '=', $this->item->division_id)->read()->as_array(); // Get item tag_ids $item_tag_ids = Tbl::factory('items_tags')->where('item_id', '=', $this->item->id)->read()->as_array(NULL, 'tag_id'); $this->item->tag_ids = implode(', ', $item_tag_ids); // Get tags $tags = Tbl::factory('tags')->read()->as_array(); // Get divisions $divisions = Tbl::factory('divisions')->read()->as_array(); // Get parents $parents = Tbl::factory('items')->read()->as_array(); // </editor-fold> /** * If update */ // <editor-fold defaultstate="collapsed" desc="If update"> if ($this->request->post('update')) { // Set post to item $this->item->segment = Arr::get($this->request->post(), 'segment'); $this->item->title = Arr::get($this->request->post(), 'title'); $this->item->catch = Arr::get($this->request->post(), 'catch'); $this->item->keywords = Arr::get($this->request->post(), 'keywords'); $this->item->description = Arr::get($this->request->post(), 'description'); $this->item->summary = Arr::get($this->request->post(), 'summary'); $this->item->order = Arr::get($this->request->post(), 'order'); $this->item->is_active = Arr::get($this->request->post(), 'is_active', 0); $this->item->issued = Arr::get($this->request->post(), 'issued', $this->item->created); $this->item->category_ids = $this->request->post('category_id') ? implode(', ', $this->request->post('category_id')) : '[]'; $this->item->tag_ids = $this->request->post('tag_id') ? implode(', ', $this->request->post('tag_id')) : '[]'; $this->item->parent_id = Arr::get($this->request->post(), 'parent_id'); $this->item->send_comment_is_on = Arr::get($this->request->post(), 'send_comment_is_on', 0); // Database transaction start Database::instance()->begin(); // Try try { // Update item Tbl::factory('items')->get($this->item->id)->update(array('segment' => Arr::get($this->request->post(), 'segment'), 'title' => Arr::get($this->request->post(), 'title'), 'catch' => Arr::get($this->request->post(), 'catch'), 'keywords' => Arr::get($this->request->post(), 'keywords'), 'description' => Arr::get($this->request->post(), 'description'), 'summary' => Arr::get($this->request->post(), 'summary'), 'order' => Arr::get($this->request->post(), 'order'), 'is_active' => Arr::get($this->request->post(), 'is_active', 0), 'issued' => Arr::get($this->request->post(), 'issued', $this->item->created), 'parent_id' => Arr::get($this->request->post(), 'parent_id'), 'send_comment_is_on' => Arr::get($this->request->post(), 'send_comment_is_on', 0))); // Delete category カテゴリーをいったん削除 $delete_category_ids = Tbl::factory('items_categories')->where('item_id', '=', $this->item->id)->read()->as_array(NULL, 'id'); foreach ($delete_category_ids as $delete_category_id) { Tbl::factory('items_categories')->get($delete_category_id)->delete(); } // Create category 新たにカテゴリーをつける if ($this->request->post('category_id')) { foreach ($this->request->post('category_id') as $category_id) { // リレーションテーブルなので念のためカテゴリーが有るかチェック $category_exist = (bool) Tbl::factory('categories')->where('id', '=', $category_id)->read('id'); // なかったらエラー if (!$category_exist) { throw new Kohana_Exception(Kohana::message('general', 'not_exist'), array(':text' => 'Category')); } // Create items_categories Tbl::factory('items_categories')->create(array('item_id' => $this->item->id, 'category_id' => $category_id)); } } // Delete tag タグをいったん削除 $delete_tag_ids = Tbl::factory('items_tags')->where('item_id', '=', $this->item->id)->read()->as_array(NULL, 'id'); foreach ($delete_tag_ids as $delete_tag_id) { Tbl::factory('items_tags')->get($delete_tag_id)->delete(); } // Create tag 新たにタブをつける if ($this->request->post('tag_id')) { foreach ($this->request->post('tag_id') as $tag_id) { // リレーションテーブルなので念のためカテゴリーが有るかチェック $tag_exist = (bool) Tbl::factory('tags')->where('id', '=', $tag_id)->read('id'); // なかったらエラー if (!$tag_exist) { throw new Kohana_Exception(Kohana::message('general', 'not_exist'), array(':text' => 'Tag')); } // Create items_tags Tbl::factory('items_tags')->create(array('item_id' => $this->item->id, 'tag_id' => $tag_id)); } } // New file $newname = $this->item->segment; // rename file $rename_file_success = Cms_Helper::rename_file($oldname, $newname, $this->settings->item_dir . '/' . $division->segment); // images dir change name イメージディレクトリの名前変更 if ($rename_file_success) { Cms_Helper::rename_dir($oldname, $newname, $this->settings->image_dir . '/item/' . $division->segment); } // 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_failed'), 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['local_menu'] = Tpl::get_file('local_menu', $this->settings->back_tpl_dir); $content_file = Tpl::get_file('edit', $this->settings->back_tpl_dir . '/items', $this->partials); $this->content = Tpl::factory($content_file)->set('item', $this->item)->set('divisions', $divisions)->set('categories', $categories)->set('tags', $tags)->set('parents', $parents); // </editor-fold> }
/** * Action edit */ public function action_edit() { // Get id from param, if there is nothing then throw to 404 $id = $this->request->param('key'); if (!$id) { throw HTTP_Exception::factory(404); } // Get division, if there is nothing then throw to 404 $division = Tbl::factory('divisions')->get($id); if (!$division) { throw HTTP_Exception::factory(404); } // Get wrapper $wrapper = Tbl::factory('wrappers')->where('id', '=', $division->wrapper_id)->read(1); // Direct set to division $division->wrapper_segment = $wrapper->segment; $division->wrapper_name = $wrapper->name; $division->wrapper_content_type = $wrapper->content_type; // Get content from file and direct set to division $division->content = Tpl::get_file($division->segment, $this->settings->front_tpl_dir . '/division'); $division->delete_url = URL::site("{$this->settings->backend_name}/divisions/delete/{$division->id}", 'http'); // Save old name $oldname = $division->segment; // Get wrappers $wrappers = Tbl::factory('wrappers')->read()->as_array(); // If there are post if ($this->request->post()) { // Set post to division $division->wrapper_id = $this->request->post('wrapper_id'); $division->segment = $this->request->post('segment'); $division->name = $this->request->post('name'); $division->content = $this->request->post('content'); // Database transaction start Database::instance()->begin(); // Try try { // Update Tbl::factory('divisions')->get($division->id)->update(array('wrapper_id' => $this->request->post('wrapper_id'), 'segment' => $this->request->post('segment'), 'name' => $this->request->post('name'))); // New name $newname = $division->segment; // Rename items/division/directory name Cms_Helper::rename_dir($oldname, $newname, $this->settings->item_dir); // Rename images/division/directory name Cms_Helper::rename_dir($oldname, $newname, $this->settings->image_dir . '/item'); // rename theme/.../division/division file Cms_Helper::rename_file($oldname, $newname, $this->settings->front_tpl_dir . '/division'); // Update file Cms_Helper::set_file($newname, $this->settings->front_tpl_dir . '/division', $this->request->post('content')); // Database commit Database::instance()->commit(); // Add success notice Notice::add(Notice::SUCCESS, Kohana::message('general', 'update_success')); // Redirect $this->redirect(URL::site("{$this->settings->backend_name}/divisions/edit/{$division->id}", 'http')); } 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_failed'), NULL, $e->errors('validation')); } catch (Exception $e) { // Database rollback Database::instance()->rollback(); // Add error notice Notice::add(Notice::ERROR, $e->getMessage()); } } /** * View */ $content_file = Tpl::get_file('edit', $this->settings->back_tpl_dir . '/divisions', $this->partials); $this->content = Tpl::factory($content_file)->set('division', $division)->set('wrappers', $wrappers); }
/** * Password * * @return object * post * success * failed * errors */ public static function account($post) { /* * Check onetime ticket */ // <editor-fold defaultstate="collapsed" desc="Check onetime ticket"> $session_ticket = Session::instance()->get_once('ticket'); $post_ticket = Arr::get($post, 'ticket'); if (!$session_ticket or !$post_ticket or $session_ticket !== $post_ticket) { //HTTP::redirect(Request::current()->referrer()); } // </editor-fold> // Build result $result = new stdClass(); $result->post = $post; $result->success = FALSE; $result->invalid = FALSE; $result->exception = FALSE; $result->errors = array(); // Try try { // Save old file $oldname = Auth::instance()->get_user()->username; // Get settings $settings = Cms_Helper::settings(); // $_FILESがなくて$postがabatar_deleteを持ってない時 if (!isset($_FILES['avatar']) and !Arr::get($post, 'avatar_delete')) { // Update $user = Tbl::factory('users')->get(Auth::instance()->get_user()->id)->update($post); // New name $newname = $user->username; // Rename image user dir Cms_Helper::rename_dir($oldname, $newname, $settings->image_dir . '/user'); } elseif (Upload::not_empty($_FILES['avatar']) and !Arr::get($post, 'avatar_delete')) { // Set post $post['avatar'] = $_FILES['avatar']; // Get image type $post['ext'] = NULL; switch ($post['avatar']['type']) { case 'image/jpeg': $post['ext'] = '.jpg'; break; case 'image/png': $post['ext'] = '.png'; break; case 'image/gif': $post['ext'] = '.gif'; break; default: $post['ext'] = NULL; break; } // Update $user = Tbl::factory('users')->get(Auth::instance()->get_user()->id)->update($post, 'validate_with_avatar'); // New name $newname = $user->username; // Rename image user dir Cms_Helper::rename_dir($oldname, $newname, $settings->image_dir . '/user'); // Image division directory // イメージを入れるディレクトリ $dir_path = 'application/' . $settings->image_dir . '/user/' . $user->username . '/'; // Upload image イメージをアップロード $filename = Upload::save($post['avatar'], 'avatar' . $user->ext, $dir_path); // Build sizes $sizes = array('_v' => explode(',', str_replace(' ', '', $settings->image_v)), '_h' => explode(',', str_replace(' ', '', $settings->image_h)), '_s' => explode(',', str_replace(' ', '', $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); } } else { // Get user $user = Auth::instance()->get_user(); // Get directory $dir_path = 'application/' . $settings->image_dir . '/user/' . $user->username . '/'; // Delete image files if (is_file($dir_path . 'avatar' . $user->ext)) { unlink($dir_path . 'avatar' . $user->ext); unlink($dir_path . 'avatar' . '_v' . $user->ext); unlink($dir_path . 'avatar' . '_h' . $user->ext); unlink($dir_path . 'avatar' . '_s' . $user->ext); } // Set NULL to post ext $post['ext'] = NULL; // Update Tbl::factory('users')->get(Auth::instance()->get_user()->id)->update($post); } // Database commit Database::instance()->commit(); Auth::instance()->logout(); /** * Set result */ $result->post = array(); $result->success = TRUE; /** * redirect */ Session::instance()->set('account_result', $result); // Todo:: oldとnewを比較、avatarだけならloginにいかないようにする? //HTTP::redirect(Request::current()->url('http')); HTTP::redirect(URL::site('author/login', 'http')); } catch (Validation_Exception $e) { // Database rollback Database::instance()->rollback(); // Result $result->invalid = TRUE; // Separate errors field and message $errors = $e->errors('validation'); foreach ($errors as $key => $value) { $result->errors[] = array('field' => $key, 'message' => $value); } } catch (HTTP_Exception_302 $e) { HTTP::redirect($e->location()); } catch (Exception $e) { // Database rollback Database::instance()->rollback(); // Result $result->exception = TRUE; // errors $result->errors[] = array('field' => 'system error', 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()); //echo Debug::vars($result->errors); } Session::instance()->set('account_result', $result); }