Drupal 8: Когда я обновляю поле узла до определенного значения, как вызвать мой модуль (managefinishdate.module), чтобы обновить другое поле? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть тип узла с именем машины to_do_item, и я хочу создать модуль с именем managefinishdate для обновления узла: когда пользователь отредактирует поле узла (field_status) на «завершено» и нажмет «сохранить», затем Модуль автоматически обновит field_date_finished до текущей даты.

Я попытался создать модуль и уже успешно установить в "Расширить": function managefinishdate_todolist_update (\ Drupal \ Core \ Entity \ EntityInterface $ entity) { ... } однако, я не уверен, что этот модуль вызывается, потому что, что бы я ни делал внутри, кажется, ничего не появилось.

<?php

use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Entity\Node;

/**  * Implements hook_ENTITY_TYPE_update().
* If a user update status to Completed,
* update the finished date as save date
*/

function managefinishdate_todolist_update(\Drupal\Core\Entity\EntityInterface $entity) {
    $node = \Drupal::routeMatch()->getParameter('node');
    print_r($node);

  //$entity_type = 'node';
  //$bundles = ['to_do_item'];

  //$fld_finishdate = 'field_date_finished';
  //if ($entity->getEntityTypeId() != $entity_type || !in_array($entity->bundle(), $bundles)) {
    //return;
  //}
  //$current_date=date("Y-m-d");
  //$entity->{$fld_finishdate}->setValue($current_date);

} 

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

В соответствии с соглашением Drupal, ваш модуль с именем manage_finish_date должен содержать файл manage_finish_date.module, который находится в корневом каталоге и должен выглядеть следующим образом:

<?php

use Drupal\node\Entity\Node;
/**
 * Implements hook_ENTITY_TYPE_insert().
 */
function manage_finish_date_node_insert(Node $node) {
  ManageFinishDate::update_time();
}
/**
 * Implements hook_ENTITY_TYPE_update().
 */
function manage_finish_date_node_update(Node $node) {
  ManageFinishDate::update_time();
}

У вас также должен быть другой файл с именем 'src / ManageFinishDate.php ', который должен выглядеть следующим образом:

<?php

namespace Drupal\manage_finish_date;

use Drupal;
use Drupal\node\Entity\Node;

class ManageFinishDate {

  public static function update_time($node, $action = 'create') {

    // Entity bundles to act on
    $bundles = array('to_do_item');
    if (in_array($node->bundle(), $bundles)) {
      // Load the node and update
      $status = $node->field_status->value;
      $node_to_update = Node::load($node);
      if ($status == 'completed') {
        $request_time = Drupal::time();
        $node_to_update->set('field_date_finished', $request_time);
        $node_to_update->save();
      }
    }
  }
}

Код не проверен, но должен работать.Убедитесь, что имя модуля и пространство имен совпадают, а также имя файла класса и имя класса совпадают для его работы.Также очистите кеш после загрузки.

Это будет обрабатывать только что созданные и обновленные узлы.

0 голосов
/ 14 июня 2019

Пожалуйста, посмотрите после этого примера кода, который может вам помочь:

function YOUR_MODULE_entity_presave (Drupal \ Core \ Entity \ EntityInterface $ entity) {

switch ($ entity-> bundle ()) {

// Заменить CONTENT_TYPE вашим фактическим типом содержимого

case 'CONTENT_TYPE':

$ node = \ Drupal:: routeMatch () -> getParameter ('node');

if ($ node instanceof \ Drupal \ node \ NodeInterface) {

// Установить текущую дату

}

перерыв;

}

}

...