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 ...
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.
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
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:
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
.
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, 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.
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 ...
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.
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;
}
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.
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;
}