এজেএক্স কল করার পরে ফর্মটি কীভাবে পুনর্নির্মাণ করবেন


12

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

<?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;
    }
}

পাঠ্যক্ষেত্রের সংখ্যা form_state ভেরিয়েবল 'সংখ্যা' এর উপর ভিত্তি করে। কলব্যাক কলামক্যালব্যাক ফর্ম_স্টেট ভেরিয়েবলটিকে 10 এ পরিবর্তন করে এবং 'কলামনাম' ফর্ম ক্ষেত্রটি পরিবর্তিত হলে তা বহিস্কার করা হয়। তবে form form_state-> setRebuild () সত্ত্বেও ফর্মটি নতুন সংখ্যক ক্ষেত্রের সাথে পুনর্নির্মাণ করা হয়নি; বলা হয়. এজ্যাক্স কলের পরে ফর্মটি পুনর্নির্মাণের কোনও উপায় আছে কি?

দ্রষ্টব্য: আমি ইতিমধ্যে প্রকৃত এজাক্স কলটির ভিতরে ফর্মের আইটেমগুলি প্রতিস্থাপন বা সংযোজন করার মতো কৌশলগুলি চেষ্টা করেছি তবে যখন এটি ঘটে তখন প্রতিস্থাপিত ক্ষেত্রগুলিতে কোনও ইনপুট $ form_state এ পাস হবে না।

আপডেট: 4 কে 4 এর সমাধান করার চেষ্টা করার পরে আমি একটি ত্রুটি পেয়েছি

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

প্রথম সমস্যাটি হ'ল কলাম নম্বরটির মানটি হ্যান্ডেল করা। প্রথম বিল্ডে এটি কনফিগারেশন থেকে পান, একটি পুনর্নির্মাণে এটি ব্যবহারকারীর ইনপুট থেকে পান এবং এটি putোকান $columnNum

দ্বিতীয়টি স্থির করতে হবে, ফর্মের কোন অংশটি এজেএক্সে পরিবর্তিত হয় এবং এটি আইডি সহ একটি ডিভ ধারক মধ্যে রাখুন 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;
    }

কলব্যাকে আমাদের কেবল এজাক্সের মোড়ক ফিরতে হবে।

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

ড্রুপাল প্রতিটি এজাক্স অনুরোধে ফর্মটি পুনর্নির্মাণ করে এবং $formকলব্যাকের প্যারামিটারে রাখে । এটি আবার পুনর্নির্মাণের চেষ্টা করার কোনও অর্থ হবে না।


1
এজাক্স অনুরোধটি কল করার পরে আমি একটি ত্রুটি পেয়েছি। 'এইচটিটিপি ফলাফলের কোড: 200' স্থিতি পাঠ্য: ঠিক আছে প্রতিক্রিয়া পাঠ্য:
ম্যাট

1
আমি যে পরীক্ষার জিনিসগুলি একটি ডাই সম্পাদন করেছি (মুদ্রণ_আর ($ ফর্ম_সেটেট-> গেটভ্যালু ())); এবং এটি সঠিকভাবে যথাযথ কলাম স্তরের মান প্রদর্শন করে। এটি অন্যথায় কেবল ত্রুটিযুক্ত।
ম্যাট

1
আমি প্রদর্শনের জন্য আপনার কোডে পরিবর্তনগুলি রেখেছি। লাইন নম্বর সহ ত্রুটি বার্তা ছাড়াই ডিবাগ করতে সহায়তা করতে পারে না।
4k4

2
আপনি কি কেভিনের মন্তব্য থেকে সিনট্যাক্স ত্রুটিটি সরিয়েছেন? ত্রুটি লগ মধ্যে পিএইচপি ত্রুটি আছে? এই জাতীয় কোডটি পরীক্ষা করার সময় প্রচুর পরিমাণে থাকা উচিত।
4k4

2
ত্রুটিটি সনাক্ত করা হয়েছে, এর অর্থ return $form['column']নাল, কারণ প্রত্যাবর্তনের মানটি চেক করা হয়নি renderResponse()। কলব্যাকের প্যারামিটার তালিকায় এখনও সমস্যা হতে পারে, কারণ আমরা সেই ফর্ম কীটিতে কমপক্ষে একটি ধারক রেখেছি এবং এটি এই ত্রুটিটি রোধ করতে পারে।
4k4

2

আমি অনুমান করি আপনি wrapperআপনার '#ajax'(পাশের callback) পদ্ধতিতে অনুপস্থিত পদ্ধতিতে idযেখানে কলব্যাকের মাধ্যমে ফিরে আসা সামগ্রীটি রাখা উচিত সেই অঞ্চলের HTML বৈশিষ্ট্য সমন্বিত attrib দেখুন: আয়াক্স এপিআই । তারপরে আপনাকে নিশ্চিত করতে হবে যে এই ধরণের ধারক 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'];
}

সম্পূর্ণ কোড উদাহরণের জন্য, দেখুন: প্রকার রেডিওগুলির জন্য আরও বিকল্প যুক্ত করতে কিভাবে দ্রুপাল 8 এ অ্যাজাক্স ব্যবহার করুন

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