आम तौर पर आप या तो cTools ऑब्जेक्ट कैश ( Drupal 7 में मल्टीस्टेप फॉर्म के समान ), या $form_state
(इस ट्यूटोरियल के अनुसार ) के माध्यम से चरणों के बीच फॉर्म वैल्यू स्टोर कर सकते हैं ।
Drupal 8 में आप FormBase
एक नया मल्टीस्टेप क्लास बनाने के लिए क्लास इनहेरिट कर सकते हैं ।
Drupal 8 में मल्टी-स्टेप फॉर्म का निर्माण कैसे करें लेख में आप Drupal 8 में एक मल्टीस्टेप फॉर्म बनाने का एक सरल तरीका पा सकते हैं।
सबसे पहले, आपको आधार वर्ग बनाने की आवश्यकता होगी जो आवश्यक निर्भरता को इंजेक्ट करने के प्रभारी होंगे।
हम सभी फॉर्म कक्षाओं को एक साथ जोड़ेंगे और उन्हें हमारे डेमो मॉड्यूल Multistep
के Form
प्लगइन डायरेक्टरी के भीतर स्थित एक नए फ़ोल्डर के अंदर रखेंगे । यह विशुद्ध रूप से एक स्वच्छ संरचना होने और जल्दी से यह बताने में सक्षम है कि कौन से रूप हमारे मल्टीस्टेप फॉर्म प्रक्रिया का हिस्सा हैं।
यहाँ डेमो कोड ( 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
डेटा का उपयोग कई अनुरोधों पर उपलब्ध रखता है। अगर हमें और अधिक चरणों की आवश्यकता है, तो हमें केवल कुछ और रूप बनाने होंगे, उन्हें मौजूदा लोगों के बीच जोड़ना होगा और कुछ समायोजन करने होंगे।