[Решено]comment_form_alter и скрытие кастомного поля

Главные вкладки

Аватар пользователя Capt._Jack Capt._Jack 1 апреля 2015 в 4:10

Вопрос к знатокам: имеется определенный тип материала, для комментария создано свое поле. Поле выводится как для самого комментария, так и для формы добавления комментария. Мне требуется чтобы для формы добавления комментария поле не отображалось, но было доступно при редактировании уже существующего комментария.

Использую темизацию:

function mytheme_form_comment_form_alter(&$form, &$form_state) {
unset($form['field_my_field']);
}

Хорошо, из формы добавления комментария поле пропало, но оно пропало и из формы редактирования уже существующих комментов, чего мне не нужно.
Как в данном случае затемизировать форму комментария, чтобы при редактировании уже существующих комментов поле отображалось? Проблема в том что форма используется одна и та же что при добавлении, что при редактировании комментов. Что пришло в голову: переопределить форму с учетом страницы, на которой она используется. Предоставляет ли темизация такие возможности? Поиском в сети пользовался, ничего не нашел. Может кто еще какие варианты решения проблемы предложит?

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 1 апреля 2015 в 9:36

Форма та же - данные разные в $form, для редактирования есть cid, для просмотра содержания form используйте модуль devel например.

P.S.
Лучше $form['field_my_field']['#type'] = 'hidden' чем unset

Аватар пользователя Capt._Jack Capt._Jack 2 апреля 2015 в 0:35

sas@drupal.org, да, все верно, посмотрел через devel, в форме при добавлении комментария значение cid равно NULL, при редактировании оно не пустое, имеет некоторое значение. Выходит нужно использовать что-то вроде "если cid равен NULL тогда скрыть поле". Правильно понимаю?

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
Лучше $form['field_my_field']['#type'] = 'hidden' чем unset

А чем и почему? Хотя бы в общих чертах.

Аватар пользователя sas@drupal.org sas@drupal.org 2 апреля 2015 в 16:06

Хотя бы потому, что поле потом при редактировании будет использоваться а значит оно должно создаваться на этапе создания комментария.

Аватар пользователя Capt._Jack Capt._Jack 3 апреля 2015 в 2:40

sas@drupal.org, спасибо за наводку и пояснение. Скрыть поле в форме при создании комментария вышло таким вот кодом:

if ($form_id == 'comment_node_type_my_node_form' && !$form['cid']['#value'])
$form['field_my_field']['#type'] = 'hidden';

Теперь другая проблема в этой связи назрела. По замыслу поле после заполнения (уже после создания и редактирования комментария) будет отображаться в комментарии. Надумал его выводить совсем не после текста самого комментария, а через шаблон, для темизации. Через массив $content вывожу в нужном мне месте шаблона:

print render($content['field_my_field']);

Поле вывелось там где мне нужно. Теперь через админку скрываю поле комментария для отображения (ибо уже вывел через шаблон, ручками, и поле задвоилось). После скрытия через админку - поле не отображается вовсе. Я так понял что скрыв поле через админку оно становится недоступным для вывода и через шаблон. Что делать?

Аватар пользователя sas@drupal.org sas@drupal.org 4 апреля 2015 в 10:48

Из опыта - намного проще будет воспользоваться для изменения местоположения выводимого поля в комментарии - настройкой display для комментариев например - admin/structure/types/manage/product/comment/display , если нужная будет большая гибкость используйте - https://www.drupal.org/project/ds

Аватар пользователя Capt._Jack Capt._Jack 5 апреля 2015 в 7:55

sas@drupal.org, спасибо за советы, но все же решил по другому. Буду иметь вариант с Display Suite ввиду. Тип материала, над которым я работаю и темизирую - тема форума, и, соответственно, комментарии темы форума. То поле, которое я хотел "отделить" от самого комментария мне нужно было перенести, в моем случае, в div "forum-post-footer" (это область, в которой находятся кнопки "Вверх", "Изменить", "Цитировать", "Ответить" и "Удалить").

Решение: через админку не скрывал поле для отображения. В шаблоне Advanced Forum под названием "advanced-forum.theme-name.post.tpl.php" (это как раз и есть шаблон отображаемого комментария в теме форума) убрал вывод всего массива $content в блоке

, вместо него сделал вывод только поля "$content['body']" (чтобы мое вручную созданное поле не отображалось в самом комментарии), а само поле вывел в блоке