Как правильно скрыть CCK поле на форме редактирования ноды?
Прислано: CALLIKA
вт, 13/07/2010 - 07:53
Доброго времени суток,
есть два типа материала: 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 в этом случае не подойдет). Любым ссылкам на мануалы/статьи буду очень рад.
спасибо :)
- CALLIKA's blog
- Для комментирования войдите или зарегистрируйтесь
может hook_form_alter?
- Для комментирования войдите или зарегистрируйтесь
Может лучше модулями Content Permissions или Field Permissions
- Для комментирования войдите или зарегистрируйтесь
http://drupal.org/project/nodeformcols - классная штука
- Для комментирования войдите или зарегистрируйтесь
4 вариант у меня получался..но как-то через Ж...и через form_alter, ключевое слово -вес модуля(порядок обработки формы модулями).
Но опять-же, это не спасает от редактирование пользователем html-кода
Тоже очень хотел бы разобраться в этом вопросе...
Вопрос, как мне кажется, довольно таки актуальный...но 100%-ных решений пока не видел...
Почему стандартно не реализованы функции управления полями формы?
- Для комментирования войдите или зарегистрируйтесь
я ж тебе скинул ссылку на модуль через него можна скрыть любые поля!!
- Для комментирования войдите или зарегистрируйтесь
может hook_form_alter?
3, 4 и 5 через hook_form_alter и работали
Может лучше модулями Content Permissions или Field Permissions
Field Permissions у меня стоит, использую в тругих типах. Думаю, он не подойдет, т.к. будет полностью закрыт доступ к этим полям и cnr может натворить косяков... хотя попробую включить, может и поможет...
ключевое слово -вес модуля(порядок обработки формы модулями).
ну это я уже научился обходить... хотя конечно из-за этих весов проблемы регулярно всплывают... :(
http://drupal.org/project/nodeformcols - классная штука
с виду и правда классная :) вечерком попробую:)
- Для комментирования войдите или зарегистрируйтесь
Тем не менее вопрос все еще актуален - хочется выяснить для себя как правильно скрывать поля с помощью кода. Думаю ответ многим будет полезен и интересен :)
- Для комментирования войдите или зарегистрируйтесь
Поиск по drupal.org по разделу Modules - запрос "form"
вывел много интересных модулей для редактирования форм.
Правда в основном они предоставляют API для обработки форм.
Надо будет как-нибудь приглядеться.
- Для комментирования войдите или зарегистрируйтесь
попробовал http://drupal.org/project/nodeformcols - отличная штука! рекомендую всем! еще было бы разделение настроек по ролям... будет время допишу... (ну или погуглю... :D )
- Для комментирования войдите или зарегистрируйтесь
Рубить лес и идти напролом это конечно весело, но иногда стоит остановиться, посмотреть как растёт сакура что пишут в комментах и увидеть:
Content Permissions
Посмотрите исходник модуля - там несколько строк или просто включите модуль и получите профит.
- Для комментирования войдите или зарегистрируйтесь
Рубить лес и идти напролом это конечно весело, но иногда стоит остановиться, посмотреть как растёт сакура что пишут в комментах и увидеть:
Content Permissions
Посмотрите исходник модуля - там несколько строк или просто включите модуль и получите профит.
Можно линк на этот модуль? а то я сам не нашел с таким названием (Поиск по модулям друпала + Google) :( может он как то чуть по-другому называется?
- Для комментирования войдите или зарегистрируйтесь
Нет, он называется именно так и входит в состав ССК
- Для комментирования войдите или зарегистрируйтесь
1. на after build 2. на submit в первом я сохраняю в $form_state все поле которое хочу скрыть и делаю ему unset. во втором, я из $form_state выдергиваю сохраненные ранее данные и вставляю обратно в форму. (так же слежу за тем, что бы мой обработчик на сабмит выполнялся перед всеми остальными)
Вот этот вариант мне нравиться, или что-то наподобие...
Осталось только довести до ума...
А можно поподробнее... как делали ?
- Для комментирования войдите или зарегистрируйтесь
попробовал http://drupal.org/project/nodeformcols - отличная штука! рекомендую всем!
у меня вызвало конфликт с модулем 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']; }
как-то так я делал... =)
у меня вызвало конфликт с модулем User Relationships - поле исчезло
хорошо тогда, что я его не использую...
- Для комментирования войдите или зарегистрируйтесь
<?php/*хук пост обработки формы*/ 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. И проще и правильней.
- Для комментирования войдите или зарегистрируйтесь








Комментарии