'CRM_Core_BAO_ActionSchedule', 'schedule' => $dao, 'mapping' => $dao). * Ex: Array('class'=>'CRM_Mailing_BAO_MailingJob', 'mailing' => $dao). * * For lack of a better place, here's a list of known/intended context values: * * - controller: string, the class which is managing the mail-merge. * - smarty: bool, whether to enable smarty support. * - contactId: int, the main person/org discussed in the message. * - contact: array, the main person/org discussed in the message. * (Optional for performance tweaking; if omitted, will load * automatically from contactId.) * - actionSchedule: DAO, the rule which triggered the mailing * [for CRM_Core_BAO_ActionScheduler]. */ public $context; /** * @var EventDispatcherInterface */ protected $dispatcher; /** * @var array * Each message is an array with keys: * - string: Unprocessed message (eg "Hello, {display_name}."). * - format: Media type (eg "text/plain"). * - tokens: List of tokens which are actually used in this message. */ protected $messages; /** * DO NOT access field this directly. Use TokenRow. This is * marked as public only to benefit TokenRow. * * @var array * Array(int $pos => array $keyValues); */ public $rowContexts; /** * DO NOT access field this directly. Use TokenRow. This is * marked as public only to benefit TokenRow. * * @var array * Ex: $rowValues[$rowPos][$format][$entity][$field] = 'something'; * Ex: $rowValues[3]['text/plain']['contact']['display_name'] = 'something'; */ public $rowValues; /** * A list of available tokens * @var array * Array(string $dottedName => array('entity'=>string, 'field'=>string, 'label'=>string)). */ protected $tokens = NULL; protected $next = 0; /** * @param EventDispatcherInterface $dispatcher * @param array $context */ public function __construct($dispatcher, $context) { $this->dispatcher = $dispatcher; $this->context = $context; } /** * Register a string for which we'll need to merge in tokens. * * @param string $name * Ex: 'subject', 'body_html'. * @param string $value * Ex: '
Hello {contact.name}
'. * @param string $format * Ex: 'text/html'. * @return TokenProcessor */ public function addMessage($name, $value, $format) { $this->messages[$name] = array( 'string' => $value, 'format' => $format, 'tokens' => \CRM_Utils_Token::getTokens($value), ); return $this; } /** * Add a row of data. * * @return TokenRow */ public function addRow() { $key = $this->next++; $this->rowContexts[$key] = array(); $this->rowValues[$key] = array( 'text/plain' => array(), 'text/html' => array(), ); return new TokenRow($this, $key); } /** * @param array $params * Array with keys: * - entity: string, e.g. "profile". * - field: string, e.g. "viewUrl". * - label: string, e.g. "Default Profile URL (View Mode)". * @return TokenProcessor */ public function addToken($params) { $key = $params['entity'] . '.' . $params['field']; $this->tokens[$key] = $params; return $this; } /** * @param string $name * @return array * Keys: * - string: Unprocessed message (eg "Hello, {display_name}."). * - format: Media type (eg "text/plain"). */ public function getMessage($name) { return $this->messages[$name]; } /** * Get a list of all tokens used in registered messages. * * @return array */ public function getMessageTokens() { $tokens = array(); foreach ($this->messages as $message) { $tokens = \CRM_Utils_Array::crmArrayMerge($tokens, $message['tokens']); } foreach (array_keys($tokens) as $e) { $tokens[$e] = array_unique($tokens[$e]); sort($tokens[$e]); } return $tokens; } public function getRow($key) { return new TokenRow($this, $key); } /** * @return \Traversable