123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512 |
- <?php
- /**
- * @file
- * Provides additional buttons for nodes.
- *
- * Currently available buttons:
- * - Cancel
- * - Save and Continue
- *
- * Furthermore available is the Create new action.
- * - The action can used as tab in addition to the node View or node Edit tab.
- * - The action can used as action link.
- *
- * @todo
- * OG compatibility
- */
- /**
- * Implements hook_permission().
- */
- function mb_content_permission() {
- return array(
- 'access mb content' => array(
- 'title' => t('Use More Content Buttons'),
- 'description' => t('Use the buttons defined by More Buttons Content.')
- )
- );
- }
- /**
- * Implements hook_menu().
- */
- function mb_content_menu() {
- $items = array();
- $items['admin/config/mb/buttons/more-buttons-content'] = array(
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('mb_content_admin'),
- 'title' => 'Contents',
- 'access arguments' => array('administer site configuration'),
- 'description' => 'An overview of what content type uses buttons/functions of the MB Content module.',
- 'file' => 'mb_content.admin.inc',
- 'type' => MENU_LOCAL_TASK,
- 'weight' => 9
- );
- $items['admin/config/mb/buttons/more-buttons-content/reset'] = array(
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('mb_content_reset'),
- 'access arguments' => array('administer site configuration'),
- 'type' => MENU_CALLBACK,
- 'file' => 'mb_content.admin.inc'
- );
- return $items;
- }
- /**
- * Title callback to provide the title for the create new tab.
- *
- * @return string
- */
- function mb_content_createnew_title() {
- $mb_default_values = mb_default_values('mb_content');
- $mb_values = variable_get('mb_values', array());
- return isset($mb_values['tabcn']) ? $mb_values['tabcn'] : $mb_default_values['tabcn'];
- }
- /**
- * Implements hook_theme().
- */
- function mb_content_theme() {
- return array(
- 'mb_content_admin' => array(
- 'variables' => array('form' => NULL),
- )
- );
- }
- /**
- * Implements hook_form_alter().
- */
- function mb_content_form_alter(&$form, &$form_state, $form_id) {
- // Make sure the form alter changes take place only in certain forms.
- // Get the right node types.
- $node_type = '';
- $module = 'mb_content';
- // Node add/edit forms.
- if (isset($form['#node']->type) && isset($form['#node_edit_form'])) {
- $node_type = $form['#node']->type;
- }
- // Preparing the administration of MB Content; Content type edit form.
- elseif (isset($form['type']) && !empty($form['#type']['#value']) && isset($form['#node_edit_form'])) {
- $node_type = $form['#type']['#value'];
- }
- // Prepare the administration of MB Content; Content type add form.
- elseif (isset($form['#node']->type) && empty($form['#type']['#value']) && isset($form['#node_edit_form'])) {
- // Use temporary an content type as dummy to handle button management on the "Add content type" page.
- $node_type = 'mb_content_type_dummy';
- }
- switch ($form_id) {
- case 'node_type_form':
- // Provide the prepared MB Content button settings.
- // Check the specific case add content type form.
- if (empty($form['#node_type']->type)) {
- // Add content type.
- $type = 'mb_content_type_dummy';
- }
- else {
- // Edit an content type.
- $type = $form['#node_type']->type;
- }
- // It makes no sense to use the MB Content module with the content type panel.
- if ($type == 'panel') {
- return;
- }
- /**
- * The additional buttons and tab settings.
- */
- $form['node_buttons'] = array(
- '#type' => 'fieldset',
- '#title' => t('Button settings - content'),
- '#group' => 'additional_settings',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#weight' => 4,
- '#attached' => array(
- 'js' => array(drupal_get_path('module', $module) . '/' . $module . '_node_form.js')
- )
- );
- // Provide "Cancel" button settings.
- $form['node_buttons'][$module . '_cancel'] = array(
- '#type' => 'select',
- '#title' => t('Cancel button'),
- '#description' => t('Please select using the button or its position.'),
- '#options' => mb_cancel_button_positions(),
- '#default_value' => variable_get($module . '_cancel_' . $type, 0)
- );
- // Provide "Save and continue" button settings.
- $form['node_buttons'][$module . '_sac'] = array(
- '#type' => 'select',
- '#title' => t('Save and continue button'),
- '#description' => t('Please select using the button or its position.'),
- '#options' => mb_save_button_positions($module),
- '#default_value' => variable_get($module . '_sac_' . $type, 0)
- );
- // Provide the "Create new" tab option.
- $form['node_buttons'][$module . '_tabcn'] = array(
- '#type' => 'checkbox',
- '#title' => t('Create new tab'),
- '#description' => t('Enable an "Create new" tab in addition to the %view or %edit tab.', array('%view' => t('View'), '%edit' => t('Edit'))),
- '#default_value' => variable_get($module . '_tabcn_' . $type, 0)
- );
- // Use an own submit callback to save the settings
- // on the add/edit content type forms.
- $form['#submit'][] = 'mb_content_admin_form_submit';
- break;
- case 'node_type_delete_confirm':
- // Use an own submit callback to delete MB Content
- // content type system variables if content types will be deleted.
- $form['#submit'][] = 'mb_content_delete_confirm_submit';
- break;
- case $node_type . '_node_form':
- // It makes no sense to use the MB Content module with the content type panel.
- if ($node_type == 'panel') {
- return;
- }
- $mb_default_values = mb_default_values();
- $mb_content_values = mb_get_values('mb');
- $destination = drupal_get_destination();
- $settings = array();
- $settings['cancel'] = variable_get($module . '_cancel_' . $node_type, 0);
- $settings['sac'] = variable_get($module . '_sac_' . $node_type, 0);
- $settings['tabcn'] = variable_get($module . '_tabcn_' . $node_type, 0);
- // Insert the referer.
- $referer = preg_replace('/.*\/node\//', 'node/', url($_SERVER["HTTP_REFERER"]));
- $form['#referer'] = $referer;
- $form_state['cache'] = TRUE;
- /**
- * Destination parameter handling.
- *
- * Deactivate the destination parameter
- * and keep these parameter in order to be able to use it anyway.
- */
- if (preg_match('/\?destination/', $form['#action'])) {
- $form_state['storage']['#mb_redirect'] = preg_replace('/^.*\?destination\=/', '', $form['#action']);
- }
- elseif (preg_match('/\?destination/', $form['#referer'])) {
- $form_state['storage']['#mb_redirect'] = preg_replace('/^.*\?destination\=/', '', $form['#referer']);
- }
- $form['#action'] = preg_replace('/\?destination.*/', '', $form['#action']);
- if (isset($form_state['storage']['#mb_redirect'])) {
- $form['storage']['#mb_redirect'] = $form_state['storage']['#mb_redirect'];
- }
- elseif (isset($form['storage']['#mb_redirect'])) {
- $form_state['#mb_redirect'] = $form['storage']['#mb_redirect'];
- }
- // Identify the "Create new" tab action.
- if (preg_match('/node\/\d+/', $referer) && !isset($form_state['clicked_button']['#id'])) {
- $form['#tabcn_referer'] = $referer;
- }
- /**
- * The "Save and continue" form element.
- */
- if ($settings['sac'] > 0) {
- // Left of Save.
- if ($settings['sac'] == 1) {
- $weight_sac = $form['actions']['submit']['#weight'] - 0.025;
- }
- // Right of Save
- if ($settings['sac'] == 2) {
- $weight_sac = $form['actions']['submit']['#weight'] + 0.025;
- }
- // Define the "Save and continue" form element.
- $form['actions']['sac'] = array(
- '#type' => 'submit',
- '#value' => isset($mb_content_values['sac']) ? t('@sac-value', array('@sac-value' => t($mb_content_values['sac']))) : t($mb_default_values['sac']),
- '#weight' => $weight_sac,
- '#validate' => array('mb_content_changed_validate'),
- '#submit' => array('node_form_submit', 'mb_content_sac_submit')
- );
- }
- /**
- * The "Cancel" form element.
- */
- if ($settings['cancel'] > 0) {
- if ($settings['cancel'] == 1) {
- $weight_cancel = $form['actions']['submit']['#weight'] - 1;
- }
- elseif ($settings['cancel'] == 2) {
- $weight_cancel = 16;
- }
- // Define the "Cancel" form element.
- $form['actions']['cancel'] = array(
- '#type' => 'submit',
- '#value' => isset($mb_content_values['cancel']) ? t('@cancel-value', array('@cancel-value' => t($mb_content_values['cancel']))) : t($mb_default_values['cancel']),
- '#weight' => $weight_cancel,
- '#validate' => array('mb_content_cancel_validate'),
- '#limit_validation_errors' => array(),
- );
- }
- /**
- * Extra validation for the standard buttons.
- * Without this break the normal form handling.
- * @see mb_content_cancel_validate(), mb_content_changed_submit()
- * Call edit form from admin/content is no needed this callbacks.
- */
- if ($settings['sac'] > 0 || $destination['destination'] != 'admin/content') {
- $form['actions']['preview']['#validate'][] = 'mb_content_changed_validate';
- $form['actions']['submit']['#validate'][] = 'mb_content_changed_validate';
- $form['actions']['delete']['#validate'][] = 'mb_content_changed_validate';
- // Corresponding submit callbacks.
- $form['actions']['preview']['#submit'][] = 'mb_content_changed_submit';
- $form['actions']['submit']['#submit'][] = 'mb_content_changed_submit';
- }
- // OG compatibility.
- // Provide the group ID.
- // Add an new group article.
- // if (isset($_GET['gids_node'])) {
- // $gids_node = $_GET['gids_node'];
- // $form['#mnb']['og']['group_id'] = (int)$gids_node[0];
- // }
- // Edit an group article.
- // $og_context = module_invoke('og', 'get_context_by_url');
- // if (isset($og_context->nid)) {
- // $form['#mnb']['og']['group_id'] = $og_context->nid;
- // }
- break;
- }
- }
- /**
- * Implements hook_menu_local_tasks_alter().
- *
- * Alter the node local tasks to
- * - use an destination parameter
- * - provide the "Create new" tab.
- */
- function mb_content_menu_local_tasks_alter(&$data, $router_item, $root_path) {
- global $base_url;
- $destination = drupal_get_destination();
- $module = 'mb_content';
- if ($router_item['tab_root'] == 'node/%') {
- $node = $router_item['map'][1];
- $node_type_name = node_type_get_name($node);
- // Add Create new as local task tab.
- // Note: access_callback no works.
- if (variable_get('mb_content_tabcn_' . $node->type, 0) == 1) {
- // Note: The weight setting are not accepted.
- // Organize the proper tab weight for the new "Create new" tab to display the new tab on the right position.
- $holder = array();
- // User with node edit permission. The tabs are displayed and the Edit tab exists.
- if (isset($data['tabs'][0]['output'][1]) && $data['tabs'][0]['output'][1]['#link']['page_callback'] == 'node_page_edit') {
- $holder = array_splice($data['tabs'][0]['output'], 2);
- }
- // User without node edit permission. The tabs are displayed and the Edit tab is not exist.
- elseif (isset($data['tabs'][0]['output'][1]) && $data['tabs'][0]['output'][1]['#link']['page_callback'] != 'node_page_edit') {
- $holder = array_splice($data['tabs'][0]['output'], 1);
- }
- // Insert the new tab.
- $data['tabs'][0]['output'][] = array(
- '#theme' => 'menu_local_task',
- '#link' => array(
- 'title' => mb_content_createnew_title(),
- 'href' => 'node/add/' . $node->type,
- 'tab_root_href' => 'node/' . $node->nid,
- 'weight' => 2,
- 'localized_options' => array(
- 'attributes' => array(
- 'title' => t('Create new @content', array('@content' => t($node_type_name))),
- )
- )
- )
- );
- // Rebuild the tabs to display all tabs.
- $data['tabs'][0]['output'] = array_merge($data['tabs'][0]['output'], $holder);
- }
- // Add Create new as action link.
- if ($root_path == 'node/%/edit' && variable_get('mb_content_tabcn_' . $node->type, 0) == 2) {
- $css_node_type = str_replace('_', '-', $node->type);
-
- $item = menu_get_item('node/add/' . $node->type);
- $item['title'] = t('Create new @content', array('@content' => t($node_type_name)));
- $item['localized_options']['attributes']['class'] = array('node-action-link', 'node-action-link-' . $css_node_type);
- $data['actions']['output'][] = array(
- '#theme' => 'menu_local_action',
- '#link' => $item,
- );
- }
- }
- }
- /**
- * Implements hook_form_validate().
- *
- * Handle the "Cancel" validation.
- */
- function mb_content_cancel_validate($form, &$form_state) {
- // This is the cancel action. No validation required.
- mb_content_cancel_action($form, $form_state);
- }
- /**
- * Implements hook_form_validate().
- *
- * Skip the function node_last_changed().
- */
- function mb_content_changed_validate($form, &$form_state) {
- $form['changed']['#default_value'] = 0;
- }
- /**
- * Implements hook_form_submit().
- *
- * Handle different submit actions and make different redirects.
- * - "Preview"
- * - "Save"
- * - "Delete"
- */
- function mb_content_changed_submit($form, &$form_state) {
- $redirect = '<front>';
- if ($form_state['clicked_button']['#id'] == 'edit-preview') {
- $form_state['redirect'] = FALSE;
- }
- if ($form_state['clicked_button']['#id'] == 'edit-submit') {
- $redirect = 'node/' . $form_state['nid'];
- drupal_goto($redirect);
- }
- if ($form_state['clicked_button']['#id'] == 'edit-delete') {
- $form_state['redirect'] = $redirect;
- }
- }
- /**
- * The "Cancel" action.
- *
- * Handle different submit actions and make different redirects.
- *
- * @see mb_content_cancel_validate()
- */
- function mb_content_cancel_action($form, &$form_state) {
- // Hide the error messages.
- drupal_get_messages('error');
- $redirect = '<front>';
- // $options query example:
- // array('query' => array('destination' => 'node/' . $node->nid))
- $options = array();
- if (arg(0) === 'node' && arg(1) === 'add') {
- // Limitation:
- // Exist only one content type this redirect does not work.
- $redirect = 'node/add';
- if (isset($form['#tabcn_referer'])) {
- $redirect = $form['#tabcn_referer'];
- }
- }
- if (arg(0) === 'node' && is_numeric(arg(1)) && arg(2) === 'edit') {
- $redirect = 'node/' . arg(1);
- }
- if (isset($form_state['storage']['#mb_redirect'])) {
- $redirect = $form_state['storage']['#mb_redirect'];
- }
- elseif (isset($form['storage']['#mb_redirect'])) {
- $redirect = $form['storage']['#mb_redirect'];
- }
- drupal_goto($redirect, $options);
- }
- /**
- * Implements hook_form_submit().
- *
- * Handle the "Save and continue" action.
- */
- function mb_content_sac_submit($form, &$form_state) {
- $destination = drupal_get_destination();
- $nid = $form_state['build_info']['args'][0]->nid;
- $redirect = 'node/' . $nid . '/edit';
- $form_state['rebuild'] = TRUE;
- if (isset($form_state['storage']['#mb_redirect'])) {
- $form['storage']['#mb_redirect'] = $form_state['storage']['#mb_redirect'];
- }
- elseif (isset($form['storage']['#mb_redirect'])) {
- $form_state['#mb_redirect'] = $form['storage']['#mb_redirect'];
- }
- // Is meant edit nodes from content management page.
- if ($destination['destination'] != 'admin/content') {
- drupal_get_messages('error');
- $form_state['redirect'] = $redirect;
- }
- $form_state['redirect'] = $redirect;
- }
- /**
- * Implements hook_form_submit().
- *
- * Save options from "Add content type" form and administer nodetype form.
- */
- function mb_content_admin_form_submit($form, &$form_state) {
- // Handle button management on the "Add content type" page.
- // Delete the dummy content type system variable
- // and set the right content type system variable.
- foreach ($form_state['values'] as $key => $value) {
- if ($key == 'type') {
- $type = $value;
- }
- if (preg_match("/^mb_content_type_dummy/", $key)) {
- // Insert the right content type.
- $new_type = preg_replace("/mb_content_type_dummy/", $type, $key);
- $form_state['values'][$new_type] = $value;
- // Delete the dummy content type.
- unset($form_state['values'][$key]);
- }
- }
- }
- /**
- * Submit callback to delete MB Content content type system variables
- * if content types will be deleted.
- */
- function mb_content_delete_confirm_submit($form, &$form_state) {
- $module = 'mb_content';
- foreach ($form_state['build_info']['args'] as $type) {
- variable_del($module . '_cancel_' . $type->type);
- variable_del($module . '_sac_' . $type->type);
- variable_del($module . '_tabcn_' . $type->type);
- }
- }
|