global defaults. Use the weight to specify the order the context meta tags run.', array('@url' => url('admin/config/search/metatags/config/global'))); foreach ($contexts as $name => $context) { // Only show context items that are specifically selected to be "Shown on // metatag admin page". if (isset($context->reactions['metatag_context_reaction']['metatag_admin']) && $context->reactions['metatag_context_reaction']['metatag_admin']) { $ops = array( l(t('Edit'), 'admin/config/search/metatags/context/' . $context->name, array('query' => array('destination' => 'admin/config/search/metatags/context'))), l(t('Delete'), 'admin/config/search/metatags/context/' . $context->name . '/delete', array('query' => array('destination' => 'admin/config/search/metatags/context'))), ); $rows[] = array( 'name' => $context->name, 'path' => isset($context->conditions['path']) ? htmlspecialchars(implode(', ', $context->conditions['path']['values'])) : t('No path condition.'), 'weight' => isset($context->reactions['metatag_context_reaction']['weight']) ? $context->reactions['metatag_context_reaction']['weight'] : 0, 'ops' => implode(' | ', $ops), ); } } uasort($rows, 'drupal_sort_weight'); return theme('table', array('header' => $header, 'rows' => $rows, 'caption' => $caption)); } /** * FormAPI callback to build the 'config_add' form. */ function metatag_context_config_add_form($form, &$form_state) { $form['name'] = array( '#title' => 'Name', '#type' => 'textfield', '#default_value' => '', '#description' => 'The unique ID for this metatag path context rule. This must contain only lower case letters, numbers and underscores.', '#required' => 1, '#maxlength' => 255, '#element_validate' => array('metatag_context_edit_name_validate'), ); $form['actions']['#type'] = 'actions'; $form['actions']['save'] = array( '#type' => 'submit', '#value' => t('Add and configure'), ); $form['actions']['cancel'] = array( '#type' => 'link', '#title' => t('Cancel'), '#href' => isset($_GET['destination']) ? $_GET['destination'] : 'admin/config/search/metatags/context', ); return $form; } /** * FormAPI callback to validate the 'edit_name' field. */ function metatag_context_edit_name_validate($element, &$form_state) { // Check for string identifier sanity. if (!preg_match('!^[a-z0-9_-]+$!', $element['#value'])) { form_error($element, t('The name can only consist of lowercase letters, underscores, dashes, and numbers.')); return; } // Ensure the CTools exportables system is loaded. ctools_include('export'); // Check for name collision. if ($exists = ctools_export_crud_load('context', $element['#value'])) { form_error($element, t('A context with this name already exists. Please choose another name or delete the existing item before creating a new one.')); } } /** * FormAPI callback to save the 'edit_name' form. */ function metatag_context_config_add_form_submit($form, &$form_state) { $context = metatag_context_load_default_context(); $context->name = $form_state['values']['name']; context_save($context); // Update the i18n strings. if (!empty($context->reactions['metatag_context_reaction']['metatags'][LANGUAGE_NONE])) { metatag_translations_update($context->reactions['metatag_context_reaction']['metatags'][LANGUAGE_NONE], 'metatag_context:' . $context->name); } $form_state['redirect'] = 'admin/config/search/metatags/context/' . $context->name; } /** * FormAPI callback to build the edit form. */ function metatag_context_config_edit_form($form, &$form_state, $context) { $form_state['metatag_context']['context'] = $context; // Empty form to start with. $form = array(); // Don't care about the instance name, the data is being managed by Context // and not Metatag. $instance = ""; $options = array( 'token types' => array('node', 'term', 'user'), ); $metatags = $context->reactions['metatag_context_reaction']['metatags']; if (!isset($metatags[LANGUAGE_NONE])) { $metatags = array( LANGUAGE_NONE => $metatags, ); } // Load the METATAG form. metatag_metatags_form($form, $instance, $metatags[LANGUAGE_NONE], $options); $form['paths'] = array( '#title' => 'Path', '#description' => t('Set this metatag context when any of the paths above match the page path. Put each path on a separate line. You can use the * character (asterisk) as a wildcard and the ~ character (tilde) to exclude one or more paths. Use <front> for the site front page. Only local paths (e.g. "example/page") will work, do not use relative URLs ("/example/page") or absolute URLs ("http://example.com/example/page").'), '#type' => 'textarea', '#default_value' => isset($context->conditions['path']['values']) ? html_entity_decode(implode(' ', $context->conditions['path']['values'])) : '', '#required' => 1, '#weight' => -100, ); // If other conditions are assigned, mention it. $conditions = array_keys($context->conditions); foreach ($conditions as $key => $condition) { if ($condition == 'path') { unset($conditions[$key]); } } if (!empty($conditions)) { $form['other_conditions'] = array( '#prefix' => '

', '#markup' => t('Other conditions have been assigned that must be controlled through the main Context settings page.'), '#suffix' => '

', '#weight' => -99.9, ); } $form['help'] = array( '#prefix' => '

', '#markup' => t('Values assigned here inherit from the global defaults.', array('@url' => url('admin/config/search/metatags/config/global'))), '#suffix' => '

', '#weight' => -99, ); $form['metatags']['#type'] = 'container'; unset($form['metatags']['#collapsed']); unset($form['metatags']['#collapsible']); $form['actions']['#type'] = 'actions'; $form['actions']['save'] = array( '#type' => 'submit', '#value' => t('Save'), ); $form['actions']['cancel'] = array( '#type' => 'link', '#title' => t('Cancel'), '#href' => isset($_GET['destination']) ? $_GET['destination'] : 'admin/config/search/metatags/context', ); $form['#submit'][] = 'metatag_context_config_edit_form_submit'; return $form; } /** * FormAPI callback for the final submission. */ function metatag_context_config_edit_form_submit($form, &$form_state) { $context = $form_state['metatag_context']['context']; $context->reactions['metatag_context_reaction']['metatags'] = $form_state['values']['metatags']; $paths = explode("\n", str_replace("\r", "", $form_state['values']['paths'])); $paths = array_combine($paths, $paths); $context->conditions['path']['values'] = $paths; context_save($context); // Update the i18n strings. if (!empty($context->reactions['metatag_context_reaction']['metatags'][LANGUAGE_NONE])) { metatag_translations_update($context->reactions['metatag_context_reaction']['metatags'][LANGUAGE_NONE], 'metatag_context:' . $context->name); } $form_state['redirect'] = 'admin/config/search/metatags/context'; } /** * FormAPI callback to build the 'delete' form. */ function metatag_context_delete_form($form, &$form_state, $context) { $form_state['metatag_context']['context'] = $context; $form['delete'] = array( '#value' => 'This action will permanently remove this item from your database.', ); $form['actions']['#type'] = 'actions'; $form['actions']['save'] = array( '#type' => 'submit', '#value' => t('Delete'), ); $form['actions']['cancel'] = array( '#type' => 'link', '#title' => t('Cancel'), '#href' => isset($_GET['destination']) ? $_GET['destination'] : 'admin/config/search/metatags/context', ); $form['#submit'][] = 'metatag_context_delete_form_submit'; return $form; } /** * FormAPI submission callback for the 'delete' form. */ function metatag_context_delete_form_submit($form, &$form_state) { context_delete($form_state['metatag_context']['context']); $form_state['redirect'] = 'admin/config/search/metatags/context'; } /** * Create a default Metatag-focused context. * * @return object * A context structure in the form of a StdClass object. */ function metatag_context_load_default_context() { $context = new stdClass(); $context->disabled = FALSE; /* Edit this to true to make a default context disabled initially */ $context->api_version = 3; $context->name = 'default_metatag_context'; $context->description = ''; $context->tag = 'Metatag'; $context->metatag = TRUE; $context->conditions = array( 'path' => array( 'values' => array(), ), ); $context->reactions = array( 'metatag_context_reaction' => array( 'metatags' => array(), 'metatag_admin' => 1, ), ); $context->condition_mode = 0; $context->weight = 0; // Translatables // Included for use with string extractors like potx. t('Metatag'); return $context; }