আমি কীভাবে একটি 'চেকবাক্স' এফএপিআই উপাদানগুলিতে একটি একক চেকবক্স অক্ষম করতে পারি?


31

শিরোনাম মূলত এটি সব বলে, আমি চেকবক্স টাইপ এফএপিআই উপাদানগুলির একটি একক চেকবক্স অক্ষম করতে চাই ।

আমি জাভাস্ক্রিপ্টের সাহায্যে করতে চাই না, বা চেকবক্স থেকে একাধিক চেকবক্স উপাদানগুলিতে কোনও বিকল্প পরিবর্তন করছি না কারণ উপাদানটি অন্য মডিউল দ্বারা সরবরাহ করা হয়েছে।

থটস?


আপনার প্রশ্নে একটি টাইপ রয়েছে: "অক্ষম করুন"
এফআর 6

উত্তর:


36

ড্রুপাল 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 তে # প্রবেশ ফাংশন সেট করতে পারেন ।


3
টাইপো সংশোধন করার সাথে সাথে এই কোডটি ডি 7-এ আমার জন্য একেবারে কাজ করে। ধন্যবাদ!
বেথ

1
দুর্দান্ত ধর! এটা আপনার জন্য কাজ করে খুশি।
টিমোফিয়ে ডটকম

2
যদি আপনি # অ্যাক্সেস ব্যবহার করেন, তবে যদি চেকবক্সটি # ডিফল্ট_ভ্যালুতে সেট করা থাকে তবে তা জমা দেওয়ার ক্ষেত্রে ফর্মের রাষ্ট্রীয় মানগুলিতে সেট করা হবে না।
নিক

এটি দুর্দান্তভাবে কাজ করে।
ডেভিড মিস্টার

এএএএফসিটিতে বেটার এক্সপোজড ফিল্টার (বিইএফ) ব্যবহার করে চেকবক্সগুলি (একাধিক উপাদান নির্বাচন করতে পারে) নিয়ে কাজ করবে না।
মেন্থোমাস

22

দুর্ভাগ্যক্রমে এফএপিআই তে করার কোনও সত্যিকারের পরিষ্কার উপায় নেই। আপনার সেরা বাজি - যদি আপনি নির্ধারিত হন - তবে চেকবক্সের উপাদানগুলিতে অতিরিক্ত # প্রসেস ফাংশনটি পরিবর্তন করা ।

'চেকবক্সগুলি' টাইপের উপাদানগুলিতে যুক্ত ডিফল্ট ফাংশনটি আসলে একটি ফাংশন ( প্রসারিত_চেকবক্স () ) একক উপাদানকে 'চেকবাক্স' টাইপের একাধিক উপাদানগুলিতে বিভক্ত করে যা পরে একের মধ্যে আবার একীভূত হয়। আপনি যদি আপনার দ্বিতীয় প্রক্রিয়া ফাংশনটি পিগব্যাক করেন তবে এটি 'চেকবক্স' উপাদানগুলির বর্ধিত গোষ্ঠীতে পৌঁছতে পারে এবং প্রশ্নে থাকা একটিটিকে অক্ষম করতে পারে।

নিম্নলিখিত কোডটি সম্পূর্ণরূপে অনির্ধারিত, সুতরাং সাবধানতাচক:

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()আউটপুট চালানো ।
ডিসিফার

আপনি একটি "বিরতি" যোগ করতে পারেন; কিছুটা বেশি দক্ষতার জন্য উপরের স্টেটমেন্টের ভিতরে, যদি না আপনি একই উপাদান দু'বার দেখার আশা করেন see
ক্রিস কোহেন

ভাল ধরা, ক্রিস, আমি কোড স্নিপেট পরিবর্তন করেছি। ধন্যবাদ!
ইটোন

2
@ টিমোফির প্রতিক্রিয়াটির সাথে তুলনা করা হলে গৃহীত উত্তরটি কিছুটা ওভারকিল বলে মনে হচ্ছে।
সাইট্রিকগুই

6

সম্পাদনা ব্যবহারকারী পৃষ্ঠায় ভূমিকা উপাদান পরিবর্তন করতে ড্রুপাল 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

আমি চেকবক্সগুলিকে "অ্যাসাইন" এবং "এনসাইন করা" হিসাবে ব্যবহার করছি। ক্লায়েন্টটি জিজ্ঞাসা করেছে যে আমি "আনসাইন করা" অক্ষম করেছি, তবে "অ্যাসাইনমেন্ট" উপস্থাপন করা এখনও গুরুত্বপূর্ণ। অক্ষম চেকবাক্সগুলি "মিথ্যা" হিসাবে জমা দেয় এবং সঠিকভাবে পরিচালনা না করা থাকলে তা ছাড়িয়ে দেওয়া হবে তা মনে রেখে, আমি আমার চেকবক্সগুলিকে "প্রক্রিয়াগুলির" মধ্যে বিভক্ত করি এবং "এই অক্ষমগুলি উপেক্ষা করি"। এখানে কীভাবে:

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

লক্ষ্য করুন যে 'पार्टनर_সাইনমেন্টস' এর নিজস্ব অ্যারে / ভেরিয়েবল এবং আমার ব্যবহারের ক্ষেত্রে "সাইন ইন," হিসাবে প্রক্রিয়া করা হবে না। পোস্ট করার জন্য ধন্যবাদ - এটি আমাকে এই সমাধানে নিয়ে গেছে।


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

আমি লিখিত হিসাবে ইটনের উত্তর পেতে পারিনি (# প্রসেস কলব্যাক কিছুই ফেরত না এবং চেকবক্সগুলি প্রসারিত করার আগে এটি ডাকা হয়) এবং আমি অক্ষম চেকবক্স থেকে মানটি ফিরে পেতে চেয়েছিলাম (আমি স্থায়ীভাবে এটি চেক করতে চেয়েছিলাম) )। এটি আমার পক্ষে কাজ করেছে (ডি 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
@ কোইভো এটি একটি ডি 6 উত্তর ছিল, ফাংশনটি আর ডি 7
অ্যান্ডিতে

1

সম্পাদনা ব্যবহারকারী পৃষ্ঠায় ভূমিকা উপাদান পরিবর্তন করতে ড্রুপাল 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

দ্রুপাল In-তে, ক্ষেত্রযোগ্য সত্তার একটি নির্বাচনের ক্ষেত্রে বিকল্পগুলি অক্ষম করতে, আমি দেখতে পেয়েছি যে আমাকে একটি #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;
}

ড্রুপাল 6 এ পরীক্ষিত, তবে এটি দ্রুপাল 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;
        }
    }
}

ডি 7: এখানেও, # after_build ব্যবহার করে কাঙ্ক্ষিত কাজ করছে। নিশ্চিতকরণ সেটিংস অ্যাক্সেস নিষ্ক্রিয়
এসঘোষ

0

আমি নিম্নলিখিত কোডটি ড্রুপাল 6 এ ব্যবহার করছি: -

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

এবং কল ব্যাক ফাংশনটি এখানে রয়েছে: -

/ ** * 'ফ্যাচার' এর উপর ভিত্তি করে প্রতিটি চেকবক্স প্রসেস করুন ইতিমধ্যে সাব-ডোমেন দ্বারা ব্যবহৃত হয়েছে বা নেই। * @ পরিরাম অ্যারে 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;
}

Drupal.stackexchange.com এ আপনাকে স্বাগতম! আপনার কোড ফর্ম্যাটিং ঠিক করুন। আইনী_প্রসেস_চেকবক্স () ফাংশনের আগে মন্তব্যগুলি "কোড" ফর্ম্যাটের বাইরে রেখে গেছে। ধন্যবাদ.
ermannob

0

এর মধ্যে একটি গুরুত্বপূর্ণ বিষয়টির কারণ হ'ল অক্ষম চেকবক্সগুলি জমা দেওয়া হয় না, সুতরাং আপনার মনে হতে পারে যে আপনাকে #valueচেকবক্সটিও চাপিয়ে দেওয়া দরকার .. উদাহরণস্বরূপ:

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

আমার ক্ষেত্রে, এটি ব্যতীত, এর $form_state['values']মধ্যে আমার চেকবক্স মানটি নেই (যা ডিফল্টরূপে সক্ষম হয়েছিল তবে অক্ষম ছিল)।


0

হুক টেক্সটফিল্ড এবং ডেটাবেস থেকে তথ্য সহ একটি গতিশীল পাঠ্যবক্স করুন

1 the এসোসিয়েশন পান। ডাটাবেস থেকে অ্যারে যেমন

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

2 lements কার্যকর 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 ['মান'] অ্যারে বৈধতা / জমা / পুনর্নির্মাণের সময় উপস্থিত হলে আপনাকে চেকবক্স সংস্করণ হিসাবে একই গাছের কাঠামো দেয়। আপনি যদি কোনও কারণে # ট্রি ব্যবহার করতে না পারেন বা না চান, প্রতিটি চেকবাক্সকে '#parents' => array('my_element', $key)মান কাঠামোতে স্পষ্টভাবে তার অবস্থান নির্ধারণ করার জন্য একটি সম্পত্তি দিন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.