AJAX कॉल के बाद फॉर्म का पुनर्निर्माण कैसे करें


12

मैं ajax कॉल का उपयोग करके ड्रॉपडाउन बॉक्स के आधार पर उपयोगकर्ता को गतिशील रूप से कई फ़ील्ड चुनने की अनुमति देने का प्रयास कर रहा हूं, लेकिन मुझे फॉर्म को फिर से बनाने के लिए ajax कॉल प्राप्त करने के लिए प्रतीत नहीं हो सकता है।

<?php
class AJAXexample extends BlockBase {
    public function blockForm($form, FormStateInterface $form_state) {
        if (empty($form_state->getValue('number'))) {
            $form_state->setValue('number', 3);
        } 
        $form['columnNum'] = [
            '#title'   => t('Number of Columns'),
            '#type'    => 'select',
            '#options' => [
                1         => '1',
                2         => '2',
                3         => '3',
                4         => '4',
            ],
            '#default_value' => $this->configuration['columnNum'],
            '#empty_option'  => t('-select-'),
            '#ajax'          => [
                'callback'      => [$this, 'columnCallback'],
            ],
        ];
        for ($i = 0; $i < $form_state->getValue('number'); $i += 1) {
            $form['column'][$i] = [
                $i => [
                    '#type'       => 'details',
                    '#title'      => t('Column '.$numTitle),
                    '#open'       => FALSE,
                    'columnTitle' => [
                        '#type'      => 'textfield',
                        '#title'     => t('Column Title'),
                        '#value'     => $config[0]['columnTitle'],
                    ],  
                ],
            ];  
        return $form;
    }

    public function columnCallback(array &$form, FormStateInterface $form_state) {
        $form_state->setValue('number', 10);
        $form_state->setRebuild(true);
        return $form;
    }
}

Textfields की संख्या form_state चर 'संख्या' पर आधारित है। कॉलबैक कॉलम कॉलबैक form_state वैरिएबल को 10 में बदल देता है, और 'कॉलमनम' फॉर्म फ़ील्ड को बदलने पर निकाल दिया जाता है। हालाँकि फॉर्म को $ form_state-> setRebuild () के बावजूद फ़ील्ड की नई संख्या के साथ दोबारा नहीं बनाया गया है; कहा जाता है। क्या अजाक्स कॉल के बाद पुनर्निर्माण के लिए फॉर्म प्राप्त करने का एक तरीका है?

नोट: मैंने पहले से ही वास्तविक अजाक्स कॉल के अंदर फॉर्म के आइटम को बदलने या अपग्रेड करने जैसी तकनीकों की कोशिश की है, लेकिन जब ऐसा होता है तो बदले हुए क्षेत्रों में कोई भी इनपुट $ form_state के पास नहीं जाता है।

अद्यतन: 4k4 के समाधान का प्रयास करने के बाद मुझे एक त्रुटि मिलती है

Recoverable fatal error: Argument 1 passed to Drupal\Core\Render\MainContent\AjaxRenderer::renderResponse() must be of the type array, null given, called in /Library/WebServer/Documents/aaep/web/core/lib/Drupal/Core/Form/FormAjaxResponseBuilder.php on line 89 and defined in Drupal\Core\Render\MainContent\AjaxRenderer->renderResponse() (line 45 of /Library/WebServer/Documents/aaep/web/core/lib/Drupal/Core/Render/MainContent/AjaxRenderer.php).

विश्वास यह है कि त्रुटि इसलिए होती है क्योंकि $ फॉर्म ['कॉलम'] ब्लॉकफ़ॉर्म फ़ंक्शन में कंटेनर के रूप में बनाए जाने के बावजूद अशक्त लौट रहा है। मैंने कॉलबैक को अन्य तरीकों से कॉल करने का प्रयास किया है

'#ajax' => [
    'callback' => '::columnCallback',
]

तथा

'#ajax' => [
    'callback' => [$this, '\Drupal\my_examples\Plugin\Block\AJAXexample::columnCallback'],
]

लेकिन मुझे वही त्रुटि मिलती है। उत्सुकता से, जब मैंने कॉलबैक को केवल $ फॉर्म ['कॉलम'] के बजाय पूरे $ फॉर्म को वापस करने के लिए बदल दिया तो यह फॉर्म को दोहराता है (फॉर्म की एक प्रति वर्तमान फॉर्म के नीचे दिखाई देती है) और फिर भी कॉलम की उचित संख्या के बिना।


टाइपो हो सकता है, लेकिन दोहरी जाँच हो सकती है, क्या आप जानते हैं कि कॉलम में पहला तर्क टाइपो (सरणी और $ फॉर्म के बीच कोई स्थान नहीं) है?
केविन

जवाबों:


4

पहली समस्या स्तंभ संख्या के लिए मान को संभालना है। पहले बिल्ड पर इसे कॉन्फ़िगरेशन से प्राप्त करें, पुनर्निर्माण पर इसे उपयोगकर्ता इनपुट से प्राप्त करें और इसे अंदर डालें $columnNum

दूसरा यह तय करना है कि AJAX में फॉर्म का कौन सा हिस्सा बदलता है और आईडी के साथ एक डिव कंटेनर में डाल दिया जाता है columns-wrapper

class AJAXexample extends BlockBase {
    public function blockForm($form, FormStateInterface $form_state) {
        $columnNum = empty($form_state->getValue('columnNum')) ? $this->configuration['columnNum'] : $form_state->getValue('columnNum');
        $form['columnNum'] = [
            '#title'   => t('Number of Columns'),
            '#type'    => 'select',
            '#options' => [
                1         => '1',
                2         => '2',
                3         => '3',
                4         => '4',
            ],
            '#default_value' => $this->configuration['columnNum'],
            '#empty_option'  => t('-select-'),
            '#ajax'          => [
                'callback'      => [$this, 'columnCallback'],
                'wrapper'       => 'columns-wrapper', 
            ],
        ];
        $form['column'] = [
            '#type' => 'container',
            '#attributes' => ['id' => 'columns-wrapper'],
        ];
        for ($i = 0; $i < $columnNum; $i += 1) {
            $form['column'][$i] = [
                $i => [
                    '#type'       => 'details',
                    '#title'      => t('Column '.$numTitle),
                    '#open'       => FALSE,
                    'columnTitle' => [
                        '#type'      => 'textfield',
                        '#title'     => t('Column Title'),
                        '#value'     => $config[0]['columnTitle'],
                    ],  
                ],
            ];  
        return $form;
    }

कॉलबैक में हमें केवल ajax आवरण को वापस करना होगा।

public function columnCallback(array&$form, FormStateInterface $form_state) {
    return $form['column'];
}

Drupal, ajax के प्रत्येक अनुरोध पर फ़ॉर्म को फिर से लिखता है और $formकॉलबैक के पैरामीटर में डालता है । इसे दोबारा बनाने की कोशिश करने का कोई मतलब नहीं होगा।


1
मुझे अजाक्स अनुरोध के बाद त्रुटि मिलती है। 'HTTP रिजल्ट कोड: 200' स्टेटसटैक्स: ओके रिस्पांसटैक्स्ट:
मैट

1
परीक्षण की चीजें मैंने एक डाई (प्रिंट_आर ($ form_state-> getValues ​​())); और इसने उचित स्तंभ मान को ठीक से प्रदर्शित किया। यह सिर्फ त्रुटियां हैं अन्यथा।
मैट

1
मैंने प्रदर्शन के लिए आपके कोड में परिवर्तन किए हैं। लाइन नंबर के साथ त्रुटि संदेशों के बिना डिबगिंग के साथ मदद नहीं कर सकता।
4k4

2
क्या आपने @ केविन की टिप्पणी से वाक्य रचना त्रुटि दूर की? क्या त्रुटि लॉग में php त्रुटियाँ हैं? इस तरह के नए कोड का परीक्षण करते समय बहुत कुछ होना चाहिए।
4k4

2
त्रुटि का पता लगाया, इसका अर्थ return $form['column']है अशक्त, क्योंकि वापसी मूल्य अनियंत्रित हो जाता है renderResponse()। कॉलबैक के पैरामीटर सूची के साथ अभी भी एक समस्या हो सकती है, क्योंकि हम कम से कम एक कंटेनर को उस फॉर्म कुंजी में रखते हैं और यह इस त्रुटि को रोक देगा।
4k4

2

मुझे लगता है कि आप wrapperअपने '#ajax'(अगले callback) तरीके से गायब हैं, जिसमें idउस क्षेत्र की HTML विशेषता शामिल है, जहां कॉलबैक द्वारा लौटाई गई सामग्री को रखा जाना चाहिए। देखें: अजाक्स एपीआई । फिर आपको यह सुनिश्चित करना होगा कि ऐसे कंटेनर idमौजूद हैं।

कोड उदाहरण (सरलीकृत):

public function blockForm($form, FormStateInterface $form_state) {
    $form['wrapper'] = array(
        '#type' => 'container',
        '#attributes' => array('id' => 'data-wrapper'),
        );
    $form['wrapper']['columnNum'] = [
        '#title'   => t('Number of Columns'),
        '#type'    => 'select',
        '#options' => [1 => '1', 2 => '2'],
        '#default_value' => $this->configuration['columnNum'],
        '#ajax'          => [
            'callback'   => '::columnCallback',
            'wrapper'    => 'data-wrapper',
        ],
    ];
}
public function columnCallback(array &$form, FormStateInterface $form_state) {
    return $form['wrapper'];
}

पूर्ण कोड उदाहरण के लिए, देखें: प्रकार रेडियो के लिए अधिक विकल्प कैसे जोड़ें Drupal 8 में Ajax का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.