web-dev-qa-db-fra.com

Comment créer un bloc pour mon formulaire personnalisé?

Je crée un module de formulaire personnalisé. Maintenant, je veux montrer mon formulaire dans un bloc. Comment puis-je faire ceci ?

Remarque: je crée MymoduleBlock.php dans/modules/my-module/src/Plugin/Block path avec ce code mais ne fonctionne pas:

<?php

namespace Drupal\my-module\Plugin\Block;

use Drupal\Core\Form\FormInterface;
use Drupal\Core\Block\BlockBase;

class MymoduleBlock extends BlockBase {
  public function build() {
    $form = \Drupal::formBuilder()->getForm('Drupal\my-module\Form\MymoduleForm');
    return $form;
   }
}
3
RobinSon

Le code dans MymoduleBlock::build() est correct, et c'est ce que fait Drupal core dans UserLoginBlock::build() .

  $form = \Drupal::formBuilder()->getForm('Drupal\user\Form\UserLoginForm');
  unset($form['name']['#attributes']['autofocus']);
  // When unsetting field descriptions, also unset aria-describedby attributes
  // to avoid introducing an accessibility bug.
  // @todo Do this automatically in https://www.drupal.org/node/2547063.
  unset($form['name']['#description']);
  unset($form['name']['#attributes']['aria-describedby']);
  unset($form['pass']['#description']);
  unset($form['pass']['#attributes']['aria-describedby']);
  $form['name']['#size'] = 15;
  $form['pass']['#size'] = 15;

Ce qui manque à la définition de bloc, c'est l'annotation (le commentaire avant la classe) qui permet à Drupal d'identifier cette classe comme plugin. Voir ce que Block API dit. est à moi.)

Les blocs sont une combinaison d'une entité de configuration et d'un plugin . L'entité de configuration stocke les informations de placement (thème, région, poids) et toute autre configuration spécifique au bloc. Le plugin de bloc effectue le travail de rendu du contenu du bloc pour l'affichage.

Les plugins de bloc utilisent les annotations définies par \Drupal\Core\Block\Annotation\Block . Voir rubrique Annotations pour plus d'informations sur les annotations.

Dans la classe de bloc que j'ai utilisée comme exemple, l'annotation est la suivante.

/*
 * @Block(
 *   id = "user_login_block",
 *   admin_label = @Translation("User login"),
 *   category = @Translation("Forms")
 * )
 */

De plus, le nom de machine du module ne doit pas contenir de tirets, qui ne sont pas autorisés dans les fonctions PHP. Cela crée des problèmes lorsque vous implémentez des hooks, car le nom de hook est dérivé du nom de machine du Par exemple, l'implémentation de hook_page_attachments() pour votre module serait my-module_page_attachments(), ce qui n'est pas acceptable PHP nom de la fonction.
Si vous pensez que votre module ne va pas implémenter de hooks, gardez à l'esprit que la majorité des modules implémentent au moins hook_update_N () , pour lequel il est également préférable de ne pas utiliser de majuscules dans nom de la machine du module.

7
kiamlaluno

À condition que vous publiez tout votre code, il manque des annotations dans votre classe Block. Les annotations sont utilisées par Drupal 8 pour enregistrer les plugins.

Consultez ce lien pour commencer sur les blocs personnalisés:

https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-block

N'oubliez pas de vider votre cache après avoir créé votre plugin de bloc.

P.S. Je vois que vous avez nommé votre module "mon-module". Les tirets ne sont pas autorisés dans les noms de module, utilisez des traits de soulignement. Pour plus d'informations sur la dénomination des modules, veuillez consulter: https://www.drupal.org/docs/8/creating-custom-modules/naming-and-placing-your-drupal-8-module

2
mvdgun