সাধারণত আপনি সিটিউলস অবজেক্ট ক্যাশে ( দ্রুপাল in- তে মাল্টিসট্যাপ ফর্মের অনুরূপ ), অথবা $form_state
(এই টিউটোরিয়াল অনুসারে ) ব্যবহার করে ধাপগুলির মধ্যে ফর্ম মান সংরক্ষণ করতে পারেন ।
ড্রুপাল 8 এ আপনি FormBase
একটি নতুন মাল্টিস্টেপ ক্লাস তৈরি করতে বর্গ উত্তরাধিকারী হতে পারেন।
দ্রুপাল 8-এ মাল্টি-স্টেপ ফর্মগুলি কীভাবে তৈরি করবেন সেই নিবন্ধে আপনি দ্রুপাল 8- তে একটি মাল্টিস্টেপ ফর্ম তৈরি করার একটি সহজ উপায় খুঁজে পেতে পারেন।
প্রথমত, আপনাকে বেস শ্রেণি তৈরি করতে হবে যা প্রয়োজনীয় নির্ভরতাগুলি ইনজেকশনের দায়িত্বে থাকবে।
আমরা সমস্ত ফর্ম ক্লাস একসাথে গ্রুপ করব এবং সেগুলি আমাদের ডেমো মডিউলটির প্লাগইন ডিরেক্টরিতে Multistep
অবস্থিত একটি নতুন ফোল্ডারের ভিতরে রাখব Form
। এটি বিশুদ্ধরূপে একটি পরিষ্কার কাঠামো থাকার জন্য এবং কোন ফর্মগুলি আমাদের মাল্টিস্টেপ ফর্ম প্রক্রিয়াটির অংশ তা দ্রুত তা জানাতে সক্ষম হবার জন্য is
এখানে ডেমো কোড ( MultistepFormBase.php
ফাইলের জন্য ):
/**
* @file
* Contains \Drupal\demo\Form\Multistep\MultistepFormBase.
*/
namespace Drupal\demo\Form\Multistep;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Session\SessionManagerInterface;
use Drupal\user\PrivateTempStoreFactory;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class MultistepFormBase extends FormBase {
/**
* @var \Drupal\user\PrivateTempStoreFactory
*/
protected $tempStoreFactory;
/**
* @var \Drupal\Core\Session\SessionManagerInterface
*/
private $sessionManager;
/**
* @var \Drupal\Core\Session\AccountInterface
*/
private $currentUser;
/**
* @var \Drupal\user\PrivateTempStore
*/
protected $store;
/**
* Constructs a \Drupal\demo\Form\Multistep\MultistepFormBase.
*
* @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
* @param \Drupal\Core\Session\SessionManagerInterface $session_manager
* @param \Drupal\Core\Session\AccountInterface $current_user
*/
public function __construct(PrivateTempStoreFactory $temp_store_factory, SessionManagerInterface $session_manager, AccountInterface $current_user) {
$this->tempStoreFactory = $temp_store_factory;
$this->sessionManager = $session_manager;
$this->currentUser = $current_user;
$this->store = $this->tempStoreFactory->get('multistep_data');
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('user.private_tempstore'),
$container->get('session_manager'),
$container->get('current_user')
);
}
/**
* {@inheritdoc}.
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Start a manual session for anonymous users.
if ($this->currentUser->isAnonymous() && !isset($_SESSION['multistep_form_holds_session'])) {
$_SESSION['multistep_form_holds_session'] = true;
$this->sessionManager->start();
}
$form = array();
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#button_type' => 'primary',
'#weight' => 10,
);
return $form;
}
/**
* Saves the data from the multistep form.
*/
protected function saveData() {
// Logic for saving data goes here...
$this->deleteStore();
drupal_set_message($this->t('The form has been saved.'));
}
/**
* Helper method that removes all the keys from the store collection used for
* the multistep form.
*/
protected function deleteStore() {
$keys = ['name', 'email', 'age', 'location'];
foreach ($keys as $key) {
$this->store->delete($key);
}
}
}
তারপরে আপনি ফাইল হিসাবে প্রকৃত ফর্ম শ্রেণি তৈরি করতে পারেন MultistepOneForm.php
:
/**
* @file
* Contains \Drupal\demo\Form\Multistep\MultistepOneForm.
*/
namespace Drupal\demo\Form\Multistep;
use Drupal\Core\Form\FormStateInterface;
class MultistepOneForm extends MultistepFormBase {
/**
* {@inheritdoc}.
*/
public function getFormId() {
return 'multistep_form_one';
}
/**
* {@inheritdoc}.
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Your name'),
'#default_value' => $this->store->get('name') ? $this->store->get('name') : '',
);
$form['email'] = array(
'#type' => 'email',
'#title' => $this->t('Your email address'),
'#default_value' => $this->store->get('email') ? $this->store->get('email') : '',
);
$form['actions']['submit']['#value'] = $this->t('Next');
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->store->set('email', $form_state->getValue('email'));
$this->store->set('name', $form_state->getValue('name'));
$form_state->setRedirect('demo.multistep_two');
}
}
ইন buildForm()
পদ্ধতি আমরা আমাদের দুই ডামি ফর্ম উপাদানের সংজ্ঞা করছে। লক্ষ্য করুন যে আমরা পিতামাত্ত শ্রেণীর থেকে বিদ্যমান ফর্ম সংজ্ঞাটি পুনরুদ্ধার করছি। এই ক্ষেত্রগুলির জন্য ডিফল্ট মানগুলি সেই কীগুলির জন্য স্টোরের মধ্যে পাওয়া মান হিসাবে সেট করা হয় (যাতে ব্যবহারকারীরা এই পদক্ষেপে তারা পূরণ করা মানগুলি যদি তারা ফিরে আসে তবে তারা দেখতে পারে)। অবশেষে, আমরা অ্যাকশন বোতামের মানটিকে নেক্সটে পরিবর্তন করছি (এই ফর্মটি চূড়ান্ত নয় এটি বোঝাতে)।
ইন submitForm()
পদ্ধতি আমরা দোকান থেকে পেশ মান সংরক্ষণ এবং তারপর দ্বিতীয় ফর্ম (রুট এ পাওয়া যাবে যা পুনর্নির্দেশ demo.multistep_two
)। মনে রাখবেন যে কোডটি হালকা রাখতে আমরা এখানে কোনও ধরণের বৈধতা করছি না। তবে বেশিরভাগ ব্যবহারের ক্ষেত্রে কিছু ইনপুট বৈধতার জন্য ডাকা হবে।
এবং ডেমো মডিউলটিতে আপনার রাউটিং ফাইল আপডেট করুন ( demo.routing.yml
):
demo.multistep_one:
path: '/demo/multistep-one'
defaults:
_form: '\Drupal\demo\Form\Multistep\MultistepOneForm'
_title: 'First form'
requirements:
_permission: 'access content'
demo.multistep_two:
path: '/demo/multistep-two'
defaults:
_form: '\Drupal\demo\Form\Multistep\MultistepTwoForm'
_title: 'Second form'
requirements:
_permission: 'access content'
শেষ অবধি, দ্বিতীয় ফর্মটি তৈরি করুন ( MultistepTwoForm
):
/**
* @file
* Contains \Drupal\demo\Form\Multistep\MultistepTwoForm.
*/
namespace Drupal\demo\Form\Multistep;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
class MultistepTwoForm extends MultistepFormBase {
/**
* {@inheritdoc}.
*/
public function getFormId() {
return 'multistep_form_two';
}
/**
* {@inheritdoc}.
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$form['age'] = array(
'#type' => 'textfield',
'#title' => $this->t('Your age'),
'#default_value' => $this->store->get('age') ? $this->store->get('age') : '',
);
$form['location'] = array(
'#type' => 'textfield',
'#title' => $this->t('Your location'),
'#default_value' => $this->store->get('location') ? $this->store->get('location') : '',
);
$form['actions']['previous'] = array(
'#type' => 'link',
'#title' => $this->t('Previous'),
'#attributes' => array(
'class' => array('button'),
),
'#weight' => 0,
'#url' => Url::fromRoute('demo.multistep_one'),
);
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->store->set('age', $form_state->getValue('age'));
$this->store->set('location', $form_state->getValue('location'));
// Save the data
parent::saveData();
$form_state->setRedirect('some_route');
}
}
submitForm()
পদ্ধতির অভ্যন্তরে আমরা আবার স্টোরগুলিতে মানগুলি সংরক্ষণ করি এবং এই ডেটাটিকে যেভাবে উপযুক্ত মনে হয় ততটুকু ধরে রাখতে পিতামাতার ক্লাসে মুলতবি। তারপরে আমরা আমাদের যে পৃষ্ঠাটি চাই সেগুলিতে পুনঃনির্দেশ করি (আমরা এখানে যে রুটটি ব্যবহার করি এটি একটি ডামি একটি)।
আমাদের এখন একটি কার্যকরী মাল্টিস্টিপ ফর্ম থাকা উচিত যা PrivateTempStore
একাধিক অনুরোধ জুড়ে ডেটা উপলব্ধ রাখতে ব্যবহার করে । আমাদের যদি আরও পদক্ষেপের প্রয়োজন হয় তবে আমাদের আরও কিছু ফর্ম তৈরি করতে হবে, বিদ্যমান বিদ্যমানগুলির মধ্যে এগুলি যুক্ত করতে হবে এবং বেশ কয়েকটি সমন্বয় করতে হবে।