web-dev-qa-db-ja.com

プログラムでシステムメッセージを変更するにはどうすればよいですか?

コメントフォームクラスのdrupalメッセージを変更または非表示にしたいのですが。

entity_insert()フックで、新しいメッセージを設定します。

私はそれを行う方法については考えていますが、それをどこで行うかはまだわかりません。

考え:

_$_SESSION['messages']_の設定を解除して、設定解除した後にメッセージで設定するかどうか.

または

drupal_get_message($type, TRUE)

問題私のメッセージは、除外したいメッセージの前に設定されます。メッセージ配列の設定を解除すると、メッセージも消えてしまいます。

だから私の質問は、それらをmyModuleのどこに置くのですか?

また、特定のフォームをフックして送信ハンドラを追加しようとしましたが、機能しません。

_/**
 * Implements hook_form_FORM_ID_alter().
 */
function my_module_form_comment_form_alter(&$form, FormStateInterface $form_state) {
  $form['actions']['submit']['#submit'][]  = 'my_module_comment_form_submit';
}

/**
 * Submit handler.
 */
function my_module_comment_form_submit(&$form, FormStateInterface $form_state) {
  $message = $_SESSION['messages'];
}
_

わかりました。しかし、その解決策は私の見解ではかなり醜いです。

これはhook_preprocessで行います。

_/**
 * Implements hook_preprocess_HOOK().
 */
function my_module_preprocess_node(&$variables) {
  $user = Drupal::currentUser();
  $entity_id = $variables['attributes']['data-history-node-id'];
  $entity_type = $variables['elements']['comment']['#entity_type'];
  $bundle = $variables['elements']['comment']['#bundle'];
  $comment_type = FieldConfig::load($entity_type . '.' . $bundle . '.comment');
  $maxCommmentUser = $comment_type->getThirdPartySetting('my_module', 'edit-limit-per-user', FALSE) + 1;
  $limitUser = $comment_type->getThirdPartySetting('my_module', 'edit-limit-per-user', FALSE);
  $currentCommentUser = my_module_get_user($entity_id);
  $maxCommentNode = $comment_type->getThirdPartySetting('my_module', 'edit-limit-per-node', FALSE) + 1;
  $limitNode = $comment_type->getThirdPartySetting('my_module', 'edit-limit-per-node', FALSE);
  $currentCommentNode = my_module_get_node($entity_id);
  if ($maxCommentNode) {
    if ($maxCommentNode <= $currentCommentNode && !$user->hasPermission('bypass comment limit')) {
      drupal_get_messages('status', TRUE);
      drupal_set_message(t('The Node you want to comment has reached its maximum of @maxcommentnode comments', ['@maxcommentnode' => $limitNode]));

    }
  }
  if ($maxCommmentUser) {
    if ($maxCommmentUser <= $currentCommentUser && !$user->hasPermission('bypass comment limit')) {
      drupal_get_messages('status', TRUE);
      drupal_set_message(t('You have commented @maxcomment times, please edit or delete some of your older comments', ['@maxcomment' => $limitUser]));
    }
  }
}
_
7
Insasse

システムメッセージは Symfony Flashbag に保存されるため、バージョンごとに変わる可能性があるセッション変数をハックする必要はありません。 Drupal 8.5では、symfonyのフラッシュバッグをカプセル化するために新しいメッセンジャーサービスが導入され、 deleteAll() でメッセージを削除できます:

\Drupal::messenger()->deleteAll();
3
4k4

私は同様の解決策を探していて、hook_preprocess_HOOK()、この場合はhook_preprocess_status_messages()の使用について説明しているこの素晴らしい記事を見つけました https://stackoverflow.com/questions/38788080/remove-default-message-in- drupal-8

メッセージを上書きする目的で、ロジックで単純なstrposを使用します。

/**
 * Implements hook_preprocess_HOOK().
 *
 * @param $variables
 */
function mymodule_preprocess_status_messages(&$variables) {
  if(isset($variables['message_list']['status'])){
    $status_messages = $variables['message_list']['status'];
    foreach($status_messages as $delta => $message) {
      if (strpos((string) $message, 'The message that I am expecting') !== FALSE) {
        $variables['message_list']['status'][$delta] = "Some different message text";
      }
    }
  }
}
9
Tyler Fahey

答えは、hook_entity_insert()を使用しないことかもしれません。その時までには遅すぎます。コンテンツはすでに作成されているため、システムはそれに応じてメッセージを作成します。

hook_entity_insert documentation が言うように:hook_entity_insertは新しいエンティティの作成に応答します。

たぶん Entity APIからの別のフック を試してみてください。これは、不要なメッセージを生成させないものです。

2
mcaleaa

問題のメッセージがフォームの検証からform_errorsであると想定:

事実の後でメッセージを変更するのではなく、最初に(hook_form_alterから)エラーを生成する#validate関数をオーバーライド/置換して、独自のカスタムエラーを提供できます。

1
autopoietic

unset($SESSION['_symfony_flashes']['status'][0])を実行できます。私の場合、unset($_SESSION['messages']['status'])が機能しませんでした。その後、\Drupal::messenger()->addMessage(t('My message here'))を実行することができました。

これが誰かを助けることを願っています。

0
Kartagis
/**
 * Implements hook_preprocess_HOOK().
 */
function comment_limit_preprocess_node(&$variables) {
  if (in_array('node-max', $_SESSION['messages']['status']) && in_array('user-max', $_SESSION['messages']['status'])) {
    drupal_get_messages('status', TRUE);
    drupal_set_message(t('The comment limit for this node has been reached!'));
    drupal_set_message(t('Your comment limit has been reached!'));
  }
  elseif (in_array('node-max', $_SESSION['messages']['status'])) {
    drupal_get_messages('status', TRUE);
    drupal_set_message(t('The comment limit for this node has been reached!'));
  }
  elseif (in_array('user-max', $_SESSION['messages']['status'])) {
    drupal_get_messages('status', TRUE);
    drupal_set_message(t('Your comment limit has been reached!'));
  }
}

これは少しきれいに見え、機能します。

0
Insasse