রাজ্যগুলির সাথে কীভাবে প্রয়োজনীয় ফর্ম তৈরি করবেন?


31

আমার একটি ড্রপ ডাউন তালিকা রয়েছে যা বেছে নেওয়া হয়েছে তার উপর ভিত্তি করে বিভিন্ন ক্ষেত্র প্রদর্শন করে এবং আমি জানি যে আমি রাজ্যগুলির সাথে দৃশ্যমানতা টগল করতে পারি তবে যখন আমি প্রয়োজনীয় ব্যবহারের চেষ্টা করি তখন * স্প্যানটি প্রদর্শিত হয় তবে এটি আসলে প্রয়োজন হয় না। আমার অর্থ হ'ল এটি "প্রয়োজনীয়" হওয়া সত্ত্বেও আমি জমা দিতে পারি এবং ড্রুপাল থেকে কোনও ত্রুটি বার্তা পাই না। আমি কি কিছু ভুল করছি বা এটি বর্তমানে দ্রুপাল 8.৮ এ বিভক্ত?

        $form['host_info'] = array(
        '#type' => 'select',
        '#title' => t("Host Connection"),
        '#options' => array(
          'SSH2' => t('SSH2'),
          'Web Service' => t('Web Service'),
        ),
        '#default_value' => t(variable_get('host_info', 'SSH2')),
        '#description' => t("Specify the connection information to the host"),
        '#required' => TRUE,
    );

    $form['ssh_host'] = array(
        '#type' => 'textfield',
        '#title' => t("Host Address"),
        '#description' => t("Host address of the SSH2 server"),
        '#default_value' => t(variable_get('ssh_host')),
        '#states' => array(
            'visible' => array(
                ':input[name=host_info]' => array('value' => t('SSH2')),
            ),
            'required' => array(
                ':input[name=host_info]' => array('value' => t('SSH2')),
            ),
        ),
    );

    $form['ssh_port'] = array(
        '#type' => 'textfield',
        '#title' => t("Port"),
        '#description' => t("Port number of the SSH2 server"),
        '#default_value' => t(variable_get('ssh_port')),
        '#states' => array(
            'visible' => array(
                ':input[name=host_info]' => array('value' => t('SSH2')),
            ),
            'required' => array(
                ':input[name=host_info]' => array('value' => t('Web Service')),
            ),
        ),
    );

আপনি ডাবল উদ্ধৃতি অনুপস্থিত name। এটা অবশ্যই হবে :input[name="host_info"]
লেম্যানমান্স

উত্তর:


20

একটি কাস্টম বৈধতা ফাংশন এ আপনার নিজের যাচাই করতে হবে।

# স্টেট দ্বারা কনফিগার করা সমস্ত কিছুই ব্রাউজারে 100% হয়, ফর্মটি জমা দেওয়ার সময় দ্রুপালের পক্ষে এটি যা কিছু ঘটে তা দৃশ্যমান হয় না (উদাহরণস্বরূপ, সমস্ত অদৃশ্য ফর্ম ক্ষেত্র একইভাবে জমা দেওয়া হয় এবং যদি কোনও # স্টেট না থাকে) valid


আমি বুঝতে পারি যে ঘটনাটি ছিল। আমি যখন এটি কীভাবে করব তা নিয়ে যখন গবেষণা করছিলাম তখন আমি রাষ্ট্রগুলির সাথে 'প্রয়োজনীয়' বৈশিষ্ট্যটি আবিষ্কার করেছিলাম এবং ভেবেছিলাম অতিরিক্ত কাজ ছাড়াই এটি আমার প্রয়োজন মতো কাজ করবে।
সাথারিয়েল

11

আপনি এটির মতো প্রয়োজনীয় ব্যবহার করতে পারেন:

'#states'=> [
  'required' => [
    ':input[name="abroad_because[somecheckbox]"]' => ['checked' => TRUE],
  ],
],

4
হ্যাঁ - এটি উপাদানটিতে প্রয়োজনীয় সূচক যুক্ত করবে। তবে এতে কোনও ক্লায়েন্ট বা সার্ভার সাইডের বৈধতা জড়িত থাকবে না।
আয়শক

একটি বাগ হতে পারে? প্রয়োজনীয়
# টি

প্রয়োজনের কীটিকে # টি আপডেটের অ্যারেতে রেখে দেওয়া আমার পক্ষে কাজ করে মনে হয়েছিল, যদিও এটি আমার ইমেল ক্ষেত্রের বৈধতা ছিল। সুতরাং, আমি অবাক হয়েছি যে আপনি যদি ফর্ম আইটেমটিতে এটির জন্য ডিফল্ট ড্রুপাল # এলিমেট_এলডিট ব্যবহার করেন?
অ্যালেক্স ফিননার্ন

8

ফেলিক্স ইভের উত্তরের সাথে খুব মিল, কেবল এটিই ইনলাইন উপাদান বৈধতার জন্য একটি স্নিপেট:

আপনি একটি উপাদানকে প্রয়োজনীয় উপাদানকে বৈধতা ফাংশন বলছেন:

$form['element'] = array(
....
  '#element_validate' => array(
     0 => 'my_module_states_require_validate',
   ),
)

তারপরে যাচাইকরণের ফাংশনটি প্রয়োজনীয় ক্ষেত্রটি সন্ধান করে এবং এটির সঠিক ফর্মের মান আছে কিনা তা যাচাই করে যা প্রয়োজনীয় ক্ষেত্রটি প্রকাশ করে।

function my_module_states_require_validate($element, $form_state) {
  $required_field_key = key($element['#states']['visible']);
  $required_field = explode('"', $required_field_key);
  if($form_state['values'][$required_field[1]] == $element['#states']['visible'][$required_field_key]['value']) {
    if($form_state['values'][$element['#name']] == '') {
      form_set_error($element['#name'], $element['#title'].' is required.');
    }
  }
}

1
এটিই সেরা সমাধান আইএমএইচও!
অ্যালেক্স ফিননার্ন

3

ফর্মের জন্য AFTER_BUILD ফাংশনটি ব্যবহার করার এবং সেই ক্ষেত্রটি optionচ্ছিক করে তোলার আরও একটি উপায় রয়েছে। এখানে একটি লিঙ্ক দেওয়া আছেড্রুপাল 6 এর জন্য ।

এটি আপনার ফর্ম কোডে যুক্ত করুন

$form['#after_build'][] = 'custom_form_after_build';

বিল্ড করার পরে প্রয়োগ করুন, আপনার কাস্টম ক্ষেত্রের শর্ত পরীক্ষা করুন

function custom_form_after_build($form, &$form_state) {
  if(isset($form_state['input']['custom_field'])) {
    $form['another_custom_field']['#required'] = FALSE;
    $form['another_custom_field']['#needs_validation'] = FALSE;
  }
 return $form;
}

আমার ক্ষেত্রে # স্টেটগুলি একাধিক * যুক্ত করছে তাই আমাকে এড়াতে হবে এবং স্প্যানটি লুকিয়ে রাখতে এবং প্রদর্শন করতে jquery ব্যবহার করতে হবে *

$('.another-custom-field').find('span').hide();  

এবং

$('.another-custom-field').find('span').show();

আমার কাস্টম_ফিল্ড মানের উপর ভিত্তি করে।


3

এখানে একটি বিস্তারিত গাইড ড্রুপাল 7 ফর্ম # স্টেটের জন্য

এটি গুরুত্বপূর্ণ বিট:

/**
 * Form implementation.
 */
function module_form($form, $form_state) {
  $form['checkbox_1'] = [
    '#title' => t('Checkbox 1'),
    '#type' => 'checkbox',
  ];

  // If checkbox is checked then text input
  // is required (with a red star in title).
  $form['text_input_1'] = [
    '#title' => t('Text input 1'),
    '#type' => 'textfield',
    '#states' => [
      'required' => [
        'input[name="checkbox_1"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];

  $form['actions'] = [
    'submit' => [
      '#type' => 'submit',
      '#value' => t('Submit'),
    ],
  ];

  return $form;
}

/**
 * Form validate callback.
 */
function module_form_validate($form, $form_state) {
  // if checkbox is checked and text input is empty then show validation
  // fail message.
  if (!empty($form_state['values']['checkbox_1']) &&
    empty($form_state['values']['text_input_1'])
  ) {
    form_error($form['text_input_1'], t('@name field is required.', [
      '@name' => $form['text_input_1']['#title'],
    ]));
  }
}

2

আমি ঠিক একই সমস্যার মুখোমুখি হয়েছি তাই কাস্টম বৈধতা সরবরাহ করার জন্য প্রয়োজন তবে আমি চাই # স্টেট অ্যারের মাধ্যমে এটি নিয়ন্ত্রণ করা যাতে আমাকে একই নিয়ম দু'বার উল্লেখ করতে না হয়।

এটি jQuery নির্বাচনকারী থেকে ফিল্ডের নাম আহরণের মাধ্যমে কাজ করে (নির্বাচক অবশ্যই ফর্ম্যাটে থাকতে হবে :input[name="field_name"]বা এটি কাজ করবে না)।

নীচের কোডটি কেবলমাত্র সেই নির্দিষ্ট দৃশ্যেই পরীক্ষিত হয় যে আমি এটি ব্যবহার করছিলাম, তবে আমি এটি অন্য কারও পক্ষে কার্যকর হিসাবে প্রমাণ করতে পারি।

function hook_form_validate($form, &$form_state) {

    // check for required field specified in the states array

    foreach($form as $key => $field) {

        if(is_array($field) && isset($field['#states']['required'])) {

            $required = false;
            $lang = $field['#language'];

            foreach($field['#states']['required'] as $cond_field_sel => $cond_vals) {

                // look for name= in the jquery selector - if that isn't there then give up (for now)
                preg_match('/name="(.*)"/', $cond_field_sel, $matches);

                if(isset($matches[1])) {

                    // remove language from field name
                    $cond_field_name = str_replace('[und]', '', $matches[1]);

                    // get value identifier (e.g. value, tid, target_id)
                    $value_ident = key($cond_vals);

                    // loop over the values of the conditional field
                    foreach($form_state['values'][$cond_field_name][$lang] as $cond_field_val) {

                        // check for a match
                        if($cond_vals[$value_ident] == $cond_field_val[$value_ident]) {
                            // now we know this field is required
                            $required = true;
                            break 2;
                        }

                    }

                }

            }

            if($required) {
                $field_name = $field[$lang]['#field_name'];
                $filled_in = false;
                foreach($form_state['values'][$field_name][$lang] as $item) {
                    if(array_pop($item)) {
                        $filled_in = true;
                    }
                }
                if(!$filled_in) {
                    form_set_error($field_name, t(':field is a required field', array(':field' => $field[$lang]['#title'])));
                }
            }

        }
    }

}

2

আমি ড্রুপাল 8 এ এটি করতে সক্ষম হয়েছি:

          '#states' => array(
            'required' => array(
              array(':input[name="host_info"]' => array('value' => 'SSH2')),
             ),
           ),

টি ('এসএসএইচ 2') রাখবেন না। এটি সেখানে অনুল্লেখিত এসএসএইচ 2 বিকল্পের মানের পরিবর্তে এটির অনুবাদটি দেবে।

আমি সন্দেহ করি যে এটি ড্রুপাল 7 এর জন্যও কাজ করবে।


1
ড্রুপাল 7 এ, অনুরূপ সমাধান দেওয়ার উত্তরের দিকে নির্দেশিত হিসাবে, এটি প্রয়োজনীয় ক্ষেত্রের চিহ্নগুলি সরবরাহ করে, তবে বাস্তবে কোনও বৈধতা সম্পাদন করে না। ড্রুপাল 8 কি প্রয়োজনীয় ক্ষেত্রগুলি # স্টেটস হিসাবে চিহ্নিত ক্ষেত্রগুলিকে আসলে বৈধতা দেয়?
আল্ট্রাসোবিব

0

আমার কাছে ফর্ম ক্ষেত্র এবং একটি চেকবাক্স রয়েছে, তাই ডমিনিক উডম্যানের উত্তর সম্পর্কে আমার কিছুটা কাজ করা দরকার। অন্য কোনও শরীর একই সমস্যার মধ্যে চলে যাওয়ার ক্ষেত্রে:

function my_module_states_require_validate($element, $form_state) {
  $required_field_key = key($element['#states']['visible']);
  $required_field = explode('"', $required_field_key);
  $keys = explode('[', $required_field[1]);
  $keys = str_replace(']', '', $keys);
  $tmp = $form_state['values'];
  foreach ($keys as $key => $value) {
    $tmp = $tmp[$value];
  }
  if($tmp == $element['#states']['visible'][$required_field_key]['checked']) {
    $keys2 = explode('[', $element['#name']);
    $keys2 = str_replace(']', '', $keys2);
    $tmp2 = $form_state['values'];
    foreach ($keys2 as $key => $value) {
      $tmp2 = $tmp2[$value];
    }
    if($tmp2 == '') {
      form_set_error($element['#name'], $element['#title']. t(' is required.'));
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.