Как правильно скрыть CCK поле на форме редактирования ноды?

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

Аватар пользователя CALLIKA CALLIKA 13 июля 2010 в 11: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 модулем). Почему - пока разобраться не получилось Sad (в системе куча модулей стоит)

собственно вопросы:
1. если у кого-нибудь есть идеи по поводу возникающей ошибки - буду очень рад выслушать
2. [главный вопрос] как ПРАВИЛЬНО скрыть поле/группу полей с формы редактирования ноды? Так, что бы пользователь никак не мог это поле изменить (тот же CSS в этом случае не подойдет). Любым ссылкам на мануалы/статьи буду очень рад.

спасибо Smile

Комментарии

Аватар пользователя Orion76 Orion76 13 июля 2010 в 12:35

4 вариант у меня получался..но как-то через Ж...и через form_alter, ключевое слово -вес модуля(порядок обработки формы модулями).
Но опять-же, это не спасает от редактирование пользователем html-кода

Тоже очень хотел бы разобраться в этом вопросе...
Вопрос, как мне кажется, довольно таки актуальный...но 100%-ных решений пока не видел...
Почему стандартно не реализованы функции управления полями формы?

Аватар пользователя CALLIKA CALLIKA 13 июля 2010 в 13:12

"George88" wrote:
может hook_form_alter?

3, 4 и 5 через hook_form_alter и работали
"bodro" wrote:
Может лучше модулями Content Permissions или Field Permissions

Field Permissions у меня стоит, использую в тругих типах. Думаю, он не подойдет, т.к. будет полностью закрыт доступ к этим полям и cnr может натворить косяков... хотя попробую включить, может и поможет...
"orion76" wrote:
ключевое слово -вес модуля(порядок обработки формы модулями).

ну это я уже научился обходить... хотя конечно из-за этих весов проблемы регулярно всплывают... Sad
"vitaliy.stymkovskyy" wrote:
http://drupal.org/project/nodeformcols - классная штука

с виду и правда классная Smile вечерком попробую:)

Аватар пользователя CALLIKA CALLIKA 13 июля 2010 в 13:14

Тем не менее вопрос все еще актуален - хочется выяснить для себя как правильно скрывать поля с помощью кода. Думаю ответ многим будет полезен и интересен Smile

Аватар пользователя Orion76 Orion76 13 июля 2010 в 15:03

Поиск по drupal.org по разделу Modules - запрос "form"
вывел много интересных модулей для редактирования форм.
Правда в основном они предоставляют API для обработки форм.
Надо будет как-нибудь приглядеться.

Аватар пользователя Dan Dan 14 июля 2010 в 2:22

Рубить лес и идти напролом это конечно весело, но иногда стоит остановиться, посмотреть как растёт сакура что пишут в комментах и увидеть:

"bodro" wrote:
Content Permissions

Посмотрите исходник модуля - там несколько строк или просто включите модуль и получите профит.

Аватар пользователя CALLIKA CALLIKA 14 июля 2010 в 23:28

Dan wrote:
Рубить лес и идти напролом это конечно весело, но иногда стоит остановиться, посмотреть как растёт сакура что пишут в комментах и увидеть:
"bodro" wrote:
Content Permissions

Посмотрите исходник модуля - там несколько строк или просто включите модуль и получите профит.

Можно линк на этот модуль? а то я сам не нашел с таким названием (Поиск по модулям друпала + Google) Sad может он как то чуть по-другому называется?

Аватар пользователя Orion76 Orion76 15 июля 2010 в 12:02
1. на after build
2. на submit
в первом я сохраняю в $form_state все поле которое хочу скрыть и делаю ему unset.
во втором, я из $form_state выдергиваю сохраненные ранее данные и вставляю обратно в форму. (так же слежу за тем, что бы мой обработчик на сабмит выполнялся перед всеми остальными)

Вот этот вариант мне нравиться, или что-то наподобие...
Осталось только довести до ума...
А можно поподробнее... как делали ?

Аватар пользователя CALLIKA CALLIKA 17 июля 2010 в 17:11

"orion76" wrote:
А можно поподробнее... как делали ?

/*хук пост обработки формы*/
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'];
}

как-то так я делал... Smile

"wargan" wrote:
у меня вызвало конфликт с модулем User Relationships - поле исчезло

хорошо тогда, что я его не использую...

Аватар пользователя Koder Koder 16 января 2011 в 10:43

"CALLIKA" wrote:
<?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 и других типов, значения не сохраняются после отправки формы.