Заголовок в основному говорить про все, я хочу відключити один прапорець прапорців типу FAPI.
Я не хочу робити, якщо з JavaScript, і не змінюється його з прапорців на кілька елементів прапорця опцією, оскільки елемент надається іншим модулем.
Думки?
Заголовок в основному говорить про все, я хочу відключити один прапорець прапорців типу FAPI.
Я не хочу робити, якщо з JavaScript, і не змінюється його з прапорців на кілька елементів прапорця опцією, оскільки елемент надається іншим модулем.
Думки?
Відповіді:
Чистий спосіб існує в 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
}
Ще один приклад .
Ви також можете встановити функцію #access на FALSE, щоб повністю приховати прапорець.
На жаль, у FAPI немає дійсно чистого способу зробити це. Ваша найкраща ставка - якщо ви налаштовані - змінити додаткову функцію #process на елемент прапорців.
Функція за замовчуванням, додана до елементів типу "прапорці", насправді є функцією ( expand_checkboxes () ) розбиває один елемент на кілька елементів типу "checkbox", які згодом об'єднуються назад в один. Якщо ви перейдете на вашу другу функцію процесу, вона може потрапити в розширену групу елементів "прапорця" і вимкнути цю проблему.
Наступний код є абсолютно неперевіреним, так що застереження:
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()над результатом.
Ось мій код для Drupal 7, щоб змінити елемент "Ролі" на сторінці "Редагувати користувача".
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;
}
Я використовую прапорці як "призначити" та "скасувати призначення". Клієнт попросив, щоб я відключив "скасувати призначення", але все ще важливо представити "призначення". Маючи на увазі, що прапорці ВИМКНЕНО подаються як "помилкові", і якщо неправильно оброблятися, вони не скасують, я розділив свої прапорці на "обробляти ці" та "ігнорувати цих відключених". Ось як:
// 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" - це власний масив / змінна, і вона не буде оброблятися як "скасувати призначення" в моєму випадку використання. Дякую за публікацію - це привело мене до цього рішення.
D7. Тут ми повинні були переконатися, що при додаванні вузла один певний параметр опорного терміна таксономії завжди не встановлений, і він завжди буде збережений у вузлі. Тому ми ввійшли в #after_build і відключили цю певну опцію, але повинні були переконатися, що врешті-решт певна опція буде передана. Тому що лише відключення це зупинило б перехід цього варіанта на майбутні гачки.
// a constant
define('MYTERM', 113);
/**
* Implements hook_form_alter().
*/
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'MYCONTENTTYPE_node_form') {
$form['#after_build'][] = 'MYMODULE_MYCONTENTTYPE_node_form_after_build';
}
}
/**
* Implements custom after_build_function()
*/
function MYMODULE_MYCONTENTTYPE_node_form_after_build($form, &$form_state) {
foreach (element_children($form['field_MYFIELD'][LANGUAGE_NONE]) as $tid) {
if ($tid == MYTERM) {
$element = &$form['field_MYFIELD'][LANGUAGE_NONE][$tid];
$element['#checked'] = TRUE;
$element['#attributes']['disabled'] = 'disabled';
}
}
// here's ensured the term's travel goes on
$form['field_MYFIELD'][LANGUAGE_NONE]['#value'] += drupal_map_assoc(array(MYTERM));
return $form;
}
Ось так виглядає вимкнений варіант:

Я не міг отримати відповідь Ітона, щоб він працював так, як написано (зворотний виклик #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()
Ось мій код для Drupal 7, щоб змінити елемент "Ролі" на сторінці "Редагувати користувача".
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, щоб вимкнути параметри у виділеному об'єкті, що працює на екрані, я виявив, що мені потрібно встановити #processфункцію. На жаль, це відключило вбудовану функцію процесу form_process_checkboxes, так що її потрібно додати назад (або викликати з вашої функції процесу). Крім того, при відключенні прапорців, які вже встановлені, я виявив, що вбудоване значення зворотного виклику ( form_type_checkboxes_value) ігнорує значення за замовчуванням під час отримання результатів із вхідних даних.
$field_lang_form = &$your_form[$field][LANGUAGE_NONE];
$field_lang_form['#process'][] = 'form_process_checkboxes';
$field_lang_form['#process'][] = 'YOURMODULE_YOURFUNCTION_process';
$field_lang_form['#value_callback'] = 'YOURMODULE_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);
}
Я не виявив, що жодна з інших відповідей на цій сторінці спрацювала в цьому випадку.
Ось мій приклад (з використанням #after_build):
$form['legal']['legal_accept']['#type'] = 'checkboxes';
$form['legal']['legal_accept']['#options'] = $options;
$form['legal']['legal_accept']['#after_build'][] = '_process_checkboxes';
Плюс наступну функцію зворотного виклику:
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.
Ви можете використовувати таку функцію ( джерело ):
/*
* 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 singular
case '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 options
if (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;
} else if (!isset($form[$field_name]['#type']) && is_array($form[$field_name])) { // case: if type not exist, find type from inside of array
foreach ($form[$field_name] as $key => $value) {
if (isset($form[$field_name][$key]['#type'])) {
$curr_arr = &$form[$field_name][$key]; // set array as current
break;
}
}
} else {
$curr_arr = &$form[$field_name]; // set field array as current
}
// set the value
if (isset($curr_arr['#type'])) {
switch ($curr_arr['#type']) {
case 'textfield':
default:
$curr_arr[$keyname] = TRUE;
}
}
}
Я використовую цей код у drupal 6: -
$form['statuses'] = array(
'#type' => 'checkboxes',
'#options' => $statuses,
'#default_value' => $status_val,
'#after_build' => array('legal_process_checkboxes')
);
і функція зворотного дзвінка тут: -
/ ** * Обробляти кожен прапорець на основі "feture" вже використовується субдоменом чи ні. * @param Array $ елемент масив прапорців форми * /
function legal_process_checkboxes($element) {
foreach (element_children($element) as $key) {
$feature_id = $key;
$res_total = '';
$total = feature_used($feature_id) ;
if ($total) {
$element[$key]['#attributes'] = array('disabled' => 'disabled');
}
}
return $element;
}
Важливим фактором є те, що відключені прапорці не надсилаються, тому ви можете виявити, що вам потрібно також #valueзастосувати прапорець. Наприклад:
$element['child1']['#disabled'] = TRUE;
$element['child1']['#value'] = 'child1';
У моєму випадку без цього значення $form_state['values']не містило моє прапорець (яке було включено за замовчуванням, але вимкнено).
Підключіть текстове поле і зробіть динамічне текстове поле з інформацією з бази даних
1 ° отримують доц. масив з бази даних, наприклад
$blah = array('test1' => 'Choose for test1', 'test2' => 'Choose for test2', ...)
2 ° знаряддя hook_form_alter()
/ ** * Реалізує гачок_форма_алтер (). * форма id = перегляди-викриття-форма * /
function test_form_alter(&$form, &$form_state, $form_id)
{
//only for this particular form
if ($form['#id'] == "views-exposed-form-advanced-search-page-2")
{
$form['phases'] = array(
'#type' => 'checkboxes',
'#options' => $blah,
);
}
}
3 ° декілька полів будуть перевірятими!
Якщо ви будуєте свою власну форму, замість того, щоб виконувати окремі функції form_alter / # process / # pre_render, ви можете просто перейти від "прапорців" до створення окремих елементів "прапорця".
$options = array(
1 => t('Option one'),
2 => t('Option two'),
);
// Standard 'checkboxes' method:
$form['my_element'] = array(
'#type' => 'checkboxes',
'#title' => t('Some checkboxes'),
'#options' => $options,
);
// Individual 'checkbox' method:
$form['my_element'] = array(
'#type' => 'container',
'#attributes' => array('class' => array('form-checkboxes')),
'#tree' => TRUE,
'label' => array('#markup' => '<label>' . t('Some checkboxes') . '</label>',
);
foreach ($options as $key => $label) {
$form['my_element'][$key] = array(
'#type' => 'checkbox',
'#title' => $label,
'#return_value' => $key,
);
}
// Set whatever #disabled (etc) properties you need.
$form['my_element'][1]['#disabled'] = TRUE;
'#tree' => TRUEдає вам таку саму структуру дерева, що і версію прапорців, коли масив $ form_state ['значень'] надходить на перевірку / подання / відновлення. Якщо ви не можете або не хочете використовувати #tree з якихось причин, надайте кожному прапорець '#parents' => array('my_element', $key)властивість, щоб явно встановити його положення в структурі значень.