मैं एक फ़ॉर्म कैसे प्रस्तुत करूं?


20

क्या करने के लिए वैकल्पिक है drupal_get_form('user_login')। Drupal 8 में

मैं theme_name.theme में निम्न कोड का उपयोग कर रहा हूं, लेकिन यह काम नहीं करता है।

// Include namespace for userLoginForm.
use \Drupal\Core\core\modules\user\src\Form;

function MYTHEMENAME_preprocess_page(&$variables) {
  $form = UserLoginForm::create();
} 

जवाबों:


33

drupal_get_form() फार्म बिल्डर सेवा द्वारा प्रतिस्थापित किया गया है, जैसे:

$form = \Drupal::formBuilder()->getForm(\Drupal\user\Form\UserLoginForm::class);

देखें रिकॉर्ड बदलें अधिक जानकारी के लिए।

वास्तव में, नहीं - यह परिवर्तन रिकॉर्ड गलत है। यह आपको फॉर्म आईडी पास करने के लिए बताएगा, जब वास्तव में आपको क्लास स्ट्रिंग पास करने की आवश्यकता होती है।


आपके उत्तर के लिए धन्यवाद, लेकिन मैंने पहले ही इसे लिखने के रूप में उपयोग कर लिया है और मुझे बिल्डर बनाने के लिए drupal_get_form परिवर्तन भी पता है, लेकिन मैं यह जानना चाहता हूं कि इसे अपने थीम प्रीप्रोसेस हुक में कैसे उपयोग किया जाए।
कमल ओबेरॉय

1
मुझे यकीन नहीं है कि आपका क्या मतलब है, जब तक $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');कि यह नहीं है?
क्लाइव

2
तर्क एक वर्ग है, एक form_id नहीं। UserLoginForm :: वर्ग जैसा कुछ।
बर्दिर

1
मेरा सुझाव है कि आप PHP 5.5 :: वर्ग का उपयोग करें। यह बहुत आसान है (काम करता है) और कष्टप्रद टाइपो से बचा जाता है
बर्दिर

1
कृपया असंबंधित विषय @KamalOberoi के लिए एक नया प्रश्न पूछें - यह भविष्य के आगंतुकों को उस तरह से अधिक मदद प्रदान करेगा। लेकिन एक सामान्य नियम के रूप में, अपने सर्वर त्रुटि लॉग में देखो और प्रहरी आप उस संदेश देखने के लिए जब
क्लाइव

15

आप फॉर्म फोल्डर के तहत एक फॉर्म बना सकते हैं। और फिर आप अपने फॉर्म को कहीं भी कॉल कर सकते हैं और दिखाए गए अनुसार पैरामेटर पास कर सकते हैं।

ड्रुपल 7 :$form = drupal_get_form('form_id',$parameter);

ड्रुपल 8 :$form = \Drupal::formBuilder()->getForm('Drupal\custom_module\Form\CustomModuleForm',$parameter);


1
नोड ऐड फॉर्म कैसे प्राप्त करें, उदाहरण के लिए: आर्टिकल फॉर्म (/ नोड / ऐड / आर्टिकल) जोड़ें?
जयकंदरी

2
+1, आप इसे नियंत्रक में $ पैरामीटर के बिना भी पास कर सकते हैं।
मिस्टर

5

फॉर्म (D8) वापस करने या रेंडर (D7) करने के लिए दो विकल्प हैं। ये हैं \Drupal::formBuilder()->getFormऔर Drupal::formBuilder()->buildForm। मैं \Drupal::formBuilder()->getFormनीचे के रूप में उपयोग करें।

यदि आप कोई पैरामीटर नहीं दे रहे हैं तो इसका उपयोग करें :

$form = \Drupal::formBuilder()->getForm('\Drupal\example\Form\ExampleForm');
return $form;

यदि आप एक पैरामीटर पास कर रहे हैं तो इसका उपयोग करें :

$parameter = "your_parameter";
$form = \Drupal::formBuilder()->getForm('\Drupal\example\Form\ExampleForm', $parameter);
return $form;
//pass to formbuild function
public function buildForm(array $form, FormStateInterface $form_state, $parameter = NULL){//form code}


ड्रुपल 7 उपरोक्त के बराबर:

$parameter = 'your_parameter';
$form = drupal_get_form('form_id', $parameter);
print drupal_render($form);
//pass to form function
function form_id ($form, &$form_state, $parameter){//form code}

चीयर्स। मुझे बताएं कि क्या इससे लाभ होता है।


2

प्रलेखन वर्ग के एक उदाहरण के रूप में अच्छी तरह से अनुमति देता है। इसलिए

$formObj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($formObj);

यह भी सही है।


शायद ऐसा नहीं करते। यदि फॉर्म क्लास निर्भरता इंजेक्शन का उपयोग करती है, तो आपने इसे यहां पर रोक दिया है। जब तक आपके पास ऐसा करने का एक अच्छा कारण न हो, तब तक फॉर्म बिल्डर को क्लास को तुरंत रद्द कर देना बेहतर होगा।
अनारोनबूमन

0

नीचे के रूप में मान लें कि आपका फॉर्म वर्ग है

namespace Drupal\demo\Form;
use \Drupal\Core\Form\FormBase;
class MyForm extends FormBase {
}

आपको पहले अपने फॉर्म वर्ग से एक नया उदाहरण बनाना होगा, और उसे फॉर्मबाउलर के गेटफ़ॉर्म में पास करना होगा।

$form_obj = new \Drupal\demo\Form\MyForm();
$form = \Drupal::formBuilder()->getForm($form_obj);

2
आपको "नया उदाहरण नहीं बनाना है" - यह गलत है। आपको क्लास स्ट्रिंग पास करना चाहिए।
ईसाई

0

ठीक है, अगर यहाँ अन्य सभी विफल रहता है एक नया रूप राज्य वस्तु सेट करके एक डरपोक चाल है।

use Drupal\Core\Form\FormState;
...

$form_state = new FormState();
$form_state->set('name', $name);
$form_state->set('user', $user);
$render_array = \Drupal::formBuilder()->buildForm('\Drupal\mod\Form\MyForm', $form_state);
...
// Example render.
$response = new AjaxResponse();
// Show a dialog box.
$dialogText['#attached']['library'][] = 'core/drupal.dialog.ajax';
$response->addCommand(new OpenModalDialogCommand("Dialog Title", $render_array, ['width' => '300']));
return $response;

... तो अपने फार्म विधि buildForm में आप तब कर सकते हैं ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.