मैं 'चेकबॉक्स' FAPI तत्व में एकल चेकबॉक्स को कैसे अक्षम कर सकता हूं?


31

शीर्षक मूल रूप से यह सब कहता है, मैं एक चेकबॉक्स टाइप एफएपीआई तत्व के एक चेकबॉक्स को अक्षम करना चाहता हूं ।

अगर मैं जावास्क्रिप्ट के साथ नहीं करना चाहता, और न ही इसे चेकबॉक्स से कई चेकबॉक्स में बदल रहा हूं तत्वों के लिए एक विकल्प के रूप में तत्व एक अन्य मॉड्यूल द्वारा प्रदान किया गया है।

विचार?


आपके प्रश्न में एक टाइपो है: "अक्षम"
FR6

जवाबों:


36

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
}

एक और उदाहरण

चेकबॉक्स को पूरी तरह से छुपाने के लिए, आप FALSE में #access फ़ंक्शन भी सेट कर सकते हैं ।


3
टाइपो सही होने के साथ, यह कोड मेरे लिए डी 7 में बिल्कुल काम करता है। धन्यवाद!
बेथ

1
शानदार कैच! खुशी है कि यह आपके लिए कारगर रहा।
timofey.com

2
यदि आप #access का उपयोग करते हैं, तो यदि चेकबॉक्स को #default_values ​​में सेट किया गया है, तो यह सबमिट पर फॉर्म स्टेट मान में सेट नहीं किया जाएगा।
निक

यह अच्छी तरह से काम करता है।
डेविड मिस्टर

विचारों, AFAICT में बेहतर एक्सपोज़र फिल्टर (BEF) का उपयोग करके चेकबॉक्स (एक से अधिक तत्वों का चयन कर सकते हैं) के साथ काम नहीं करेंगे।
सोंथोमास

22

दुर्भाग्य से FAPI में ऐसा करने का वास्तव में कोई साफ तरीका नहीं है। आपकी सबसे अच्छी शर्त - यदि आप निर्धारित हैं - चेकबॉक्स तत्व पर एक अतिरिक्त #process फ़ंक्शन को बदलना है।

प्रकार 'चेकबॉक्स' के तत्वों में जोड़ा गया डिफ़ॉल्ट फ़ंक्शन वास्तव में एक फ़ंक्शन है ( विस्तार_कोचबॉक्स () ) एकल तत्व को टाइप 'चेकबॉक्स' के कई तत्वों में विभाजित करता है जो बाद में एक में विलय हो जाते हैं। यदि आप अपने दूसरे प्रोसेस फंक्शन को पिगबैकबैक करते हैं, तो यह 'चेकबॉक्स' तत्वों के विस्तारित समूह तक पहुँच सकता है और प्रश्न में एक को निष्क्रिय कर सकता है।

निम्नलिखित कोड पूरी तरह से अछूता है, इसलिए कैविट एम्प्टर:

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()आउटपुट के ऊपर चलाना था ।
Decipher

आप एक "ब्रेक जोड़ सकते हैं?" अगर ऊपर बयान थोड़ा और अधिक दक्षता के लिए, जब तक आप एक ही तत्व कुंजी दो बार देखने की उम्मीद नहीं करते।
क्रिस कोहेन

अच्छी पकड़, क्रिस, मैंने कोड स्निपेट बदल दिया। धन्यवाद!
ईटन

2
जब @ टिमोफी की प्रतिक्रिया की तुलना में स्वीकृत उत्तर थोड़ा अधिक लगता है।
Citricguy

6

उपयोगकर्ता कोड को संपादित करने के लिए 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;
}

3

मैं चेकबॉक्स का उपयोग "असाइन" और "अनसाइनस" के रूप में कर रहा हूं। क्लाइंट ने पूछा है कि मैं "अनसाइनस" को अक्षम करता हूं, लेकिन "असाइनमेंट" का प्रतिनिधित्व करना अभी भी महत्वपूर्ण है। यह ध्यान में रखते हुए कि DISABLED चेकबॉक्स "झूठे" के रूप में प्रस्तुत करते हैं और यदि ठीक से हैंडल नहीं किया जाएगा, तो मैं अपने चेकबॉक्स को "इन" प्रक्रिया में विभाजित करता हूं और "इन विकलांगों को अनदेखा करता हूं।" ऐसे:

// 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" के रूप में संसाधित नहीं किया जाएगा। पोस्टिंग के लिए धन्यवाद-- इसने मुझे इस समाधान तक पहुँचाया।


3

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

इस तरह से अक्षम विकल्प दिखता है:

यहाँ छवि विवरण दर्ज करें


2

मुझे लिखा हुआ काम करने के लिए ईटन का जवाब नहीं मिला (#process कॉलबैक कुछ भी वापस नहीं करता है, और इसे चेकबॉक्स के विस्तारित होने से पहले बुलाया जाता है) और मैं भी विकलांग चेकबॉक्स से लौटाए गए मूल्य को प्राप्त करना चाहता था (मैं चाहता था कि यह स्थायी रूप से जाँच की जाए )। यह मेरे (डी 6) के लिए काम किया।

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()
लीमैनक्स

1
@koivo यह एक डी 6 जवाब था, फ़ंक्शन अब डी 7 में मौजूद नहीं है
एंडी

1

उपयोगकर्ता कोड को संपादित करने के लिए 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;
}

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

फिर कुछ इस तरह:

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

मुझे नहीं लगा कि इस पृष्ठ पर किसी भी अन्य उत्तर ने इस मामले में काम किया है।


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

D7: यहाँ भी, #after_build का उपयोग करके वांछित के रूप में काम कर रहा है। साथ ही #attribute का उपयोग करते हुए अक्षम करने की पुष्टि की।
SGhosh

0

मैं ड्रुपल 6 में इस कोड का उपयोग कर रहा हूं: -

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

और कॉल बैक फ़ंक्शन यहां है: -

/ ** * 'भ्रूण' के आधार पर प्रत्येक चेकबॉक्स की प्रक्रिया पहले से ही एक उप-डोमेन द्वारा उपयोग की जाती है या नहीं। * @ रूपम एरो $ तत्व सरणी का फॉर्म चेकबॉक्स * /

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

Drupal.stackexchange.com में आपका स्वागत है! कृपया अपना कोड स्वरूपण ठीक करें। लीगल_प्रोसेस_कैचबॉक्स () फ़ंक्शन के पहले टिप्पणियाँ "कोड" प्रारूप के बाहर छोड़ दी गई हैं। धन्यवाद।
इरमनोब

0

इसमें एक महत्वपूर्ण बात यह है कि अक्षम चेकबॉक्स प्रस्तुत नहीं किए जाते हैं, इसलिए आपको लग सकता है कि आपको #valueचेकबॉक्स को भी बाध्य करने की आवश्यकता है .. उदाहरण के लिए:

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

मेरे मामले में, इसके बिना, $form_state['values']मेरा चेकबॉक्स मान नहीं था (जो डिफ़ॉल्ट रूप से सक्षम था, लेकिन अक्षम)।


0

हुक टेक्स्टफील्ड और डेटाबेस से जानकारी के साथ एक गतिशील टेक्स्टबॉक्स बनाएं

1 ° गधा मिलता है। डेटाबेस से सरणी उदा

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

2 ° इम्प्लीमेंट्स hook_form_alter()

/ ** * औजार हुक_फॉर्म_ल्टर ()। * फॉर्म आईडी = विचार-उजागर-प्रपत्र * /

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 ° कई क्षेत्रों की जाँच होगी!


0

यदि आप अपना स्वयं का फ़ॉर्म बना रहे हैं, तो अलग-अलग फ़ॉर्म_ल्टर / # प्रक्रिया / # प्री_रेंडर फ़ंक्शंस से चलने के बजाय आप 'चेकबॉक्स' से अलग-अलग 'चेकबॉक्स' तत्वों को जेनरेट कर सकते हैं।

$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)को मान संरचना में अपनी स्थिति स्पष्ट रूप से सेट करने के लिए एक संपत्ति दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.