Вопрос: как вставить свои значения в форму редактирования, на наследуя Action (ответ найден)

В данный момент очень криво выглядит добавление какого-либо поля плагином в стандартные поля форм topic/add или blog/add
и вот, почему:

для добавления поля, что бы не переопределять системные функции, пользуюсь хуками на ActionBlog.
все удобно, кроме одного момента:
при редактировании топика\блога вернуть в форму сохраненные плагином значения нельзя посредством хуков, т.к. blog_edit_before обрабатывается только при сабмите формы.
очень нехватает системного хука чуть выше по коду (или ниже, после else) для того, что бы можно было впихнуть $_REQUEST['myfield']='myvalue';

Согласитесь, наследвоать ActionBlog ради добавления одной строчки кода как-то не то, тем более, с учетом вероятных конфликтов с другими плагинами.

код под катом

для наглядности, вот код проблемной функции ActionBlog

protected function EventEditBlog() {
		/**
		 * Меню
		 */
		$this->sMenuSubItemSelect='';
		$this->sMenuItemSelect='profile';
		
		/**
		 * Проверяем передан ли в УРЛе номер блога
		 */
		$sBlogId=$this->GetParam(0);
		if (!$oBlog=$this->Blog_GetBlogById($sBlogId)) {
			return parent::EventNotFound();
		}
		/**
		 * Проверяем тип блога
		 */
		if ($oBlog->getType()=='personal') {
			return parent::EventNotFound();
		}
		/**
		 * Проверям авторизован ли пользователь
		 */
		if (!$this->User_IsAuthorization()) {
			$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
			return Router::Action('error');
		}
		/**
		 * Явлется ли авторизованный пользователь хозяином блога, либо его администратором
		 */
		$oBlogUser=$this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(),$this->oUserCurrent->getId());		
		$bIsAdministratorBlog=$oBlogUser ? $oBlogUser->getIsAdministrator() : false;
		if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId()  and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
			return parent::EventNotFound();
		}			
		
		$this->Viewer_AddHtmlTitle($oBlog->getTitle());
		$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_edit'));
		
		$this->Viewer_Assign('oBlogEdit',$oBlog);
		/**
		 * Устанавливаем шалон для вывода
		 */		
		$this->SetTemplateAction('add');
		/**
		 * Если нажали кнопку "Сохранить"
		 */
		if (isPost('submit_blog_add')) {
			/**
			 * Запускаем проверку корректности ввода полей при редактировании блога
			 */
			if (!$this->checkBlogFields($oBlog)) {
				return false;
			}
			$oBlog->setTitle(getRequest('blog_title'));
			/**
			 * Парсим описание блога на предмет ХТМЛ тегов
			 */
			$sText=$this->Text_Parser(getRequest('blog_description'));			
			$oBlog->setDescription($sText);
			$oBlog->setType(getRequest('blog_type'));
			$oBlog->setLimitRatingTopic(getRequest('blog_limit_rating_topic'));
			//$oBlog->setUrl(getRequest('blog_url'));	// запрещаем смену URL блога	
			/**
			* Загрузка аватара, делаем ресайзы
			*/			
			if (isset($_FILES['avatar']) and is_uploaded_file($_FILES['avatar']['tmp_name'])) {
				if ($sPath=$this->Blog_UploadBlogAvatar($_FILES['avatar'],$oBlog)) {
					$oBlog->setAvatar($sPath);
				} else {
					$this->Message_AddError($this->Lang_Get('blog_create_avatar_error'),$this->Lang_Get('error'));
					return false;
				}
			}
			/**
			 * Удалить аватар
			 */
			if (isset($_REQUEST['avatar_delete'])) {
				$this->Blog_DeleteBlogAvatar($oBlog);
				$oBlog->setAvatar(null);
			}
			/**
			 * Обновляем блог
			 */
#Вот этот хук доступен только при сабмите формы
			$this->Hook_Run('blog_edit_before', array('oBlog'=>$oBlog));
			if ($this->Blog_UpdateBlog($oBlog)) {
				$this->Hook_Run('blog_edit_after', array('oBlog'=>$oBlog));
				Router::Location($oBlog->getUrlFull());
			} else {
				$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
				return Router::Action('error');
			}
		} else {
#Это загружает значения в форму
			/**
			 * Загружаем данные в форму редактирования блога
			 */
			$_REQUEST['blog_title']=$oBlog->getTitle();
			$_REQUEST['blog_url']=$oBlog->getUrl();
			$_REQUEST['blog_type']=$oBlog->getType();
			$_REQUEST['blog_description']=$oBlog->getDescription();
			$_REQUEST['blog_limit_rating_topic']=$oBlog->getLimitRatingTopic();
			$_REQUEST['blog_id']=$oBlog->getId();
		}
		
		
	}

5 комментариев

avatar
в форму сохраненные плагином значения нельзя посредством хуков, т.к. blog_edit_before обрабатывается только при сабмите формы
а зачем вобще использовать blog_edit_before при формировании данных для формы редактирования? Вы в хуке соберите данные для которые внесли плагином и добавьте их хуком шаблона, а blog_edit_before уже обрабатывайте результат после нажатия сохранить.

надеюсь понятно обьяснил
avatar
небольшой пример из нового плагина
public function RegisterHook() {

      if (Router::GetAction()=='profile' and Router::GetActionEvent()){
        $aProfessions=Config::Get('plugin.profession.aProfession');
        if ($oUserProfile=$this->User_GetUserByLogin(Router::GetActionEvent()) and $aUserProfessionId = $this->PluginProfession_Profession_GetProfessionByUserId($oUserProfile->getId())){
...

собирает данные сохраненные сторонним плагином, по адресу _/profile/_login_/
avatar
Непонятно.
Как вытащить через шаблонданные из таблицы?
Как я понимаю, только event'ом.
avatar
не через шаблон, а через хук.

в примере выше файл HookProfession.class.php

в регистрации хуков отлавливаем нужный экшен или эвент или параметр
if (Router::GetAction()=='profile' and Router::GetActionEvent()){

и выполняем обращение к модулю стороннего плагина
$aUserProfessionId = $this->PluginProfession_Profession_GetProfessionByUserId($oUserProfile->getId())

далее просто выводим в шаблон
avatar
Дошло, спасибо.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.