Как отключить один флажок в элементе FAPI «checkboxes»?

Заголовок в основном говорит все, я хочу отключить один флажок элемента checkboxes типа FAPI.

Я не хочу делать, если с JavaScript, и не меняет его с флажками на несколько флажков элементов, поскольку этот элемент предоставляется другим модулем.

Мысли?

31 голос | спросил Decipher 16 MaramWed, 16 Mar 2011 04:35:29 +03002011-03-16T04:35:29+03:0004 2011, 04:35:29

12 ответов


36

В Drupal 7 существует чистый способ! По-видимому, за этот пост он еще не задокументирован.

function mymodule_form_alter (& $ form, & $ form_state, $ form_id) {
  $ form ['checkboxes_element'] ['# disabled'] = TRUE; //отключает все параметры
  $ form ['checkboxes_element'] [abc] ['# disabled'] = TRUE; //отключает параметр, называемый abc
}

Другой пример .

Вы также можете установить функцию #access в FALSE , чтобы полностью скрыть флажок.

ответил timofey 15 ThuEurope/Moscow2011-12-15T14:12:23+04:00Europe/Moscow12bEurope/MoscowThu, 15 Dec 2011 14:12:23 +0400 2011, 14:12:23
22

К сожалению, в FAPI нет действительно чистого способа сделать это. Лучше всего - если вы решите - это изменить дополнительный #process function в элементе checkboxes.

Функция по умолчанию, добавленная к элементам «checkboxes» типа, фактически является функцией ( expand_checkboxes () ) разбивает один элемент на несколько элементов типа 'checkbox', которые позже объединяются обратно в один. Если вы хотите выполнить вторую функцию процесса, она может попасть в расширенную группу элементов «checkbox» и отключить эту информацию.

Следующий код полностью не проверен, поэтому caveat 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) как $ key) {
    if ($ key == YOUR_CHECK_VALUE) {
      $ element [$ key] ['# disabled'] = TRUE;
      вернуть;
    }
  }
}
ответил Eaton 16 MaramWed, 16 Mar 2011 05:40:50 +03002011-03-16T05:40:50+03:0005 2011, 05:40:50
5

Вот мой код для Drupal 7, чтобы изменить элемент Роли на странице Редактировать пользователя.

function mymodule_form_alter (& $ form, & $ form_state, $ form_id) {
  $ form ['checkboxes_element'] ['# pre_render'] [] = 'form_process_checkboxes'; //Я должен был добавить это, или он вернет первую роль только с моим обратным вызовом ниже
  $ form ['checkboxes_element'] ['# pre_render'] [] = 'mymodule_disable_element';
}

function mymodule_disable_element (($ element) {
  foreach (element_children ($ element) как $ key) {
    if ($ key == YOUR_CHECK_VALUE) {
      $ element [$ key] ['# attributes'] ['disabled'] = 'disabled';
    }
  }
  return $ element;
}
ответил afeijo 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 30 Sep 2011 17:17:11 +0400 2011, 17:17:11
3

Я использую флажки как «назначать» и «отменять присвоение». Клиент попросил меня отключить «отменить назначение», но по-прежнему важно представлять «назначение». Помня о том, что флажки DISABLED представлены как «ложные», а если не обрабатываются должным образом, они будут отменены, я делю свои флажки в «обрабатывать эти» и «игнорирую эти отключенные». Вот как это сделать:

//Предоставлять LIVE флажки только для не назначенных партнеров
$ form ['partner'] ['partners'] = массив (
  '#type' => «Галочки»,
  '#options' => array_diff ($ partners, $ assignments),
  '#title' => т ($ partnername),
);
//Предоставляем флажки для отключенных для назначенных партнеров (но с другой переменной, поэтому они не обрабатываются как un-assign)
$ form ['partner'] ['partner_assignments'] = массив (
  '#type' => «Галочки»,
  '#options' => $ задания,
  '#default_value' => array_keys ($ назначения),
  '#disabled' => ПРАВДА,
  '#title' => т ($ partnername),
);

Обратите внимание, что «partner_assignments» - это собственный массив /переменная и не будет обрабатываться как «неприсоединение» в моем случае использования. Спасибо за сообщение - это привело меня к этому решению.

ответил texas-bronius 23 J000000Saturday11 2011, 01:45:41
3

D7. Здесь мы должны были убедиться, что при добавлении узла один определенный ссылочный параметр таксономии всегда неконтролируемый и всегда будет сохранен в узле. Таким образом, мы вошли в #after_build и отключили этот параметр, но должны были убедиться, что в конце будет передан определенный параметр. Причина только отключение его остановила бы эту опцию для будущих перехватов.

//константа
define ('MYTERM', 113);

/**
 * Реализует hook_form_alter ().
 * /
функция MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {
    if ($ form_id == 'MYCONTENTTYPE_node_form') {
    $ form ['# after_build'] [] = 'MYMODULE_MYCONTENTTYPE_node_form_after_build';
    }
}

/**
 * Реализует пользовательскую функцию after_build_function ()
 * /
function MYMODULE_MYCONTENTTYPE_node_form_after_build ($ form, & $ form_state) {
  foreach (element_children ($ form ['field_MYFIELD'] [LANGUAGE_NONE]) как $ tid) {
    if ($ tid == MYTERM) {
      $ element = & $ form ['field_MYFIELD'] [LANGUAGE_NONE] [$ tid];
      $ element ['# checked'] = TRUE;
      $ element ['# attributes'] ['disabled'] = 'disabled';
    }
  }
  //здесь гарантируется, что путешествие продолжается
  $ form ['field_MYFIELD'] [LANGUAGE_NONE] ['# value'] + = drupal_map_assoc (массив (MYTERM));
  return $ form;
}

Вот как выглядит отключенная опция:

введите описание изображения здесь>> </p></div>
										<div class=ответил leymannx 14 FebruaryEurope/MoscowbFri, 14 Feb 2014 14:21:41 +0400000000pmFri, 14 Feb 2014 14:21:41 +040014 2014, 14:21:41

2

Я не мог заставить ответ Eaton работать как написанный (обратный вызов #process ничего не возвращает, и он вызывается до того, как флажки будут расширены), и я также хотел получить значение, возвращенное из запрещенного флажка (я хотел он постоянно проверяется). Это сработало для меня (D6).

function mymodule_form_alter (& $ form, & $ form_state, $ form_id) {
  $ form ['checkboxes_element'] ['# process'] [] = 'mymodule_disable_element';
}

function mymodule_disable_element ($ element) {
  $ expand = expand_checkboxes ($ element);
  $ checkbox = & $ Расширен [YOUR_CHECK_VALUE];
  $ checkbox ['# disabled'] = TRUE;
  $ checkbox ['# value_callback'] = 'mymodule_element_value_callback';
  return $ extended;
}

function mymodule_element_value_callback ($ element, $ edit = FALSE) {
  //Возвращаем любое значение, которое вы хотели бы здесь, иначе элемент вернется
  //FALSE, потому что он отключен.
  return 'VALUE';
}

Если кто-нибудь знает более аккуратный способ, я бы хотел его услышать!

ответил Andy 25 Maypm11 2011, 17:18:04
1

Вот мой код для Drupal 7, чтобы изменить элемент Роли на странице Редактировать пользователя.

function mymodule_form_alter (& $ form, & $ form_state, $ form_id) {
  $ form ['checkboxes_element'] ['# pre_render'] [] = 'form_process_checkboxes'; //Я должен был добавить это, или он вернет первую роль только с моим обратным вызовом ниже
  $ form ['checkboxes_element'] ['# pre_render'] [] = 'mymodule_disable_element';
}

function mymodule_disable_element (($ element) {
  foreach (element_children ($ element) как $ key) {
    if ($ key == YOUR_CHECK_VALUE) {
      $ element [$ key] ['# attributes'] ['disabled'] = 'disabled';
      return $ element;
    }
  }
  return $ element;
}
ответил jrockowitz 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 21:33:49 +0400 2011, 21:33:49
1

В 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';

Тогда что-то вроде этого:

функция YOURMODULE_YOURFUNCTION_process ($ element) {
  //Запретить доступ к ВАШЕЙ ПРИЧИНОЙ, но показывать как отключен, если параметр установлен.
  foreach (element_children ($ element) как $ field) {
    если (ПРИЧИНА ОТКЛЮЧИТЬ ЗДЕСЬ) {
      if (! empty ($ element [$ field] ['# default_value'])) {
        $ element [$ field] ['# disabled'] = TRUE;
      } else {
        $ element [$ club] ['# access'] = FALSE;
      }
    }
  }
  return $ element;
}

И наконец:

функция YOURMODULE_form_type_checkboxes_value ($ element, $ input = FALSE) {
  if ($ input! == FALSE) {
    foreach ($ element ['# default_value'] как $ value) {
      если (ЭТО ОПЦИЯ БЫЛО УСТАНОВЛЕНА И ОТКЛЮЧЕНА - ВАША БИЗНЕС-ЛОГИКА) {
        //Этот параметр был отключен и не был возвращен браузером. Установите его вручную.
        $ input [$ value] = $ value;
      }
    }
  }
  return form_type_checkboxes_value ($ element, $ input);
}

Я не нашел, что в этом случае работали другие ответы на этой странице.

ответил Dan Chadwick 21 Jpm1000000pmWed, 21 Jan 2015 16:37:49 +030015 2015, 16:37:49
1

Вот мой пример (используя #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) как $ key) {
    if ($ key == 0) {//значение вашего флажка, 0, 1 и т. д.
      $ element [$ key] ['# attributes'] = array ('disabled' => 'disabled');
      //$ element [$ key] ['# theme'] = 'hidden'; //скрыть полностью
    }
  }
  return $ element;
}

Протестировано на Drupal 6, но оно должно работать и на Drupal 7.


Drupal 6

Вы можете использовать следующую функцию ( источник ):

/*
 * Изменить параметры для отдельного флажка или поля радио в форме
 * Вы можете использовать эту функцию, используя hook_alter hook.
 * i.e_set_checkbox_option ('field_tier_level', 'associate', array ('# disabled' => 'disabled'), $ form);
 *
 * @param $ field_name (строка)
 * Название поля в форме
 * @param $ checkbox_name (строка)
 * Имя галочки для изменения параметров (если оно равно null, установлено для всех)
 * @param $ options (array)
 * Пользовательские параметры для установки
 * @param $ form (array)
 * Форма для изменения
 *
 * @author kenorb на 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] как $ key => $ value) {
            if (isset ($ form [$ field_name] [$ key] ['# type'])) {
                $ curr_arr = & $ form [$ field_name] [$ key]; //установить массив как текущий
                $ type = $ form [$ field_name] [$ key] ['# type'];
                ломать;
            }
        }
        if (isset ($ curr_arr) & & is_array ($ curr_arr ['# default_value'])) {
            switch ($ type) {//изменен тип от множественного числа до единственного
                case 'radioios':
                    $ type = 'radio';
                    ломать;
                case 'checkboxes':
                    $ type = 'checkbox';
                    ломать;
            }

            foreach ($ curr_arr ['# default_value'] как $ key => $ value) {
                foreach ($ curr_arr as $ old_key => $ old_value) {//копировать существующие параметры для текущей опции
                    $ new_options [$ old_key] = $ old_value;
                }
                $ new_options ['# type'] = $ type; //задать тип
                $ new_options ['# title'] = $ value; //задаем правильное название опции
                $ curr_arr [$ key] = $ new_options; //установить новые параметры

                if (empty ($ checkbox_name) || strcasecmp ($ checkbox_name, $ value) == 0) {//проверить имя или установить для
                    foreach ($ options as $ new_key => $ new_value) {
                        $ curr_arr [$ key] [$ new_key] = $ value;
                    }
                }
            }
            переменная не установлена ​​($ curr_arr [ 'опции #']); //удаление старых параметров
        } else {
            return NULL;
        }
    } else {
        return NULL;
    }
}

/*
 * Отключить выбранное поле в форме (независимо от текстового поля, флажка или радио)
 * Вы можете использовать эту функцию, используя hook_alter hook.
 * i.e_disable_field ('title', $ form);
 *
 * @param $ field_name (строка)
 * Название поля в форме
 * @param $ form (array)
 * Форма для изменения
 *
 * @author kenorb на gmail.com
 * /
function _disable_field ($ field_name, & $ form) {
    $ keyname = '#disabled';

    if (! isset ($ form [$ field_name])) {//case: если поле не существует, поместите ключевое имя в основной массив
        $ form [$ keyname] = TRUE;
    } else if (! isset ($ form [$ field_name] ['# type']) & & is_array ($ form [$ field_name])) {//case: если тип не существует, найдите тип изнутри массива
        foreach ($ form [$ field_name] как $ key => $ value) {
            if (isset ($ form [$ field_name] [$ key] ['# type'])) {
                $ curr_arr = & $ form [$ field_name] [$ key]; //установить массив как текущий
                ломать;
            }
        }
    } else {
        $ curr_arr = & $ form [$ field_name]; //задаем массив полей как текущий
    }

    //установить значение
    if (isset ($ curr_arr ['# type])) {
        switch ($ curr_arr ['# type']) {
            case 'textfield':
            по умолчанию:
                $ curr_arr [$ keyname] = TRUE;
        }
    }
}
ответил kenorb 9 52012vEurope/Moscow11bEurope/MoscowFri, 09 Nov 2012 18:18:49 +0400 2012, 18:18:49
0

Я использую этот следующий код в drupal 6: -

$ form ['statuses'] = array (
    '#type' => «Галочки»,
    '#options' => $ статусы,
    '#default_value' => $ Status_val,
    '#after_build' => массив ( '') legal_process_checkboxes
    );

и функция обратного вызова здесь: -

/**  * Обработать каждый флажок на основе «feture» уже используется субдоменом или нет.  * @param Array $ element array of form checkboxes  * /

function legal_process_checkboxes ($ element) {

  foreach (element_children ($ element) как $ key) {

    $ feature_id = $ key;
    $ res_total = '';

    $ total = feature_used ($ feature_id);

    if ($ total) {
      $ element [$ key] ['# attributes'] = array ('disabled' => 'disabled');
    }
  }
  return $ element;
}
ответил Sandip Ghosh 25 Jpm1000000pmFri, 25 Jan 2013 13:52:43 +040013 2013, 13:52:43
0

Важное значение имеет то, что отключенные флажки не передаются, поэтому вы можете обнаружить, что вам нужно также установить флажок #value. Например:

$ element ['child1'] ['# disabled'] = TRUE;
$ element ['child1'] ['# value'] = 'child1';

В моем случае без этого $ form_state ['values'] не содержал мое значение флажка (которое было включено по умолчанию, но отключено).

ответил Nick 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 10 Sep 2013 19:12:11 +0400 2013, 19:12:11
0

Подключить текстовое поле и создать динамическое текстовое поле с информацией из базы данных

1Â ° получить связь. массив из базы данных, например

$ blah = array ('test1' => 'Выбрать для test1', 'test2' => 'Выбрать для test2', ...)

2Â ° Реализует hook_form_alter ()

/**  * Реализует hook_form_alter ().  * form id = view-exposure-form  * /

function test_form_alter (& $ form, & $ form_state, $ form_id)
{
  //только для этой конкретной формы
  if ($ form ['# id'] == "views-exposure-form-advanced-search-page-2")
    {
       $ form ['phase'] = array (
           '#type' => «Галочки»,
           '#options' => $ Бла,
      );
    }
}

3 ° много полей будут проверяться!

ответил Mathieu Dierckx 6 42014vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2014 13:44:45 +0300 2014, 13:44:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132