क्या एक ही तत्व तत्व (रैपर) को केवल एक # ट्रिगर ट्रिगर तत्व द्वारा ट्रिगर किया जाना संभव है?


52
function ajax_example_simplest($form, &$form_state) {

  //This is my ajax trigger element
  $form['element_trigger'] = array(
    '#type' => 'select',
    '#options' => array(
      'one' => 'one',
      'two' => 'two',
      'three' => 'three',
    ),
    '#ajax' => array(
      'callback' => 'ajax_example_simplest_callback',

      /** Q: Can I somehow declare more than one wrapper? **/
      //Say for instance, something like:
      'wrapper' => array('replace_div_1', 'replace_div_2'),

     ),
  );

  //replace_div_1
  $form['element_to_be_replaced_1'] = array(
    '#type' => 'textfield',
    '#title' => t("My conditional field one"),
    '#prefix' => '<div id="replace_div_1">',
    '#suffix' => '</div>',
  );


 //... more form elements here

  //replace_div_2
  $form['element_to_be_replaced_2'] = array(
    '#type' => 'textfield',
    '#title' => t("My conditional field two"),
    '#prefix' => '<div id="replace_div_2">',
    '#suffix' => '</div>',
  );
  return $form;
}

function ajax_example_simplest_callback($form, $form_state) {

  //... do my stuff here


  //normally I would return only the form bit for replacing a single wrapper
  //declared in the trigger element, like this:
  return $form['element_to_be_replaced_blahblah'];

}

क्या यह संभव है कि कॉलबैक फ़ंक्शन में एक से अधिक फॉर्म बिट को एजेएएक्स फ्रेमवर्क पर लौटाया जाए जो कि $form['element_to_be_replaced_1']बदलना चाहिए <div id="replace_div_1">और $form['element_to_be_replaced_2']बदलना चाहिए <div id="replace_div_2">?

जवाबों:


73

अद्यतन करने के लिए एकल तत्व का HTML वापस करने के बजाय, आपका ajax कॉलबैक ajax कमांड की एक सरणी वापस कर सकता है । तो यह प्रत्येक तत्व को बदलने के लिए दो ajax_command_replace वापस कर सकता है ।

function ajax_example_simplest_callback(&$form, $form_state) {
  return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1'])),
      ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']))
    )
  );
}

2
यह कमाल है !! बहुत समय बचाया। बहुत बहुत धन्यवाद :)
संध्या यादव

24 घंटे में आपके रास्ते पर एक इनाम आ रहा है।
आयुष

कॉलबैक फ़ंक्शन का नाम बदलना पड़ा। फ़ंक्शन का उपयोग करना ajax_example_simplest_callback (और $ फॉर्म, $ form_state) {} ने मुझे मौत का सफेद स्क्रीन दिया।
घोटी

5

Drupal 8 वैकल्पिक सिंटैक्स

use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;

class name extends FormBase{
   function ajax_example_simplest(array $form, FormStateInterface &$form_state) {
       $response = new AjaxResponse();
       $response->addCommand(new ReplaceCommand("#replace_div_1", ($form['element_to_be_replaced_1'])));
       $response->addCommand(new ReplaceCommand("#replace_div_2", ($form['element_to_be_replaced_2'])));
       return $response;
   }
}

एक अंतर यह है कि रेंडर कमांड को हटा दिया जाता है, क्योंकि AjaxResponse लागू करता है Drupal \ Core \ Render \ AttachmentsInterface

प्रस्तुत करना ($ फॉर्म ['element_to_be_replaced_1'])

रेंडर जोड़ना अभी भी काम करता है, लेकिन उस तरह से TableSelect टेबल को अपडेट करते समय मुझे समस्याएं हुईं।


धन्यवाद, यह काम करता है। मुझे लगता है कि रेंडर () का उपयोग करना समझदारी नहीं होगी क्योंकि ड्रुपल डॉक्यूमेंटेशन कहता है कि इसका विस्थापित और ड्रुपल 9
Ngatia Frankline

4

पियरे ब्यूले का जवाब मेरे काम नहीं आया। हालांकि, निम्नलिखित की तरह कुछ काम किया।

function ajax_example_simplest_callback(&$form, $form_state) {
    $commands = array();
    $commands[] = ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1']));
    $commands[] = ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']));
    $page = array('#type' => 'ajax', '#commands' => $commands);
    ajax_deliver($page);
}

AJAX आदेशों की सरणी लौटाने के बजाय, ajax_deliver () को कॉल नोट करें ।


2
मुझे लगता है कि आप अपने रूप में # राज ['पथ'] का उपयोग कर रहे हैं। उस स्थिति में, अपने हुक_मेनू कार्यान्वयन में, आपको 'डिलीट कॉलबैक' संपत्ति का उपयोग करना चाहिए, इससे ड्रुपल को आपके पेज कॉलबैक परिणाम को मार्कअप के बजाय AJAX कमांड के रूप में प्रस्तुत करना होगा। लेकिन इसे सीधे अपने पेज कॉलबैक में उपयोग करते हुए, आप सामान्य Drupal पेज डिलीवरी को बायपास करते हैं।
पियरे ब्यूले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.