web-dev-qa-db-ja.com

トークンを使用して、日付フィールドを「現在時刻」+「5分」に設定します

Field Timer モジュールを使用して、記事ノードにカウントダウンタイマーを表示しています。

私の記事ノードに(field_article_datetime)という名前の日付/時刻フィールドがあるとしましょう

このモジュールは、日付/時刻フィールド(field_article_datetime)の値を取得し、記事の表示でそれをカウントダウンタイマーに変換します。

記事ノードが作成されたら、日付/時刻フィールド(field_article_datetime)の値を現在時刻+ 5分に設定します。

現在の時間を抽出するために、トークンモジュールからトークン[node:created]を使用していますが、+ 5分を追加する方法の解決策が見つかりません-)トークン[node:created]に。

例:

12/03/2019 08:50:15 PMと言うと、ユーザーが新しい記事ノードを作成しました...したがって、+ 5分を作成時刻に追加して、(field_article_datetime)という名前の日付/時刻フィールドが12 /になるようにします03/2019 08:55:15 PM...

これにより、記事ノードの表示ページに5分間のカウントダウンタイマーが表示されます。

注:私は ビジネスルール モジュール( Rules モジュールと同様)を使用して、トークンモジュールを使用した日付/時刻フィールド(field_article_datetime)の値。


Update#1:ノードがサイトにすでに作成されており、Webフォームの送信後に更新時間+ 5分

最良のアイデアは、以下を実行するカスタムモジュールを使用することです。

  1. Nidで記事を取得します。
  2. field_article_datetimeの値をupdated time + 5 * 60に設定します。
  3. ノードを保存する

上記のアクションは、ユーザーがWebフォームを送信するときにトリガーされるため、customwebformhandler.phpファイルを作成しないでください。

カスタムWebフォームハンドラーファイルを作成しましたが、私はプログラマーではないので、ファイルを完成させるために助けが必要です。

<?php

namespace Drupal\my_module_name\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;

use Drupal\node\Entity\Node;

use Drupal\webform\WebformInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;
use Drupal\webform\Entity\WebformSubmission;


/**
 * Update a node entity from a webform submission.
 *
 * @WebformHandler(
 *   id = "Update a node",
 *   label = @Translation("Update a node"),
 *   category = @Translation("Entity Update"),
 *   description = @Translation("Updates a node from Webform Submissions."),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 *   submission = \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_REQUIRED,
 * )
 */

class UpdateNodeWebformHandler extends WebformHandlerBase {

  /**
   * {@inheritdoc}
   */

  // Fetch & Update node object from webform-submission.

  // Function to be fired while submitting the Webform.
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    // Get an array of the values from the submission.
    $values = $webform_submission->getData();

    // The webform has an element text field with machine name (update_nid) which 
    // contains the node ID of the node to be updated.
    // This is the part where to fetch the node by the value of (update_nid) element.
        Some code here

    // This is the node Updating part.
    $created = $entity->updated->value;
    date_default_timezone_set('GMT');
    $createdadd5 = date('Y-m-d\TH:i:s', $created + 5 * 60);
    $entity->field_article_datetime->value = $createdadd5;

    // This is the node Saving part.
    $node->save();
  }
}
1
Elie Masaad

トークンだけのソリューションは考えられません。トークンのない迅速でダーティなソリューションは次のとおりです

Article datetimeフィールドを設定して、デフォルトの相対時間を+ 5分にします

enter image description here

このフィールドをcssで非表示にして、ユーザーが変更しないようにするか、または_hook_form_alter_ファイルの_MODULENAME.module_関数で変更できます。

_// adjust node_article_form for your content type 
if($form_id == 'node_article_form'  || $form_id == "node_article_edit_form"){
  $form["field_article_datetime"]['widget'][0]['value']['#attributes']['readonly'] = 'readonly';
}
_

もちろん、ユーザーがフォームに入力するのに時間がかかる場合、設定された日時はノードの作成時間+5分を正確に反映しない可能性があります(日時はフォームの作成時に設定されるため)。

上記が十分でない場合は、_hook_entity_presave_を使用して、作成時間+5分になるように時間を調整できます。

_function MODULENAME_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  // adjust article to reflect your content type
  if ($entity->bundle() == "article" && $entity->isNew()) {
    $created = $entity->created->value;
    date_default_timezone_set('GMT');
    $createdadd5 = date('Y-m-d\TH:i:s', $created + 5 * 60);
    $entity->field_article_datetime->value = $createdadd5;
  }
}
_

注:ノードの更新時にもタイマーを更新する場合は、&& $entity->isNew()の部分を削除するだけです。

1
GiorgosK