ফর্মটিতে গতিশীল নির্বাচন তালিকা (নির্ভরশীল ড্রপডাউন)


28

আমি ড্রুপাল সাত ব্যবহার করছি। আমি একটি নির্বাচনী তালিকার বিকল্পগুলি একটি ফর্মের অন্য নির্বাচন তালিকাতে নির্বাচিত মানের উপর নির্ভরশীল করতে চাই। আমি নিশ্চিত যে এর আগেও অনেকবার জিজ্ঞাসা করা হয়েছিল, তবে কীভাবে এটি করা যায় তার জন্য আমার একটি পরিষ্কার উত্তর পেতে আমার সমস্যা হচ্ছে।

ফর্মটি ব্যবহারকারীদের একটি কাজের ইতিহাসে প্রবেশের জন্য। তাদের স্কোয়াড্রন নির্বাচন করতে হবে যা স্কোয়াড্রন ফিল্ডের ধরণের নোড রেফারেন্স এবং এটি একটি ড্রপ-ডাউন তালিকায়। তবে স্কোয়াড্রন একটি শহর ড্রপ-ডাউন তালিকার উপর নির্ভরশীল। ব্যবহারকারীদের প্রথমে একটি শহর নির্বাচন করা দরকার যা স্কোয়াড্রনের জন্য বিকল্পগুলি ফিল্টার করবে। স্কোয়াড্রন বিষয়বস্তুর ধরণে, আমি শহরের জন্য একটি শ্রমশক্তি তৈরি করেছি যা স্কোয়াড্রনকে ট্যাগ করা হয়।

আমি সবচেয়ে ভাল উপায় (সরল?) হিসাবে এটি সম্পর্কে কোনও পয়েন্টারের জন্য, বা অনলাইন যে কোনও সহায়ক সংস্থান যা সহায়তা করবে তার জন্য আমি কৃতজ্ঞ থাকব।

উত্তর:


27

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

$form['city'] = array(
  '#type' => 'select',
  '#title' => t('City'),
  '#options' => $options,
  '#ajax' => array(
    'event' => 'change',
    'wrapper' => 'squadron-wrapper',
    'callback' => 'mymodule_ajax_callback',
    'method' => 'replace',
  ),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
  '#type' => 'select',
  '#title' => t('Squadron'),
  '#options' => $squadron_options,
);

এটি কেবলমাত্র উপাদানগুলির প্রাথমিক সেটআপ। স্কোয়াড্রন-এ কী কী বিকল্পগুলি দেওয়া উচিত তা নির্ধারণ করার জন্য এখন আপনাকে একটি উপায় প্রয়োজন। প্রথমে আপনাকে আপনার অ্যাজাক্স কলব্যাকটি 'শহর' নির্বাচনের তালিকায় চিহ্নিত করতে হবে। বেশিরভাগ ক্ষেত্রে আপনি এজেন্ট $ ফর্মটিতে এজাক্স উপাদানটি আবৃত উপাদানটিকে ফিরে আসতে পারেন।

function mymodule_ajax_callback($form, $form_state) {
  return $form;
}

এখন, যখন 'সিটি' বাছাই তালিকার পরিবর্তন হবে এটি ফর্মের স্কোয়াড্রন-মোড়কের অংশটি পুনর্নির্মাণ করবে। আপনার 'নগর' মানটি এখন $ form_state ['মান'] এ থাকবে। সুতরাং, ফর্মটি পুনর্নির্মাণ করার সময় আমাদের 'সিটি' এর মানের উপর ভিত্তি করে বাছাই তালিকার কী বিকল্পগুলি দিতে হবে তা নির্ধারণ করতে হবে।

// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
  case 'default':
    // Set default options.
    break;
  case 'losangeles':
    // Set up $squadron_options for los angeles.
    break;
}

// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
  $form['squadron_wrapper']['squadron'] = array(
    '#type' => 'select',
    '#title' => t('Squadron'),
    '#options' => $squadron_options,
  );
}

6
উদাহরণগুলি মডিউলে উদাহরণগুলি পাওয়া যায় ("AJAX উদাহরণ" → "নির্ভরশীল ড্রপডাউন")। আপনি হায়ারার্কিকাল সিলেক্ট মডিউলটিও দেখতে পাবেন ।
কলাব্রো

যাইহোক, বিকল্পভাবে আপনি এটি একটি বহু-পদক্ষেপের আকারে করতে পারেন, তবে আমি মনে করি নি যে এটি আপনি যা খুঁজছেন ঠিক তেমন শোনাচ্ছে। এছাড়াও ^ শুভ কল! এই জাতীয় জিনিস শেখার জন্য উদাহরণ মডিউলগুলি দুর্দান্ত
jordojuice

@ জর্ডোজুইস আপনার উত্তরের জন্য আপনাকে অনেক ধন্যবাদ আমি এখন এটি নিয়ে কাজ করছি। আপনি উপরে যে কোডটি দিয়েছেন তার তৃতীয় উদাহরণে (শুরু // মানটি পান ...) আমি কোন ফাংশনটিতে কোডটির এই অংশটি রেখেছি? এটি কি _ajax_callback ফাংশনে যায়? ধন্যবাদ
বেন

আমি এর জন্য উদাহরণ মডিউলটি অনুসরণ করেছি তবে প্রথম ড্রপ ডাউনতে আমি যখনই কোনও আইটেমটি নির্বাচন করি তখনই আমি একটি ত্রুটি পেয়েছি: সতর্কতা: অ্যারে_ভ্যালু () প্যারামিটার 1 অ্যারে হিসাবে প্রত্যাশা করবে, _ ফিল্ড_ফিলার_সাইটগুলি () এর লাইন দেওয়া হয়েছে: I এর লাইন 525: আমার ডকুমেন্টস \ ওয়েব \ XAMPP \ htdocs \ mysite \ মডিউল \ ক্ষেত্র \ field.module)। আমি এই এজ্যাক্স নির্ভরশীল ড্রপ ডাউনের সাথে একত্রে একটি মাল্টি স্টেপ ফর্ম ব্যবহার করছি যা আমি একটি কাস্টম ওভাররাইড মডিউলটিতে লিখেছি .... যদিও প্রথমটির উপর ভিত্তি করে দ্বিতীয় ডিডির জন্য মানগুলি পরিবর্তিত হয়। এটি কেবল একটি সতর্কতা দেখানো হলেও বিরক্তিকর ... কেউ দয়া করে আমাকে এই সতর্কতাটি সরাতে সহায়তা করতে পারে? ধন্যবাদ!
জানুয়ারী

2 এই কোডটির মধ্যে গুরুত্বপূর্ণ পার্থক্য এবং কী কী @Ben এর জন্য কাজ করে। মনে রাখবেন যে # সুফিক্স একটি আইডি ব্যবহার করে এবং এজাক্স কলব্যাক পুরো ফর্মটি নয়, ফর্ম উপাদানটি প্রদান করে। এটি ছাড়াও এটি সুপার সহায়ক ছিল!
ওলফার-ইস্ট

11

উপরে jordojuice অনেক ধন্যবাদ। তার সহায়তায় আমি একটি সমাধান সন্ধান করতে সক্ষম হয়েছি। আমি http://public-action.org/content/drupal-7-form-api-d dependent-lists-and-ajax-form-submission- এ উদাহরণটিও দেখেছি । আমি অবশেষে নীচের কোডগুলি ব্যবহার করেছি যা কাস্টম মডিউলটিতে কাজ করে। কিছু কারণে আমি আমার কোনও মান $ form_state মানগুলিতে খুঁজে পাইনি, তবে সেগুলি $ আকারে সন্ধান করতে সক্ষম হয়েছি। অবশেষে, যখন আমি পরীক্ষা করেছি, আমি একটি ত্রুটি বার্তা পাচ্ছি যে ড্রপ-ডাউনে দ্রুপাল একটি অবৈধ পছন্দ সনাক্ত করেছে। আমি ফর্মের মধ্যে 1290 লাইনটি মন্তব্য করে এটি পেয়েছি inc

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));

আমার ব্যবহৃত চূড়ান্ত কোডটি ছিল:

<?php

function sappers_squadron_form_work_history_node_form_alter(&$form, &$form_state) {     
        //echo '<pre>';
        //print_r ($form);
        //echo '</pre>';

        $squadron_options = array();

        if(isset($form['field_wkhist_city']['und']['#default_value'][0])) {
            $city = $form['field_wkhist_city']['und']['#default_value'][0];
        }
        else {
            $city = 0;
        }

        $squadron_options = sappers_squadron_squadrons($city);

        $form['field_wkhist_city']['und']['#ajax'] = array(
            'event' => 'change',
            'wrapper' => 'squadron-wrapper',
            'callback' => 'sappers_squadron_ajax_callback',
            'method' => 'replace',
        );

        $form['field_squadron']['und']['#prefix'] = '<div id="squadron-wrapper">';
        $form['field_squadron']['und']['#suffix'] = '</div>';
        $form['field_squadron']['und']['#options'] = $squadron_options;
}


function sappers_squadron_ajax_callback($form, $form_state) {   
    $city = $form['field_wkhist_city']['und']['#value'];

    $form['field_squadron']['und']['#options'] = sappers_squadron_squadrons($city);

    return $form['field_squadron'];
}


function sappers_squadron_squadrons($city) {
    $nodes = array();

    $select = db_query("SELECT node.title AS node_title, node.nid AS nid FROM  {node} node INNER JOIN {taxonomy_index} taxonomy_index ON node.nid = taxonomy_index.nid WHERE (( (node.status = '1') AND (node.type IN  ('squadron')) AND (taxonomy_index.tid = $city) )) ORDER BY node_title ASC");

    $nodes[]="";

    foreach ($select as $node) {
            $nodes[$node->nid] = $node->node_title;
    }

    return $nodes;
}

?>

আমি একটি অবৈধ পছন্দ সনাক্ত করা হয়েছে পেতে। সাইট এডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন। ত্রুটি যখন আমি উপরের প্রয়োগের চেষ্টা করেছি। আপনি কি সাহায্য করতে পারেন?
হর্ষাল

@ শারশাল - আমার একই সমস্যা ছিল এবং আমি আমার উত্তরের যে সমাধানটি দিয়েছি তা বাস্তবায়নের মধ্য দিয়ে সমাধান করেছি, দয়া করে উপরেরটি (পরিবর্তিত ফর্ম.ইনক) দেখুন। এটি কিছুটা হ্যাক তবে এটি আমার জন্য কাজ করেছে।
বেন

@ হারশাল - নীচে হ্যাকারের দেওয়া সম্ভবত একটি আরও ভাল সমাধান।
বেন

1

কোড লাইন রাখুন অর্থাত্‍
$nodes[''] = '- None -'; পরে

 $nodes = array();

আপনার sappers_squadron_squadrons function এবং এটি আপনার ত্রুটি সমাধান করবে

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));


1

"একটি অবৈধ পছন্দ চিহ্নিত করার মূল কারণটি সনাক্ত করা হয়েছে। দয়া করে সাইট প্রশাসকের সাথে যোগাযোগ করুন।" 0 এর সাথে যুক্ত 0 $nodes[]="";টির সাথে খালি স্ট্রিংটি ফিল্ড_সক্যাড্রন ক্ষেত্রের জন্য অবৈধ।

দেখুন অগ্রিম পিএইচপি প্রোগ্রামিং ও উন্নয়ন , কিন্তু যে মনে রাখা DANGEROUS_SKIP_CHECK এবং বৈধ পতাকা D7 উঠিয়ে হয়

আমি সেই লাইনটি সরিয়ে দেওয়ার পরে, ত্রুটিটি চলে গেছে।


1

রেফারেন্স ফিল্ড বিকল্প সীমা মডিউলটি ব্যবহার করুন

এই মডিউলটি বিভিন্ন ধরণের রেফারেন্স ক্ষেত্রগুলিকে বর্তমান সত্তায় অন্যান্য ক্ষেত্রের মান দ্বারা সীমিত করার জন্য তাদের উইজেটগুলির উপলভ্য বিকল্পগুলি রাখতে দেয়।


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