Чистый способ существует в Drupal 7! Судя по всему, это еще не задокументировано.
function mymodule_form_alter(&$form,&$form_state, $form_id){
$form['checkboxes_element']['#disabled']= TRUE;//disables all options
$form['checkboxes_element'][abc]['#disabled']= TRUE;//disables option, called abc}
С исправленной опечаткой этот код абсолютно у меня работает в D7. Спасибо!
Бэт
1
Отличный улов! Рад, что это сработало для вас.
timofey.com
2
Если вы используете #access, то если в #default_values установлен флажок, он не будет установлен в значениях состояния формы при отправке.
Ник
Это хорошо работает.
Дэвид Майстер
Не будет работать с флажками (можно выбрать более одного элемента) с использованием улучшенных открытых фильтров (BEF) в представлениях, AFAICT.
1kenthomas
22
К сожалению, в FAPI нет действительно чистого способа сделать это. Лучше всего - если вы решительно настроены - изменить дополнительную функцию #process на элемент checkboxes.
Функция по умолчанию, добавляемая к элементам типа 'checkboxes', на самом деле является функцией ( expand_checkboxes () ), которая разбивает отдельный элемент на несколько элементов типа 'checkbox', которые впоследствии объединяются в один. Если бы вам пришлось добавить вторую функцию процесса, она могла бы попасть в расширенную группу элементов 'checkbox' и отключить рассматриваемый элемент.
Следующий код совершенно не проверен, поэтому будьте осторожны с emptor:
function mymodule_form_alter(&$form,&$form_state, $form_id){
$form['checkboxes_element']['#process'][]='mymodule_disable_element';}function mymodule_disable_element($element){foreach(element_children($element)as $key){if($key == YOUR_CHECK_VALUE){
$element[$key]['#disabled']= TRUE;return;}}}
Звучит лучше, чем подход, который я выбрал: прикрепить функцию темы к элементу и выполнить preg_replace()вывод поверх результата.
Расшифровка
Вы можете добавить «перерыв»; внутри приведенного выше оператора if для большей эффективности, если только вы не ожидаете увидеть один и тот же ключ элемента дважды.
Крис Коэн
Хороший улов, Крис, я изменил фрагмент кода. Благодарность!
Итон
2
Принятый ответ кажется немного излишним по сравнению с ответом @ timofey.
Citricguy
6
Вот мой код для Drupal 7, чтобы изменить элемент Roles на странице Edit User.
function mymodule_form_alter(&$form,&$form_state, $form_id){
$form['checkboxes_element']['#pre_render'][]='form_process_checkboxes';// I had to add this one, or it will return the first role only with my callback bellow
$form['checkboxes_element']['#pre_render'][]='mymodule_disable_element';}function mymodule_disable_element(($element){foreach(element_children($element)as $key){if($key == YOUR_CHECK_VALUE){
$element[$key]['#attributes']['disabled']='disabled';}}return $element;}
Я использую флажки как «назначить» и «отменить». Клиент попросил, чтобы я отключил «unassign», но все равно важно представлять «назначение». Имея в виду, что флажки ОТКЛЮЧЕНО отправляются как «ложь», и если они не обрабатываются должным образом, будут отменены, я разделил свои флажки на «обработать эти» и «проигнорировал эти отключенные». Вот как:
// Provide LIVE checkboxes only for un-assigned Partners
$form['partner']['partners']= array('#type'=>'checkboxes','#options'=> array_diff($partners, $assignments),'#title'=> t($partnername),);// Provide DISABLED checkboxes for assigned Partners (but with a different variable, so it doesn't get processed as un-assignment)
$form['partner']['partner_assignments']= array('#type'=>'checkboxes','#options'=> $assignments,'#default_value'=> array_keys($assignments),'#disabled'=> TRUE,'#title'=> t($partnername),);
Обратите внимание, что 'partner_assignments' является его собственным массивом / переменной и не будет обрабатываться как "unassign" в моем случае использования. Спасибо за публикацию - это привело меня к этому решению.
D7. Здесь мы должны были убедиться, что при добавлении узла один определенный параметр ссылки на термин таксономии всегда не проверяется и всегда будет сохраняться на узле. Таким образом, мы вошли в #after_build и отключили эту определенную опцию, но должны были убедиться, что в конце эта опция будет передана. Только отключив его, можно было бы остановить путешествие этой опции к будущим хукам.
Я не мог заставить ответ Итона работать как написано (обратный вызов #process ничего не возвращает, и он вызывается до расширения флажков), и я также хотел получить значение, возвращаемое из отключенного флажка (я хотел, чтобы он был постоянно проверен ). Это сработало для меня (D6).
function mymodule_form_alter(&$form,&$form_state, $form_id){
$form['checkboxes_element']['#process'][]='mymodule_disable_element';}function mymodule_disable_element($element){
$expanded = expand_checkboxes($element);
$checkbox =& $expanded[YOUR_CHECK_VALUE];
$checkbox['#disabled']= TRUE;
$checkbox['#value_callback']='mymodule_element_value_callback';return $expanded;}function mymodule_element_value_callback($element, $edit = FALSE){// Return whatever value you'd like here, otherwise the element will return// FALSE because it's disabled.return'VALUE';}
Если кто-нибудь знает более аккуратный способ, я хотел бы услышать это!
Fatal error: Call to undefined function expand_checkboxes()
leymannx
1
@koivo Это был ответ D6, функция больше не существует в D7
Энди
1
Вот мой код для Drupal 7, чтобы изменить элемент Roles на странице Edit User.
function mymodule_form_alter(&$form,&$form_state, $form_id){
$form['checkboxes_element']['#pre_render'][]='form_process_checkboxes';// I had to add this one, or it will return the first role only with my callback bellow
$form['checkboxes_element']['#pre_render'][]='mymodule_disable_element';}function mymodule_disable_element(($element){foreach(element_children($element)as $key){if($key == YOUR_CHECK_VALUE){
$element[$key]['#attributes']['disabled']='disabled';return $element;}}return $element;}
В Drupal 7, чтобы отключить опции в select в полевом объекте, я обнаружил, что мне нужно установить #processфункцию. К сожалению, это отключило встроенную функцию процесса form_process_checkboxes, поэтому ее необходимо добавить обратно (или вызвать из функции процесса). Кроме того, при отключении флажков, которые уже установлены, я обнаружил, что встроенное значение callback ( form_type_checkboxes_value) игнорирует значения по умолчанию при получении результатов из ввода.
function YOURMODULE_YOURFUNCTION_process($element){// Disallow access YOUR REASON, but show as disabled if option is set.foreach(element_children($element)as $field){if(REASON TO DISABLE HERE){if(!empty($element[$field]['#default_value'])){
$element[$field]['#disabled']= TRUE;}else{
$element[$club]['#access']= FALSE;}}}return $element;}
И наконец:
function YOURMODULE_form_type_checkboxes_value($element, $input = FALSE){if($input !== FALSE){foreach($element['#default_value']as $value){if(THIS OPTION WAS SET AND DISABLED - YOUR BUSINESS LOGIC){// This option was disabled and was not returned by the browser. Set it manually.
$input[$value]= $value;}}}return form_type_checkboxes_value($element, $input);}
Я не нашел, что какой-либо другой ответ на этой странице работал в этом случае.
function _process_checkboxes($element){foreach(element_children($element)as $key){if($key ==0){// value of your checkbox, 0, 1, etc.
$element[$key]['#attributes']= array('disabled'=>'disabled');// $element[$key]['#theme'] = 'hidden'; // hide completely}}return $element;}
Протестировано на Drupal 6, но должно работать и на Drupal 7.
Drupal 6
Вы можете использовать следующую функцию ( источник ):
/*
* Change options for individual checkbox or radio field in the form
* You can use this function using form_alter hook.
* i.e. _set_checkbox_option('field_tier_level', 'associate', array('#disabled' => 'disabled'), $form);
*
* @param $field_name (string)
* Name of the field in the form
* @param $checkbox_name (string)
* Name of checkbox to change options (if it's null, set to all)
* @param $options (array)
* Custom options to set
* @param $form (array)
* Form to change
*
* @author kenorb at gmail.com
*/function _set_checkbox_option($field_name, $checkbox_name = NULL, $options,&$form){if(isset($form[$field_name])&& is_array($form[$field_name])){foreach($form[$field_name]as $key => $value){if(isset($form[$field_name][$key]['#type'])){
$curr_arr =&$form[$field_name][$key];// set array as current
$type = $form[$field_name][$key]['#type'];break;}}if(isset($curr_arr)&& is_array($curr_arr['#default_value'])){switch($type){// changed type from plural to singularcase'radios':
$type ='radio';break;case'checkboxes':
$type ='checkbox';break;}foreach($curr_arr['#default_value']as $key => $value){foreach($curr_arr as $old_key => $old_value){// copy existing options for to current option
$new_options[$old_key]= $old_value;}
$new_options['#type']= $type;// set type
$new_options['#title']= $value;// set correct title of option
$curr_arr[$key]= $new_options;// set new optionsif(empty($checkbox_name)|| strcasecmp($checkbox_name, $value)==0){// check name or set for foreach($options as $new_key => $new_value){
$curr_arr[$key][$new_key]= $value;}}}
unset($curr_arr['#options']);// delete old options settings}else{return NULL;}}else{return NULL;}}/*
* Disable selected field in the form(whatever if it's textfield, checkbox or radio)
* You can use this function using form_alter hook.
* i.e. _disable_field('title', $form);
*
* @param $field_name (string)
* Name of the field in the form
* @param $form (array)
* Form to change
*
* @author kenorb at gmail.com
*/function _disable_field($field_name,&$form){
$keyname ='#disabled';if(!isset($form[$field_name])){// case: if field doesn't exists, put keyname in the main array
$form[$keyname]= TRUE;}elseif(!isset($form[$field_name]['#type'])&& is_array($form[$field_name])){// case: if type not exist, find type from inside of arrayforeach($form[$field_name]as $key => $value){if(isset($form[$field_name][$key]['#type'])){
$curr_arr =&$form[$field_name][$key];// set array as currentbreak;}}}else{
$curr_arr =&$form[$field_name];// set field array as current}// set the valueif(isset($curr_arr['#type'])){switch($curr_arr['#type']){case'textfield':default:
$curr_arr[$keyname]= TRUE;}}}
/ ** * Обрабатывать каждый флажок на основе 'feture', который уже используется поддоменом или нет. * @param Array $ element array of checkboxes формы * /
Добро пожаловать на drupal.stackexchange.com! Пожалуйста, исправьте форматирование вашего кода. Комментарии перед функцией legal_process_checkboxes () остались вне формата «код». Спасибо.
ermannob
0
Важно учитывать, что отключенные флажки не отправляются, поэтому вы можете обнаружить, что вам #valueтоже нужно установить флажок. Например:
Подключите текстовое поле и создайте динамическое текстовое поле с информацией из базы данных
1 ° получить доц. массив из базы данных, например
$blah = array('test1'=>'Choose for test1','test2'=>'Choose for test2',...)
2 ° орудия hook_form_alter()
/ ** * Реализует hook_form_alter (). * id формы = вид-выставленная-форма * /
function test_form_alter(&$form,&$form_state, $form_id){//only for this particular formif($form['#id']=="views-exposed-form-advanced-search-page-2"){
$form['phases']= array('#type'=>'checkboxes','#options'=> $blah,);}}
Если вы создаете свою собственную форму, вместо выполнения отдельных функций form_alter / # process / # pre_render вы можете просто переключиться с «флажков» на создание отдельных элементов «флажков».
'#tree' => TRUEдает ту же древовидную структуру, что и версия флажков, когда массив $ form_state ['values'] прибывает при проверке / отправке / перестройке. Если вы не можете или не хотите использовать #tree по какой-либо причине, присвойте каждому флажку '#parents' => array('my_element', $key)свойство, чтобы явно установить его положение в структуре значений.
Ответы:
Чистый способ существует в Drupal 7! Судя по всему, это еще не задокументировано.
Еще один пример .
Вы также можете установить функцию #access в FALSE, чтобы полностью скрыть флажок.
источник
К сожалению, в FAPI нет действительно чистого способа сделать это. Лучше всего - если вы решительно настроены - изменить дополнительную функцию #process на элемент checkboxes.
Функция по умолчанию, добавляемая к элементам типа 'checkboxes', на самом деле является функцией ( expand_checkboxes () ), которая разбивает отдельный элемент на несколько элементов типа 'checkbox', которые впоследствии объединяются в один. Если бы вам пришлось добавить вторую функцию процесса, она могла бы попасть в расширенную группу элементов 'checkbox' и отключить рассматриваемый элемент.
Следующий код совершенно не проверен, поэтому будьте осторожны с emptor:
источник
preg_replace()
вывод поверх результата.Вот мой код для Drupal 7, чтобы изменить элемент Roles на странице Edit User.
источник
Я использую флажки как «назначить» и «отменить». Клиент попросил, чтобы я отключил «unassign», но все равно важно представлять «назначение». Имея в виду, что флажки ОТКЛЮЧЕНО отправляются как «ложь», и если они не обрабатываются должным образом, будут отменены, я разделил свои флажки на «обработать эти» и «проигнорировал эти отключенные». Вот как:
Обратите внимание, что 'partner_assignments' является его собственным массивом / переменной и не будет обрабатываться как "unassign" в моем случае использования. Спасибо за публикацию - это привело меня к этому решению.
источник
D7. Здесь мы должны были убедиться, что при добавлении узла один определенный параметр ссылки на термин таксономии всегда не проверяется и всегда будет сохраняться на узле. Таким образом, мы вошли в #after_build и отключили эту определенную опцию, но должны были убедиться, что в конце эта опция будет передана. Только отключив его, можно было бы остановить путешествие этой опции к будущим хукам.
Вот как выглядит отключенная опция:
источник
Я не мог заставить ответ Итона работать как написано (обратный вызов #process ничего не возвращает, и он вызывается до расширения флажков), и я также хотел получить значение, возвращаемое из отключенного флажка (я хотел, чтобы он был постоянно проверен ). Это сработало для меня (D6).
Если кто-нибудь знает более аккуратный способ, я хотел бы услышать это!
источник
Fatal error: Call to undefined function expand_checkboxes()
Вот мой код для Drupal 7, чтобы изменить элемент Roles на странице Edit User.
источник
В Drupal 7, чтобы отключить опции в select в полевом объекте, я обнаружил, что мне нужно установить
#process
функцию. К сожалению, это отключило встроенную функцию процессаform_process_checkboxes
, поэтому ее необходимо добавить обратно (или вызвать из функции процесса). Кроме того, при отключении флажков, которые уже установлены, я обнаружил, что встроенное значение callback (form_type_checkboxes_value
) игнорирует значения по умолчанию при получении результатов из ввода.Тогда как то так:
И наконец:
Я не нашел, что какой-либо другой ответ на этой странице работал в этом случае.
источник
Вот мой пример (используя
#after_build
):Плюс следующая функция обратного вызова:
Протестировано на Drupal 6, но должно работать и на Drupal 7.
Drupal 6
Вы можете использовать следующую функцию ( источник ):
источник
Я использую следующий код на drupal 6: -
и функция обратного вызова здесь: -
/ ** * Обрабатывать каждый флажок на основе 'feture', который уже используется поддоменом или нет. * @param Array $ element array of checkboxes формы * /
источник
Важно учитывать, что отключенные флажки не отправляются, поэтому вы можете обнаружить, что вам
#value
тоже нужно установить флажок. Например:В моем случае, без этого,
$form_state['values']
не было моего значения флажка (который был включен по умолчанию, но отключен).источник
Подключите текстовое поле и создайте динамическое текстовое поле с информацией из базы данных
1 ° получить доц. массив из базы данных, например
2 ° орудия
hook_form_alter()
/ ** * Реализует hook_form_alter (). * id формы = вид-выставленная-форма * /
3 ° несколько полей будут проверяться!
источник
Если вы создаете свою собственную форму, вместо выполнения отдельных функций form_alter / # process / # pre_render вы можете просто переключиться с «флажков» на создание отдельных элементов «флажков».
'#tree' => TRUE
дает ту же древовидную структуру, что и версия флажков, когда массив $ form_state ['values'] прибывает при проверке / отправке / перестройке. Если вы не можете или не хотите использовать #tree по какой-либо причине, присвойте каждому флажку'#parents' => array('my_element', $key)
свойство, чтобы явно установить его положение в структуре значений.источник