danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Provides a controller for building an entity overview form.
|
danielebarchiesi@4
|
6 */
|
danielebarchiesi@4
|
7
|
danielebarchiesi@4
|
8 /**
|
danielebarchiesi@4
|
9 * Default UI controller providing admin UI.
|
danielebarchiesi@4
|
10 *
|
danielebarchiesi@4
|
11 * This controller suites best for managing configuration entities.
|
danielebarchiesi@4
|
12 * For a controller suiting content entities, see EntityContentUIController.
|
danielebarchiesi@4
|
13 */
|
danielebarchiesi@4
|
14 class EntityDefaultUIController {
|
danielebarchiesi@4
|
15
|
danielebarchiesi@4
|
16 protected $entityType;
|
danielebarchiesi@4
|
17 protected $entityInfo, $path;
|
danielebarchiesi@4
|
18 protected $id_count;
|
danielebarchiesi@4
|
19
|
danielebarchiesi@4
|
20 /**
|
danielebarchiesi@4
|
21 * Defines the number of entries to show per page in overview table.
|
danielebarchiesi@4
|
22 */
|
danielebarchiesi@4
|
23 public $overviewPagerLimit = 25;
|
danielebarchiesi@4
|
24
|
danielebarchiesi@4
|
25 public function __construct($entity_type, $entity_info) {
|
danielebarchiesi@4
|
26 $this->entityType = $entity_type;
|
danielebarchiesi@4
|
27 $this->entityInfo = $entity_info;
|
danielebarchiesi@4
|
28 $this->path = $this->entityInfo['admin ui']['path'];
|
danielebarchiesi@4
|
29 $this->statusKey = empty($this->entityInfo['entity keys']['status']) ? 'status' : $this->entityInfo['entity keys']['status'];
|
danielebarchiesi@4
|
30 }
|
danielebarchiesi@4
|
31
|
danielebarchiesi@4
|
32 /**
|
danielebarchiesi@4
|
33 * Provides definitions for implementing hook_menu().
|
danielebarchiesi@4
|
34 */
|
danielebarchiesi@4
|
35 public function hook_menu() {
|
danielebarchiesi@4
|
36 $items = array();
|
danielebarchiesi@4
|
37 // Set this on the object so classes that extend hook_menu() can use it.
|
danielebarchiesi@4
|
38 $this->id_count = count(explode('/', $this->path));
|
danielebarchiesi@4
|
39 $wildcard = isset($this->entityInfo['admin ui']['menu wildcard']) ? $this->entityInfo['admin ui']['menu wildcard'] : '%entity_object';
|
danielebarchiesi@4
|
40 $plural_label = isset($this->entityInfo['plural label']) ? $this->entityInfo['plural label'] : $this->entityInfo['label'] . 's';
|
danielebarchiesi@4
|
41
|
danielebarchiesi@4
|
42 $items[$this->path] = array(
|
danielebarchiesi@4
|
43 'title' => $plural_label,
|
danielebarchiesi@4
|
44 'page callback' => 'drupal_get_form',
|
danielebarchiesi@4
|
45 'page arguments' => array($this->entityType . '_overview_form', $this->entityType),
|
danielebarchiesi@4
|
46 'description' => 'Manage ' . $plural_label . '.',
|
danielebarchiesi@4
|
47 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
48 'access arguments' => array('view', $this->entityType),
|
danielebarchiesi@4
|
49 'file' => 'includes/entity.ui.inc',
|
danielebarchiesi@4
|
50 );
|
danielebarchiesi@4
|
51 $items[$this->path . '/list'] = array(
|
danielebarchiesi@4
|
52 'title' => 'List',
|
danielebarchiesi@4
|
53 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@4
|
54 'weight' => -10,
|
danielebarchiesi@4
|
55 );
|
danielebarchiesi@4
|
56 $items[$this->path . '/add'] = array(
|
danielebarchiesi@4
|
57 'title callback' => 'entity_ui_get_action_title',
|
danielebarchiesi@4
|
58 'title arguments' => array('add', $this->entityType),
|
danielebarchiesi@4
|
59 'page callback' => 'entity_ui_get_form',
|
danielebarchiesi@4
|
60 'page arguments' => array($this->entityType, NULL, 'add'),
|
danielebarchiesi@4
|
61 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
62 'access arguments' => array('create', $this->entityType),
|
danielebarchiesi@4
|
63 'type' => MENU_LOCAL_ACTION,
|
danielebarchiesi@4
|
64 );
|
danielebarchiesi@4
|
65 $items[$this->path . '/manage/' . $wildcard] = array(
|
danielebarchiesi@4
|
66 'title' => 'Edit',
|
danielebarchiesi@4
|
67 'title callback' => 'entity_label',
|
danielebarchiesi@4
|
68 'title arguments' => array($this->entityType, $this->id_count + 1),
|
danielebarchiesi@4
|
69 'page callback' => 'entity_ui_get_form',
|
danielebarchiesi@4
|
70 'page arguments' => array($this->entityType, $this->id_count + 1),
|
danielebarchiesi@4
|
71 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
72 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
73 'access arguments' => array('update', $this->entityType, $this->id_count + 1),
|
danielebarchiesi@4
|
74 );
|
danielebarchiesi@4
|
75 $items[$this->path . '/manage/' . $wildcard . '/edit'] = array(
|
danielebarchiesi@4
|
76 'title' => 'Edit',
|
danielebarchiesi@4
|
77 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
78 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@4
|
79 );
|
danielebarchiesi@4
|
80
|
danielebarchiesi@4
|
81 // Clone form, a special case for the edit form.
|
danielebarchiesi@4
|
82 $items[$this->path . '/manage/' . $wildcard . '/clone'] = array(
|
danielebarchiesi@4
|
83 'title' => 'Clone',
|
danielebarchiesi@4
|
84 'page callback' => 'entity_ui_get_form',
|
danielebarchiesi@4
|
85 'page arguments' => array($this->entityType, $this->id_count + 1, 'clone'),
|
danielebarchiesi@4
|
86 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
87 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
88 'access arguments' => array('create', $this->entityType),
|
danielebarchiesi@4
|
89 );
|
danielebarchiesi@4
|
90 // Menu item for operations like revert and delete.
|
danielebarchiesi@4
|
91 $items[$this->path . '/manage/' . $wildcard . '/%'] = array(
|
danielebarchiesi@4
|
92 'page callback' => 'drupal_get_form',
|
danielebarchiesi@4
|
93 'page arguments' => array($this->entityType . '_operation_form', $this->entityType, $this->id_count + 1, $this->id_count + 2),
|
danielebarchiesi@4
|
94 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
95 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
96 'access arguments' => array('delete', $this->entityType, $this->id_count + 1),
|
danielebarchiesi@4
|
97 'file' => 'includes/entity.ui.inc',
|
danielebarchiesi@4
|
98 );
|
danielebarchiesi@4
|
99
|
danielebarchiesi@4
|
100 if (!empty($this->entityInfo['exportable'])) {
|
danielebarchiesi@4
|
101 // Menu item for importing an entity.
|
danielebarchiesi@4
|
102 $items[$this->path . '/import'] = array(
|
danielebarchiesi@4
|
103 'title callback' => 'entity_ui_get_action_title',
|
danielebarchiesi@4
|
104 'title arguments' => array('import', $this->entityType),
|
danielebarchiesi@4
|
105 'page callback' => 'drupal_get_form',
|
danielebarchiesi@4
|
106 'page arguments' => array($this->entityType . '_operation_form', $this->entityType, NULL, 'import'),
|
danielebarchiesi@4
|
107 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
108 'access arguments' => array('create', $this->entityType),
|
danielebarchiesi@4
|
109 'file' => 'includes/entity.ui.inc',
|
danielebarchiesi@4
|
110 'type' => MENU_LOCAL_ACTION,
|
danielebarchiesi@4
|
111 );
|
danielebarchiesi@4
|
112 }
|
danielebarchiesi@4
|
113
|
danielebarchiesi@4
|
114 if (!empty($this->entityInfo['admin ui']['file'])) {
|
danielebarchiesi@4
|
115 // Add in the include file for the entity form.
|
danielebarchiesi@4
|
116 foreach (array("/manage/$wildcard", "/manage/$wildcard/clone", '/add') as $path_end) {
|
danielebarchiesi@4
|
117 $items[$this->path . $path_end]['file'] = $this->entityInfo['admin ui']['file'];
|
danielebarchiesi@4
|
118 $items[$this->path . $path_end]['file path'] = isset($this->entityInfo['admin ui']['file path']) ? $this->entityInfo['admin ui']['file path'] : drupal_get_path('module', $this->entityInfo['module']);
|
danielebarchiesi@4
|
119 }
|
danielebarchiesi@4
|
120 }
|
danielebarchiesi@4
|
121 return $items;
|
danielebarchiesi@4
|
122 }
|
danielebarchiesi@4
|
123
|
danielebarchiesi@4
|
124 /**
|
danielebarchiesi@4
|
125 * Provides definitions for implementing hook_forms().
|
danielebarchiesi@4
|
126 *
|
danielebarchiesi@4
|
127 * Use per bundle form ids if possible, such that easy per bundle alterations
|
danielebarchiesi@4
|
128 * are supported too.
|
danielebarchiesi@4
|
129 *
|
danielebarchiesi@4
|
130 * Note that for performance reasons, this method is only invoked for forms,
|
danielebarchiesi@4
|
131 * which receive the entity_type as first argument. Thus any forms added, must
|
danielebarchiesi@4
|
132 * follow that pattern.
|
danielebarchiesi@4
|
133 *
|
danielebarchiesi@4
|
134 * @see entity_forms()
|
danielebarchiesi@4
|
135 */
|
danielebarchiesi@4
|
136 public function hook_forms() {
|
danielebarchiesi@4
|
137 // The overview and the operation form are implemented by the controller,
|
danielebarchiesi@4
|
138 // the callback and validation + submit handlers just invoke the controller.
|
danielebarchiesi@4
|
139 $forms[$this->entityType . '_overview_form'] = array(
|
danielebarchiesi@4
|
140 'callback' => 'entity_ui_overview_form',
|
danielebarchiesi@4
|
141 'wrapper_callback' => 'entity_ui_form_defaults',
|
danielebarchiesi@4
|
142 );
|
danielebarchiesi@4
|
143 $forms[$this->entityType . '_operation_form'] = array(
|
danielebarchiesi@4
|
144 'callback' => 'entity_ui_operation_form',
|
danielebarchiesi@4
|
145 'wrapper_callback' => 'entity_ui_form_defaults',
|
danielebarchiesi@4
|
146 );
|
danielebarchiesi@4
|
147
|
danielebarchiesi@4
|
148 // The entity form (ENTITY_TYPE_form) handles editing, adding and cloning.
|
danielebarchiesi@4
|
149 // For that form, the wrapper callback entity_ui_main_form_defaults() gets
|
danielebarchiesi@4
|
150 // directly invoked via entity_ui_get_form().
|
danielebarchiesi@4
|
151 // If there are bundles though, we use form ids that include the bundle name
|
danielebarchiesi@4
|
152 // (ENTITY_TYPE_edit_BUNDLE_NAME_form) to enable per bundle alterations
|
danielebarchiesi@4
|
153 // as well as alterations based upon the base form id (ENTITY_TYPE_form).
|
danielebarchiesi@4
|
154 if (!(count($this->entityInfo['bundles']) == 1 && isset($this->entityInfo['bundles'][$this->entityType]))) {
|
danielebarchiesi@4
|
155 foreach ($this->entityInfo['bundles'] as $bundle => $bundle_info) {
|
danielebarchiesi@4
|
156 $forms[$this->entityType . '_edit_' . $bundle . '_form']['callback'] = $this->entityType . '_form';
|
danielebarchiesi@4
|
157 // Again the wrapper callback is invoked by entity_ui_get_form() anyway.
|
danielebarchiesi@4
|
158 }
|
danielebarchiesi@4
|
159 }
|
danielebarchiesi@4
|
160 return $forms;
|
danielebarchiesi@4
|
161 }
|
danielebarchiesi@4
|
162
|
danielebarchiesi@4
|
163 /**
|
danielebarchiesi@4
|
164 * Builds the entity overview form.
|
danielebarchiesi@4
|
165 */
|
danielebarchiesi@4
|
166 public function overviewForm($form, &$form_state) {
|
danielebarchiesi@4
|
167 // By default just show a simple overview for all entities.
|
danielebarchiesi@4
|
168 $form['table'] = $this->overviewTable();
|
danielebarchiesi@4
|
169 $form['pager'] = array('#theme' => 'pager');
|
danielebarchiesi@4
|
170 return $form;
|
danielebarchiesi@4
|
171 }
|
danielebarchiesi@4
|
172
|
danielebarchiesi@4
|
173 /**
|
danielebarchiesi@4
|
174 * Overview form validation callback.
|
danielebarchiesi@4
|
175 *
|
danielebarchiesi@4
|
176 * @param $form
|
danielebarchiesi@4
|
177 * The form array of the overview form.
|
danielebarchiesi@4
|
178 * @param $form_state
|
danielebarchiesi@4
|
179 * The overview form state which will be used for validating.
|
danielebarchiesi@4
|
180 */
|
danielebarchiesi@4
|
181 public function overviewFormValidate($form, &$form_state) {}
|
danielebarchiesi@4
|
182
|
danielebarchiesi@4
|
183 /**
|
danielebarchiesi@4
|
184 * Overview form submit callback.
|
danielebarchiesi@4
|
185 *
|
danielebarchiesi@4
|
186 * @param $form
|
danielebarchiesi@4
|
187 * The form array of the overview form.
|
danielebarchiesi@4
|
188 * @param $form_state
|
danielebarchiesi@4
|
189 * The overview form state which will be used for submitting.
|
danielebarchiesi@4
|
190 */
|
danielebarchiesi@4
|
191 public function overviewFormSubmit($form, &$form_state) {}
|
danielebarchiesi@4
|
192
|
danielebarchiesi@4
|
193
|
danielebarchiesi@4
|
194 /**
|
danielebarchiesi@4
|
195 * Generates the render array for a overview table for arbitrary entities
|
danielebarchiesi@4
|
196 * matching the given conditions.
|
danielebarchiesi@4
|
197 *
|
danielebarchiesi@4
|
198 * @param $conditions
|
danielebarchiesi@4
|
199 * An array of conditions as needed by entity_load().
|
danielebarchiesi@4
|
200
|
danielebarchiesi@4
|
201 * @return Array
|
danielebarchiesi@4
|
202 * A renderable array.
|
danielebarchiesi@4
|
203 */
|
danielebarchiesi@4
|
204 public function overviewTable($conditions = array()) {
|
danielebarchiesi@4
|
205
|
danielebarchiesi@4
|
206 $query = new EntityFieldQuery();
|
danielebarchiesi@4
|
207 $query->entityCondition('entity_type', $this->entityType);
|
danielebarchiesi@4
|
208
|
danielebarchiesi@4
|
209 // Add all conditions to query.
|
danielebarchiesi@4
|
210 foreach ($conditions as $key => $value) {
|
danielebarchiesi@4
|
211 $query->propertyCondition($key, $value);
|
danielebarchiesi@4
|
212 }
|
danielebarchiesi@4
|
213
|
danielebarchiesi@4
|
214 if ($this->overviewPagerLimit) {
|
danielebarchiesi@4
|
215 $query->pager($this->overviewPagerLimit);
|
danielebarchiesi@4
|
216 }
|
danielebarchiesi@4
|
217
|
danielebarchiesi@4
|
218 $results = $query->execute();
|
danielebarchiesi@4
|
219
|
danielebarchiesi@4
|
220 $ids = isset($results[$this->entityType]) ? array_keys($results[$this->entityType]) : array();
|
danielebarchiesi@4
|
221 $entities = $ids ? entity_load($this->entityType, $ids) : array();
|
danielebarchiesi@4
|
222 ksort($entities);
|
danielebarchiesi@4
|
223
|
danielebarchiesi@4
|
224 $rows = array();
|
danielebarchiesi@4
|
225 foreach ($entities as $entity) {
|
danielebarchiesi@4
|
226 $rows[] = $this->overviewTableRow($conditions, entity_id($this->entityType, $entity), $entity);
|
danielebarchiesi@4
|
227 }
|
danielebarchiesi@4
|
228
|
danielebarchiesi@4
|
229 $render = array(
|
danielebarchiesi@4
|
230 '#theme' => 'table',
|
danielebarchiesi@4
|
231 '#header' => $this->overviewTableHeaders($conditions, $rows),
|
danielebarchiesi@4
|
232 '#rows' => $rows,
|
danielebarchiesi@4
|
233 '#empty' => t('None.'),
|
danielebarchiesi@4
|
234 );
|
danielebarchiesi@4
|
235 return $render;
|
danielebarchiesi@4
|
236 }
|
danielebarchiesi@4
|
237
|
danielebarchiesi@4
|
238 /**
|
danielebarchiesi@4
|
239 * Generates the table headers for the overview table.
|
danielebarchiesi@4
|
240 */
|
danielebarchiesi@4
|
241 protected function overviewTableHeaders($conditions, $rows, $additional_header = array()) {
|
danielebarchiesi@4
|
242 $header = $additional_header;
|
danielebarchiesi@4
|
243 array_unshift($header, t('Label'));
|
danielebarchiesi@4
|
244 if (!empty($this->entityInfo['exportable'])) {
|
danielebarchiesi@4
|
245 $header[] = t('Status');
|
danielebarchiesi@4
|
246 }
|
danielebarchiesi@4
|
247 // Add operations with the right colspan.
|
danielebarchiesi@4
|
248 $header[] = array('data' => t('Operations'), 'colspan' => $this->operationCount());
|
danielebarchiesi@4
|
249 return $header;
|
danielebarchiesi@4
|
250 }
|
danielebarchiesi@4
|
251
|
danielebarchiesi@4
|
252 /**
|
danielebarchiesi@4
|
253 * Returns the operation count for calculating colspans.
|
danielebarchiesi@4
|
254 */
|
danielebarchiesi@4
|
255 protected function operationCount() {
|
danielebarchiesi@4
|
256 $count = 3;
|
danielebarchiesi@4
|
257 $count += !empty($this->entityInfo['bundle of']) && entity_type_is_fieldable($this->entityInfo['bundle of']) && module_exists('field_ui') ? 2 : 0;
|
danielebarchiesi@4
|
258 $count += !empty($this->entityInfo['exportable']) ? 1 : 0;
|
danielebarchiesi@4
|
259 $count += !empty($this->entityInfo['i18n controller class']) ? 1 : 0;
|
danielebarchiesi@4
|
260 return $count;
|
danielebarchiesi@4
|
261 }
|
danielebarchiesi@4
|
262
|
danielebarchiesi@4
|
263 /**
|
danielebarchiesi@4
|
264 * Generates the row for the passed entity and may be overridden in order to
|
danielebarchiesi@4
|
265 * customize the rows.
|
danielebarchiesi@4
|
266 *
|
danielebarchiesi@4
|
267 * @param $additional_cols
|
danielebarchiesi@4
|
268 * Additional columns to be added after the entity label column.
|
danielebarchiesi@4
|
269 */
|
danielebarchiesi@4
|
270 protected function overviewTableRow($conditions, $id, $entity, $additional_cols = array()) {
|
danielebarchiesi@4
|
271 $entity_uri = entity_uri($this->entityType, $entity);
|
danielebarchiesi@4
|
272
|
danielebarchiesi@4
|
273 $row[] = array('data' => array(
|
danielebarchiesi@4
|
274 '#theme' => 'entity_ui_overview_item',
|
danielebarchiesi@4
|
275 '#label' => entity_label($this->entityType, $entity),
|
danielebarchiesi@4
|
276 '#name' => !empty($this->entityInfo['exportable']) ? entity_id($this->entityType, $entity) : FALSE,
|
danielebarchiesi@4
|
277 '#url' => $entity_uri ? $entity_uri : FALSE,
|
danielebarchiesi@4
|
278 '#entity_type' => $this->entityType),
|
danielebarchiesi@4
|
279 );
|
danielebarchiesi@4
|
280
|
danielebarchiesi@4
|
281 // Add in any passed additional cols.
|
danielebarchiesi@4
|
282 foreach ($additional_cols as $col) {
|
danielebarchiesi@4
|
283 $row[] = $col;
|
danielebarchiesi@4
|
284 }
|
danielebarchiesi@4
|
285
|
danielebarchiesi@4
|
286 // Add a row for the exportable status.
|
danielebarchiesi@4
|
287 if (!empty($this->entityInfo['exportable'])) {
|
danielebarchiesi@4
|
288 $row[] = array('data' => array(
|
danielebarchiesi@4
|
289 '#theme' => 'entity_status',
|
danielebarchiesi@4
|
290 '#status' => $entity->{$this->statusKey},
|
danielebarchiesi@4
|
291 ));
|
danielebarchiesi@4
|
292 }
|
danielebarchiesi@4
|
293 // In case this is a bundle, we add links to the field ui tabs.
|
danielebarchiesi@4
|
294 $field_ui = !empty($this->entityInfo['bundle of']) && entity_type_is_fieldable($this->entityInfo['bundle of']) && module_exists('field_ui');
|
danielebarchiesi@4
|
295 // For exportable entities we add an export link.
|
danielebarchiesi@4
|
296 $exportable = !empty($this->entityInfo['exportable']);
|
danielebarchiesi@4
|
297 // If i18n integration is enabled, add a link to the translate tab.
|
danielebarchiesi@4
|
298 $i18n = !empty($this->entityInfo['i18n controller class']);
|
danielebarchiesi@4
|
299
|
danielebarchiesi@4
|
300 // Add operations depending on the status.
|
danielebarchiesi@4
|
301 if (entity_has_status($this->entityType, $entity, ENTITY_FIXED)) {
|
danielebarchiesi@4
|
302 $row[] = array('data' => l(t('clone'), $this->path . '/manage/' . $id . '/clone'), 'colspan' => $this->operationCount());
|
danielebarchiesi@4
|
303 }
|
danielebarchiesi@4
|
304 else {
|
danielebarchiesi@4
|
305 $row[] = l(t('edit'), $this->path . '/manage/' . $id);
|
danielebarchiesi@4
|
306
|
danielebarchiesi@4
|
307 if ($field_ui) {
|
danielebarchiesi@4
|
308 $row[] = l(t('manage fields'), $this->path . '/manage/' . $id . '/fields');
|
danielebarchiesi@4
|
309 $row[] = l(t('manage display'), $this->path . '/manage/' . $id . '/display');
|
danielebarchiesi@4
|
310 }
|
danielebarchiesi@4
|
311 if ($i18n) {
|
danielebarchiesi@4
|
312 $row[] = l(t('translate'), $this->path . '/manage/' . $id . '/translate');
|
danielebarchiesi@4
|
313 }
|
danielebarchiesi@4
|
314 if ($exportable) {
|
danielebarchiesi@4
|
315 $row[] = l(t('clone'), $this->path . '/manage/' . $id . '/clone');
|
danielebarchiesi@4
|
316 }
|
danielebarchiesi@4
|
317
|
danielebarchiesi@4
|
318 if (empty($this->entityInfo['exportable']) || !entity_has_status($this->entityType, $entity, ENTITY_IN_CODE)) {
|
danielebarchiesi@4
|
319 $row[] = l(t('delete'), $this->path . '/manage/' . $id . '/delete', array('query' => drupal_get_destination()));
|
danielebarchiesi@4
|
320 }
|
danielebarchiesi@4
|
321 elseif (entity_has_status($this->entityType, $entity, ENTITY_OVERRIDDEN)) {
|
danielebarchiesi@4
|
322 $row[] = l(t('revert'), $this->path . '/manage/' . $id . '/revert', array('query' => drupal_get_destination()));
|
danielebarchiesi@4
|
323 }
|
danielebarchiesi@4
|
324 else {
|
danielebarchiesi@4
|
325 $row[] = '';
|
danielebarchiesi@4
|
326 }
|
danielebarchiesi@4
|
327 }
|
danielebarchiesi@4
|
328 if ($exportable) {
|
danielebarchiesi@4
|
329 $row[] = l(t('export'), $this->path . '/manage/' . $id . '/export');
|
danielebarchiesi@4
|
330 }
|
danielebarchiesi@4
|
331 return $row;
|
danielebarchiesi@4
|
332 }
|
danielebarchiesi@4
|
333
|
danielebarchiesi@4
|
334
|
danielebarchiesi@4
|
335 /**
|
danielebarchiesi@4
|
336 * Builds the operation form.
|
danielebarchiesi@4
|
337 *
|
danielebarchiesi@4
|
338 * For the export operation a serialized string of the entity is directly
|
danielebarchiesi@4
|
339 * shown in the form (no submit function needed).
|
danielebarchiesi@4
|
340 */
|
danielebarchiesi@4
|
341 public function operationForm($form, &$form_state, $entity, $op) {
|
danielebarchiesi@4
|
342 switch ($op) {
|
danielebarchiesi@4
|
343 case 'revert':
|
danielebarchiesi@4
|
344 $label = entity_label($this->entityType, $entity);
|
danielebarchiesi@4
|
345 $confirm_question = t('Are you sure you want to revert the %entity %label?', array('%entity' => $this->entityInfo['label'], '%label' => $label));
|
danielebarchiesi@4
|
346 return confirm_form($form, $confirm_question, $this->path);
|
danielebarchiesi@4
|
347
|
danielebarchiesi@4
|
348 case 'delete':
|
danielebarchiesi@4
|
349 $label = entity_label($this->entityType, $entity);
|
danielebarchiesi@4
|
350 $confirm_question = t('Are you sure you want to delete the %entity %label?', array('%entity' => $this->entityInfo['label'], '%label' => $label));
|
danielebarchiesi@4
|
351 return confirm_form($form, $confirm_question, $this->path);
|
danielebarchiesi@4
|
352
|
danielebarchiesi@4
|
353 case 'export':
|
danielebarchiesi@4
|
354 if (!empty($this->entityInfo['exportable'])) {
|
danielebarchiesi@4
|
355 $export = entity_export($this->entityType, $entity);
|
danielebarchiesi@4
|
356 $form['export'] = array(
|
danielebarchiesi@4
|
357 '#type' => 'textarea',
|
danielebarchiesi@4
|
358 '#title' => t('Export'),
|
danielebarchiesi@4
|
359 '#description' => t('For importing copy the content of the text area and paste it into the import page.'),
|
danielebarchiesi@4
|
360 '#rows' => 25,
|
danielebarchiesi@4
|
361 '#default_value' => $export,
|
danielebarchiesi@4
|
362 );
|
danielebarchiesi@4
|
363 return $form;
|
danielebarchiesi@4
|
364 }
|
danielebarchiesi@4
|
365
|
danielebarchiesi@4
|
366 case 'import':
|
danielebarchiesi@4
|
367 $form['import'] = array(
|
danielebarchiesi@4
|
368 '#type' => 'textarea',
|
danielebarchiesi@4
|
369 '#title' => t('Import'),
|
danielebarchiesi@4
|
370 '#description' => t('Paste an exported %entity_type here.', array('%entity_type' => $this->entityInfo['label'])),
|
danielebarchiesi@4
|
371 '#rows' => 20,
|
danielebarchiesi@4
|
372 );
|
danielebarchiesi@4
|
373 $form['overwrite'] = array(
|
danielebarchiesi@4
|
374 '#title' => t('Overwrite'),
|
danielebarchiesi@4
|
375 '#type' => 'checkbox',
|
danielebarchiesi@4
|
376 '#description' => t('If checked, any existing %entity with the same identifier will be replaced by the import.', array('%entity' => $this->entityInfo['label'])),
|
danielebarchiesi@4
|
377 '#default_value' => FALSE,
|
danielebarchiesi@4
|
378 );
|
danielebarchiesi@4
|
379 $form['submit'] = array(
|
danielebarchiesi@4
|
380 '#type' => 'submit',
|
danielebarchiesi@4
|
381 '#value' => t('Import'),
|
danielebarchiesi@4
|
382 );
|
danielebarchiesi@4
|
383 return $form;
|
danielebarchiesi@4
|
384 }
|
danielebarchiesi@4
|
385 drupal_not_found();
|
danielebarchiesi@4
|
386 exit;
|
danielebarchiesi@4
|
387 }
|
danielebarchiesi@4
|
388
|
danielebarchiesi@4
|
389 /**
|
danielebarchiesi@4
|
390 * Operation form validation callback.
|
danielebarchiesi@4
|
391 */
|
danielebarchiesi@4
|
392 public function operationFormValidate($form, &$form_state) {
|
danielebarchiesi@4
|
393 if ($form_state['op'] == 'import') {
|
danielebarchiesi@4
|
394 if ($entity = entity_import($this->entityType, $form_state['values']['import'])) {
|
danielebarchiesi@4
|
395 // Store the successfully imported entity in $form_state.
|
danielebarchiesi@4
|
396 $form_state[$this->entityType] = $entity;
|
danielebarchiesi@4
|
397 if (!$form_state['values']['overwrite']) {
|
danielebarchiesi@4
|
398 // Check for existing entities with the same identifier.
|
danielebarchiesi@4
|
399 $id = entity_id($this->entityType, $entity);
|
danielebarchiesi@4
|
400 $entities = entity_load($this->entityType, array($id));
|
danielebarchiesi@4
|
401 if (!empty($entities)) {
|
danielebarchiesi@4
|
402 $label = entity_label($this->entityType, $entity);
|
danielebarchiesi@4
|
403 $vars = array('%entity' => $this->entityInfo['label'], '%label' => $label);
|
danielebarchiesi@4
|
404 form_set_error('import', t('Import of %entity %label failed, a %entity with the same machine name already exists. Check the overwrite option to replace it.', $vars));
|
danielebarchiesi@4
|
405 }
|
danielebarchiesi@4
|
406 }
|
danielebarchiesi@4
|
407 }
|
danielebarchiesi@4
|
408 else {
|
danielebarchiesi@4
|
409 form_set_error('import', t('Import failed.'));
|
danielebarchiesi@4
|
410 }
|
danielebarchiesi@4
|
411 }
|
danielebarchiesi@4
|
412 }
|
danielebarchiesi@4
|
413
|
danielebarchiesi@4
|
414 /**
|
danielebarchiesi@4
|
415 * Operation form submit callback.
|
danielebarchiesi@4
|
416 */
|
danielebarchiesi@4
|
417 public function operationFormSubmit($form, &$form_state) {
|
danielebarchiesi@4
|
418 $msg = $this->applyOperation($form_state['op'], $form_state[$this->entityType]);
|
danielebarchiesi@4
|
419 drupal_set_message($msg);
|
danielebarchiesi@4
|
420 $form_state['redirect'] = $this->path;
|
danielebarchiesi@4
|
421 }
|
danielebarchiesi@4
|
422
|
danielebarchiesi@4
|
423 /**
|
danielebarchiesi@4
|
424 * Applies an operation to the given entity.
|
danielebarchiesi@4
|
425 *
|
danielebarchiesi@4
|
426 * Note: the export operation is directly carried out by the operationForm()
|
danielebarchiesi@4
|
427 * method.
|
danielebarchiesi@4
|
428 *
|
danielebarchiesi@4
|
429 * @param string $op
|
danielebarchiesi@4
|
430 * The operation (revert, delete or import).
|
danielebarchiesi@4
|
431 * @param $entity
|
danielebarchiesi@4
|
432 * The entity to manipulate.
|
danielebarchiesi@4
|
433 *
|
danielebarchiesi@4
|
434 * @return
|
danielebarchiesi@4
|
435 * The status message of what has been applied.
|
danielebarchiesi@4
|
436 */
|
danielebarchiesi@4
|
437 public function applyOperation($op, $entity) {
|
danielebarchiesi@4
|
438 $label = entity_label($this->entityType, $entity);
|
danielebarchiesi@4
|
439 $vars = array('%entity' => $this->entityInfo['label'], '%label' => $label);
|
danielebarchiesi@4
|
440 $id = entity_id($this->entityType, $entity);
|
danielebarchiesi@4
|
441 $edit_link = l(t('edit'), $this->path . '/manage/' . $id . '/edit');
|
danielebarchiesi@4
|
442
|
danielebarchiesi@4
|
443 switch ($op) {
|
danielebarchiesi@4
|
444 case 'revert':
|
danielebarchiesi@4
|
445 entity_delete($this->entityType, $id);
|
danielebarchiesi@4
|
446 watchdog($this->entityType, 'Reverted %entity %label to the defaults.', $vars, WATCHDOG_NOTICE, $edit_link);
|
danielebarchiesi@4
|
447 return t('Reverted %entity %label to the defaults.', $vars);
|
danielebarchiesi@4
|
448
|
danielebarchiesi@4
|
449 case 'delete':
|
danielebarchiesi@4
|
450 entity_delete($this->entityType, $id);
|
danielebarchiesi@4
|
451 watchdog($this->entityType, 'Deleted %entity %label.', $vars);
|
danielebarchiesi@4
|
452 return t('Deleted %entity %label.', $vars);
|
danielebarchiesi@4
|
453
|
danielebarchiesi@4
|
454 case 'import':
|
danielebarchiesi@4
|
455 // First check if there is any existing entity with the same ID.
|
danielebarchiesi@4
|
456 $id = entity_id($this->entityType, $entity);
|
danielebarchiesi@4
|
457 $entities = entity_load($this->entityType, array($id));
|
danielebarchiesi@4
|
458 if ($existing_entity = reset($entities)) {
|
danielebarchiesi@4
|
459 // Copy DB id and remove the new indicator to overwrite the DB record.
|
danielebarchiesi@4
|
460 $idkey = $this->entityInfo['entity keys']['id'];
|
danielebarchiesi@4
|
461 $entity->{$idkey} = $existing_entity->{$idkey};
|
danielebarchiesi@4
|
462 unset($entity->is_new);
|
danielebarchiesi@4
|
463 }
|
danielebarchiesi@4
|
464 entity_save($this->entityType, $entity);
|
danielebarchiesi@4
|
465 watchdog($this->entityType, 'Imported %entity %label.', $vars);
|
danielebarchiesi@4
|
466 return t('Imported %entity %label.', $vars);
|
danielebarchiesi@4
|
467
|
danielebarchiesi@4
|
468 default:
|
danielebarchiesi@4
|
469 return FALSE;
|
danielebarchiesi@4
|
470 }
|
danielebarchiesi@4
|
471 }
|
danielebarchiesi@4
|
472
|
danielebarchiesi@4
|
473 /**
|
danielebarchiesi@4
|
474 * Entity submit builder invoked via entity_ui_form_submit_build_entity().
|
danielebarchiesi@4
|
475 *
|
danielebarchiesi@4
|
476 * Extracts the form values and updates the entity.
|
danielebarchiesi@4
|
477 *
|
danielebarchiesi@4
|
478 * The provided implementation makes use of the helper function
|
danielebarchiesi@4
|
479 * entity_form_submit_build_entity() provided by core, which already invokes
|
danielebarchiesi@4
|
480 * the field API attacher for fieldable entities.
|
danielebarchiesi@4
|
481 *
|
danielebarchiesi@4
|
482 * @return
|
danielebarchiesi@4
|
483 * The updated entity.
|
danielebarchiesi@4
|
484 *
|
danielebarchiesi@4
|
485 * @see entity_ui_form_submit_build_entity()
|
danielebarchiesi@4
|
486 */
|
danielebarchiesi@4
|
487 public function entityFormSubmitBuildEntity($form, &$form_state) {
|
danielebarchiesi@4
|
488 // Add the bundle property to the entity if the entity type supports bundles
|
danielebarchiesi@4
|
489 // and the form provides a value for the bundle key. Especially new entities
|
danielebarchiesi@4
|
490 // need to have their bundle property pre-populated before we invoke
|
danielebarchiesi@4
|
491 // entity_form_submit_build_entity().
|
danielebarchiesi@4
|
492 if (!empty($this->entityInfo['entity keys']['bundle']) && isset($form_state['values'][$this->entityInfo['entity keys']['bundle']])) {
|
danielebarchiesi@4
|
493 $form_state[$this->entityType]->{$this->entityInfo['entity keys']['bundle']} = $form_state['values'][$this->entityInfo['entity keys']['bundle']];
|
danielebarchiesi@4
|
494 }
|
danielebarchiesi@4
|
495 entity_form_submit_build_entity($this->entityType, $form_state[$this->entityType], $form, $form_state);
|
danielebarchiesi@4
|
496 return $form_state[$this->entityType];
|
danielebarchiesi@4
|
497 }
|
danielebarchiesi@4
|
498 }
|
danielebarchiesi@4
|
499
|
danielebarchiesi@4
|
500 /**
|
danielebarchiesi@4
|
501 * UI controller providing UI for content entities.
|
danielebarchiesi@4
|
502 *
|
danielebarchiesi@4
|
503 * For a controller providing UI for bundleable content entities, see
|
danielebarchiesi@4
|
504 * EntityBundleableUIController.
|
danielebarchiesi@4
|
505 * For a controller providing admin UI for configuration entities, see
|
danielebarchiesi@4
|
506 * EntityDefaultUIController.
|
danielebarchiesi@4
|
507 */
|
danielebarchiesi@4
|
508 class EntityContentUIController extends EntityDefaultUIController {
|
danielebarchiesi@4
|
509
|
danielebarchiesi@4
|
510 /**
|
danielebarchiesi@4
|
511 * Provides definitions for implementing hook_menu().
|
danielebarchiesi@4
|
512 */
|
danielebarchiesi@4
|
513 public function hook_menu() {
|
danielebarchiesi@4
|
514 $items = parent::hook_menu();
|
danielebarchiesi@4
|
515 $wildcard = isset($this->entityInfo['admin ui']['menu wildcard']) ? $this->entityInfo['admin ui']['menu wildcard'] : '%entity_object';
|
danielebarchiesi@4
|
516
|
danielebarchiesi@4
|
517 // Unset the manage entity path, as the provided UI is for admin entities.
|
danielebarchiesi@4
|
518 unset($items[$this->path]);
|
danielebarchiesi@4
|
519
|
danielebarchiesi@4
|
520 $defaults = array(
|
danielebarchiesi@4
|
521 'file' => $this->entityInfo['admin ui']['file'],
|
danielebarchiesi@4
|
522 'file path' => isset($this->entityInfo['admin ui']['file path']) ? $this->entityInfo['admin ui']['file path'] : drupal_get_path('module', $this->entityInfo['module']),
|
danielebarchiesi@4
|
523 );
|
danielebarchiesi@4
|
524
|
danielebarchiesi@4
|
525 // Add view, edit and delete menu items for content entities.
|
danielebarchiesi@4
|
526 $items[$this->path . '/' . $wildcard] = array(
|
danielebarchiesi@4
|
527 'title callback' => 'entity_ui_get_page_title',
|
danielebarchiesi@4
|
528 'title arguments' => array('view', $this->entityType, $this->id_count),
|
danielebarchiesi@4
|
529 'page callback' => 'entity_ui_entity_page_view',
|
danielebarchiesi@4
|
530 'page arguments' => array($this->id_count),
|
danielebarchiesi@4
|
531 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
532 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
533 'access arguments' => array('view', $this->entityType, $this->id_count),
|
danielebarchiesi@4
|
534 ) + $defaults;
|
danielebarchiesi@4
|
535 $items[$this->path . '/' . $wildcard . '/view'] = array(
|
danielebarchiesi@4
|
536 'title' => 'View',
|
danielebarchiesi@4
|
537 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@4
|
538 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
539 'weight' => -10,
|
danielebarchiesi@4
|
540 ) + $defaults;
|
danielebarchiesi@4
|
541 $items[$this->path . '/' . $wildcard . '/edit'] = array(
|
danielebarchiesi@4
|
542 'page callback' => 'entity_ui_get_form',
|
danielebarchiesi@4
|
543 'page arguments' => array($this->entityType, $this->id_count),
|
danielebarchiesi@4
|
544 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
545 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
546 'access arguments' => array('edit', $this->entityType, $this->id_count),
|
danielebarchiesi@4
|
547 'title' => 'Edit',
|
danielebarchiesi@4
|
548 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@4
|
549 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
|
danielebarchiesi@4
|
550 ) + $defaults;
|
danielebarchiesi@4
|
551 $items[$this->path . '/' . $wildcard . '/delete'] = array(
|
danielebarchiesi@4
|
552 'page callback' => 'drupal_get_form',
|
danielebarchiesi@4
|
553 'page arguments' => array($this->entityType . '_operation_form', $this->entityType, $this->id_count, 'delete'),
|
danielebarchiesi@4
|
554 'load arguments' => array($this->entityType),
|
danielebarchiesi@4
|
555 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
556 'access arguments' => array('delete', $this->entityType, $this->id_count),
|
danielebarchiesi@4
|
557 'title' => 'Delete',
|
danielebarchiesi@4
|
558 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@4
|
559 'context' => MENU_CONTEXT_INLINE,
|
danielebarchiesi@4
|
560 'file' => $this->entityInfo['admin ui']['file'],
|
danielebarchiesi@4
|
561 'file path' => isset($this->entityInfo['admin ui']['file path']) ? $this->entityInfo['admin ui']['file path'] : drupal_get_path('module', $this->entityInfo['module']),
|
danielebarchiesi@4
|
562 ) + $defaults;
|
danielebarchiesi@4
|
563
|
danielebarchiesi@4
|
564 return $items;
|
danielebarchiesi@4
|
565 }
|
danielebarchiesi@4
|
566
|
danielebarchiesi@4
|
567 /**
|
danielebarchiesi@4
|
568 * Operation form submit callback.
|
danielebarchiesi@4
|
569 */
|
danielebarchiesi@4
|
570 public function operationFormSubmit($form, &$form_state) {
|
danielebarchiesi@4
|
571 parent::operationFormSubmit($form, $form_state);
|
danielebarchiesi@4
|
572 // The manage entity path is unset for the content entity UI.
|
danielebarchiesi@4
|
573 $form_state['redirect'] = '<front>';
|
danielebarchiesi@4
|
574 }
|
danielebarchiesi@4
|
575 }
|
danielebarchiesi@4
|
576
|
danielebarchiesi@4
|
577 /**
|
danielebarchiesi@4
|
578 * UI controller providing UI for bundleable content entities.
|
danielebarchiesi@4
|
579 *
|
danielebarchiesi@4
|
580 * Adds a bundle selection page to the entity/add path, analogously to the
|
danielebarchiesi@4
|
581 * node/add path.
|
danielebarchiesi@4
|
582 */
|
danielebarchiesi@4
|
583 class EntityBundleableUIController extends EntityContentUIController {
|
danielebarchiesi@4
|
584
|
danielebarchiesi@4
|
585 /**
|
danielebarchiesi@4
|
586 * Provides definitions for implementing hook_menu().
|
danielebarchiesi@4
|
587 */
|
danielebarchiesi@4
|
588 public function hook_menu() {
|
danielebarchiesi@4
|
589 $items = parent::hook_menu();
|
danielebarchiesi@4
|
590
|
danielebarchiesi@4
|
591 // Extend the 'add' path.
|
danielebarchiesi@4
|
592 $items[$this->path . '/add'] = array(
|
danielebarchiesi@4
|
593 'title callback' => 'entity_ui_get_action_title',
|
danielebarchiesi@4
|
594 'title arguments' => array('add', $this->entityType),
|
danielebarchiesi@4
|
595 'page callback' => 'entity_ui_bundle_add_page',
|
danielebarchiesi@4
|
596 'page arguments' => array($this->entityType),
|
danielebarchiesi@4
|
597 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
598 'access arguments' => array('create', $this->entityType),
|
danielebarchiesi@4
|
599 'type' => MENU_LOCAL_ACTION,
|
danielebarchiesi@4
|
600 );
|
danielebarchiesi@4
|
601 $items[$this->path . '/add/%'] = array(
|
danielebarchiesi@4
|
602 'title callback' => 'entity_ui_get_action_title',
|
danielebarchiesi@4
|
603 'title arguments' => array('add', $this->entityType, $this->id_count + 1),
|
danielebarchiesi@4
|
604 'page callback' => 'entity_ui_get_bundle_add_form',
|
danielebarchiesi@4
|
605 'page arguments' => array($this->entityType, $this->id_count + 1),
|
danielebarchiesi@4
|
606 'access callback' => 'entity_access',
|
danielebarchiesi@4
|
607 'access arguments' => array('create', $this->entityType),
|
danielebarchiesi@4
|
608 );
|
danielebarchiesi@4
|
609
|
danielebarchiesi@4
|
610 if (!empty($this->entityInfo['admin ui']['file'])) {
|
danielebarchiesi@4
|
611 // Add in the include file for the entity form.
|
danielebarchiesi@4
|
612 foreach (array('/add', '/add/%') as $path_end) {
|
danielebarchiesi@4
|
613 $items[$this->path . $path_end]['file'] = $this->entityInfo['admin ui']['file'];
|
danielebarchiesi@4
|
614 $items[$this->path . $path_end]['file path'] = isset($this->entityInfo['admin ui']['file path']) ? $this->entityInfo['admin ui']['file path'] : drupal_get_path('module', $this->entityInfo['module']);
|
danielebarchiesi@4
|
615 }
|
danielebarchiesi@4
|
616 }
|
danielebarchiesi@4
|
617
|
danielebarchiesi@4
|
618 return $items;
|
danielebarchiesi@4
|
619 }
|
danielebarchiesi@4
|
620 }
|
danielebarchiesi@4
|
621
|
danielebarchiesi@4
|
622 /**
|
danielebarchiesi@4
|
623 * Form builder function for the overview form.
|
danielebarchiesi@4
|
624 *
|
danielebarchiesi@4
|
625 * @see EntityDefaultUIController::overviewForm()
|
danielebarchiesi@4
|
626 */
|
danielebarchiesi@4
|
627 function entity_ui_overview_form($form, &$form_state, $entity_type) {
|
danielebarchiesi@4
|
628 return entity_ui_controller($entity_type)->overviewForm($form, $form_state);
|
danielebarchiesi@4
|
629 }
|
danielebarchiesi@4
|
630
|
danielebarchiesi@4
|
631 /**
|
danielebarchiesi@4
|
632 * Form builder for the entity operation form.
|
danielebarchiesi@4
|
633 *
|
danielebarchiesi@4
|
634 * @see EntityDefaultUIController::operationForm()
|
danielebarchiesi@4
|
635 */
|
danielebarchiesi@4
|
636 function entity_ui_operation_form($form, &$form_state, $entity_type, $entity, $op) {
|
danielebarchiesi@4
|
637 $form_state['op'] = $op;
|
danielebarchiesi@4
|
638 return entity_ui_controller($entity_type)->operationForm($form, $form_state, $entity, $op);
|
danielebarchiesi@4
|
639 }
|
danielebarchiesi@4
|
640
|
danielebarchiesi@4
|
641 /**
|
danielebarchiesi@4
|
642 * Form wrapper the main entity form.
|
danielebarchiesi@4
|
643 *
|
danielebarchiesi@4
|
644 * @see entity_ui_form_defaults()
|
danielebarchiesi@4
|
645 */
|
danielebarchiesi@4
|
646 function entity_ui_main_form_defaults($form, &$form_state, $entity = NULL, $op = NULL) {
|
danielebarchiesi@4
|
647 // Now equals entity_ui_form_defaults() but is still here to keep backward
|
danielebarchiesi@4
|
648 // compatability.
|
danielebarchiesi@4
|
649 return entity_ui_form_defaults($form, $form_state, $form_state['entity_type'], $entity, $op);
|
danielebarchiesi@4
|
650 }
|
danielebarchiesi@4
|
651
|
danielebarchiesi@4
|
652 /**
|
danielebarchiesi@4
|
653 * Clones the entity object and makes sure it will get saved as new entity.
|
danielebarchiesi@4
|
654 *
|
danielebarchiesi@4
|
655 * @return
|
danielebarchiesi@4
|
656 * The cloned entity object.
|
danielebarchiesi@4
|
657 */
|
danielebarchiesi@4
|
658 function entity_ui_clone_entity($entity_type, $entity) {
|
danielebarchiesi@4
|
659 // Clone the entity and make sure it will get saved as a new entity.
|
danielebarchiesi@4
|
660 $entity = clone $entity;
|
danielebarchiesi@4
|
661
|
danielebarchiesi@4
|
662 $entity_info = entity_get_info($entity_type);
|
danielebarchiesi@4
|
663 $entity->{$entity_info['entity keys']['id']} = FALSE;
|
danielebarchiesi@4
|
664 if (!empty($entity_info['entity keys']['name'])) {
|
danielebarchiesi@4
|
665 $entity->{$entity_info['entity keys']['name']} = FALSE;
|
danielebarchiesi@4
|
666 }
|
danielebarchiesi@4
|
667 $entity->is_new = TRUE;
|
danielebarchiesi@4
|
668
|
danielebarchiesi@4
|
669 // Make sure the status of a cloned exportable is custom.
|
danielebarchiesi@4
|
670 if (!empty($entity_info['exportable'])) {
|
danielebarchiesi@4
|
671 $status_key = isset($entity_info['entity keys']['status']) ? $entity_info['entity keys']['status'] : 'status';
|
danielebarchiesi@4
|
672 $entity->$status_key = ENTITY_CUSTOM;
|
danielebarchiesi@4
|
673 }
|
danielebarchiesi@4
|
674 return $entity;
|
danielebarchiesi@4
|
675 }
|
danielebarchiesi@4
|
676
|
danielebarchiesi@4
|
677 /**
|
danielebarchiesi@4
|
678 * Form wrapper callback for all entity ui forms.
|
danielebarchiesi@4
|
679 *
|
danielebarchiesi@4
|
680 * This callback makes sure the form state is properly initialized and sets
|
danielebarchiesi@4
|
681 * some useful default titles.
|
danielebarchiesi@4
|
682 *
|
danielebarchiesi@4
|
683 * @see EntityDefaultUIController::hook_forms()
|
danielebarchiesi@4
|
684 */
|
danielebarchiesi@4
|
685 function entity_ui_form_defaults($form, &$form_state, $entity_type, $entity = NULL, $op = NULL) {
|
danielebarchiesi@4
|
686 $defaults = array(
|
danielebarchiesi@4
|
687 'entity_type' => $entity_type,
|
danielebarchiesi@4
|
688 );
|
danielebarchiesi@4
|
689 if (isset($entity)) {
|
danielebarchiesi@4
|
690 $defaults[$entity_type] = $entity;
|
danielebarchiesi@4
|
691 }
|
danielebarchiesi@4
|
692 if (isset($op)) {
|
danielebarchiesi@4
|
693 $defaults['op'] = $op;
|
danielebarchiesi@4
|
694 }
|
danielebarchiesi@4
|
695 $form_state += $defaults;
|
danielebarchiesi@4
|
696 if (isset($op)) {
|
danielebarchiesi@4
|
697 drupal_set_title(entity_ui_get_page_title($op, $entity_type, $entity), PASS_THROUGH);
|
danielebarchiesi@4
|
698 }
|
danielebarchiesi@4
|
699 // Add in handlers pointing to the controller for the forms implemented by it.
|
danielebarchiesi@4
|
700 if (isset($form_state['build_info']['base_form_id']) && $form_state['build_info']['base_form_id'] != $entity_type . '_form') {
|
danielebarchiesi@4
|
701 $form['#validate'][] = 'entity_ui_controller_form_validate';
|
danielebarchiesi@4
|
702 $form['#submit'][] = 'entity_ui_controller_form_submit';
|
danielebarchiesi@4
|
703 }
|
danielebarchiesi@4
|
704 return $form;
|
danielebarchiesi@4
|
705 }
|
danielebarchiesi@4
|
706
|
danielebarchiesi@4
|
707 /**
|
danielebarchiesi@4
|
708 * Validation callback for forms implemented by the UI controller.
|
danielebarchiesi@4
|
709 */
|
danielebarchiesi@4
|
710 function entity_ui_controller_form_validate($form, &$form_state) {
|
danielebarchiesi@4
|
711 // Remove 'entity_ui_' prefix and the '_form' suffix.
|
danielebarchiesi@4
|
712 $base = substr($form_state['build_info']['base_form_id'], 10, -5);
|
danielebarchiesi@4
|
713 $method = $base . 'FormValidate';
|
danielebarchiesi@4
|
714 entity_ui_controller($form_state['entity_type'])->$method($form, $form_state);
|
danielebarchiesi@4
|
715 }
|
danielebarchiesi@4
|
716
|
danielebarchiesi@4
|
717 /**
|
danielebarchiesi@4
|
718 * Submit callback for forms implemented by the UI controller.
|
danielebarchiesi@4
|
719 */
|
danielebarchiesi@4
|
720 function entity_ui_controller_form_submit($form, &$form_state) {
|
danielebarchiesi@4
|
721 // Remove 'entity_ui_' prefix and the '_form' suffix.
|
danielebarchiesi@4
|
722 $base = substr($form_state['build_info']['base_form_id'], 10, -5);
|
danielebarchiesi@4
|
723 $method = $base . 'FormSubmit';
|
danielebarchiesi@4
|
724 entity_ui_controller($form_state['entity_type'])->$method($form, $form_state);
|
danielebarchiesi@4
|
725 }
|
danielebarchiesi@4
|
726
|
danielebarchiesi@4
|
727 /**
|
danielebarchiesi@4
|
728 * Gets the page title for the passed operation.
|
danielebarchiesi@4
|
729 */
|
danielebarchiesi@4
|
730 function entity_ui_get_page_title($op, $entity_type, $entity = NULL) {
|
danielebarchiesi@4
|
731 $label = entity_label($entity_type, $entity);
|
danielebarchiesi@4
|
732 switch ($op) {
|
danielebarchiesi@4
|
733 case 'view':
|
danielebarchiesi@4
|
734 return $label;
|
danielebarchiesi@4
|
735 case 'edit':
|
danielebarchiesi@4
|
736 return t('Edit @label', array('@label' => $label));
|
danielebarchiesi@4
|
737 case 'clone':
|
danielebarchiesi@4
|
738 return t('Clone @label', array('@label' => $label));
|
danielebarchiesi@4
|
739 case 'revert':
|
danielebarchiesi@4
|
740 return t('Revert @label', array('@label' => $label));
|
danielebarchiesi@4
|
741 case 'delete':
|
danielebarchiesi@4
|
742 return t('Delete @label', array('@label' => $label));
|
danielebarchiesi@4
|
743 case 'export':
|
danielebarchiesi@4
|
744 return t('Export @label', array('@label' => $label));
|
danielebarchiesi@4
|
745 }
|
danielebarchiesi@4
|
746 if (isset($entity)) {
|
danielebarchiesi@4
|
747 list(, , $bundle) = entity_extract_ids($entity_type, $entity);
|
danielebarchiesi@4
|
748 }
|
danielebarchiesi@4
|
749 return entity_ui_get_action_title($op, $entity_type, $bundle);
|
danielebarchiesi@4
|
750 }
|
danielebarchiesi@4
|
751
|
danielebarchiesi@4
|
752 /**
|
danielebarchiesi@4
|
753 * Gets the page/menu title for local action operations.
|
danielebarchiesi@4
|
754 *
|
danielebarchiesi@4
|
755 * @param $op
|
danielebarchiesi@4
|
756 * The current operation. One of 'add' or 'import'.
|
danielebarchiesi@4
|
757 * @param $entity_type
|
danielebarchiesi@4
|
758 * The entity type.
|
danielebarchiesi@4
|
759 * @param $bundle_name
|
danielebarchiesi@4
|
760 * (Optional) The name of the bundle. May be NULL if the bundle name is not
|
danielebarchiesi@4
|
761 * relevant to the current page. If the entity type has only one bundle, or no
|
danielebarchiesi@4
|
762 * bundles, this will be the same as the entity type.
|
danielebarchiesi@4
|
763 */
|
danielebarchiesi@4
|
764 function entity_ui_get_action_title($op, $entity_type, $bundle_name = NULL) {
|
danielebarchiesi@4
|
765 $info = entity_get_info($entity_type);
|
danielebarchiesi@4
|
766 switch ($op) {
|
danielebarchiesi@4
|
767 case 'add':
|
danielebarchiesi@4
|
768 if (isset($bundle_name) && $bundle_name != $entity_type) {
|
danielebarchiesi@4
|
769 return t('Add @bundle_name @entity_type', array(
|
danielebarchiesi@4
|
770 '@bundle_name' => drupal_strtolower($info['bundles'][$bundle_name]['label']),
|
danielebarchiesi@4
|
771 '@entity_type' => drupal_strtolower($info['label']),
|
danielebarchiesi@4
|
772 ));
|
danielebarchiesi@4
|
773 }
|
danielebarchiesi@4
|
774 else {
|
danielebarchiesi@4
|
775 return t('Add @entity_type', array('@entity_type' => drupal_strtolower($info['label'])));
|
danielebarchiesi@4
|
776 }
|
danielebarchiesi@4
|
777 case 'import':
|
danielebarchiesi@4
|
778 return t('Import @entity_type', array('@entity_type' => drupal_strtolower($info['label'])));
|
danielebarchiesi@4
|
779 }
|
danielebarchiesi@4
|
780 }
|
danielebarchiesi@4
|
781
|
danielebarchiesi@4
|
782 /**
|
danielebarchiesi@4
|
783 * Submit builder for the main entity form, which extracts the form values and updates the entity.
|
danielebarchiesi@4
|
784 *
|
danielebarchiesi@4
|
785 * This is a helper function for entities making use of the entity UI
|
danielebarchiesi@4
|
786 * controller.
|
danielebarchiesi@4
|
787 *
|
danielebarchiesi@4
|
788 * @return
|
danielebarchiesi@4
|
789 * The updated entity.
|
danielebarchiesi@4
|
790 *
|
danielebarchiesi@4
|
791 * @see EntityDefaultUIController::hook_forms()
|
danielebarchiesi@4
|
792 * @see EntityDefaultUIController::entityFormSubmitBuildEntity()
|
danielebarchiesi@4
|
793 */
|
danielebarchiesi@4
|
794 function entity_ui_form_submit_build_entity($form, &$form_state) {
|
danielebarchiesi@4
|
795 return entity_ui_controller($form_state['entity_type'])->entityFormSubmitBuildEntity($form, $form_state);
|
danielebarchiesi@4
|
796 }
|
danielebarchiesi@4
|
797
|
danielebarchiesi@4
|
798 /**
|
danielebarchiesi@4
|
799 * Validation callback for machine names of exportables.
|
danielebarchiesi@4
|
800 *
|
danielebarchiesi@4
|
801 * We don't allow numeric machine names, as entity_load() treats them as the
|
danielebarchiesi@4
|
802 * numeric identifier and they are easily confused with ids in general.
|
danielebarchiesi@4
|
803 */
|
danielebarchiesi@4
|
804 function entity_ui_validate_machine_name($element, &$form_state) {
|
danielebarchiesi@4
|
805 if (is_numeric($element['#value'])) {
|
danielebarchiesi@4
|
806 form_error($element, t('Machine-readable names must not consist of numbers only.'));
|
danielebarchiesi@4
|
807 }
|
danielebarchiesi@4
|
808 }
|
danielebarchiesi@4
|
809
|
danielebarchiesi@4
|
810 /**
|
danielebarchiesi@4
|
811 * Returns HTML for an entity on the entity overview listing.
|
danielebarchiesi@4
|
812 *
|
danielebarchiesi@4
|
813 * @ingroup themeable
|
danielebarchiesi@4
|
814 */
|
danielebarchiesi@4
|
815 function theme_entity_ui_overview_item($variables) {
|
danielebarchiesi@4
|
816 $output = $variables['url'] ? l($variables['label'], $variables['url']['path'], $variables['url']['options']) : check_plain($variables['label']);
|
danielebarchiesi@4
|
817 if ($variables['name']) {
|
danielebarchiesi@4
|
818 $output .= ' <small> (' . t('Machine name') . ': ' . check_plain($variables['name']) . ')</small>';
|
danielebarchiesi@4
|
819 }
|
danielebarchiesi@4
|
820 return $output;
|
danielebarchiesi@4
|
821 }
|
danielebarchiesi@4
|
822
|
danielebarchiesi@4
|
823 /**
|
danielebarchiesi@4
|
824 * Page callback for viewing an entity.
|
danielebarchiesi@4
|
825 *
|
danielebarchiesi@4
|
826 * @param Entity $entity
|
danielebarchiesi@4
|
827 * The entity to be rendered.
|
danielebarchiesi@4
|
828 *
|
danielebarchiesi@4
|
829 * @return array
|
danielebarchiesi@4
|
830 * A renderable array of the entity in full view mode.
|
danielebarchiesi@4
|
831 */
|
danielebarchiesi@4
|
832 function entity_ui_entity_page_view($entity) {
|
danielebarchiesi@4
|
833 return $entity->view('full', NULL, TRUE);
|
danielebarchiesi@4
|
834 }
|