You are here

public function MessageMetadataController::entityPropertyInfo in Message 7

Overrides EntityDefaultMetadataController::entityPropertyInfo

File

./message.info.inc, line 13
Provides Entity metadata integration.

Class

MessageMetadataController
Extend the defaults.

Code

public function entityPropertyInfo() {
  $info = parent::entityPropertyInfo();
  $properties =& $info[$this->type]['properties'];
  $properties['type'] = array(
    'setter callback' => 'entity_property_verbatim_set',
    'required' => TRUE,
    'description' => t('The message type.'),
    'type' => 'message_type',
  ) + $properties['type'];
  unset($properties['arguments']);

  // Unset the uid property, as it is available via the user anyway.
  unset($properties['uid']);
  $properties['user'] = array(
    'label' => t("User"),
    'type' => 'user',
    'description' => t("The user for which to log the message."),
    'getter callback' => 'entity_property_getter_method',
    'setter callback' => 'entity_property_setter_method',
    'schema field' => 'uid',
    'required' => TRUE,
  );
  $properties['timestamp'] = array(
    'type' => 'date',
    'setter callback' => 'entity_property_verbatim_set',
    'description' => t('The time the message has been logged.'),
  ) + $properties['timestamp'];

  // Add a property providing the final text for use with entity tokens.
  $properties['text'] = array(
    'type' => 'text',
    'label' => t('The message text'),
    'getter callback' => 'message_property_get_text',
    'description' => t('The message text with all replacement arguments applied.'),
    // The tokens are already sanitized if needed.
    'sanitize' => TRUE,
  );

  // Bypass entity_load() as we cannot use it here.
  $message_types = db_select('message_type', 'mt')
    ->fields('mt')
    ->execute()
    ->fetchAllAssoc('name');

  // Add in the arguments specific to the bundles.
  foreach ($message_types as $name => $type) {
    $info['message']['bundles'][$name]['properties']['arguments'] = array(
      'label' => t('Message arguments'),
      'type' => 'struct',
      'description' => t("The arguments to associate with the message."),
      'getter callback' => 'entity_property_verbatim_get',
      'setter callback' => 'entity_property_verbatim_set',
      'property info' => array(),
    );
    $keys = array_filter(unserialize($type->argument_keys));
    foreach ($keys as $key) {

      // Add the argument keys so they can later be referenced by
      // entity-metadata. For example if the message is "hello @foo", then
      // that key will be available via message:arguments:foo.
      $key_name = substr($key, 1);
      $info['message']['bundles'][$name]['properties']['arguments']['property info'][$key_name] = array(
        'type' => 'text',
        'label' => t('Argument @key', array(
          '@key' => $key,
        )),
        'description' => t('The replacement value for @key', array(
          '@key' => $key,
        )),
        'getter callback' => 'message_property_get_argument',
        'setter callback' => 'message_property_set_argument',
        // Get the first character of the replacement key.
        'sanitized' => $key[0] == '!',
        'message_replace_char' => $key[0],
      );
    }
  }
  return $info;
}