it-swarm.asia

كيف يمكنني تعطيل خانة اختيار واحدة في عنصر FAPI الخاص بـ "مربعات الاختيار"؟

يقول العنوان بشكل أساسي كل شيء ، أريد تعطيل مربع اختيار واحد من نوع مربعات اختيار من نوع FAPI.

لا أريد أن أفعل إذا كان باستخدام JavaScript ، ولا يتم تغييره من مربعات الاختيار إلى مربع الاختيار المتعدد عناصر خيار حيث يتم توفير العنصر بواسطة وحدة أخرى.

أفكار؟

31
Decipher

توجد طريقة نظيفة في 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 لإخفاء مربع الاختيار تمامًا.

36
timofey.com

للأسف لا توجد طريقة نظيفة للقيام بذلك في FAPI. أفضل رهان - إذا كنت مصمماً - هو تغيير وظيفة معالجة إضافية # إضافية إلى عنصر مربعات الاختيار.

الوظيفة الافتراضية التي تمت إضافتها إلى عناصر من نوع "مربعات الاختيار" هي في الواقع وظيفة ( expand_checkboxes () ) يقسم العنصر الفردي إلى عناصر متعددة من النوع "مربع اختيار" 'التي تم دمجها لاحقًا في واحد. إذا كنت ترغب في إجراء نسخ احتياطي لوظيفة العملية الثانية ، فقد تصل إلى المجموعة الموسعة من عناصر "مربع الاختيار" وتعطيل العنصر المعني.

الكود التالي غير مُختبر تمامًا ، لذا يجب الحذر من 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;
    }
  }
}
23
Eaton

هذا هو الرمز الخاص بي 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;
}
6
aFeijo

أستخدم مربعات الاختيار كـ "تعيين" و "إلغاء تعيين". طلب العميل أن أقوم بتعطيل "إلغاء التعيين" ، ولكن لا يزال من المهم تمثيل "التعيين". ضع في اعتبارك أن مربعات الاختيار المعطلة تُرسل على أنها "خاطئة" ، وإذا لم يتم التعامل معها بشكل صحيح ، فسوف يتم إلغاء تعيينها ، وقمت بتقسيم مربعات الاختيار الخاصة بي إلى "معالجة هذه" و "تجاهل هذه الصناديق المعطلة". إليك الطريقة:

// 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" هي مصفوفة/متغير خاص بها ولن تتم معالجتها على أنها "إلغاء تعيين" في حالة الاستخدام الخاصة بي. شكرا للنشر-- قادني إلى هذا الحل.

3
texas-bronius

د 7. هنا كان علينا أن نتأكد من أنه عند إضافة عقدة ، يكون خيار مرجع مصطلح تصنيف معين غير قابل للتحقق دائمًا وسيتم حفظه دائمًا في العقدة. لذلك ذهبنا إلى #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;
}

هكذا يبدو خيار المعاقين:

enter image description here

3
leymannx

لم أستطع الحصول على إجابة إيتون للعمل كما هو مكتوب (لا يُرجع #process callback أي شيء ، ويتم استدعاؤه قبل توسيع خانات الاختيار) وأردت أيضًا استعادة القيمة من مربع الاختيار المعطل (أردت ذلك محددًا بشكل دائم ). عملت هذا بالنسبة لي (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';
}

إذا كان أي شخص يعرف طريقة أكثر أناقة ، فأنا أحب أن أسمعها!

2
Andy

في 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
Dan Chadwick

هذا هو المثال الخاص بي (باستخدام #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 أيضًا.


دروبال 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 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

هذا هو الرمز الخاص بي 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
jrockowitz

ربط Textfield وإنشاء مربع نص ديناميكي مع معلومات من قاعدة البيانات

1 ° احصل على assoc. صفيف من قاعدة البيانات على سبيل المثال

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

2 ° أدوات hook_form_alter()

/ ** * تنفيذات 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
Mathieu Dierckx

إذا كنت تنشئ نموذجًا خاصًا بك ، فبدلاً من تشغيل وظائف 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) لتعيين موضعها بشكل واضح في بنية القيم.

0
KingAndy

أنا أستخدم هذا الرمز التالي في 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;
}
0
Sandip Ghosh

من الأشياء المهمة التي يجب أخذها في الاعتبار أن مربعات الاختيار المعطلة لا يتم إرسالها ، لذلك قد تجد أنك بحاجة إلى فرض #value من مربع الاختيار أيضًا .. على سبيل المثال:

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

في حالتي ، بدون هذا ، $form_state['values'] لم تحتوي على قيمة خانة الاختيار الخاصة بي (التي كانت ممكّنة افتراضيًا ، ولكنها كانت معطلة).

0
Nick