web-dev-qa-db-fra.com

Passez l'objet utilisateur à jeton :: remplacer

J'ai le code suivant (échantillon) qui fonctionne sur cron et envoie SMS aux utilisateurs.

$token = \Drupal::token();
$message = Hey, [current-user:account-name];
$message_value = $token->replace($message);
  

Lorsque Cron Courez, obtenez le SMS texte sous 'Hey Anonymous 'Cela fonctionne correctement sur le site lorsque l'utilisateur se connecte à. Mais pas sur le cron.

J'ai donc essayé de transmettre l'objet utilisateur pour remplacer le jeton comme suit, mais cela ne fonctionne pas. Avoir le même résultat.

use Drupal\user\Entity\User;
$user = User::load($uid);
$message_value = $token->replace($message,['user' => $user]);

Il y a tellement de nœuds créés à l'aide de ce jeton. Donc, je ne peux pas les éditer tous avec un jeton neuf/personnalisé. Alors, y a-t-il un moyen de remplacer le jeton de l'utilisateur, sans écrire un jeton personnalisé? L'autre solution de contournement est d'utiliser str_replace Comme suit, mais il pourrait exister des jetons d'utilisateur dans le même texte. Donc pas préférable.

  $message_value = str_replace('[current-user:account-name]', $name, $message);

Aucune suggestion?

2
Krishna Mohan

Les current-user Jeton prendra toujours ses données de l'utilisateur actuel, vous ne pouvez pas la remplacer par des paramètres. Voir user_tokens:

if ($type == 'current-user') {
  $account = User::load(\Drupal::currentUser()
    ->id());
  $bubbleable_metadata
    ->addCacheContexts([
    'user',
  ]);
  $replacements += $token_service
    ->generate('user', $tokens, array(
    'user' => $account,
  ), $options, $bubbleable_metadata);
}

Si vous devez contrôler l'objet de compte utilisé pour le jeton, utilisez user plutôt

$message = 'Hey, [user:account-name]';
$message_value = $token->replace($message, ['user' => $account]);
2
Clive