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分。
最良のアイデアは、以下を実行するカスタムモジュールを使用することです。
field_article_datetime
の値をupdated time + 5 * 60
に設定します。上記のアクションは、ユーザーが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();
}
}
トークンだけのソリューションは考えられません。トークンのない迅速でダーティなソリューションは次のとおりです
Article datetimeフィールドを設定して、デフォルトの相対時間を+ 5分にします
このフィールドを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()
の部分を削除するだけです。