it-swarm.com.de

Wie erstelle ich programmgesteuert einen Titel für einen neuen Knoten?

Ich möchte, dass das Titelfeld jedes neuen Knotens des Inhaltstyps Agenda automatisch aus einem Datumsfeld in demselben Knoten erstellt wird.

Ich habe verschiedene Versuche unternommen, #default_value Und #value Auf dem Array $form In hook_form_FORM_ID_alter() zu setzen, aber ohne Wirkung.

Wie kann ich das erreichen?

4
iainH

Hier erfahren Sie, wie Sie dies mit einem Entity Builder-Rückruf tun.

<?php

use Drupal\Core\Form\FormStateInterface;
use Drupal\node\NodeInterface;

//Implements hook_form_FORM_ID_alter()
function agenda_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {

    $form['title']['#access'] = FALSE;
    $form['#entity_builders'][] = 'agenda_node_builder';

}

function agenda_node_builder($entity_type, NodeInterface $node, $form, FormStateInterface $form_state)
{

    $date_of_meeting = $node->field_date_of_meeting->date->format('Y-m-d');
    $node->setTitle('Agenda for meeting on '.$date_of_meeting);

}    

Anmerkungen :

  1. Ich fand, dass der Rückruf in hook_form_BASE_FORM_ID_alter() anstatt in hook_form_FORM_ID_alter Einrichten musste. In diesem Fall wurde er nicht aufgerufen.
    Ich bin dem nicht auf den Grund gegangen, aber es hat wahrscheinlich damit zu tun, dass Alter Hooks in der folgenden Reihenfolge aufgerufen werden: hook_form_alter(), hook_form_BASE_FORM_ID_alter(), hook_form_FORM_ID_alter().

  2. Nodes #entity_builders bieten ein Entitätsobjekt Node zur Änderung an, bevor es gespeichert wird, wenn das Formular schließlich gesendet wird.

Danke an @Berdir für die Hinweise.

8
iainH

Oder Sie könnten hook_entity_presave () oder hook_node_presave () verwenden und dort den Wert des Feldes ändern.

4
balagan

Eine andere Möglichkeit, dies zu erreichen, ist mit diesem Code:

use Drupal\Core\Form\FormStateInterface;
use Drupal\node\NodeInterface;

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MODULE_form_node_CONTENT_TYPE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  //Hide the title
  $form['title']['#access'] = FALSE;
}

/**
 * Implements hook_ENTITY_TYPE_create
 */
function MODULE_node_create(NodeInterface $node) {
  switch ($node->getType()) {
    case 'YOUR_CONTENT_TYPE':
      //Change the title
      $node->title = 'TEXT ' . $node->field_YOUR_FIELD->date->format('d-m-Y');
      break;
  }
}
3

Sie können die Module Automatic Nodetitles und Token verwenden, um dies zu erreichen.

Ich weiß, dass das Modul Automatic Nodetitles Noch keine Drupal 8-Version hat, aber wenn Sie Port Automatic Nodetitles to Drupallesen _ 8 , finden Sie eine funktionierende Lösung.

3

Das Modul Automatic Entity Label sollte eine gute Lösung sein und verfügt über einen D8-Port (derzeit nur DEV-Version).

1
Jonathan