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.