annotate sites/all/modules/ctools/plugins/contexts/entity.inc @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 *
danielebarchiesi@0 6 * Plugin to provide a node context. A node context is a node wrapped in a
danielebarchiesi@0 7 * context object that can be utilized by anything that accepts contexts.
danielebarchiesi@0 8 */
danielebarchiesi@0 9
danielebarchiesi@0 10 /**
danielebarchiesi@0 11 * Plugins are described by creating a $plugin array which will be used
danielebarchiesi@0 12 * by the system that includes this file.
danielebarchiesi@0 13 */
danielebarchiesi@0 14 $plugin = array(
danielebarchiesi@0 15 'title' => t("Entity"),
danielebarchiesi@0 16 'description' => t('Entity object.'),
danielebarchiesi@0 17 'context' => 'ctools_context_create_entity',
danielebarchiesi@0 18 'edit form' => 'ctools_context_entity_settings_form',
danielebarchiesi@0 19 'defaults' => array('entity_id' => ''),
danielebarchiesi@0 20 'convert list' => 'ctools_context_entity_convert_list',
danielebarchiesi@0 21 'convert' => 'ctools_context_entity_convert',
danielebarchiesi@0 22 'placeholder form' => array(
danielebarchiesi@0 23 '#type' => 'textfield',
danielebarchiesi@0 24 '#description' => t('Enter the ID of an entity for this context.'),
danielebarchiesi@0 25 ),
danielebarchiesi@0 26 'get child' => 'ctools_context_entity_get_child',
danielebarchiesi@0 27 'get children' => 'ctools_context_entity_get_children',
danielebarchiesi@0 28 );
danielebarchiesi@0 29
danielebarchiesi@0 30 function ctools_context_entity_get_child($plugin, $parent, $child) {
danielebarchiesi@0 31 $plugins = ctools_context_entity_get_children($plugin, $parent);
danielebarchiesi@0 32 return $plugins[$parent . ':' . $child];
danielebarchiesi@0 33 }
danielebarchiesi@0 34
danielebarchiesi@0 35 function ctools_context_entity_get_children($plugin, $parent) {
danielebarchiesi@0 36 $entities = entity_get_info();
danielebarchiesi@0 37 $plugins = array();
danielebarchiesi@0 38 foreach ($entities as $entity_type => $entity) {
danielebarchiesi@0 39 $child_plugin = $plugin;
danielebarchiesi@0 40 $child_plugin['title'] = $entity['label'];
danielebarchiesi@0 41 $child_plugin['keyword'] = $entity_type;
danielebarchiesi@0 42 $child_plugin['context name'] = $entity_type;
danielebarchiesi@0 43 $child_plugin['name'] = $parent . ':' . $entity_type;
danielebarchiesi@0 44 $child_plugin['description'] = t('Creates @entity context from an entity ID.', array('@entity' => $entity_type));
danielebarchiesi@0 45 $child_plugin_id = $parent . ':' . $entity_type;
danielebarchiesi@0 46 drupal_alter('ctools_entity_context', $child_plugin, $entity, $child_plugin_id);
danielebarchiesi@0 47 $plugins[$child_plugin_id] = $child_plugin;
danielebarchiesi@0 48 }
danielebarchiesi@0 49 drupal_alter('ctools_entity_contexts', $plugins);
danielebarchiesi@0 50 return $plugins;
danielebarchiesi@0 51 }
danielebarchiesi@0 52
danielebarchiesi@0 53 /**
danielebarchiesi@0 54 * It's important to remember that $conf is optional here, because contexts
danielebarchiesi@0 55 * are not always created from the UI.
danielebarchiesi@0 56 */
danielebarchiesi@0 57 function ctools_context_create_entity($empty, $data = NULL, $conf = FALSE, $plugin) {
danielebarchiesi@0 58 $entity_type = $plugin['keyword'];
danielebarchiesi@0 59 $entity = entity_get_info($entity_type);
danielebarchiesi@0 60 $context = new ctools_context(array('entity:' . $entity_type, 'entity', $entity_type));
danielebarchiesi@0 61 $context->plugin = $plugin['name'];
danielebarchiesi@0 62 $context->keyword = $entity_type;
danielebarchiesi@0 63
danielebarchiesi@0 64 if ($empty) {
danielebarchiesi@0 65 return $context;
danielebarchiesi@0 66 }
danielebarchiesi@0 67
danielebarchiesi@0 68 // Attempt to retain compatibility with broken id:
danielebarchiesi@0 69 if (is_array($data) && !isset($data['entity_id']) && isset($data['id'])) {
danielebarchiesi@0 70 $id = $data['id'];
danielebarchiesi@0 71 }
danielebarchiesi@0 72 elseif (is_array($data) && isset($data['entity_id'])) {
danielebarchiesi@0 73 $id = $data['entity_id'];
danielebarchiesi@0 74 }
danielebarchiesi@0 75 elseif (is_object($data)) {
danielebarchiesi@0 76 $ids = entity_extract_ids($entity_type, $data);
danielebarchiesi@0 77 $id = $ids[0];
danielebarchiesi@0 78 }
danielebarchiesi@0 79 elseif (is_numeric($data)) {
danielebarchiesi@0 80 $id = $data;
danielebarchiesi@0 81 $data = entity_load($entity_type, array($id));
danielebarchiesi@0 82 $data = !empty($data[$id]) ? $data[$id] : FALSE;
danielebarchiesi@0 83 }
danielebarchiesi@0 84
danielebarchiesi@0 85 if (is_array($data)) {
danielebarchiesi@0 86 $data = entity_load($entity_type, array($id));
danielebarchiesi@0 87 $data = !empty($data[$id]) ? $data[$id] : FALSE;
danielebarchiesi@0 88 }
danielebarchiesi@0 89
danielebarchiesi@0 90 if (!empty($data)) {
danielebarchiesi@0 91 $context->data = $data;
danielebarchiesi@0 92 if (!empty($entity['entity keys']['label'])) {
danielebarchiesi@0 93 $context->title = $data->{$entity['entity keys']['label']};
danielebarchiesi@0 94 }
danielebarchiesi@0 95 $context->argument = $id;
danielebarchiesi@0 96
danielebarchiesi@0 97 if ($entity['entity keys']['bundle']) {
danielebarchiesi@0 98 $context->restrictions['type'] = array($data->{$entity['entity keys']['bundle']});
danielebarchiesi@0 99 }
danielebarchiesi@0 100 return $context;
danielebarchiesi@0 101 }
danielebarchiesi@0 102 }
danielebarchiesi@0 103
danielebarchiesi@0 104 function ctools_context_entity_settings_form($form, &$form_state) {
danielebarchiesi@0 105 $conf = &$form_state['conf'];
danielebarchiesi@0 106 $plugin = &$form_state['plugin'];
danielebarchiesi@0 107
danielebarchiesi@0 108 $form['entity'] = array(
danielebarchiesi@0 109 '#title' => t('Enter the title or ID of a @entity entity', array('@entity' => $plugin['keyword'])),
danielebarchiesi@0 110 '#type' => 'textfield',
danielebarchiesi@0 111 '#maxlength' => 512,
danielebarchiesi@0 112 '#autocomplete_path' => 'ctools/autocomplete/' . $plugin['keyword'],
danielebarchiesi@0 113 '#weight' => -10,
danielebarchiesi@0 114 );
danielebarchiesi@0 115
danielebarchiesi@0 116 if (!empty($conf['entity_id'])) {
danielebarchiesi@0 117 $info = entity_load($plugin['keyword'], array($conf['entity_id']));
danielebarchiesi@0 118 $info = $info[$conf['entity_id']];
danielebarchiesi@0 119 if ($info) {
danielebarchiesi@0 120 $entity = entity_get_info($plugin['keyword']);
danielebarchiesi@0 121 $uri = entity_uri($plugin['keyword'], $info);
danielebarchiesi@0 122 if (is_array($uri) && $entity['entity keys']['label']) {
danielebarchiesi@0 123 $link = l(t("'%title' [%type id %id]", array('%title' => $info->{$entity['entity keys']['label']}, '%type' => $plugin['keyword'], '%id' => $conf['entity_id'])), $uri['path'], array('attributes' => array('target' => '_blank', 'title' => t('Open in new window')), 'html' => TRUE));
danielebarchiesi@0 124 }
danielebarchiesi@0 125 elseif (is_array($uri)) {
danielebarchiesi@0 126 $link = l(t("[%type id %id]", array('%type' => $plugin['keyword'], '%id' => $conf['entity_id'])), $uri['path'], array('attributes' => array('target' => '_blank', 'title' => t('Open in new window')), 'html' => TRUE));
danielebarchiesi@0 127 }
danielebarchiesi@0 128 elseif ($entity['entity keys']['label']) {
danielebarchiesi@0 129 $link = l(t("'%title' [%type id %id]", array('%title' => $info->{$entity['entity keys']['label']}, '%type' => $plugin['keyword'], '%id' => $conf['entity_id'])), file_create_url($uri), array('attributes' => array('target' => '_blank', 'title' => t('Open in new window')), 'html' => TRUE));
danielebarchiesi@0 130 }
danielebarchiesi@0 131 else {
danielebarchiesi@0 132 $link = t("[%type id %id]", array('%type' => $plugin['keyword'], '%id' => $conf['entity_id']));
danielebarchiesi@0 133 }
danielebarchiesi@0 134 $form['entity']['#description'] = t('Currently set to !link', array('!link' => $link));
danielebarchiesi@0 135 }
danielebarchiesi@0 136 }
danielebarchiesi@0 137
danielebarchiesi@0 138 $form['entity_id'] = array(
danielebarchiesi@0 139 '#type' => 'value',
danielebarchiesi@0 140 '#value' => $conf['entity_id'],
danielebarchiesi@0 141 );
danielebarchiesi@0 142
danielebarchiesi@0 143 $form['entity_type'] = array(
danielebarchiesi@0 144 '#type' => 'value',
danielebarchiesi@0 145 '#value' => $plugin['keyword'],
danielebarchiesi@0 146 );
danielebarchiesi@0 147
danielebarchiesi@0 148 $form['set_identifier'] = array(
danielebarchiesi@0 149 '#type' => 'checkbox',
danielebarchiesi@0 150 '#default_value' => FALSE,
danielebarchiesi@0 151 '#title' => t('Reset identifier to entity label'),
danielebarchiesi@0 152 '#description' => t('If checked, the identifier will be reset to the entity label of the selected entity.'),
danielebarchiesi@0 153 );
danielebarchiesi@0 154
danielebarchiesi@0 155 return $form;
danielebarchiesi@0 156 }
danielebarchiesi@0 157
danielebarchiesi@0 158 /**
danielebarchiesi@0 159 * Validate a node.
danielebarchiesi@0 160 */
danielebarchiesi@0 161 function ctools_context_entity_settings_form_validate($form, &$form_state) {
danielebarchiesi@0 162 // Validate the autocomplete
danielebarchiesi@0 163 if (empty($form_state['values']['entity_id']) && empty($form_state['values']['entity'])) {
danielebarchiesi@0 164 form_error($form['entity'], t('You must select an entity.'));
danielebarchiesi@0 165 return;
danielebarchiesi@0 166 }
danielebarchiesi@0 167
danielebarchiesi@0 168 if (empty($form_state['values']['entity'])) {
danielebarchiesi@0 169 return;
danielebarchiesi@0 170 }
danielebarchiesi@0 171
danielebarchiesi@0 172 $id = $form_state['values']['entity'];
danielebarchiesi@0 173 $preg_matches = array();
danielebarchiesi@0 174 $match = preg_match('/\[id: (\d+)\]/', $id, $preg_matches);
danielebarchiesi@0 175 if (!$match) {
danielebarchiesi@0 176 $match = preg_match('/^id: (\d+)/', $id, $preg_matches);
danielebarchiesi@0 177 }
danielebarchiesi@0 178
danielebarchiesi@0 179 if ($match) {
danielebarchiesi@0 180 $id = $preg_matches[1];
danielebarchiesi@0 181 }
danielebarchiesi@0 182 if (is_numeric($id)) {
danielebarchiesi@0 183 $entity = entity_load($form_state['values']['entity_type'], array($id));
danielebarchiesi@0 184 $entity = $entity[$id];
danielebarchiesi@0 185 }
danielebarchiesi@0 186 else {
danielebarchiesi@0 187 $entity_info = entity_get_info($form_state['values']['entity_type']);
danielebarchiesi@0 188 $field = $entity_info['entity keys']['label'];
danielebarchiesi@0 189 $entity = entity_load($form_state['values']['entity_type'], FALSE, array($field => $id));
danielebarchiesi@0 190 }
danielebarchiesi@0 191
danielebarchiesi@0 192 // Do not allow unpublished nodes to be selected by unprivileged users
danielebarchiesi@0 193 // || (empty($node->status) && !(user_access('administer nodes'))) need a new sanity check at some point.
danielebarchiesi@0 194 if (!$entity) {
danielebarchiesi@0 195 form_error($form['entity'], t('Invalid entity selected.'));
danielebarchiesi@0 196 }
danielebarchiesi@0 197 else {
danielebarchiesi@0 198 $entity_id = entity_extract_ids($form_state['values']['entity_type'], $entity);
danielebarchiesi@0 199 form_set_value($form['entity_id'], $entity_id[0], $form_state);
danielebarchiesi@0 200 }
danielebarchiesi@0 201 }
danielebarchiesi@0 202
danielebarchiesi@0 203 function ctools_context_entity_settings_form_submit($form, &$form_state) {
danielebarchiesi@0 204 if ($form_state['values']['set_identifier']) {
danielebarchiesi@0 205 $entity_info = entity_get_info($form_state['values']['entity_type']);
danielebarchiesi@0 206 $entity = entity_load($form_state['values']['entity_type'], array($form_state['values']['entity_id']));
danielebarchiesi@0 207 $entity = $entity[$form_state['values']['entity_id']];
danielebarchiesi@0 208 $form_state['values']['identifier'] = $entity->{$entity_info['entity keys']['label']};
danielebarchiesi@0 209 }
danielebarchiesi@0 210
danielebarchiesi@0 211 // This will either be the value set previously or a value set by the
danielebarchiesi@0 212 // validator.
danielebarchiesi@0 213 $form_state['conf']['entity_id'] = $form_state['values']['entity_id'];
danielebarchiesi@0 214 }
danielebarchiesi@0 215
danielebarchiesi@0 216 /**
danielebarchiesi@0 217 * Provide a list of ways that this context can be converted to a string.
danielebarchiesi@0 218 */
danielebarchiesi@0 219 function ctools_context_entity_convert_list($plugin) {
danielebarchiesi@0 220 $list = array();
danielebarchiesi@0 221
danielebarchiesi@0 222 $entity = entity_get_info($plugin['context name']);
danielebarchiesi@0 223 if (isset($entity['token type'])) {
danielebarchiesi@0 224 $token = $entity['token type'];
danielebarchiesi@0 225 }
danielebarchiesi@0 226 else {
danielebarchiesi@0 227 $token = $plugin['context name'];
danielebarchiesi@0 228 }
danielebarchiesi@0 229
danielebarchiesi@0 230 // Hack: we need either token.module or a core fix for this to work right,
danielebarchiesi@0 231 // until then, we just muscle it.
danielebarchiesi@0 232 if ($token == 'taxonomy_term') {
danielebarchiesi@0 233 $token = 'term';
danielebarchiesi@0 234 }
danielebarchiesi@0 235
danielebarchiesi@0 236 $tokens = token_info();
danielebarchiesi@0 237 if (isset($tokens['tokens'][$token])) {
danielebarchiesi@0 238 foreach ($tokens['tokens'][$token] as $id => $info) {
danielebarchiesi@0 239 if (!isset($list[$id])) {
danielebarchiesi@0 240 $list[$id] = $info['name'];
danielebarchiesi@0 241 }
danielebarchiesi@0 242 }
danielebarchiesi@0 243 }
danielebarchiesi@0 244 return $list;
danielebarchiesi@0 245 }
danielebarchiesi@0 246
danielebarchiesi@0 247 /**
danielebarchiesi@0 248 * Convert a context into a string.
danielebarchiesi@0 249 */
danielebarchiesi@0 250 function ctools_context_entity_convert($context, $type, $options = array()) {
danielebarchiesi@0 251 $entity_type = $context->type[2];
danielebarchiesi@0 252 $entity = entity_get_info($entity_type);
danielebarchiesi@0 253
danielebarchiesi@0 254 if (isset($entity['token type'])) {
danielebarchiesi@0 255 $token = $entity['token type'];
danielebarchiesi@0 256 }
danielebarchiesi@0 257 else {
danielebarchiesi@0 258 $token = $entity_type;
danielebarchiesi@0 259 }
danielebarchiesi@0 260
danielebarchiesi@0 261 // Hack: we need either token.module or a core fix for this to work right,
danielebarchiesi@0 262 // until then, we just muscle it.
danielebarchiesi@0 263 if ($token == 'taxonomy_term') {
danielebarchiesi@0 264 $token = 'term';
danielebarchiesi@0 265 }
danielebarchiesi@0 266
danielebarchiesi@0 267 $tokens = token_info();
danielebarchiesi@0 268
danielebarchiesi@0 269 $values = token_generate($token, array($type => $type), array($token => $context->data), $options);
danielebarchiesi@0 270 if (isset($values[$type])) {
danielebarchiesi@0 271 return $values[$type];
danielebarchiesi@0 272 }
danielebarchiesi@0 273 }