Доброго времени суток,
есть два типа материала: A (Author) и B (Album). У А есть nodereferences на B и обратно (связь 1:* - по использованию, но по факту и там и там стоит "много полей" - требование cnr). Обратные ссылки проставляются с помощью cnr. Т.е. в альбоме я указываю автора, а ссылка из автора на альбом проставляется автоматически.
Что бы лишние поля не мозолили глаза, из формы редактирования автора нужно убрать список альбомов, с которыми он связан.
Я знаю несколько вариантов:
1. CSS
2. JS
3. изменить #type на value
4. изменить #type на hidden
5. поменять #access
6. описан ниже
1,2,4 мне не особо подходят, так как пользователь теоретически может залезть в html код и отправить некорректные данные (назначить артисту альбом, который ему не принадлежит)
5 и 3 у меня не заработали, форма не проходит валидацию.
я извратился следующим образом (6-й вариант): повесил два обработчика на форму:
1. на after build
2. на submit
в первом я сохраняю в $form_state все поле которое хочу скрыть и делаю ему unset.
во втором, я из $form_state выдергиваю сохраненные ранее данные и вставляю обратно в форму. (так же слежу за тем, что бы мой обработчик на сабмит выполнялся перед всеми остальными)
до недавнего времени этот метод нормально работал, теперь почему-то работать перестал (Выдается сообщение при попытке изменить автора, который связан с альбомами: "this post can't be referenced" - ошибка генерируется nodereference модулем). Почему - пока разобраться не получилось (в системе куча модулей стоит)
собственно вопросы:
1. если у кого-нибудь есть идеи по поводу возникающей ошибки - буду очень рад выслушать
2. [главный вопрос] как ПРАВИЛЬНО скрыть поле/группу полей с формы редактирования ноды? Так, что бы пользователь никак не мог это поле изменить (тот же CSS в этом случае не подойдет). Любым ссылкам на мануалы/статьи буду очень рад.
спасибо
Комментарии
может hook_form_alter?
Может лучше модулями Content Permissions или Field Permissions
http://drupal.org/project/nodeformcols - классная штука
4 вариант у меня получался..но как-то через Ж...и через form_alter, ключевое слово -вес модуля(порядок обработки формы модулями).
Но опять-же, это не спасает от редактирование пользователем html-кода
Тоже очень хотел бы разобраться в этом вопросе...
Вопрос, как мне кажется, довольно таки актуальный...но 100%-ных решений пока не видел...
Почему стандартно не реализованы функции управления полями формы?
я ж тебе скинул ссылку на модуль через него можна скрыть любые поля!!
3, 4 и 5 через hook_form_alter и работали
Field Permissions у меня стоит, использую в тругих типах. Думаю, он не подойдет, т.к. будет полностью закрыт доступ к этим полям и cnr может натворить косяков... хотя попробую включить, может и поможет...
ну это я уже научился обходить... хотя конечно из-за этих весов проблемы регулярно всплывают...
с виду и правда классная вечерком попробую:)
Тем не менее вопрос все еще актуален - хочется выяснить для себя как правильно скрывать поля с помощью кода. Думаю ответ многим будет полезен и интересен
Поиск по drupal.org по разделу Modules - запрос "form"
вывел много интересных модулей для редактирования форм.
Правда в основном они предоставляют API для обработки форм.
Надо будет как-нибудь приглядеться.
попробовал http://drupal.org/project/nodeformcols - отличная штука! рекомендую всем! еще было бы разделение настроек по ролям... будет время допишу... (ну или погуглю... )
Рубить лес и идти напролом это конечно весело, но иногда стоит остановиться, посмотреть
как растёт сакурачто пишут в комментах и увидеть:Посмотрите исходник модуля - там несколько строк или просто включите модуль и получите профит.
Можно линк на этот модуль? а то я сам не нашел с таким названием (Поиск по модулям друпала + Google) может он как то чуть по-другому называется?
Нет, он называется именно так и входит в состав ССК
2. на submit
в первом я сохраняю в $form_state все поле которое хочу скрыть и делаю ему unset.
во втором, я из $form_state выдергиваю сохраненные ранее данные и вставляю обратно в форму. (так же слежу за тем, что бы мой обработчик на сабмит выполнялся перед всеми остальными)
Вот этот вариант мне нравиться, или что-то наподобие...
Осталось только довести до ума...
А можно поподробнее... как делали ?
http://drupal.org/node/357328
у меня вызвало конфликт с модулем User Relationships - поле исчезло
function additional_settings_form_alter(&$form, $form_state, $form_id) {
if($form_id == 'author_node_form'){
/*для формы редактирования артиста необходимо скрыть поле для редактирования альбомов этого артиста*/
/*для этого добавляем функции обработки after_build & submit формы*/
$form['#after_build'][] = 'additional_settings_author_node_form_after_build_proccess';
$form['#submit'][] = 'additional_settings_author_node_form_submit_proccess';
$form['buttons']['#weight'] = 50;
}
}
/* см additional_settings_form_alter */
function additional_settings_author_node_form_after_build_proccess($form, &$form_state){
$form_state['store']['$form_state_field_albums'] = $form_state['values']['field_albums'];
$form_state['store']['$form_field_albums'] = $form['field_albums'];
unset($form['field_albums']);
return $form;
}
/* см additional_settings_form_alter */
function additional_settings_author_node_form_submit_proccess($form, &$form_state){
$form_state['values']['field_albums'] = $form_state['store']['$form_state_field_albums'];
$form['field_albums'] = $form_state['store']['$form_field_albums'];
}
как-то так я делал...
хорошо тогда, что я его не использую...
Подскажите пожалуйста, а этот способ работает для всех типов полей? У меня успешно скрываются textarea, но при скрытии textfields и других типов, значения не сохраняются после отправки формы.
Это велосипед. Меняй access на false. И проще и правильней.