Вопрос к знатокам: имеется определенный тип материала, для комментария создано свое поле. Поле выводится как для самого комментария, так и для формы добавления комментария. Мне требуется чтобы для формы добавления комментария поле не отображалось, но было доступно при редактировании уже существующего комментария.
Использую темизацию:
function mytheme_form_comment_form_alter(&$form, &$form_state) {
unset($form['field_my_field']);
}
Хорошо, из формы добавления комментария поле пропало, но оно пропало и из формы редактирования уже существующих комментов, чего мне не нужно.
Как в данном случае затемизировать форму комментария, чтобы при редактировании уже существующих комментов поле отображалось? Проблема в том что форма используется одна и та же что при добавлении, что при редактировании комментов. Что пришло в голову: переопределить форму с учетом страницы, на которой она используется. Предоставляет ли темизация такие возможности? Поиском в сети пользовался, ничего не нашел. Может кто еще какие варианты решения проблемы предложит?
Комментарии
Форма та же - данные разные в $form, для редактирования есть cid, для просмотра содержания form используйте модуль devel например.
P.S.
Лучше $form['field_my_field']['#type'] = 'hidden' чем unset
sas@drupal.org, да, все верно, посмотрел через devel, в форме при добавлении комментария значение cid равно NULL, при редактировании оно не пустое, имеет некоторое значение. Выходит нужно использовать что-то вроде "если cid равен NULL тогда скрыть поле". Правильно понимаю?
А чем и почему? Хотя бы в общих чертах.
Хотя бы потому, что поле потом при редактировании будет использоваться а значит оно должно создаваться на этапе создания комментария.
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']);
Поле вывелось там где мне нужно. Теперь через админку скрываю поле комментария для отображения (ибо уже вывел через шаблон, ручками, и поле задвоилось). После скрытия через админку - поле не отображается вовсе. Я так понял что скрыв поле через админку оно становится недоступным для вывода и через шаблон. Что делать?
Из опыта - намного проще будет воспользоваться для изменения местоположения выводимого поля в комментарии - настройкой display для комментариев например - admin/structure/types/manage/product/comment/display , если нужная будет большая гибкость используйте - https://www.drupal.org/project/ds
sas@drupal.org, спасибо за советы, но все же решил по другому. Буду иметь вариант с Display Suite ввиду. Тип материала, над которым я работаю и темизирую - тема форума, и, соответственно, комментарии темы форума. То поле, которое я хотел "отделить" от самого комментария мне нужно было перенести, в моем случае, в div "forum-post-footer" (это область, в которой находятся кнопки "Вверх", "Изменить", "Цитировать", "Ответить" и "Удалить").
Решение: через админку не скрывал поле для отображения. В шаблоне Advanced Forum под названием "advanced-forum.theme-name.post.tpl.php" (это как раз и есть шаблон отображаемого комментария в теме форума) убрал вывод всего массива $content в блоке
Спасибо еще раз, с вашим направлением и немного приложив своих (пока слабых познаний) удалось реализовать то, что я задумал, а именно: созданное вручную поле скрыто в форме при создании комментария, но доступно при его редактировании. Единственно что смущает, так это вот этот код, который у меня работает:
if ($form_id == 'comment_node_type_my_node_form' && !$form['cid']['#value']);
Как мне показалось, он не совсем правильный, но и с "кодированием" у меня плохо, если не сказать вообще никак. По логике я думал сделать проверку в форме по cid, и если его нет то поле будет скрыто. В этом же приведенном куске кода я не пойму логику работы, точнее последний аргумент "['#value']". Я думал здесь нужно указать, что если "['#value']" равно "NULL" то поле скрывается. Повторюсь, код работает, но не так как это понимаю я. Может быть вы объяснили/либо указали бы на неточности в коде (если таковые имеются)?