Как правильно скрыть 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 в этом случае не подойдет). Любым ссылкам на мануалы/статьи буду очень рад.

спасибо :)

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано George88 в вт, 13/07/2010 - 08:14.

может hook_form_alter?


Опубликовано bodro в вт, 13/07/2010 - 08:21.

Может лучше модулями Content Permissions или Field Permissions


Опубликовано vitaliy.stymkovskyy в вт, 13/07/2010 - 08:20.

http://drupal.org/project/nodeformcols - классная штука


Опубликовано orion76 в вт, 13/07/2010 - 08:35.

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

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


Опубликовано vitaliy.stymkovskyy в вт, 13/07/2010 - 08:49.

я ж тебе скинул ссылку на модуль через него можна скрыть любые поля!!


Опубликовано CALLIKA в вт, 13/07/2010 - 09:12.

"George88" написал(а):

может hook_form_alter?

3, 4 и 5 через hook_form_alter и работали

"bodro" написал(а):

Может лучше модулями Content Permissions или Field Permissions

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

"orion76" написал(а):

ключевое слово -вес модуля(порядок обработки формы модулями).

ну это я уже научился обходить... хотя конечно из-за этих весов проблемы регулярно всплывают... :(

"vitaliy.stymkovskyy" написал(а):

http://drupal.org/project/nodeformcols - классная штука

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


Опубликовано CALLIKA в вт, 13/07/2010 - 09:14.

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


Опубликовано orion76 в вт, 13/07/2010 - 11:03.

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


Опубликовано CALLIKA в вт, 13/07/2010 - 20:37.

попробовал http://drupal.org/project/nodeformcols - отличная штука! рекомендую всем! еще было бы разделение настроек по ролям... будет время допишу... (ну или погуглю... :D )


Опубликовано Dan в вт, 13/07/2010 - 22:22.

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

"bodro" написал(а):

Content Permissions

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


Опубликовано CALLIKA в ср, 14/07/2010 - 19:28.

Dan написал(а):

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

"bodro" написал(а):

Content Permissions

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

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


Опубликовано Dan в ср, 14/07/2010 - 20:47.

Нет, он называется именно так и входит в состав ССК


Опубликовано orion76 в чт, 15/07/2010 - 08:02.

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

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


Опубликовано Dan в чт, 15/07/2010 - 09:02.

http://drupal.org/node/357328


Опубликовано wargan в чт, 15/07/2010 - 10:18.

"CALLIKA" написал(а):

попробовал http://drupal.org/project/nodeformcols - отличная штука! рекомендую всем!

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


Опубликовано CALLIKA в сб, 17/07/2010 - 13:11.

"orion76" написал(а):

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

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

как-то так я делал... =)

"wargan" написал(а):

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

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


Опубликовано Koder в вс, 16/01/2011 - 07:43.

"CALLIKA" написал(а):

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


Опубликовано Dan в вс, 16/01/2011 - 12:24.

Это велосипед. Меняй access на false. И проще и правильней.