web-dev-qa-db-fra.com

Comment désactiver le champ de titre sur le formulaire d'édition de nœud?

Comment masquer ou désactiver le champ de titre sur le formulaire de modification de nœud?

Si je le fais à partir de l'onglet d'affichage du formulaire de gestion du type de contenu (admin/structure/types/manage/CONTENT_TYPE_MACHINE_NAME/form-display), puis j'obtiens des erreurs de contrainte d'intégrité dans le journal.

Donc, je ne veux pas afficher le champ de titre par défaut dans le formulaire d'édition Node. Si je masque le champ de titre normalement comme les autres champs. Obtient un écran blanc après la création du nœud. Et le journal indique que le champ de titre peut ' t null null .... et ainsi de suite ...

8
Mudassar Ali

Vous pouvez utiliser la fonction hook_form_alter () pour modifier n'importe quel formulaire (y compris le formulaire de modification de nœud) et désactiver le champ Title. Vérifiez l'exemple de code ci-dessous:

use Drupal\field_collection\Entity\FieldCollectionItem;

function [MODULE_NAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  switch ($form_id) {
    case 'node_[CONTENT_TYPE]_edit_form':
      $form['title']['#disabled'] = 'disabled';
      break;
  }
}

Si vous modifiez un seul formulaire, vous pouvez vérifier hook_form_FORM_ID_alter () fonction et changer FORM_ID avec node_ [CONTENT_TYPE] _edit_form où CONTENT_TYPE est votre formulaire de type de nœud.

ÉDITER :

Pour définir automatiquement le titre du nœud sans permettre à l'utilisateur de voir le champ de titre, vous pouvez utiliser Étiquette d'entité automatique Module. Le module est en version dev pour D8, mais nous pouvons l'essayer s'il fonctionne correctement.

Si vous ne souhaitez pas utiliser le module Étiquette d'entité automatique , vous pouvez essayer de faire de même avec du code personnalisé, consultez l'exemple de code ici

6
Yogesh

tl; dr: Spécifiez un titre par défaut et ne permettez pas à l'utilisateur de le changer.

Le D7 → D8 modifier les enregistrements état:

node_type-> has_title supprimé au profit des affichages de formulaire d'entité

Maintenant qu'il est possible de configurer le comportement du widget de titre de noeud à l'aide des affichages de formulaire d'entité, l'indicateur spécial pour masquer l'élément de formulaire de titre pour les noeuds n'est plus nécessaire.

Pour masquer le titre d'un certain type de nœud, utilisez l'interface utilisateur "Gérer l'affichage du formulaire" ou masquez-le avec un extrait comme celui-ci:

$form_display = entity_get_form_display('node', 'article', 'default');
$form_display->removeComponent('title');
$form_display->save();

Après avoir lu cela, j'ai essayé plusieurs façons de le faire. Seul le dernier fonctionne, donc cette réponse devrait servir d'avertissement de ce que pas à essayer:

Modifier la configuration entity_form_display

S'il s'agit de votre propre module, modifiez core.entity_form_display.node.my_content_type.default.yml et supprimez la clé title de content. Cela fonctionne pour les champs, mais si je supprime le titre ou tout autre élément par défaut comme promu, créé, etc., ils sont toujours affichés sur le formulaire à /node/add/my_content_type.

Modifier l'entité_form_display dans le code

Ajoutez ce code à my_module_install:

$form_display = entity_get_form_display('node', 'my_content_type', 'default');
$form_display->removeComponent('title');
$form_display->save();

Cela fonctionne visuellement, mais il y a trois problèmes avec cette solution: - Elle provoque toujours les erreurs de contrainte d'intégrité auxquelles vous faites référence. - Il provoque la config dans la base de données pour remplacer la config dans le fichier au moment de l'installation, ce qui est une mauvaise idée, à mon humble avis. - entity_get_form_display est obsolète

Cachez-le dans la configuration entity_form_display

Cachez-le, mais ne le supprimez pas. Dans core.entity_form_display.node.my_content_type.default.yml:

hidden:
  title: false

Par essais et erreurs, j'ai trouvé que la logique était inversée ici. Cela provoque également les erreurs de contrainte d'intégrité auxquelles vous faites référence.

Cachez-le en utilisant CSS

J'ai essayé, et il semble que les chaînes vides soient également interdites pour le titre. Vous devez donc soit créer votre propre type d'entité, qui réimplémente la plupart du code du module de nœud principal, ou ...

La seule solution de travail que j'ai pu trouver

Spécifiez un titre par défaut et n'autorisez pas l'utilisateur à le modifier.

function my_module_form_node_my_content_type_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  $form['title']['#disabled'] = 'disabled';
  $form['title']['widget'][0]['value']['#default_value'] = 'none';
}

Vous pouvez remplacer none par my_module, un horodatage ou votre marque préférée de beurre d'arachide.

4
rudolfbyker

C'est ainsi que je résous ce problème dans un projet. En ce moment Étiquette d'entité automatique n'ont pas de Drupal 8, si vous voir le code vous ne trouverez qu'une info. fichier yml.

Vous devez toujours définir le titre, donc lors de la création de l'entité, vous définissez le titre.

use Drupal\node\NodeInterface;

/**
 * Implements hook_ENTITY_TYPE_create
 */
function YOUR_MODULE_node_create(NodeInterface $node) {
  switch ($node->getType()) {
    case 'CONTENT_TYPE_MACHINE_NAME':
      $node->title = 'Date: ' . date('Y-m-d G:i:s');
      break;
  }
}

Et l'autre partie est de masquer le titre sous la forme du nœud, pour ce faire, vous pouvez utiliser:

/**
 * Implements hook_form_alter().
 */
function YOUR_MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  //With this you will know your form_id (see in the next function YOUR_FORM_ID)
  dpm($form_id);
}

Et dans ce crochet, vous cacherez le titre, avec cela, vous faites le tour

/**
 * Implements hook_form_FORM_ID_alter().
 */
function YOUR_MODULE_form_YOUR_FORM_ID_alter(array &$form, FormStateInterface $form_state, $form_id) {
  $form['title']['#access'] = FALSE;
}
2
Adrian Cid Almaguer

Vous pouvez également utiliser le module de titre de nœud automatique. Cela vous permettra de définir le titre du nœud comme vous le souhaitez dans la configuration du type de contenu, mais n'affichera pas le champ lors de l'ajout ou de la modification.

1
Gareth Davies

J'ai trouvé le titre utile à bien des égards dans le générateur de mise en page: - Afficher l'aperçu du contenu - L'utiliser comme identifiant de bloc

Ma solution génère des titres automatiques en utilisant le titre du type de bloc et en comptant le nombre de blocs du même type.

function [module]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  if ($form_id === 'layout_builder_add_block') {
    // Get the blocks plugins id counter.
    $bundle = $form['settings']['block_form']['#block']->bundle();
    $plugin_id = 'inline_block:' . $bundle;

    // Get the blocks plugins id count array.
    if ($node = $form_state->getTemporary()['gathered_contexts']['layout_builder.entity']->getContextData()->getEntity()) {
      $block_count = 0;
      foreach ($node->layout_builder__layout as $section) {
        $components = $section->section->getComponents();
        foreach ($components as $block) {
          if ($plugin_id === $block->getPluginId()) {
            $block_count += 1;
          }
        }
      }
    }

    // If not exist start from 0.
    // Insert default title.
    $form['settings']['label']['#default_value'] = t('%title-%title_id', [
      '%title' => $form['settings']['admin_label']['#plain_text'],
      '%title_id' => $block_count,
    ]);
    // Change title description.
    $form['settings']['label']['#title'] = t('Block id');
    $form['settings']['label']['#description'] = t('Automatic id generator. Can be modified by user but must be unique.');
    // Update and hide display title checkbox.
    // $form['settings']['label_display']['#default_value'] = FALSE;
    // $form['settings']['label_display']['#access'] = FALSE;
  }

  if ($form_id === 'layout_builder_update_block') {
    // Change title description.
    $form['settings']['label']['#title'] = t('Block id');
    $form['settings']['label']['#description'] = t('Automatic id generator. Can be modified by user but must be unique.');
    // Update and hide display title checkbox.
    // $form['settings']['label_display']['#default_value'] = FALSE;
    // $form['settings']['label_display']['#access'] = FALSE;
  }
}

/**
 * HOOK_preprocess_block.
 */
function [module]_preprocess_block(&$variables) {
  // Add id into block.
  $label = qfcc_structure_normaliseLabelToId($variables['label']);
  if (!$label) {
    $label = Rand(100, 999);
  }
  $variables['attributes']['id'] = 'block-' . $label;
}

function [module]_normaliseLabelToId($text) {
  if (!$text) {
    return NULL;
  }

  $text = trim(strtolower($text));
  $text = str_replace(' ', '-', $text);
  $text = str_replace('_', '-', $text);
  $text = preg_replace('/[^a-z0-9\-]/', '', $text);
  return $text ?? NULL;
}

enter image description hereenter image description here

0
Maor Gigi