web-dev-qa-db-fra.com

Comment modifier par programme un message système?

Hé là, je veux changer ou masquer un message drupal de la classe CommentForm.

Dans mon entity_insert() crochet, j'ai défini un nouveau message.

J'ai une idée de comment le faire, mais je ne sais toujours pas où le faire.

idée:

si vous désactivez le $_SESSION['messages'] et le définissez avec mon message après l'avoir désactivé.

Ou

drupal_get_message($type, TRUE).

problème mon message sera placé avant celui que je veux exclure. Donc, si je désactive le tableau de messages, mon message disparaîtra également.

Donc, ma question est de savoir où les mettre dans mon module?

J'ai également essayé de connecter le formulaire spécifique et d'ajouter un gestionnaire de soumission, mais cela ne fonctionne pas.

/**
 * 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'];
}

Ok je l'ai compris. Mais cette solution est assez moche à mon avis.

Je fais cela dans un 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

Les messages système sont stockés dans un Symfony Flashbag , il n'est donc pas nécessaire de pirater les variables de session, qui peuvent changer d'une version à l'autre. Dans Drupal 8.5 un nouveau service Messenger a été introduit pour encapsuler le sac flash symfony et vous pouvez supprimer des messages avec deleteAll () :

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

Je cherchais une solution similaire et j'ai trouvé cet excellent article décrivant l'utilisation d'un hook_preprocess_HOOK (), dans ce cas, hook_preprocess_status_messages () - https://stackoverflow.com/questions/38788080/remove-default-message-in- drupal-8

Dans le but de remplacer un message, j'utilise une simple strpos dans la logique:

/**
 * 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

Je pense que la réponse pourrait être de ne pas utiliser hook_entity_insert (). À ce moment-là, il est trop tard: le contenu a déjà été créé, le système créera donc le message en conséquence.

Comme le dit la documentation hook_entity_insert : hook_entity_insert répond à la création d'une nouvelle entité.

Essayez peut-être n autre hook de l'API Entity , un qui ne provoque pas la génération du message indésirable.

2
mcaleaa

en supposant que les messages en question sont form_errors à partir de la validation du formulaire:

Plutôt que de modifier les messages après coup, vous pouvez remplacer/remplacer le #validate fonction (s) qui produisent les erreurs en premier lieu (à partir de hook_form_alter) et fournissent vos propres erreurs personnalisées.

1
autopoietic

Vous pouvez faire unset($SESSION['_symfony_flashes']['status'][0]). Dans mon cas, unset($_SESSION['messages']['status']) n'a pas fonctionné. Ensuite, j'ai pu faire \Drupal::messenger()->addMessage(t('My message here')).

J'espère que cela aide quelqu'un.

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!'));
  }
}

Cela semble un peu plus joli et cela fonctionne.

0
Insasse