- фотогалерея
- новости
- статьи
- отзывы
И моя задача сделать универсальный модуль комментариев, который бы подходил под любой другой модуль.
При разработке у меня возникли следующие вопросы и я постараюсь описать то, что я наваял и получить дельный совет.
Для примера будем использовать модуль статьи
Я создал виджет, который выводит все комментарии на страницу исходя из параметров и вызываю его в нужном месте:
Код: Выделить всё
<?php
echo frontend\modules\comments\widgets\CommentsList::widget([
'find' => ['post_id'=>$article->article_id, 'type'=>'article'],
'model' => 'common\modules\articles\models\Articles'
]);
?>
В таблице комментария есть поля:
post_id - идентификатор записи комментария
type - тип записи (для каждого модуля он может быть разным). В данном случае для модуля Статьи тип комментариев article
Далее все комментарии вывелись на страницу (есть 2 типа вида: древовидные комментарии и обычные через пагинацию), в данном случае древовидные.
Тут собственно и возникает первый самый главный вопрос.
У нас есть форма для добавления комментариев и когда пользователь добавляет новый комментарий, когда данные попадают в экшин комментария у нас теряется связь. Тоесть куда, к чему, зачем, почему был добавлен комментарий.
Для этого я тяну строку 'common\modules\articles\models\Articles' и добавляю ее в форму:
Код: Выделить всё
...
echo '<div class="clearfix formElementMargin">' . $form->field($model, 'text')->textarea() . '</div>';
echo Html::activeHiddenInput($model, 'post_id');
echo Html::activeHiddenInput($model, 'type');
echo Html::activeHiddenInput($model, 'parent_comm_id');
echo Html::activeHiddenInput($model, 'postModel');
...
Код: Выделить всё
/**
* Проверяем пост
*/
public function checkPost($attribute)
{
if($post = @call_user_func($this->postModel .'::className')) {
if($post::findOne($this->post_id)) {
// Указываем тип комментария
$this->type = $post::getCommentsType();
}
else {
$this->addError($attribute, Yii::t('comments.main', 'Записи с ID{id} не существует', ['id'=> $this->post_id]));
}
}
else {
$this->addError($attribute, Yii::t('comments.main', 'Ошибка при выборе записи'));
}
}
В общем ничего кроме как тянуть за собой строку common\modules\articles\models\Articles я не придумал. Подскажите пожалуйста на сколько это плохо, и есть ли другие варианты ?
Основная суть сделать 1 модуль комментарии полностью универсальным для всех других необходимых модулей.