Wie deaktiviere ich das Titelfeld im Knotenbearbeitungsformular?

8

Wie kann ich das Titelfeld im Knotenbearbeitungsformular ausblenden oder deaktivieren?

Wenn ich dies über den Inhaltstyp Registerkarte "Formularanzeige verwalten" ( admin/structure/types/manage/CONTENT_TYPE_MACHINE_NAME/form-display) tue, werden im Protokoll einige Integritätsbeschränkungsfehler angezeigt .

Daher möchte ich das Standardtitelfeld nicht im Knotenbearbeitungsformular anzeigen. Wenn ich das Titelfeld normalerweise wie andere Felder verstecke. Nach der Knotenerstellung wurde ein weißer Bildschirm angezeigt. Und log sagt, dass das Titelfeld nicht null sein kann ... und so weiter ...

Mudassar Ali
quelle
Suchen Sie Node::setTitle?
Jimmy Ko
@ JimmyKom Danke für den Kommentar. Lassen Sie mich umformulieren, ich möchte kein Standardtitelfeld im Knotenbearbeitungsformular anzeigen. Wenn ich das Titelfeld normalerweise wie andere Felder verstecke. Nach der Knotenerstellung wurde ein weißer Bildschirm angezeigt. Und Protokoll sagt Titelfeld kann nicht null sein .... und so weiter ...
Mudassar Ali
Lösen Sie Ihr Problem?
Adrian Cid Almaguer

Antworten:

6

Sie können mit hook_form_alter () Funktion zu verändern , jede Form (einschließlich Knoten bearbeiten Form) und deaktivieren Titel Feld. Überprüfen Sie den folgenden Beispielcode:

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

Wenn Sie nur ein Formular ändern, können Sie die Funktion hook_form_FORM_ID_alter () überprüfen und FORM_ID mit node_ [CONTENT_TYPE] _edit_form ändern, wobei CONTENT_TYPE Ihr Knotentypformular ist.

BEARBEITEN:

Um den Knotentitel automatisch festzulegen, ohne dass der Benutzer das Titelfeld sehen kann, können Sie das automatische Entitätsbeschriftungsmodul verwenden . Das Modul ist in der Dev-Version für D8, aber wir können es ausprobieren, wenn es richtig funktioniert.

Wenn Sie das Modul " Automatische Entitätsbezeichnung" nicht verwenden möchten , können Sie dies mit benutzerdefiniertem Code versuchen. Überprüfen Sie den Beispielcode hier

Yogesh
quelle
Danke, aber das Deaktivieren des Feldes ist kein Problem. Es scheint, dass Drupal Core es nicht erlaubt, Knoten ohne Titel zu erstellen. Wie Sie diesen Fehler von DBDrupal\Core\Entity\EntityStorageException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null: INSERT INTO {node_field_data}
Mudassar Ali
Ok, im Grunde möchten Sie das Titelfeld weder beim Hinzufügen noch beim Bearbeiten von Knoteninhalten anzeigen und Benutzern erlauben, Inhalte zu erstellen, oder? Wenn ja, lesen Sie dieses Modul Automatische Entitätsbezeichnung, wenn dies hilfreich ist. Das Modul befindet sich derzeit in der Entwicklungsversion.
Yogesh
das ist in dev für D8. nicht sicher sicher zu benutzen ...
Mudassar Ali
1
Wenn das Modul " Automatische Entitätsbezeichnung" nicht funktioniert, können Sie den unter diesem Link angegebenen Beispielcode ausprobieren. Drupal 8-Titel automatisch ausfüllen? .
Yogesh
1
Wie identifizieren Sie Knoten in der Verwaltungsoberfläche, wenn sie keinen Titel haben? Wie rechnen Sie Metadaten und dergleichen ab? Das ist ziemlich unorthodox, nur zu sagen. Am besten irgendwie einen Wert eingeben.
Kevin
4

tl; dr: Geben Sie einen Standardtitel an und erlauben Sie dem Benutzer nicht, ihn zu ändern.

Der Änderungsdatensatz D7 → D8 lautet :

node_type-> has_title wurde zugunsten von Entitätsformularanzeigen entfernt

Jetzt, da es möglich ist, das Verhalten des Knotentitel-Widgets mithilfe von Entitätsformularanzeigen zu konfigurieren, wird das spezielle Flag zum Ausblenden des Titelformularelements für Knoten nicht mehr benötigt.

Um den Titel für einen bestimmten Knotentyp auszublenden, verwenden Sie die Benutzeroberfläche "Formularanzeige verwalten" oder verbergen Sie ihn mit einem Snippet wie dem folgenden:

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

Nachdem ich das gelesen hatte, versuchte ich es auf verschiedene Arten. Nur der letzte funktioniert, daher sollte diese Antwort als Warnung dienen, was nicht zu versuchen ist:

Bearbeiten Sie die Konfiguration entity_form_display

Wenn es sich um Ihr eigenes Modul handelt, bearbeiten Sie core.entity_form_display.node.my_content_type.default.ymlden titleSchlüssel und entfernen Sie ihn aus content. Dies funktioniert für Felder, aber wenn ich den Titel oder andere Standardelemente wie Heraufstufen, Erstellen usw. entferne, werden sie weiterhin im Formular unter angezeigt /node/add/my_content_type.

Ändern Sie die Anzeige entity_form_display im Code

Fügen Sie diesen Code hinzu zu my_module_install:

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

Dies funktioniert visuell, es gibt jedoch drei Probleme mit dieser Lösung: - Es verursacht immer noch die Integritätsbeschränkungsfehler, auf die Sie verweisen. - Es bewirkt, dass die Konfiguration in der Datenbank die Konfiguration in der Datei bei der Installation überschreibt, was meiner Meinung nach eine schlechte Idee ist, IMHO. - entity_get_form_displayist veraltet

Blenden Sie es in der Konfiguration entity_form_display aus

Verstecke es, aber entferne es nicht. In core.entity_form_display.node.my_content_type.default.yml:

hidden:
  title: false

Durch Versuch und Irrtum fand ich, dass die Logik hier umgekehrt wurde. Auch dies verursacht die Integritätsbeschränkungsfehler, auf die Sie verweisen.

Verstecke es mit CSS

Ich habe es versucht, und es scheint, dass leere Zeichenfolgen für den Titel ebenfalls nicht zulässig sind. Sie müssen also entweder Ihren eigenen Entitätstyp erstellen, der den größten Teil des Codes aus dem Kernknotenmodul neu implementiert, oder ...

Die einzige funktionierende Lösung, die ich finden konnte

Geben Sie einen Standardtitel an und erlauben Sie dem Benutzer nicht, ihn zu ändern.

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';
}

Sie können nonezu my_moduleeinem Zeitstempel oder Ihrer Lieblingsmarke für Erdnussbutter wechseln .

rudolfbyker
quelle
2

So löse ich dieses Problem in einem Projekt. Derzeit verfügt Automatic Entity Label nicht über eine Drupal 8-Version. Wenn Sie den Code sehen , finden Sie nur eine info.yml-Datei.

Sie müssen immer den Titel festlegen, also legen Sie bei der Erstellung der Entität den Titel fest.

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

Und der andere Teil ist, den Titel im Knotenformular auszublenden. Dazu können Sie Folgendes verwenden:

/**
 * 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);
}

Und in diesem Hook versteckst du den Titel, damit machst du den Trick

/**
 * 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;
}
Adrian Cid Almaguer
quelle
1

Sie können auch das automatische Knotentitelmodul verwenden. Auf diese Weise können Sie den Knotentitel in der Konfiguration des Inhaltstyps auf den gewünschten Wert festlegen, das Feld wird jedoch beim Hinzufügen oder Bearbeiten nicht angezeigt.

Gareth Davies
quelle
0

Ich fand den Titel im Layout-Generator in vielerlei Hinsicht nützlich: - Inhaltsvorschau anzeigen - Als Block-ID verwenden

Meine Lösung generiert automatische Titel, indem sie den Blocktyp-Titel verwendet und die Anzahl der Blöcke desselben Typs zählt.

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

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Maor Gigi
quelle