annotate sites/all/modules/ctools/includes/context-admin.inc @ 11:b0ee71395280

deleted .DS_Store files
author danieleb <danielebarchiesi@me.com>
date Mon, 28 Oct 2013 16:12:13 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file includes/common-context.inc
danielebarchiesi@0 5 * Provide API for adding contexts for modules that embed displays.
danielebarchiesi@0 6 *
danielebarchiesi@0 7 * Note that most of this code was directly copied from Panels 2, and as such
danielebarchiesi@0 8 * a lot of this code is crusty. It could probably stand to be rewritten,
danielebarchiesi@0 9 * and brought up to date, or at least better commented.
danielebarchiesi@0 10 */
danielebarchiesi@0 11
danielebarchiesi@0 12 /**
danielebarchiesi@0 13 * Provide a list of the ways contexts can be embedded.
danielebarchiesi@0 14 *
danielebarchiesi@0 15 * This provides a full list of context types that the tool understands
danielebarchiesi@0 16 * and can let modules utilize.
danielebarchiesi@0 17 */
danielebarchiesi@0 18 function ctools_context_info($type = NULL) {
danielebarchiesi@0 19 static $info = NULL;
danielebarchiesi@0 20
danielebarchiesi@0 21 // static doesn't work with functions like t().
danielebarchiesi@0 22 if (empty($info)) {
danielebarchiesi@0 23 $info = array(
danielebarchiesi@0 24 'argument' => array(
danielebarchiesi@0 25 'title' => t('Arguments'),
danielebarchiesi@0 26 'singular title' => t('argument'),
danielebarchiesi@0 27 'description' => '', // t("Arguments are parsed from the URL and translated into contexts that may be added to the display via the 'content' tab. These arguments are parsed in the order received, and you may use % in your URL to hold the place of an object; the rest of the arguments will come after the URL. For example, if the URL is node/%/panel and your user visits node/1/panel/foo, the first argument will be 1, and the second argument will be foo."),
danielebarchiesi@0 28 'add button' => t('Add argument'),
danielebarchiesi@0 29 'context function' => 'ctools_get_argument',
danielebarchiesi@0 30 'key' => 'arguments', // the key that data will be stored on an object, eg $panel_page
danielebarchiesi@0 31 'sortable' => TRUE,
danielebarchiesi@0 32 'settings' => 'argument_settings',
danielebarchiesi@0 33 ),
danielebarchiesi@0 34 'relationship' => array(
danielebarchiesi@0 35 'title' => t('Relationships'),
danielebarchiesi@0 36 'singular title' => t('relationship'),
danielebarchiesi@0 37 'description' => '', // t('Relationships are contexts that are created from already existing contexts; the add relationship button will only appear once there is another context available. Relationships can load objects based upon how they are related to each other; for example, the author of a node, or a taxonomy term attached to a node, or the vocabulary of a taxonomy term.'),
danielebarchiesi@0 38 'add button' => t('Add relationship'),
danielebarchiesi@0 39 'context function' => 'ctools_get_relationship',
danielebarchiesi@0 40 'key' => 'relationships',
danielebarchiesi@0 41 'sortable' => FALSE,
danielebarchiesi@0 42 'settings' => 'relationship_settings',
danielebarchiesi@0 43 ),
danielebarchiesi@0 44 'context' => array(
danielebarchiesi@0 45 'title' => t('Contexts'),
danielebarchiesi@0 46 'singular title' => t('context'),
danielebarchiesi@0 47 'description' => '', // t('Contexts are embedded directly into the panel; you generally must select an object in the panel. For example, you could select node 5, or the term "animals" or the user "administrator"'),
danielebarchiesi@0 48 'add button' => t('Add context'),
danielebarchiesi@0 49 'context function' => 'ctools_get_context',
danielebarchiesi@0 50 'key' => 'contexts',
danielebarchiesi@0 51 'sortable' => FALSE,
danielebarchiesi@0 52 'settings' => 'context_settings',
danielebarchiesi@0 53 ),
danielebarchiesi@0 54 'requiredcontext' => array(
danielebarchiesi@0 55 'title' => t('Required contexts'),
danielebarchiesi@0 56 'singular title' => t('required context'),
danielebarchiesi@0 57 'description' => '', // t('Required contexts are passed in from some external source, such as a containing panel. If a mini panel has required contexts, it can only appear when that context is available, and therefore will not show up as a standard Drupal block.'),
danielebarchiesi@0 58 'add button' => t('Add required context'),
danielebarchiesi@0 59 'context function' => 'ctools_get_context',
danielebarchiesi@0 60 'key' => 'requiredcontexts',
danielebarchiesi@0 61 'sortable' => FALSE,
danielebarchiesi@0 62 ),
danielebarchiesi@0 63 );
danielebarchiesi@0 64 }
danielebarchiesi@0 65
danielebarchiesi@0 66 if ($type === NULL) {
danielebarchiesi@0 67 return $info;
danielebarchiesi@0 68 }
danielebarchiesi@0 69
danielebarchiesi@0 70 return $info[$type];
danielebarchiesi@0 71 }
danielebarchiesi@0 72
danielebarchiesi@0 73
danielebarchiesi@0 74 /**
danielebarchiesi@0 75 * Get the data belonging to a particular context.
danielebarchiesi@0 76 */
danielebarchiesi@0 77 function ctools_context_get_plugin($type, $name) {
danielebarchiesi@0 78 $info = ctools_context_info($type);
danielebarchiesi@0 79 if (function_exists($info['context function'])) {
danielebarchiesi@0 80 return $info['context function']($name);
danielebarchiesi@0 81 }
danielebarchiesi@0 82 }
danielebarchiesi@0 83
danielebarchiesi@0 84 /**
danielebarchiesi@0 85 * Add the argument table plus gadget plus javascript to the form.
danielebarchiesi@0 86 */
danielebarchiesi@0 87 function ctools_context_add_argument_form($module, &$form, &$form_state, &$form_location, $object, $cache_key = NULL) {
danielebarchiesi@0 88 if (empty($cache_key)) {
danielebarchiesi@0 89 $cache_key = $object->name;
danielebarchiesi@0 90 }
danielebarchiesi@0 91
danielebarchiesi@0 92 $form_location = array(
danielebarchiesi@0 93 '#prefix' => '<div id="ctools-arguments-table">',
danielebarchiesi@0 94 '#suffix' => '</div>',
danielebarchiesi@0 95 '#theme' => 'ctools_context_item_form',
danielebarchiesi@0 96 '#cache_key' => $cache_key,
danielebarchiesi@0 97 '#ctools_context_type' => 'argument',
danielebarchiesi@0 98 '#ctools_context_module' => $module,
danielebarchiesi@0 99 );
danielebarchiesi@0 100
danielebarchiesi@0 101 $args = ctools_get_arguments();
danielebarchiesi@0 102 $choices = array();
danielebarchiesi@0 103 foreach ($args as $name => $arg) {
danielebarchiesi@0 104 if (empty($arg['no ui'])) {
danielebarchiesi@0 105 $choices[$name] = $arg['title'];
danielebarchiesi@0 106 }
danielebarchiesi@0 107 }
danielebarchiesi@0 108
danielebarchiesi@0 109 asort($choices);
danielebarchiesi@0 110
danielebarchiesi@0 111 if (!empty($choices) || !empty($object->arguments)) {
danielebarchiesi@0 112 ctools_context_add_item_table('argument', $form_location, $choices, $object->arguments);
danielebarchiesi@0 113 }
danielebarchiesi@0 114 }
danielebarchiesi@0 115
danielebarchiesi@0 116 function ctools_context_add_context_form($module, &$form, &$form_state, &$form_location, $object, $cache_key = NULL) {
danielebarchiesi@0 117 if (empty($cache_key)) {
danielebarchiesi@0 118 $cache_key = $object->name;
danielebarchiesi@0 119 }
danielebarchiesi@0 120
danielebarchiesi@0 121 $form_location = array(
danielebarchiesi@0 122 '#prefix' => '<div id="ctools-contexts-table">',
danielebarchiesi@0 123 '#suffix' => '</div>',
danielebarchiesi@0 124 '#theme' => 'ctools_context_item_form',
danielebarchiesi@0 125 '#cache_key' => $cache_key,
danielebarchiesi@0 126 '#ctools_context_type' => 'context',
danielebarchiesi@0 127 '#ctools_context_module' => $module,
danielebarchiesi@0 128 );
danielebarchiesi@0 129
danielebarchiesi@0 130 // Store the order the choices are in so javascript can manipulate it.
danielebarchiesi@0 131 $form_location['markup'] = array(
danielebarchiesi@0 132 '#markup' => '&nbsp;',
danielebarchiesi@0 133 );
danielebarchiesi@0 134
danielebarchiesi@0 135 $choices = array();
danielebarchiesi@0 136 foreach (ctools_get_contexts() as $name => $arg) {
danielebarchiesi@0 137 if (empty($arg['no ui'])) {
danielebarchiesi@0 138 $choices[$name] = $arg['title'];
danielebarchiesi@0 139 }
danielebarchiesi@0 140 }
danielebarchiesi@0 141
danielebarchiesi@0 142 asort($choices);
danielebarchiesi@0 143
danielebarchiesi@0 144 if (!empty($choices) || !empty($object->contexts)) {
danielebarchiesi@0 145 ctools_context_add_item_table('context', $form_location, $choices, $object->contexts);
danielebarchiesi@0 146 }
danielebarchiesi@0 147
danielebarchiesi@0 148 }
danielebarchiesi@0 149
danielebarchiesi@0 150 function ctools_context_add_required_context_form($module, &$form, &$form_state, &$form_location, $object, $cache_key = NULL) {
danielebarchiesi@0 151 if (empty($cache_key)) {
danielebarchiesi@0 152 $cache_key = $object->name;
danielebarchiesi@0 153 }
danielebarchiesi@0 154
danielebarchiesi@0 155 $form_location = array(
danielebarchiesi@0 156 '#prefix' => '<div id="ctools-requiredcontexts-table">',
danielebarchiesi@0 157 '#suffix' => '</div>',
danielebarchiesi@0 158 '#theme' => 'ctools_context_item_form',
danielebarchiesi@0 159 '#cache_key' => $cache_key,
danielebarchiesi@0 160 '#ctools_context_type' => 'requiredcontext',
danielebarchiesi@0 161 '#ctools_context_module' => $module,
danielebarchiesi@0 162 );
danielebarchiesi@0 163
danielebarchiesi@0 164 // Store the order the choices are in so javascript can manipulate it.
danielebarchiesi@0 165 $form_location['markup'] = array(
danielebarchiesi@0 166 '#value' => '&nbsp;',
danielebarchiesi@0 167 );
danielebarchiesi@0 168
danielebarchiesi@0 169 $choices = array();
danielebarchiesi@0 170 foreach (ctools_get_contexts() as $name => $arg) {
danielebarchiesi@0 171 if (empty($arg['no required context ui'])) {
danielebarchiesi@0 172 $choices[$name] = $arg['title'];
danielebarchiesi@0 173 }
danielebarchiesi@0 174 }
danielebarchiesi@0 175
danielebarchiesi@0 176 asort($choices);
danielebarchiesi@0 177
danielebarchiesi@0 178 if (!empty($choices) || !empty($object->contexts)) {
danielebarchiesi@0 179 ctools_context_add_item_table('requiredcontext', $form_location, $choices, $object->requiredcontexts);
danielebarchiesi@0 180 }
danielebarchiesi@0 181 }
danielebarchiesi@0 182
danielebarchiesi@0 183 function ctools_context_add_relationship_form($module, &$form, &$form_state, &$form_location, $object, $cache_key = NULL) {
danielebarchiesi@0 184 if (empty($cache_key)) {
danielebarchiesi@0 185 $cache_key = $object->name;
danielebarchiesi@0 186 }
danielebarchiesi@0 187
danielebarchiesi@0 188 $form_location = array(
danielebarchiesi@0 189 '#prefix' => '<div id="ctools-relationships-table">',
danielebarchiesi@0 190 '#suffix' => '</div>',
danielebarchiesi@0 191 '#theme' => 'ctools_context_item_form',
danielebarchiesi@0 192 '#cache_key' => $cache_key,
danielebarchiesi@0 193 '#ctools_context_type' => 'relationship',
danielebarchiesi@0 194 '#ctools_context_module' => $module,
danielebarchiesi@0 195 );
danielebarchiesi@0 196
danielebarchiesi@0 197 // Store the order the choices are in so javascript can manipulate it.
danielebarchiesi@0 198 $form_location['markup'] = array(
danielebarchiesi@0 199 '#value' => '&nbsp;',
danielebarchiesi@0 200 );
danielebarchiesi@0 201
danielebarchiesi@0 202 $base_contexts = isset($object->base_contexts) ? $object->base_contexts : array();
danielebarchiesi@0 203 $available_relationships = ctools_context_get_relevant_relationships(ctools_context_load_contexts($object, TRUE, $base_contexts));
danielebarchiesi@0 204
danielebarchiesi@0 205 ctools_context_add_item_table('relationship', $form_location, $available_relationships, $object->relationships);
danielebarchiesi@0 206 }
danielebarchiesi@0 207
danielebarchiesi@0 208 /**
danielebarchiesi@0 209 * Include all context administrative include files, css, javascript.
danielebarchiesi@0 210 */
danielebarchiesi@0 211 function ctools_context_admin_includes() {
danielebarchiesi@0 212 ctools_include('context');
danielebarchiesi@0 213 ctools_include('modal');
danielebarchiesi@0 214 ctools_include('ajax');
danielebarchiesi@0 215 ctools_include('object-cache');
danielebarchiesi@0 216 ctools_modal_add_js();
danielebarchiesi@0 217 ctools_modal_add_plugin_js(ctools_get_contexts());
danielebarchiesi@0 218 ctools_modal_add_plugin_js(ctools_get_relationships());
danielebarchiesi@0 219 }
danielebarchiesi@0 220
danielebarchiesi@0 221 /**
danielebarchiesi@0 222 * Add the context table to the page.
danielebarchiesi@0 223 */
danielebarchiesi@0 224 function ctools_context_add_item_table($type, &$form, $available_contexts, $items) {
danielebarchiesi@0 225 $form[$type] = array(
danielebarchiesi@0 226 '#tree' => TRUE,
danielebarchiesi@0 227 );
danielebarchiesi@0 228
danielebarchiesi@0 229 $module = $form['#ctools_context_module'];
danielebarchiesi@0 230 $cache_key = $form['#cache_key'];
danielebarchiesi@0 231
danielebarchiesi@0 232 if (isset($items) && is_array($items)) {
danielebarchiesi@0 233 foreach ($items as $position => $context) {
danielebarchiesi@0 234 ctools_context_add_item_to_form($module, $type, $cache_key, $form[$type][$position], $position, $context);
danielebarchiesi@0 235 }
danielebarchiesi@0 236 }
danielebarchiesi@0 237
danielebarchiesi@0 238 $type_info = ctools_context_info($type);
danielebarchiesi@0 239 $form['description'] = array(
danielebarchiesi@0 240 '#prefix' => '<div class="description">',
danielebarchiesi@0 241 '#suffix' => '</div>',
danielebarchiesi@0 242 '#markup' => $type_info['description'],
danielebarchiesi@0 243 );
danielebarchiesi@0 244
danielebarchiesi@0 245 ctools_context_add_item_table_buttons($type, $module, $form, $available_contexts);
danielebarchiesi@0 246 }
danielebarchiesi@0 247
danielebarchiesi@0 248 function ctools_context_add_item_table_buttons($type, $module, &$form, $available_contexts) {
danielebarchiesi@0 249 drupal_add_library('system', 'drupal.ajax');
danielebarchiesi@0 250 $form['buttons'] = array(
danielebarchiesi@0 251 '#tree' => TRUE,
danielebarchiesi@0 252 );
danielebarchiesi@0 253
danielebarchiesi@0 254 if (!empty($available_contexts)) {
danielebarchiesi@0 255 $type_info = ctools_context_info($type);
danielebarchiesi@0 256
danielebarchiesi@0 257 $module = $form['#ctools_context_module'];
danielebarchiesi@0 258 $cache_key = $form['#cache_key'];
danielebarchiesi@0 259
danielebarchiesi@0 260 // The URL for this ajax button
danielebarchiesi@0 261 $form['buttons'][$type]['add-url'] = array(
danielebarchiesi@0 262 '#attributes' => array('class' => array("ctools-$type-add-url")),
danielebarchiesi@0 263 '#type' => 'hidden',
danielebarchiesi@0 264 '#value' => url("ctools/context/ajax/add/$module/$type/$cache_key", array('absolute' => TRUE)),
danielebarchiesi@0 265 );
danielebarchiesi@0 266
danielebarchiesi@0 267 asort($available_contexts);
danielebarchiesi@0 268 // This also will be in the URL.
danielebarchiesi@0 269 $form['buttons'][$type]['item'] = array(
danielebarchiesi@0 270 '#attributes' => array('class' => array("ctools-$type-add-url")),
danielebarchiesi@0 271 '#type' => 'select',
danielebarchiesi@0 272 '#options' => $available_contexts,
danielebarchiesi@0 273 '#required' => FALSE,
danielebarchiesi@0 274 );
danielebarchiesi@0 275
danielebarchiesi@0 276 $form['buttons'][$type]['add'] = array(
danielebarchiesi@0 277 '#type' => 'submit',
danielebarchiesi@0 278 '#attributes' => array('class' => array('ctools-use-modal')),
danielebarchiesi@0 279 '#id' => "ctools-$type-add",
danielebarchiesi@0 280 '#value' => $type_info['add button'],
danielebarchiesi@0 281 );
danielebarchiesi@0 282 }
danielebarchiesi@0 283 }
danielebarchiesi@0 284
danielebarchiesi@0 285 /**
danielebarchiesi@0 286 * Add a row to the form. Used both in the main form and by
danielebarchiesi@0 287 * the ajax to add an item.
danielebarchiesi@0 288 */
danielebarchiesi@0 289 function ctools_context_add_item_to_form($module, $type, $cache_key, &$form, $position, $item) {
danielebarchiesi@0 290 // This is the single function way to load any plugin by variable type.
danielebarchiesi@0 291 $info = ctools_context_get_plugin($type, $item['name']);
danielebarchiesi@0 292 $form['title'] = array(
danielebarchiesi@0 293 '#markup' => check_plain($item['identifier']),
danielebarchiesi@0 294 );
danielebarchiesi@0 295
danielebarchiesi@0 296 // Relationships not sortable.
danielebarchiesi@0 297 $type_info = ctools_context_info($type);
danielebarchiesi@0 298
danielebarchiesi@0 299 if (!empty($type_info['sortable'])) {
danielebarchiesi@0 300 $form['position'] = array(
danielebarchiesi@0 301 '#type' => 'weight',
danielebarchiesi@0 302 '#default_value' => $position,
danielebarchiesi@0 303 '#attributes' => array('class' => array('drag-position')),
danielebarchiesi@0 304 );
danielebarchiesi@0 305 }
danielebarchiesi@0 306
danielebarchiesi@0 307 $form['remove'] = array(
danielebarchiesi@0 308 '#markup' => ctools_ajax_image_button(ctools_image_path('icon-delete.png'), "ctools/context/ajax/delete/$module/$type/$cache_key/$position", t('Remove this item.')),
danielebarchiesi@0 309 );
danielebarchiesi@0 310
danielebarchiesi@0 311 $form['settings'] = array(
danielebarchiesi@0 312 '#markup' => ctools_modal_image_button(ctools_image_path('icon-configure.png'), "ctools/context/ajax/configure/$module/$type/$cache_key/$position", t('Configure settings for this item.')),
danielebarchiesi@0 313 );
danielebarchiesi@0 314 }
danielebarchiesi@0 315
danielebarchiesi@0 316
danielebarchiesi@0 317 // ---------------------------------------------------------------------------
danielebarchiesi@0 318 // AJAX forms and stuff.
danielebarchiesi@0 319
danielebarchiesi@0 320 /**
danielebarchiesi@0 321 * Ajax entry point to add an context
danielebarchiesi@0 322 */
danielebarchiesi@0 323 function ctools_context_ajax_item_add($mechanism = NULL, $type = NULL, $cache_key = NULL, $name = NULL, $step = NULL) {
danielebarchiesi@0 324 ctools_include('ajax');
danielebarchiesi@0 325 ctools_include('modal');
danielebarchiesi@0 326 ctools_include('context');
danielebarchiesi@0 327 ctools_include('cache');
danielebarchiesi@0 328 ctools_include('plugins-admin');
danielebarchiesi@0 329
danielebarchiesi@0 330 if (!$name) {
danielebarchiesi@0 331 return ctools_ajax_render_error();
danielebarchiesi@0 332 }
danielebarchiesi@0 333
danielebarchiesi@0 334 // Load stored object from cache.
danielebarchiesi@0 335 if (!($object = ctools_cache_get($mechanism, $cache_key))) {
danielebarchiesi@0 336 ctools_ajax_render_error(t('Invalid object name.'));
danielebarchiesi@0 337 }
danielebarchiesi@0 338
danielebarchiesi@0 339 // Get info about what we're adding, i.e, relationship, context, argument, etc.
danielebarchiesi@0 340 $plugin_definition = ctools_context_get_plugin($type, $name);
danielebarchiesi@0 341 if (empty($plugin_definition)) {
danielebarchiesi@0 342 ctools_ajax_render_error(t('Invalid context type'));
danielebarchiesi@0 343 }
danielebarchiesi@0 344
danielebarchiesi@0 345 // Set up the $conf array for this plugin
danielebarchiesi@0 346 if (empty($step) || empty($object->temporary)) {
danielebarchiesi@0 347 // Create the basis for our new context.
danielebarchiesi@0 348 $conf = ctools_context_get_defaults($plugin_definition, $object, $type);
danielebarchiesi@0 349 $object->temporary = &$conf;
danielebarchiesi@0 350 }
danielebarchiesi@0 351 else {
danielebarchiesi@0 352 $conf = &$object->temporary;
danielebarchiesi@0 353 }
danielebarchiesi@0 354
danielebarchiesi@0 355 // Load the contexts that may be used.
danielebarchiesi@0 356 $base_contexts = isset($object->base_contexts) ? $object->base_contexts : array();
danielebarchiesi@0 357 $contexts = ctools_context_load_contexts($object, TRUE, $base_contexts);
danielebarchiesi@0 358
danielebarchiesi@0 359 $type_info = ctools_context_info($type);
danielebarchiesi@0 360 $form_state = array(
danielebarchiesi@0 361 'ajax' => TRUE,
danielebarchiesi@0 362 'modal' => TRUE,
danielebarchiesi@0 363 'modal return' => TRUE,
danielebarchiesi@0 364 'object' => &$object,
danielebarchiesi@0 365 'conf' => &$conf,
danielebarchiesi@0 366 'plugin' => $plugin_definition,
danielebarchiesi@0 367 'type' => $type,
danielebarchiesi@0 368 'contexts' => $contexts,
danielebarchiesi@0 369 'title' => t('Add @type "@context"', array('@type' => $type_info['singular title'], '@context' => $plugin_definition['title'])),
danielebarchiesi@0 370 'type info' => $type_info,
danielebarchiesi@0 371 'op' => 'add',
danielebarchiesi@0 372 'step' => $step,
danielebarchiesi@0 373 );
danielebarchiesi@0 374
danielebarchiesi@0 375 $form_info = array(
danielebarchiesi@0 376 'path' => "ctools/context/ajax/add/$mechanism/$type/$cache_key/$name/%step",
danielebarchiesi@0 377 'show cancel' => TRUE,
danielebarchiesi@0 378 'default form' => 'ctools_edit_context_form_defaults',
danielebarchiesi@0 379 'auto caching' => TRUE,
danielebarchiesi@0 380 'cache mechanism' => $mechanism,
danielebarchiesi@0 381 'cache key' => $cache_key,
danielebarchiesi@0 382 // This is stating what the cache will be referred to in $form_state
danielebarchiesi@0 383 'cache storage' => 'object',
danielebarchiesi@0 384 );
danielebarchiesi@0 385
danielebarchiesi@0 386 if ($type == 'requiredcontext') {
danielebarchiesi@0 387 $form_info += array(
danielebarchiesi@0 388 'add form name' => 'required context add form',
danielebarchiesi@0 389 'edit form name' => 'required context edit form',
danielebarchiesi@0 390 );
danielebarchiesi@0 391 }
danielebarchiesi@0 392
danielebarchiesi@0 393 $output = ctools_plugin_configure_form($form_info, $form_state);
danielebarchiesi@0 394
danielebarchiesi@0 395 if (!empty($form_state['cancel'])) {
danielebarchiesi@0 396 $output = array(ctools_modal_command_dismiss());
danielebarchiesi@0 397 }
danielebarchiesi@0 398 else if (!empty($form_state['complete'])) {
danielebarchiesi@0 399 // Successful submit -- move temporary data to location.
danielebarchiesi@0 400
danielebarchiesi@0 401 // Create a reference to the place our context lives. Since this is fairly
danielebarchiesi@0 402 // generic, this is the easiest way to get right to the place of the
danielebarchiesi@0 403 // object without knowing precisely what data we're poking at.
danielebarchiesi@0 404 $ref = &$object->{$type_info['key']};
danielebarchiesi@0 405
danielebarchiesi@0 406 // Figure out the position for our new context.
danielebarchiesi@0 407 $position = empty($ref) ? 0 : max(array_keys($ref)) + 1;
danielebarchiesi@0 408
danielebarchiesi@0 409 $conf['id'] = ctools_context_next_id($ref, $name);
danielebarchiesi@0 410 $ref[$position] = $conf;
danielebarchiesi@0 411
danielebarchiesi@0 412 if (isset($object->temporary)) {
danielebarchiesi@0 413 unset($object->temporary);
danielebarchiesi@0 414 }
danielebarchiesi@0 415
danielebarchiesi@0 416 ctools_cache_operation($mechanism, $cache_key, 'finalize', $object);
danielebarchiesi@0 417
danielebarchiesi@0 418 // Very irritating way to update the form for our contexts.
danielebarchiesi@0 419 $arg_form_state = array('values' => array());
danielebarchiesi@0 420
danielebarchiesi@0 421 $arg_form = array(
danielebarchiesi@0 422 '#post' => array(),
danielebarchiesi@0 423 '#programmed' => FALSE,
danielebarchiesi@0 424 '#tree' => FALSE,
danielebarchiesi@0 425 );
danielebarchiesi@0 426
danielebarchiesi@0 427 // Build a chunk of the form to merge into the displayed form
danielebarchiesi@0 428 $arg_form[$type] = array(
danielebarchiesi@0 429 '#tree' => TRUE,
danielebarchiesi@0 430 );
danielebarchiesi@0 431 $arg_form[$type][$position] = array(
danielebarchiesi@0 432 '#tree' => TRUE,
danielebarchiesi@0 433 );
danielebarchiesi@0 434
danielebarchiesi@0 435 ctools_context_add_item_to_form($mechanism, $type, $cache_key, $arg_form[$type][$position], $position, $ref[$position]);
danielebarchiesi@0 436 $arg_form = form_builder('ctools_context_form', $arg_form, $arg_form_state);
danielebarchiesi@0 437
danielebarchiesi@0 438 // Build the relationships table so we can ajax it in.
danielebarchiesi@0 439 // This is an additional thing that goes in here.
danielebarchiesi@0 440 $rel_form = array(
danielebarchiesi@0 441 '#theme' => 'ctools_context_item_form',
danielebarchiesi@0 442 '#cache_key' => $cache_key,
danielebarchiesi@0 443 '#ctools_context_type' => 'relationship',
danielebarchiesi@0 444 '#ctools_context_module' => $mechanism,
danielebarchiesi@0 445 '#only_buttons' => TRUE,
danielebarchiesi@0 446 '#post' => array(),
danielebarchiesi@0 447 '#programmed' => FALSE,
danielebarchiesi@0 448 '#tree' => FALSE,
danielebarchiesi@0 449 );
danielebarchiesi@0 450
danielebarchiesi@0 451 $rel_form['relationship'] = array(
danielebarchiesi@0 452 '#tree' => TRUE,
danielebarchiesi@0 453 );
danielebarchiesi@0 454
danielebarchiesi@0 455 // Allow an object to set some 'base' contexts that come from elsewhere.
danielebarchiesi@0 456 $rel_contexts = isset($object->base_contexts) ? $object->base_contexts : array();
danielebarchiesi@0 457 $all_contexts = ctools_context_load_contexts($object, TRUE, $rel_contexts);
danielebarchiesi@0 458 $available_relationships = ctools_context_get_relevant_relationships($all_contexts);
danielebarchiesi@0 459
danielebarchiesi@0 460 $output = array();
danielebarchiesi@0 461 if (!empty($available_relationships)) {
danielebarchiesi@0 462 ctools_context_add_item_table_buttons('relationship', $mechanism, $rel_form, $available_relationships);
danielebarchiesi@0 463 $rel_form = form_builder('dummy_form_id', $rel_form, $arg_form_state);
danielebarchiesi@0 464 $output[] = ajax_command_replace('div#ctools-relationships-table div.buttons', drupal_render($rel_form));
danielebarchiesi@0 465 }
danielebarchiesi@0 466
danielebarchiesi@0 467 $theme_vars = array();
danielebarchiesi@0 468 $theme_vars['type'] = $type;
danielebarchiesi@0 469 $theme_vars['form'] = $arg_form[$type][$position];
danielebarchiesi@0 470 $theme_vars['position'] = $position;
danielebarchiesi@0 471 $theme_vars['count'] = $position;
danielebarchiesi@0 472 $text = theme('ctools_context_item_row', $theme_vars);
danielebarchiesi@0 473 $output[] = ajax_command_append('#' . $type . '-table tbody', $text);
danielebarchiesi@0 474 $output[] = ajax_command_changed('#' . $type . '-row-' . $position, '.title');
danielebarchiesi@0 475 $output[] = ctools_modal_command_dismiss();
danielebarchiesi@0 476 }
danielebarchiesi@0 477 else {
danielebarchiesi@0 478 $output = ctools_modal_form_render($form_state, $output);
danielebarchiesi@0 479 }
danielebarchiesi@0 480 print ajax_render($output);
danielebarchiesi@0 481 exit;
danielebarchiesi@0 482 }
danielebarchiesi@0 483
danielebarchiesi@0 484 /**
danielebarchiesi@0 485 * Ajax entry point to edit an item
danielebarchiesi@0 486 */
danielebarchiesi@0 487 function ctools_context_ajax_item_edit($mechanism = NULL, $type = NULL, $cache_key = NULL, $position = NULL, $step = NULL) {
danielebarchiesi@0 488 ctools_include('ajax');
danielebarchiesi@0 489 ctools_include('modal');
danielebarchiesi@0 490 ctools_include('context');
danielebarchiesi@0 491 ctools_include('cache');
danielebarchiesi@0 492 ctools_include('plugins-admin');
danielebarchiesi@0 493
danielebarchiesi@0 494 if (!isset($position)) {
danielebarchiesi@0 495 return ctools_ajax_render_error();
danielebarchiesi@0 496 }
danielebarchiesi@0 497
danielebarchiesi@0 498 // Load stored object from cache.
danielebarchiesi@0 499 if (!($object = ctools_cache_get($mechanism, $cache_key))) {
danielebarchiesi@0 500 ctools_ajax_render_error(t('Invalid object name.'));
danielebarchiesi@0 501 }
danielebarchiesi@0 502
danielebarchiesi@0 503 $type_info = ctools_context_info($type);
danielebarchiesi@0 504
danielebarchiesi@0 505 // Create a reference to the place our context lives. Since this is fairly
danielebarchiesi@0 506 // generic, this is the easiest way to get right to the place of the
danielebarchiesi@0 507 // object without knowing precisely what data we're poking at.
danielebarchiesi@0 508 $ref = &$object->{$type_info['key']};
danielebarchiesi@0 509
danielebarchiesi@0 510 if (empty($step) || empty($object->temporary)) {
danielebarchiesi@0 511 // Create the basis for our new context.
danielebarchiesi@0 512 $conf = $object->{$type_info['key']}[$position];
danielebarchiesi@0 513 $object->temporary = &$conf;
danielebarchiesi@0 514 }
danielebarchiesi@0 515 else {
danielebarchiesi@0 516 $conf = &$object->temporary;
danielebarchiesi@0 517 }
danielebarchiesi@0 518
danielebarchiesi@0 519 $name = $ref[$position]['name'];
danielebarchiesi@0 520 if (empty($name)) {
danielebarchiesi@0 521 ctools_ajax_render_error();
danielebarchiesi@0 522 }
danielebarchiesi@0 523
danielebarchiesi@0 524 // load the plugin definition
danielebarchiesi@0 525 $plugin_definition = ctools_context_get_plugin($type, $name);
danielebarchiesi@0 526 if (empty($plugin_definition)) {
danielebarchiesi@0 527 ctools_ajax_render_error(t('Invalid context type'));
danielebarchiesi@0 528 }
danielebarchiesi@0 529
danielebarchiesi@0 530 // Load the contexts
danielebarchiesi@0 531 $base_contexts = isset($object->base_contexts) ? $object->base_contexts : array();
danielebarchiesi@0 532 $contexts = ctools_context_load_contexts($object, TRUE, $base_contexts);
danielebarchiesi@0 533
danielebarchiesi@0 534 $form_state = array(
danielebarchiesi@0 535 'ajax' => TRUE,
danielebarchiesi@0 536 'modal' => TRUE,
danielebarchiesi@0 537 'modal return' => TRUE,
danielebarchiesi@0 538 'object' => &$object,
danielebarchiesi@0 539 'conf' => &$conf,
danielebarchiesi@0 540 'position' => $position,
danielebarchiesi@0 541 'plugin' => $plugin_definition,
danielebarchiesi@0 542 'type' => $type,
danielebarchiesi@0 543 'contexts' => $contexts,
danielebarchiesi@0 544 'title' => t('Edit @type "@context"', array('@type' => $type_info['singular title'], '@context' => $plugin_definition['title'])),
danielebarchiesi@0 545 'type info' => $type_info,
danielebarchiesi@0 546 'op' => 'add',
danielebarchiesi@0 547 'step' => $step,
danielebarchiesi@0 548 );
danielebarchiesi@0 549
danielebarchiesi@0 550 $form_info = array(
danielebarchiesi@0 551 'path' => "ctools/context/ajax/configure/$mechanism/$type/$cache_key/$position/%step",
danielebarchiesi@0 552 'show cancel' => TRUE,
danielebarchiesi@0 553 'default form' => 'ctools_edit_context_form_defaults',
danielebarchiesi@0 554 'auto caching' => TRUE,
danielebarchiesi@0 555 'cache mechanism' => $mechanism,
danielebarchiesi@0 556 'cache key' => $cache_key,
danielebarchiesi@0 557 // This is stating what the cache will be referred to in $form_state
danielebarchiesi@0 558 'cache storage' => 'object',
danielebarchiesi@0 559 );
danielebarchiesi@0 560
danielebarchiesi@0 561 if ($type == 'requiredcontext') {
danielebarchiesi@0 562 $form_info += array(
danielebarchiesi@0 563 'add form name' => 'required context add form',
danielebarchiesi@0 564 'edit form name' => 'required context edit form',
danielebarchiesi@0 565 );
danielebarchiesi@0 566 }
danielebarchiesi@0 567
danielebarchiesi@0 568 $output = ctools_plugin_configure_form($form_info, $form_state);
danielebarchiesi@0 569
danielebarchiesi@0 570 if (!empty($form_state['cancel'])) {
danielebarchiesi@0 571 $output = array(ctools_modal_command_dismiss());
danielebarchiesi@0 572 }
danielebarchiesi@0 573 else if (!empty($form_state['complete'])) {
danielebarchiesi@0 574 // successful submit
danielebarchiesi@0 575 $ref[$position] = $conf;
danielebarchiesi@0 576 if (isset($object->temporary)) {
danielebarchiesi@0 577 unset($object->temporary);
danielebarchiesi@0 578 }
danielebarchiesi@0 579
danielebarchiesi@0 580 ctools_cache_operation($mechanism, $cache_key, 'finalize', $object);
danielebarchiesi@0 581
danielebarchiesi@0 582 $output = array();
danielebarchiesi@0 583 $output[] = ctools_modal_command_dismiss();
danielebarchiesi@0 584
danielebarchiesi@0 585 $arg_form = array(
danielebarchiesi@0 586 '#post' => array(),
danielebarchiesi@0 587 '#programmed' => FALSE,
danielebarchiesi@0 588 '#tree' => FALSE,
danielebarchiesi@0 589 );
danielebarchiesi@0 590
danielebarchiesi@0 591 // Build a chunk of the form to merge into the displayed form
danielebarchiesi@0 592 $arg_form[$type] = array(
danielebarchiesi@0 593 '#tree' => TRUE,
danielebarchiesi@0 594 );
danielebarchiesi@0 595 $arg_form[$type][$position] = array(
danielebarchiesi@0 596 '#tree' => TRUE,
danielebarchiesi@0 597 );
danielebarchiesi@0 598
danielebarchiesi@0 599 ctools_context_add_item_to_form($mechanism, $type, $cache_key, $arg_form[$type][$position], $position, $ref[$position]);
danielebarchiesi@0 600 $arg_form = form_builder('ctools_context_form', $arg_form, $arg_form_state);
danielebarchiesi@0 601
danielebarchiesi@0 602 $theme_vars = array();
danielebarchiesi@0 603 $theme_vars['type'] = $type;
danielebarchiesi@0 604 $theme_vars['form'] = $arg_form[$type][$position];
danielebarchiesi@0 605 $theme_vars['position'] = $position;
danielebarchiesi@0 606 $theme_vars['count'] = $position;
danielebarchiesi@0 607 $output[] = ajax_command_replace('#' . $type . '-row-' . $position, theme('ctools_context_item_row', $theme_vars));
danielebarchiesi@0 608 $output[] = ajax_command_changed('#' . $type . '-row-' . $position, '.title');
danielebarchiesi@0 609 }
danielebarchiesi@0 610 else {
danielebarchiesi@0 611 $output = ctools_modal_form_render($form_state, $output);
danielebarchiesi@0 612 }
danielebarchiesi@0 613 print ajax_render($output);
danielebarchiesi@0 614 exit;
danielebarchiesi@0 615 }
danielebarchiesi@0 616
danielebarchiesi@0 617 /**
danielebarchiesi@0 618 * Get the defaults for a new instance of a context plugin.
danielebarchiesi@0 619 *
danielebarchiesi@0 620 * @param $plugin_definition
danielebarchiesi@0 621 * The metadata definition of the plugin from ctools_get_plugins().
danielebarchiesi@0 622 * @param $object
danielebarchiesi@0 623 * The object the context plugin will be added to.
danielebarchiesi@0 624 * @param $type
danielebarchiesi@0 625 * The type of context plugin. i.e, context, requiredcontext, relationship
danielebarchiesi@0 626 */
danielebarchiesi@0 627 function ctools_context_get_defaults($plugin_definition, $object, $type) {
danielebarchiesi@0 628 // Fetch the potential id of the plugin so we can append
danielebarchiesi@0 629 // title and keyword information for new ones.
danielebarchiesi@0 630 $type_info = ctools_context_info($type);
danielebarchiesi@0 631 $id = ctools_context_next_id($object->{$type_info['key']}, $plugin_definition['name']);
danielebarchiesi@0 632
danielebarchiesi@0 633 $conf = array(
danielebarchiesi@0 634 'identifier' => $plugin_definition['title'] . ($id > 1 ? ' ' . $id : ''),
danielebarchiesi@0 635 'keyword' => ctools_get_keyword($object, $plugin_definition['keyword']),
danielebarchiesi@0 636 'name' => $plugin_definition['name'],
danielebarchiesi@0 637 );
danielebarchiesi@0 638
danielebarchiesi@0 639 if (isset($plugin_definition['defaults'])) {
danielebarchiesi@0 640 $defaults = $plugin_definition['defaults'];
danielebarchiesi@0 641 }
danielebarchiesi@0 642 else if (isset($subtype['defaults'])) {
danielebarchiesi@0 643 $defaults = $subtype['defaults'];
danielebarchiesi@0 644 }
danielebarchiesi@0 645
danielebarchiesi@0 646 if (isset($defaults)) {
danielebarchiesi@0 647 if (is_string($defaults) && function_exists($defaults)) {
danielebarchiesi@0 648 if ($settings = $defaults($plugin_definition)) {
danielebarchiesi@0 649 $conf += $settings;
danielebarchiesi@0 650 }
danielebarchiesi@0 651 }
danielebarchiesi@0 652 else if (is_array($defaults)) {
danielebarchiesi@0 653 $conf += $defaults;
danielebarchiesi@0 654 }
danielebarchiesi@0 655 }
danielebarchiesi@0 656
danielebarchiesi@0 657 return $conf;
danielebarchiesi@0 658 }
danielebarchiesi@0 659
danielebarchiesi@0 660 /**
danielebarchiesi@0 661 * Form wrapper for the edit context form.
danielebarchiesi@0 662 *
danielebarchiesi@0 663 * @todo: We should uncombine these.
danielebarchiesi@0 664 */
danielebarchiesi@0 665 function ctools_edit_context_form_defaults($form, &$form_state) {
danielebarchiesi@0 666 // Basic values required to orient ourselves
danielebarchiesi@0 667 $object = $form_state['object'];
danielebarchiesi@0 668 $plugin_definition = $form_state['plugin'];
danielebarchiesi@0 669 $type_info = $form_state['type info'];
danielebarchiesi@0 670 $contexts = $form_state['contexts'];
danielebarchiesi@0 671 $conf = $form_state['conf'];
danielebarchiesi@0 672
danielebarchiesi@0 673 if ($type_info['key'] == 'arguments' && !isset($conf['default'])) {
danielebarchiesi@0 674 $conf['default'] = 'ignore';
danielebarchiesi@0 675 $conf['title'] = '';
danielebarchiesi@0 676 }
danielebarchiesi@0 677
danielebarchiesi@0 678 $form['description'] = array(
danielebarchiesi@0 679 '#prefix' => '<div class="description">',
danielebarchiesi@0 680 '#suffix' => '</div>',
danielebarchiesi@0 681 '#markup' => check_plain($plugin_definition['description']),
danielebarchiesi@0 682 );
danielebarchiesi@0 683
danielebarchiesi@0 684 if ($type_info['key'] == 'relationships') {
danielebarchiesi@0 685 $form['context'] = ctools_context_selector($contexts, $plugin_definition['required context'], isset($conf['context']) ? $conf['context'] : '');
danielebarchiesi@0 686 }
danielebarchiesi@0 687 if ($type_info['key'] == 'arguments') {
danielebarchiesi@0 688 $form['default'] = array(
danielebarchiesi@0 689 '#type' => 'select',
danielebarchiesi@0 690 '#title' => t('Default'),
danielebarchiesi@0 691 '#options' => array(
danielebarchiesi@0 692 'ignore' => t('Ignore it; content that requires this context will not be available.'),
danielebarchiesi@0 693 '404' => t('Display page not found or display nothing at all.'),
danielebarchiesi@0 694 ),
danielebarchiesi@0 695 '#default_value' => $conf['default'],
danielebarchiesi@0 696 '#description' => t('If the argument is missing or is not valid, select how this should behave.'),
danielebarchiesi@0 697 );
danielebarchiesi@0 698
danielebarchiesi@0 699 $form['title'] = array(
danielebarchiesi@0 700 '#type' => 'textfield',
danielebarchiesi@0 701 '#title' => t('Title'),
danielebarchiesi@0 702 '#default_value' => $conf['title'],
danielebarchiesi@0 703 '#description' => t('Enter a title to use when this argument is present. You may use %KEYWORD substitution, where the keyword is specified below.'),
danielebarchiesi@0 704 );
danielebarchiesi@0 705 }
danielebarchiesi@0 706
danielebarchiesi@0 707 $form['identifier'] = array(
danielebarchiesi@0 708 '#type' => 'textfield',
danielebarchiesi@0 709 '#title' => t('Identifier'),
danielebarchiesi@0 710 '#description' => t('Enter a name to identify this !type on administrative screens.', array('!type' => t('context'))),
danielebarchiesi@0 711 '#default_value' => $conf['identifier'],
danielebarchiesi@0 712 );
danielebarchiesi@0 713
danielebarchiesi@0 714 $form['keyword'] = array(
danielebarchiesi@0 715 '#type' => 'textfield',
danielebarchiesi@0 716 '#title' => t('Keyword'),
danielebarchiesi@0 717 '#description' => t('Enter a keyword to use for substitution in titles.'),
danielebarchiesi@0 718 '#default_value' => $conf['keyword'],
danielebarchiesi@0 719 );
danielebarchiesi@0 720
danielebarchiesi@0 721 $form['#submit'][] = 'ctools_edit_context_form_defaults_submit';
danielebarchiesi@0 722
danielebarchiesi@0 723 return $form;
danielebarchiesi@0 724 }
danielebarchiesi@0 725
danielebarchiesi@0 726 /**
danielebarchiesi@0 727 * Submit handler to store context identifier and keyword info.
danielebarchiesi@0 728 */
danielebarchiesi@0 729 function ctools_edit_context_form_defaults_submit(&$form, &$form_state) {
danielebarchiesi@0 730 if ($form_state['type info']['key'] == 'relationships') {
danielebarchiesi@0 731 $form_state['conf']['context'] = $form_state['values']['context'];
danielebarchiesi@0 732 }
danielebarchiesi@0 733 if ($form_state['type info']['key'] == 'arguments') {
danielebarchiesi@0 734 $form_state['conf']['default'] = $form_state['values']['default'];
danielebarchiesi@0 735 $form_state['conf']['title'] = $form_state['values']['title'];
danielebarchiesi@0 736 }
danielebarchiesi@0 737
danielebarchiesi@0 738 $form_state['conf']['identifier'] = $form_state['values']['identifier'];
danielebarchiesi@0 739 $form_state['conf']['keyword'] = $form_state['values']['keyword'];
danielebarchiesi@0 740 }
danielebarchiesi@0 741
danielebarchiesi@0 742 /**
danielebarchiesi@0 743 * Ajax entry point to edit an item
danielebarchiesi@0 744 */
danielebarchiesi@0 745 function ctools_context_ajax_item_delete($mechanism = NULL, $type = NULL, $cache_key = NULL, $position = NULL) {
danielebarchiesi@0 746 ctools_include('ajax');
danielebarchiesi@0 747 ctools_include('context');
danielebarchiesi@0 748 ctools_include('cache');
danielebarchiesi@0 749
danielebarchiesi@0 750 if (!isset($position)) {
danielebarchiesi@0 751 return ctools_ajax_render_error();
danielebarchiesi@0 752 }
danielebarchiesi@0 753
danielebarchiesi@0 754 // Load stored object from cache.
danielebarchiesi@0 755 if (!($object = ctools_cache_get($mechanism, $cache_key))) {
danielebarchiesi@0 756 ctools_ajax_render_error(t('Invalid object name.'));
danielebarchiesi@0 757 }
danielebarchiesi@0 758
danielebarchiesi@0 759 $type_info = ctools_context_info($type);
danielebarchiesi@0 760
danielebarchiesi@0 761 // Create a reference to the place our context lives. Since this is fairly
danielebarchiesi@0 762 // generic, this is the easiest way to get right to the place of the
danielebarchiesi@0 763 // object without knowing precisely what data we're poking at.
danielebarchiesi@0 764 $ref = &$object->{$type_info['key']};
danielebarchiesi@0 765
danielebarchiesi@0 766 if (!array_key_exists($position, $ref)) {
danielebarchiesi@0 767 ctools_ajax_render_error(t('Unable to delete missing item!'));
danielebarchiesi@0 768 }
danielebarchiesi@0 769
danielebarchiesi@0 770 unset($ref[$position]);
danielebarchiesi@0 771 ctools_cache_operation($mechanism, $cache_key, 'finalize', $object);
danielebarchiesi@0 772
danielebarchiesi@0 773 $output = array();
danielebarchiesi@0 774 $output[] = ajax_command_replace('#' . $type . '-row-' . $position, '');
danielebarchiesi@0 775 $output[] = ajax_command_restripe("#$type-table");
danielebarchiesi@0 776 print ajax_render($output);
danielebarchiesi@0 777 exit;
danielebarchiesi@0 778 }
danielebarchiesi@0 779
danielebarchiesi@0 780 // --- End of contexts
danielebarchiesi@0 781
danielebarchiesi@0 782 function ctools_save_context($type, &$ref, $form_values) {
danielebarchiesi@0 783 $type_info = ctools_context_info($type);
danielebarchiesi@0 784
danielebarchiesi@0 785 // Organize arguments
danielebarchiesi@0 786 $new = array();
danielebarchiesi@0 787 $order = array();
danielebarchiesi@0 788
danielebarchiesi@0 789 foreach ($ref as $id => $context) {
danielebarchiesi@0 790 $position = $form_values[$type][$id]['position'];
danielebarchiesi@0 791 $order[$position] = $id;
danielebarchiesi@0 792 }
danielebarchiesi@0 793
danielebarchiesi@0 794 ksort($order);
danielebarchiesi@0 795 foreach ($order as $id) {
danielebarchiesi@0 796 $new[] = $ref[$id];
danielebarchiesi@0 797 }
danielebarchiesi@0 798 $ref = $new;
danielebarchiesi@0 799 }
danielebarchiesi@0 800
danielebarchiesi@0 801 function ctools_get_keyword($page, $word) {
danielebarchiesi@0 802 // Create a complete set of keywords
danielebarchiesi@0 803 $keywords = array();
danielebarchiesi@0 804 foreach (array('arguments', 'relationships', 'contexts', 'requiredcontexts') as $type) {
danielebarchiesi@0 805 if (!empty($page->$type) && is_array($page->$type)) {
danielebarchiesi@0 806 foreach ($page->$type as $info) {
danielebarchiesi@0 807 $keywords[$info['keyword']] = TRUE;
danielebarchiesi@0 808 }
danielebarchiesi@0 809 }
danielebarchiesi@0 810 }
danielebarchiesi@0 811
danielebarchiesi@0 812 $keyword = $word;
danielebarchiesi@0 813 $count = 1;
danielebarchiesi@0 814 while (!empty($keywords[$keyword])) {
danielebarchiesi@0 815 $keyword = $word . '_' . ++$count;
danielebarchiesi@0 816 }
danielebarchiesi@0 817 return $keyword;
danielebarchiesi@0 818 }
danielebarchiesi@0 819