it-swarm-eu.dev

Jak mohu zakázat jedno zaškrtávací políčko v prvku FAPI „zaškrtávací políčka“?

Název v podstatě říká, že vše, chci zakázat jediné zaškrtávací políčko zaškrtávací políčka typ FAPI prvku.

Nechci dělat, jestli s JavaScriptem, ani ho nemění z zaškrtávací políčka na více zaškrtávací políčka prvků možnost, protože prvek poskytuje jiný modul.

Myšlenky?

31
Decipher

Čistý způsob existuje v Drupal 7!) Zdá se, že na tento příspěvek to ještě není zdokumentováno.

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
}

Další příklad .

Můžete také nastavit funkci # access na FALSE, aby bylo políčko zcela skryto.

36
timofey.com

Ve FAPI bohužel neexistuje žádný skutečně čistý způsob. Vaše nejlepší sázka - pokud jste odhodláni - je změnit další # procesní funkce na prvek zaškrtávacích políček.

Výchozí funkce přidaná k prvkům typu 'checkboxes' je ve skutečnosti funkce ( expand_checkboxes () ) rozděluje jeden prvek na více prvků typu 'checkbox', které se později sloučí zpět do jednoho. Pokud byste měli vzít na sebe vaši druhou procesní funkci, mohla by zasáhnout do rozšířené skupiny prvků „zaškrtávací políčko“ a zakázat dotyčný.

Následující kód je naprosto netestovaný, takže buďte opatrní:

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;
    }
  }
}
22
Eaton

Tady je můj kód pro Drupal 7) pro změnu prvku Role na stránce Upravit uživatele.

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;
}
6
aFeijo

Zaškrtávací políčka používám jako „přiřadit“ a „zrušit přiřazení“. Klient požádal, aby jsem zakázal „unassign“, ale je stále důležité reprezentovat „přiřazení“. Vzhledem k tomu, že zaškrtávací políčka ZAKÁZANÉ se odesílají jako „nepravdivé“ a pokud nebude správně zacházeno, nebudou přiřazeny, rozdělím zaškrtávací políčka na „zpracovat tato“ a „ignorovat tato zakázaná“. Zde je návod:

// 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),
);

Všimněte si, že 'partner_assignments' je vlastní pole/proměnná a v mém případě použití nebude zpracováno jako "unassign". Díky za zveřejnění-- vedlo mě k tomuto řešení.

3
texas-bronius

D7. Zde jsme se museli ujistit, že při přidávání uzlu není vždy možné určit určitou taxonomii referenční referenční možnost a bude vždy uložena do uzlu. Takže jsme šli do #after_build a zakázali jsme tuto možnost, ale museli jsme se ujistit, že nakonec bude tato možnost předána. Protože pouze deaktivace by zastavila cestování této možnosti do budoucích háčků.

// 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;
}

Takto vypadá zakázaná možnost:

enter image description here

3
leymannx

Nemohl jsem dostat Eatonovu odpověď tak, aby fungovala tak, jak je napsaná (#process callback nic nevrátí, a to se nazývá před rozbalením zaškrtávacích políček) a také jsem chtěl, aby byla hodnota vrácena z deaktivovaného zaškrtávacího políčka (chtěla jsem, aby byla trvale zaškrtnuta ). Fungovalo to pro mě (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';
}

Pokud někdo zná hezčí způsob, rád bych to slyšel!

2
Andy

V Drupal 7), abych zakázal možnosti ve výběru v polní entitě, zjistil jsem, že musím nainstalovat #process funkce. Bohužel to deaktivovalo vestavěnou funkci procesu, form_process_checkboxes, takže je třeba ji přidat zpět (nebo zavolat z vaší procesní funkce). Navíc při deaktivaci zaškrtávacích políček, která jsou již zaškrtnutá, jsem zjistil, že vestavěná hodnota zpětného volání (form_type_checkboxes_value) ignoruje výchozí nastavení při načítání výsledků ze vstupu.

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

Pak něco takového:

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;
}

A nakonec:

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);
}

Nezjistil jsem, že by v tomto případě fungovala některá z dalších odpovědí na této stránce.

1
Dan Chadwick

Zde je můj příklad (pomocí #after_build):

$form['legal']['legal_accept']['#type'] = 'checkboxes';
$form['legal']['legal_accept']['#options'] = $options;
$form['legal']['legal_accept']['#after_build'][] = '_process_checkboxes';

Plus následující zpětné volání funkce:

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;
}

Testováno dne Drupal 6, ale mělo by to fungovat i proDrupal 7).


Drupal 6

Můžete použít následující funkci ( zdroj ):

/*
 * 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;
        }
    }
}
1
kenorb

Tady je můj kód pro Drupal 7) pro změnu prvku Role na stránce Upravit uživatele.

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;
}
1
jrockowitz

Zavěste textové pole a vytvořte dynamické textové pole s informacemi z databáze

1 ° získejte doc. pole z databáze, např

$blah = array('test1' => 'Choose for test1', 'test2' => 'Choose for test2', ...)

2 ° Implementace hook_form_alter()

/ ** * Implementuje hook_form_alter (). * forma id = zobrazení-exponovaná forma * /

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 ° více polí bude kontrolovatelné!

0
Mathieu Dierckx

Pokud vytváříte svůj vlastní formulář, můžete místo přepínání samostatných funkcí form_alter/# process/# pre_render jednoduše přepínat z „zaškrtávacích políček“ na generování jednotlivých prvků „zaškrtávacích políček“.

$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 Vám dává stejnou stromovou strukturu jako verze zaškrtávacích políček, když pole $ form_state ['hodnoty'] dorazí na ověření/odeslání/znovu sestavení. Pokud z nějakého důvodu nemůžete nebo nechcete použít #tree, přiřaďte každému zaškrtávacímu políčku vlastnost '#parents' => array('my_element', $key) k výslovnému nastavení pozice ve struktuře hodnot.

0
KingAndy

Následující kód používám na drupal 6: -

$form['statuses'] = array(
    '#type' => 'checkboxes',
    '#options' => $statuses,
    '#default_value' => $status_val,
    '#after_build' => array('legal_process_checkboxes')
    );

a funkce zpětného volání je zde: -

/ ** * Zpracovat každé zaškrtávací políčko založené na „feture“ je již subdoménou použito či nikoli. Zaškrtávací políčka * @param Array $ element form form * * /

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;
}
0
Sandip Ghosh

Jednou důležitou věcí, kterou je třeba vzít v úvahu, je, že zakázaná zaškrtávací políčka se neodesílají, takže možná zjistíte, že je třeba vynutit #value zaškrtávacího políčka. Například:

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

V mém případě, bez tohoto, $form_state['values'] neobsahuje moji hodnotu zaškrtávacího políčka (která byla ve výchozím nastavení povolena, ale deaktivována).

0
Nick