Nasıl form oluştururum?


20

Alternatifi nedir drupal_get_form('user_login'). Drupal 8 bölgesinde bulundunuz mu?

Theme_name.theme içinde aşağıdaki kodu kullanıyorum, ama çalışmıyor.

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

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

Yanıtlar:


33

drupal_get_form() form oluşturucu hizmeti ile değiştirildi, örneğin:

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

Daha fazla ayrıntı için Değişiklik Kaydı'na bakın.

Aslında, yapma - bu değişiklik kaydı yanlış. Aslında, sınıf dizesini geçmeniz gerektiğinde form kimliğini iletmenizi söyleyecektir.


Cevabınız için teşekkürler ama zaten yazarken kullandım ve ayrıca form oluşturucu için drupal_get_form değişikliği biliyorum ama benim tema önişleme kanca kullanmak nasıl bilmek istiyorum.
Kamal Oberoi

1
Ne demek istediğinden emin değilim $variables['foo_form'] = \Drupal::formBuilder()->getForm('user_login');, öyle değil mi?
Clive

2
Argüman, form_id değil, bir sınıftır. UserLoginForm :: class gibi bir şey.
Berdir

1
PHP 5.5 :: sınıfını kullanmanızı öneririm. Çok daha kolay (kullanımı kullanın) ve can sıkıcı yazım
hatalarını

1
Lütfen ilgisiz bir konu @KamalOberoi için yeni bir soru sorun - bu, gelecekteki ziyaretçilere bu şekilde daha fazla yardım sağlayacaktır. Ancak genel bir kural olarak, bu mesajı gördüğünüzde sunucunuzun hata günlüklerine ve gözlemciye bakın
Clive

15

Form klasörü altında bir form oluşturabilirsiniz. Ve sonra formunuzu herhangi bir yere çağırabilir ve parametreyi gösterildiği gibi geçirebilirsiniz.

Drupal 7 :$form = drupal_get_form('form_id',$parameter);

Drupal 8 :$form = \Drupal::formBuilder()->getForm('Drupal\custom_module\Form\CustomModuleForm',$parameter);


1
Bir düğüm ekleme formu nasıl alınır, örneğin: makale formu ekle (/ düğüm / add / makale)?
JayKandari

2
+1, denetleyicide $ parametresi olmadan da iletebilirsiniz.
17'de

5

Formu döndürmek (D8) veya oluşturmak (D7) için iki seçenek vardır. Bunlar \Drupal::formBuilder()->getFormve Drupal::formBuilder()->buildForm. \Drupal::formBuilder()->getFormAşağıdaki gibi kullanıyorum .

Bir parametre geçirmiyorsanız bunu kullanın :

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

Bir parametre iletiyorsanız bunu kullanın :

$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}


Drupal 7 Yukarıdakilerin eşdeğeri:

$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}

Şerefe. Yardımcı olursa haberim olsun.


2

Belgeler sınıfın bir örneğine de izin verir. Yani

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

de doğrudur.


Muhtemelen bunu yapma. Form sınıfının bağımlılık enjeksiyonunu kullanması durumunda, burada atlattınız. Bunu yapmak için iyi bir nedeniniz yoksa form oluşturucunun sınıfı başlatmasına izin vermek daha iyidir.
aaronbauman

0

Form sınıfınız olduğunu varsayarsak

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

Önce form sınıfınızdan yeni bir örnek oluşturmanız ve bunu formBuilder'ın getForm öğesine iletmeniz gerekir.

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

2
"Yeni bir örnek oluşturmak zorunda değilsiniz" - bu yanlıştır. Sınıf dizesini geçiyor olmalısınız.
Christian

0

Burada her şey başarısız olursa, yeni bir form durumu nesnesi ayarlayarak sinsi bir hile.

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;

... sonra form yönteminizde buildForm yapabilirsiniz ...

 // Get form state.
 $name = $form_state->get('name');
 if (!empty($name)) {
    $form['name'] = [
      '#type' => 'item',
      '#markup' => $name,
    ];
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.