Не получается добавить текстовое поле в шаблон Add топика

Добрый день, если кто сталкивался с подобной проблемой:
добавил в шаблон топика add новое поле topic_author по аналогии с полем topic_title.

<p><label for="topic_author">{$aLang.topic_create_author}:</label>
	<input type="text" id="topic_author" name="topic_author" value="{$_aRequest.topic_author}" class="input-text input-width-full" />
	<small class="note">{$aLang.topic_create_title_author}</small></p>


Добавил в маппер( в запрос на добавления и обновления топеика),
в валидацию topic.entity.class.php:
$this->aValidateRules[]=array('topic_author','string','max'=>500,'min'=>2,'allowEmpty'=>false,'label'=>$this->Lang_Get('topic_create_author'),'on'=>array('topic'));

Прописал функции получения и задания в topic.entity.class.php
public function getAuthor() {
return $this->_getDataOne('topic_author');
public function setAuthor($data) {
$this->_aData['topic_author']=$data;


Не помогло:
Ошибка: Поле Автор слишком короткое (минимально допустимо 2 символов).
Бьюсь с этим довольно долго, по аналогии искал topic_title находил все части кода где встречается и смотрел можно ли добавить для topic_author

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

avatar
Я так понимаю вы ходите добавить в базу данных, а имено в таблицу topic информацию об авторе. В таком случае если автор = создатель топика будет проще получть его логин с помощью такой конструкции:
$oUser = $this->User_GetUserById($oTopic->getUserId());
echo ($oUser->getLogin()); //выводит логин автора топика


Если у вас другие задачи, то по вашей проблеме:
$this->aValidateRules[]=array('topic_author','string','max'=>500,'min'=>2,'allowEmpty'=>false,'label'=>$this->Lang_Get('topic_create_author'),'on'=>array('topic'));

Эта строчка проверяет не форму, а поле в таблице topic. Так как судя по тому что вы написали, вам также необходимо:
1. Добавить новое поле в таблицу topic (topic_author)
2. Добавить поле в функции InsertTopic и UpdateTopic, чтобы это значение записывалось в базу данных при добавлении нового топика и при его редактировании.
3. Получить это поле из формы и записать в объект методом который вы уже создали в topic.entity.class.php
Вставить в функции TopicEdit и TopicAdd
$oTopic->setAuthor(getRequestStr('topic_author'));


В общем, лучше присмотритесь к первому варианту.
avatar
Спасибо, я уже прописал эти пункты.
Покопавшись, вот эта функция работает только таким образом, только так добавляется топик на страницу.
То есть записывается в таблицу значение «Пушкин» или любое другое указанное как константа и выводится на страницу.
public function getAuthor() {
/*return $this->_getDataOne('topic_author');
*/
return «Пушкин»;
avatar
Дело в том, что в таблицу в таком случае ничего не записывается. В этой ситуации getAuthor() ВСЕГДА и для всех топиков будет возвращать «Пушкин». А, что если нужно написать для одних топиков «Пушкин», а для других «Лермонтов»? В таком случае вам нужно добавлять полноценное поле в таблицу topic базы данных и менять все функции как я описал.
avatar
Либо вы можете сделать костыль и менять его вручную для каждого топика пока не хватает знаний, выглядить будет так:
public function getAuthor() {
    switch ($this->_getDataOne('topic_id')) {
    case 1:
        return "Пушкин";
        break;
    case 2:
        return "Лермонтов";
        break;
    case 23:
        return "Есенин";
        break;
    default:
       return "Неизвестный поэт";
    }
}

В таком случае для топика с ID=1 установлен автор «Пушкин», ID=2 «Лермонтов». ID=23 «Есенин». Все что не входит в этот список будет «Неизвестный поэт».
avatar
Здесь у меня второй случай, 1 пользователь публикует разных авторов
avatar
Исправил обратно на
public function getAuthor() {
return $this->_getDataOne('topic_author');
Ругается, что поле topic_author — NULL
SQL Error: Column 'topic_author' cannot be null at /home/k/konstaih/poety.su/public_html/classes/modules/topic/mapper/Topic.mapper.class.php line 51
Array ( [code] => 1048 [message] => Column 'topic_author' cannot be null [query] => INSERT INTO prefix_topic (blog_id, user_id, topic_type, topic_title, topic_author, topic_tags, topic_date_add, topic_user_ip, topic_publish, topic_publish_draft, topic_publish_index, topic_cut_text, topic_forbid_comment, topic_text_hash ) VALUES(36, 1, 'topic', 'Лермонтов',NULL, 'Лермонтов', '2018-11-29 21:19:47', '109.252.53.252', 1, 1, 0, NULL, '0', 'f87877f6b4006ad0f221e44ccb3152c8') [context] => /home/k/konstaih/poety.su/public_html/classes/modules/topic/mapper/Topic.mapper.class.php line 51 ).
avatar
Ты не передал значение формы в скрипт. В файле /classes/actions/ActionTopic.class.php в функциях SubmitEdit и SubmitAdd добавь после
$oTopic->setTags(getRequestStr('topic_tags'));

$oTopic->setAuthor(getRequestStr('topic_author'));
avatar
Да, это я сделал. Отключил на время плагин AceblogExtender и топик сохранился.В шаблоне топика add.tpl было поле с указанием категории куда сохранять топик.
Теперь другая проблема, как понять что в этом плагине не так, почему не сохраняется значение автора.
avatar
а правили в коде движка или плагина? Этот плагин дополняет класс топика
avatar
Правил в коде движка, не знаю к сожалению, где править в плагине.
avatar
Аналогично, как в движке
avatar
Спасибо большое
avatar
Теперь другая проблема — не сохраняет в категории, хотя в шаблоне add можно выбрать категорию.Просто сохраняет топик в новых топиках, а категории остаются пустыми.
avatar
какая категория, в плагине сделал подкатегории топиков?
avatar
Нет, только добавил в экшен Topic поле topic_author в валидацию и в $_REQUEST['topic_author'] = $oTopic->getAuthor(); — проверка полей перед отправкой формы.
Подкатегории у меня были до добавлены поля topic_author.
avatar
Какие категории не сохраняет? Можешь объяснить подробнее про категории
Да, это я сделал. Отключил на время плагин AceblogExtender и топик сохранился.В шаблоне топика add.tpl было поле с указанием категории куда сохранять топик.
avatar
То что выше описал, делал в плагине
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.