edit.module 5.07 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<?php

/**
 * @file
 * Provides in-place content editing functionality for fields.
 *
 * The Edit module makes content editable in-place. Rather than having to visit
 * a separate page to edit content, it may be edited in-place.
 *
 * Technically, this module adds classes and data- attributes to fields and
 * entities, enabling them for in-place editing.
 */

use Drupal\Core\Entity\EntityInterface;
use Drupal\edit\Form\EditFieldForm;
16
use Drupal\Component\Utility\NestedArray;
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

/**
 * Implements hook_custom_theme().
 *
 * @todo Add an event subscriber to the Ajax system to automatically set the
 *   base page theme for all Ajax requests, and then remove this one off.
 */
function edit_custom_theme() {
  if (substr(current_path(), 0, 5) === 'edit/') {
    return ajax_base_page_theme();
  }
}

/**
 * Implements hook_permission().
 */
function edit_permission() {
  return array(
    'access in-place editing' => array(
      'title' => t('Access in-place editing'),
    ),
  );
}

/**
42 43 44 45 46 47 48 49
 * Implements hook_contextual_links_view_alter().
 *
 * In-place editing builds upon contextual.module, but doesn't actually add its
 * "Quick edit" contextual link in PHP (i.e. here) because:
 *  - that would require to add a local task menu item in the menu system, which
 *    doesn't make any sense, since there is no corresponding page;
 *  - it should only work when JavaScript is enabled, because only then in-place
 *    editing is possible.
50
 */
51
function edit_contextual_links_view_alter(&$element, $items) {
52 53 54 55
  if (!user_access('access in-place editing')) {
    return;
  }

56
  $element['#attached']['library'][] = array('edit', 'edit');
57 58 59
}

/**
60
 * Implements hook_library_info().
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
 */
function edit_library_info() {
  $path = drupal_get_path('module', 'edit');
  $options = array(
    'scope' => 'footer',
  );
  $libraries['edit'] = array(
    'title' => 'Edit: in-place editing',
    'website' => 'http://drupal.org/project/edit',
    'version' => VERSION,
    'js' => array(
      // Core.
      $path . '/js/edit.js' => $options,
      $path . '/js/app.js' => $options,
      // Models.
      $path . '/js/models/edit-app-model.js' => $options,
      // Views.
      $path . '/js/views/propertyeditordecoration-view.js' => $options,
79
      $path . '/js/views/contextuallink-view.js' => $options,
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
      $path . '/js/views/modal-view.js' => $options,
      $path . '/js/views/toolbar-view.js' => $options,
      // Backbone.sync implementation on top of Drupal forms.
      $path . '/js/backbone.drupalform.js' => $options,
      // VIE service.
      $path . '/js/viejs/EditService.js' => $options,
      // Create.js subclasses.
      $path . '/js/createjs/editable.js' => $options,
      $path . '/js/createjs/storage.js' => $options,
      // Other.
      $path . '/js/util.js' => $options,
      $path . '/js/theme.js' => $options,
      // Basic settings.
      array(
        'data' => array('edit' => array(
          'metadataURL' => url('edit/metadata'),
          'fieldFormURL' => url('edit/form/!entity_type/!id/!field_name/!langcode/!view_mode'),
          'context' => 'body',
        )),
        'type' => 'setting',
      ),
    ),
    'css' => array(
      $path . '/css/edit.css' => array(),
    ),
    'dependencies' => array(
      array('system', 'jquery'),
      array('system', 'underscore'),
      array('system', 'backbone'),
      array('system', 'vie.core'),
      array('system', 'create.editonly'),
      array('system', 'jquery.form'),
      array('system', 'drupal.form'),
      array('system', 'drupal.ajax'),
      array('system', 'drupalSettings'),
    ),
  );
117
  $libraries['edit.editorWidget.form'] = array(
118 119 120 121 122 123 124 125 126
    'title' => '"Form" Create.js PropertyEditor widget',
    'version' => VERSION,
    'js' => array(
      $path . '/js/createjs/editingWidgets/formwidget.js' => $options,
    ),
    'dependencies' => array(
      array('edit', 'edit'),
    ),
  );
127
  $libraries['edit.editorWidget.direct'] = array(
128 129 130 131 132 133 134 135 136
    'title' => '"Direct" Create.js PropertyEditor widget',
    'version' => VERSION,
    'js' => array(
      $path . '/js/createjs/editingWidgets/drupalcontenteditablewidget.js' => $options,
    ),
    'dependencies' => array(
      array('edit', 'edit'),
    ),
  );
137 138 139 140 141 142 143 144 145 146

  return $libraries;
}

/**
 * Implements hook_preprocess_HOOK() for field.tpl.php.
 */
function edit_preprocess_field(&$variables) {
  $element = $variables['element'];
  $entity = $element['#object'];
147
  $variables['attributes']['data-edit-id'] = $entity->entityType() . '/' . $entity->id() . '/' . $element['#field_name'] . '/' . $element['#language'] . '/' . $element['#view_mode'];
148 149
}

150 151 152 153 154 155 156 157 158 159
/**
 * Implements hook_preprocess_HOOK() for node.tpl.php.
 *
 * @todo Move towards hook_preprocess_entity() once that's available.
 */
function edit_preprocess_node(&$variables) {
  $node = $variables['elements']['#node'];
  $variables['attributes']['data-edit-entity'] = 'node/' . $node->nid;
}

160 161 162 163 164 165 166 167 168
/**
 * Form constructor for the field editing form.
 *
 * @ingroup forms
 */
function edit_field_form(array $form, array &$form_state, EntityInterface $entity, $field_name) {
  $form_handler = new EditFieldForm();
  return $form_handler->build($form, $form_state, $entity, $field_name);
}