View source
<?php
namespace Drupal\message\Entity;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Annotation\PluralTranslation;
use Drupal\Core\Annotation\Translation;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Language\Language;
use Drupal\Core\Render\Markup;
use Drupal\message\MessageException;
use Drupal\message\MessageInterface;
use Drupal\message\MessageTemplateInterface;
use Drupal\user\UserInterface;
class Message extends ContentEntityBase implements MessageInterface {
protected $arguments;
protected $language = Language::LANGCODE_NOT_SPECIFIED;
public function setTemplate(MessageTemplateInterface $template) {
$this
->set('template', $template);
return $this;
}
public function getTemplate() {
return MessageTemplate::load($this
->bundle());
}
public function getCreatedTime() {
return $this
->get('created')->value;
}
public function setCreatedTime($timestamp) {
$this
->set('created', $timestamp);
return $this;
}
public function getOwner() {
return $this
->get('uid')->entity;
}
public function getOwnerId() {
return $this
->getEntityKey('uid');
}
public function setOwnerId($uid) {
$this
->set('uid', $uid);
return $this;
}
public function setOwner(UserInterface $account) {
$this
->set('uid', $account
->id());
return $this;
}
public function getUuid() {
return $this
->get('uuid')->value;
}
public function getArguments() {
$arguments = $this
->get('arguments')
->first();
return $arguments ? $arguments
->getValue() : [];
}
public function setArguments(array $values) {
$this
->set('arguments', $values);
return $this;
}
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields['mid'] = BaseFieldDefinition::create('integer')
->setLabel(t('Message ID'))
->setDescription(t('The message ID.'))
->setReadOnly(TRUE)
->setSetting('unsigned', TRUE);
$fields['uuid'] = BaseFieldDefinition::create('uuid')
->setLabel(t('UUID'))
->setDescription(t('The message UUID'))
->setReadOnly(TRUE);
$fields['template'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Template'))
->setDescription(t('The message template.'))
->setSetting('target_type', 'message_template')
->setReadOnly(TRUE);
$fields['langcode'] = BaseFieldDefinition::create('language')
->setLabel(t('Language code'))
->setDescription(t('The message language code.'));
$fields['uid'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Created by'))
->setDescription(t('The user that created the message.'))
->setSettings([
'target_type' => 'user',
'default_value' => 0,
])
->setDefaultValueCallback('Drupal\\message\\Entity\\Message::getCurrentUserId')
->setTranslatable(TRUE);
$fields['created'] = BaseFieldDefinition::create('created')
->setLabel(t('Created on'))
->setDescription(t('The time that the message was created.'))
->setTranslatable(TRUE);
$fields['arguments'] = BaseFieldDefinition::create('map')
->setLabel(t('Arguments'))
->setDescription(t('Holds the arguments of the message in serialise format.'));
return $fields;
}
public function getText($langcode = NULL, $delta = NULL) {
if (!($message_template = $this
->getTemplate())) {
return [];
}
if (!$langcode) {
$langcode = $this->language;
}
$message_arguments = $this
->getArguments();
$message_template_text = $message_template
->getText($langcode, $delta);
$output = $this
->processArguments($message_arguments, $message_template_text);
$token_options = $message_template
->getSetting('token options', []);
if (!empty($token_options['token replace'])) {
$output = $this
->processTokens($output, !empty($token_options['clear']));
}
return $output;
}
protected function processArguments(array $arguments, array $output) {
if (empty($arguments)) {
return $output;
}
foreach ($arguments as $key => $value) {
if (is_array($value) && !empty($value['callback']) && is_callable($value['callback'])) {
$value += [
'pass message' => FALSE,
];
if ($value['pass message']) {
$value['arguments']['message'] = $this;
}
$arguments[$key] = call_user_func_array($value['callback'], $value['arguments']);
}
}
foreach ($output as $key => $value) {
$output[$key] = new FormattableMarkup($value, $arguments);
}
return $output;
}
protected function processTokens(array $output, $clear) {
$options = [
'langcode' => $this->language,
'clear' => $clear,
];
foreach ($output as $key => $value) {
$output[$key] = \Drupal::token()
->replace($value, [
'message' => $this,
], $options);
}
return $output;
}
public function save() {
$token_options = !empty($this->data['token options']) ? $this->data['token options'] : [];
$tokens = [];
if (!$this
->getTemplate()) {
throw new MessageException('No valid template found.');
}
foreach ($this
->getTemplate()
->getText() as $text) {
preg_match_all('/[@|%|\\!]\\{([a-z0-9:_\\-]+?)\\}/i', $text, $matches);
foreach ($matches[1] as $delta => $token) {
$output = \Drupal::token()
->replace('[' . $token . ']', [
'message' => $this,
], $token_options);
if ($output != '[' . $token . ']') {
$argument = $matches[0][$delta];
$tokens[$argument] = Markup::create($output);
}
}
}
$arguments = $this
->getArguments();
$this
->setArguments(array_merge($tokens, $arguments));
return parent::save();
}
public static function create(array $values = []) {
return parent::create($values);
}
public static function load($id) {
return parent::load($id);
}
public static function loadMultiple(array $ids = NULL) {
return parent::loadMultiple($ids);
}
public static function deleteMultiple(array $ids) {
\Drupal::entityTypeManager()
->getStorage('message')
->delete($ids);
}
public static function queryByTemplate($template) {
return \Drupal::entityQuery('message')
->condition('template', $template)
->execute();
}
public function __toString() {
return trim(implode("\n", $this
->getText()));
}
public function setLanguage($language) {
$this->language = $language;
}
public static function getCurrentUserId() {
return [
\Drupal::currentUser()
->id(),
];
}
}