danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Perform bulk exports.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Implements hook_permission().
|
danielebarchiesi@0
|
10 */
|
danielebarchiesi@0
|
11 function bulk_export_permission() {
|
danielebarchiesi@0
|
12 return array(
|
danielebarchiesi@0
|
13 'use bulk exporter' => array(
|
danielebarchiesi@0
|
14 'title' => t('Access Bulk Exporter'),
|
danielebarchiesi@0
|
15 'description' => t('Export various system objects into code.'),
|
danielebarchiesi@0
|
16 ),
|
danielebarchiesi@0
|
17 );
|
danielebarchiesi@0
|
18 }
|
danielebarchiesi@0
|
19
|
danielebarchiesi@0
|
20 /**
|
danielebarchiesi@0
|
21 * Implements hook_menu().
|
danielebarchiesi@0
|
22 */
|
danielebarchiesi@0
|
23 function bulk_export_menu() {
|
danielebarchiesi@0
|
24 $items['admin/structure/bulk-export'] = array(
|
danielebarchiesi@0
|
25 'title' => 'Bulk Exporter',
|
danielebarchiesi@0
|
26 'description' => 'Bulk-export multiple CTools-handled data objects to code.',
|
danielebarchiesi@0
|
27 'access arguments' => array('use bulk exporter'),
|
danielebarchiesi@0
|
28 'page callback' => 'bulk_export_export',
|
danielebarchiesi@0
|
29 );
|
danielebarchiesi@0
|
30 $items['admin/structure/bulk-export/results'] = array(
|
danielebarchiesi@0
|
31 'access arguments' => array('use bulk exporter'),
|
danielebarchiesi@0
|
32 'page callback' => 'bulk_export_export',
|
danielebarchiesi@0
|
33 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
34 );
|
danielebarchiesi@0
|
35 return $items;
|
danielebarchiesi@0
|
36 }
|
danielebarchiesi@0
|
37
|
danielebarchiesi@0
|
38 /**
|
danielebarchiesi@0
|
39 * FAPI gateway to the bulk exporter.
|
danielebarchiesi@0
|
40 *
|
danielebarchiesi@0
|
41 * @param $cli
|
danielebarchiesi@0
|
42 * Whether this function is called from command line.
|
danielebarchiesi@0
|
43 * @param $options
|
danielebarchiesi@0
|
44 * A collection of options, only passed in by drush_ctools_export().
|
danielebarchiesi@0
|
45 */
|
danielebarchiesi@0
|
46 function bulk_export_export($cli = FALSE, $options = array()) {
|
danielebarchiesi@0
|
47 ctools_include('export');
|
danielebarchiesi@0
|
48 $form = array();
|
danielebarchiesi@0
|
49 $schemas = ctools_export_get_schemas(TRUE);
|
danielebarchiesi@0
|
50 $exportables = $export_tables = array();
|
danielebarchiesi@0
|
51
|
danielebarchiesi@0
|
52 foreach ($schemas as $table => $schema) {
|
danielebarchiesi@0
|
53 if (!empty($schema['export']['list callback']) && function_exists($schema['export']['list callback'])) {
|
danielebarchiesi@0
|
54 $exportables[$table] = $schema['export']['list callback']();
|
danielebarchiesi@0
|
55 }
|
danielebarchiesi@0
|
56 else {
|
danielebarchiesi@0
|
57 $exportables[$table] = ctools_export_default_list($table, $schema);
|
danielebarchiesi@0
|
58 }
|
danielebarchiesi@0
|
59 natcasesort($exportables[$table]);
|
danielebarchiesi@0
|
60 $export_tables[$table] = $schema['module'];
|
danielebarchiesi@0
|
61 }
|
danielebarchiesi@0
|
62 if ($exportables) {
|
danielebarchiesi@0
|
63 $form_state = array(
|
danielebarchiesi@0
|
64 're_render' => FALSE,
|
danielebarchiesi@0
|
65 'no_redirect' => TRUE,
|
danielebarchiesi@0
|
66 'exportables' => $exportables,
|
danielebarchiesi@0
|
67 'export_tables' => $export_tables,
|
danielebarchiesi@0
|
68 'name' => '',
|
danielebarchiesi@0
|
69 'code' => '',
|
danielebarchiesi@0
|
70 'module' => '',
|
danielebarchiesi@0
|
71 );
|
danielebarchiesi@0
|
72
|
danielebarchiesi@0
|
73 // If called from drush_ctools_export, get the module name and
|
danielebarchiesi@0
|
74 // select all exportables and call the submit function directly.
|
danielebarchiesi@0
|
75 if ($cli) {
|
danielebarchiesi@0
|
76 $module_name = $options['name'];
|
danielebarchiesi@0
|
77 $form_state['values']['name'] = $module_name;
|
danielebarchiesi@0
|
78 if (isset($options['selections'])) {
|
danielebarchiesi@0
|
79 $exportables = $options['selections'];
|
danielebarchiesi@0
|
80 }
|
danielebarchiesi@0
|
81 $form_state['values']['tables'] = array();
|
danielebarchiesi@0
|
82 foreach ($exportables as $table => $names) {
|
danielebarchiesi@0
|
83 if (!empty($names)) {
|
danielebarchiesi@0
|
84 $form_state['values']['tables'][] = $table;
|
danielebarchiesi@0
|
85 $form_state['values'][$table] = array();
|
danielebarchiesi@0
|
86 foreach ($names as $name => $title) {
|
danielebarchiesi@0
|
87 $form_state['values'][$table][$name] = $name;
|
danielebarchiesi@0
|
88 }
|
danielebarchiesi@0
|
89 }
|
danielebarchiesi@0
|
90 }
|
danielebarchiesi@0
|
91 $output = bulk_export_export_form_submit($form, $form_state);
|
danielebarchiesi@0
|
92 }
|
danielebarchiesi@0
|
93 else {
|
danielebarchiesi@0
|
94 $output = drupal_build_form('bulk_export_export_form', $form_state);
|
danielebarchiesi@0
|
95 $module_name = $form_state['module'];
|
danielebarchiesi@0
|
96 }
|
danielebarchiesi@0
|
97
|
danielebarchiesi@0
|
98 if (!empty($form_state['submitted']) || $cli) {
|
danielebarchiesi@0
|
99 drupal_set_title(t('Bulk export results'));
|
danielebarchiesi@0
|
100 $output = '';
|
danielebarchiesi@0
|
101 $module_code = '';
|
danielebarchiesi@0
|
102 $api_code = array();
|
danielebarchiesi@0
|
103 $dependencies = $file_data = array();
|
danielebarchiesi@0
|
104 foreach ($form_state['code'] as $module => $api_info) {
|
danielebarchiesi@0
|
105 if ($module == 'general') {
|
danielebarchiesi@0
|
106 $module_code .= $api_info;
|
danielebarchiesi@0
|
107 }
|
danielebarchiesi@0
|
108 else {
|
danielebarchiesi@0
|
109 foreach ($api_info as $api => $info) {
|
danielebarchiesi@0
|
110 $api_hook = ctools_plugin_api_get_hook($module, $api);
|
danielebarchiesi@0
|
111 if (empty($api_code[$api_hook])) {
|
danielebarchiesi@0
|
112 $api_code[$api_hook] = '';
|
danielebarchiesi@0
|
113 }
|
danielebarchiesi@0
|
114 $api_code[$api_hook] .= " if (\$module == '$module' && \$api == '$api') {\n";
|
danielebarchiesi@0
|
115 $api_code[$api_hook] .= " return array('version' => $info[version]);\n";
|
danielebarchiesi@0
|
116 $api_code[$api_hook] .= " }\n";
|
danielebarchiesi@0
|
117 $dependencies[$module] = TRUE;
|
danielebarchiesi@0
|
118
|
danielebarchiesi@0
|
119 $file = $module_name . '.' . $api . '.inc';
|
danielebarchiesi@0
|
120 $code = "<?php\n\n";
|
danielebarchiesi@0
|
121 $code .= "/**\n";
|
danielebarchiesi@0
|
122 $code .= " * @file\n";
|
danielebarchiesi@0
|
123 $code .= " * Bulk export of $api objects generated by Bulk export module.\n";
|
danielebarchiesi@0
|
124 $code .= " */\n\n";
|
danielebarchiesi@0
|
125 $code .= $info['code'];
|
danielebarchiesi@0
|
126 if ($cli) {
|
danielebarchiesi@0
|
127 $file_data[$file] = $code;
|
danielebarchiesi@0
|
128 }
|
danielebarchiesi@0
|
129 else {
|
danielebarchiesi@0
|
130 $export_form = drupal_get_form('ctools_export_form', $code, t('Place this in @file', array('@file' => $file)));
|
danielebarchiesi@0
|
131 $output .= drupal_render($export_form);
|
danielebarchiesi@0
|
132 }
|
danielebarchiesi@0
|
133 }
|
danielebarchiesi@0
|
134 }
|
danielebarchiesi@0
|
135 }
|
danielebarchiesi@0
|
136
|
danielebarchiesi@0
|
137 // Add hook_ctools_plugin_api at the top of the module code, if there is any.
|
danielebarchiesi@0
|
138 if ($api_code) {
|
danielebarchiesi@0
|
139 foreach ($api_code as $api_hook => $text) {
|
danielebarchiesi@0
|
140 $api = "\n/**\n";
|
danielebarchiesi@0
|
141 $api .= " * Implements hook_$api_hook().\n";
|
danielebarchiesi@0
|
142 $api .= " */\n";
|
danielebarchiesi@0
|
143 $api .= "function {$module_name}_$api_hook(\$module, \$api) {\n";
|
danielebarchiesi@0
|
144 $api .= $text;
|
danielebarchiesi@0
|
145 $api .= "}\n";
|
danielebarchiesi@0
|
146 $module_code = $api . $module_code;
|
danielebarchiesi@0
|
147 }
|
danielebarchiesi@0
|
148 }
|
danielebarchiesi@0
|
149
|
danielebarchiesi@0
|
150 if ($module_code) {
|
danielebarchiesi@0
|
151 $module = "<?php\n\n";
|
danielebarchiesi@0
|
152 $module .= "/**\n";
|
danielebarchiesi@0
|
153 $module .= " * @file\n";
|
danielebarchiesi@0
|
154 $module .= " * Bulk export of objects generated by Bulk export module.\n";
|
danielebarchiesi@0
|
155 $module .= " */\n";
|
danielebarchiesi@0
|
156 $module .= $module_code;
|
danielebarchiesi@0
|
157 if ($cli) {
|
danielebarchiesi@0
|
158 $file_data[$module_name . '.module'] = $module;
|
danielebarchiesi@0
|
159 }
|
danielebarchiesi@0
|
160 else {
|
danielebarchiesi@0
|
161 $export_form = drupal_get_form('ctools_export_form', $module, t('Place this in @file', array('@file' => $form_state['module'] . '.module')));
|
danielebarchiesi@0
|
162 $output = drupal_render($export_form) . $output;
|
danielebarchiesi@0
|
163 }
|
danielebarchiesi@0
|
164 }
|
danielebarchiesi@0
|
165
|
danielebarchiesi@0
|
166 $info = strtr("name = @module export module\n", array('@module' => $form_state['module']));
|
danielebarchiesi@0
|
167 $info .= strtr("description = Export objects from CTools\n", array('@module' => $form_state['values']['name']));
|
danielebarchiesi@0
|
168 foreach ($dependencies as $module => $junk) {
|
danielebarchiesi@0
|
169 $info .= "dependencies[] = $module\n";
|
danielebarchiesi@0
|
170 }
|
danielebarchiesi@0
|
171 $info .= "package = Chaos tool suite\n";
|
danielebarchiesi@0
|
172 $info .= "core = 7.x\n";
|
danielebarchiesi@0
|
173 if ($cli) {
|
danielebarchiesi@0
|
174 $file_data[$module_name . '.info'] = $info;
|
danielebarchiesi@0
|
175 }
|
danielebarchiesi@0
|
176 else {
|
danielebarchiesi@0
|
177 $export_form = drupal_get_form('ctools_export_form', $info, t('Place this in @file', array('@file' => $form_state['module'] . '.info')));
|
danielebarchiesi@0
|
178 $output = drupal_render($export_form) . $output;
|
danielebarchiesi@0
|
179 }
|
danielebarchiesi@0
|
180 }
|
danielebarchiesi@0
|
181
|
danielebarchiesi@0
|
182 if ($cli) {
|
danielebarchiesi@0
|
183 return $file_data;
|
danielebarchiesi@0
|
184 }
|
danielebarchiesi@0
|
185 else {
|
danielebarchiesi@0
|
186 return $output;
|
danielebarchiesi@0
|
187 }
|
danielebarchiesi@0
|
188 }
|
danielebarchiesi@0
|
189 else {
|
danielebarchiesi@0
|
190 return t('There are no objects to be exported at this time.');
|
danielebarchiesi@0
|
191 }
|
danielebarchiesi@0
|
192 }
|
danielebarchiesi@0
|
193
|
danielebarchiesi@0
|
194 /**
|
danielebarchiesi@0
|
195 * FAPI definition for the bulk exporter form.
|
danielebarchiesi@0
|
196 *
|
danielebarchiesi@0
|
197 */
|
danielebarchiesi@0
|
198 function bulk_export_export_form($form, &$form_state) {
|
danielebarchiesi@0
|
199
|
danielebarchiesi@0
|
200 $files = system_rebuild_module_data();
|
danielebarchiesi@0
|
201
|
danielebarchiesi@0
|
202 $form['additional_settings'] = array(
|
danielebarchiesi@0
|
203 '#type' => 'vertical_tabs',
|
danielebarchiesi@0
|
204 );
|
danielebarchiesi@0
|
205
|
danielebarchiesi@0
|
206 $options = $tables = array();
|
danielebarchiesi@0
|
207 foreach ($form_state['exportables'] as $table => $list) {
|
danielebarchiesi@0
|
208 if (empty($list)) {
|
danielebarchiesi@0
|
209 continue;
|
danielebarchiesi@0
|
210 }
|
danielebarchiesi@0
|
211
|
danielebarchiesi@0
|
212 foreach ($list as $id => $title) {
|
danielebarchiesi@0
|
213 $options[$table][$id] = array($title);
|
danielebarchiesi@0
|
214 $options[$table][$id]['#attributes'] = array('class' => array('bulk-selection'));
|
danielebarchiesi@0
|
215 }
|
danielebarchiesi@0
|
216
|
danielebarchiesi@0
|
217 $module = $form_state['export_tables'][$table];
|
danielebarchiesi@0
|
218 $header = array($table);
|
danielebarchiesi@0
|
219 $module_name = $files[$module]->info['name'];
|
danielebarchiesi@0
|
220 $tables[] = $table;
|
danielebarchiesi@0
|
221
|
danielebarchiesi@0
|
222 if (!isset($form[$module_name])) {
|
danielebarchiesi@0
|
223 $form[$files[$module]->info['name']] = array(
|
danielebarchiesi@0
|
224 '#type' => 'fieldset',
|
danielebarchiesi@0
|
225 '#group' => 'additional_settings',
|
danielebarchiesi@0
|
226 '#title' => $module_name,
|
danielebarchiesi@0
|
227 );
|
danielebarchiesi@0
|
228 }
|
danielebarchiesi@0
|
229
|
danielebarchiesi@0
|
230 $form[$module_name]['tables'][$table] = array(
|
danielebarchiesi@0
|
231 '#prefix' => '<div class="export-container">',
|
danielebarchiesi@0
|
232 '#suffix' => '</div>',
|
danielebarchiesi@0
|
233 '#type' => 'tableselect',
|
danielebarchiesi@0
|
234 '#header' => $header,
|
danielebarchiesi@0
|
235 '#options' => $options[$table],
|
danielebarchiesi@0
|
236 );
|
danielebarchiesi@0
|
237 }
|
danielebarchiesi@0
|
238
|
danielebarchiesi@0
|
239 $form['tables'] = array(
|
danielebarchiesi@0
|
240 '#type' => 'value',
|
danielebarchiesi@0
|
241 '#value' => $tables,
|
danielebarchiesi@0
|
242 );
|
danielebarchiesi@0
|
243
|
danielebarchiesi@0
|
244 $form['name'] = array(
|
danielebarchiesi@0
|
245 '#type' => 'textfield',
|
danielebarchiesi@0
|
246 '#title' => t('Module name'),
|
danielebarchiesi@0
|
247 '#description' => t('Enter the module name to export code to.'),
|
danielebarchiesi@0
|
248 );
|
danielebarchiesi@0
|
249
|
danielebarchiesi@0
|
250 $form['submit'] = array(
|
danielebarchiesi@0
|
251 '#type' => 'submit',
|
danielebarchiesi@0
|
252 '#value' => t('Export'),
|
danielebarchiesi@0
|
253 );
|
danielebarchiesi@0
|
254
|
danielebarchiesi@0
|
255 $form['#action'] = url('admin/structure/bulk-export/results');
|
danielebarchiesi@0
|
256 $form['#attached']['css'][] = drupal_get_path('module', 'bulk_export') . '/bulk_export.css';
|
danielebarchiesi@0
|
257 $form['#attached']['js'][] = drupal_get_path('module', 'bulk_export') . '/bulk_export.js';
|
danielebarchiesi@0
|
258 return $form;
|
danielebarchiesi@0
|
259 }
|
danielebarchiesi@0
|
260
|
danielebarchiesi@0
|
261 /**
|
danielebarchiesi@0
|
262 * Process the bulk export submit form and make the results available.
|
danielebarchiesi@0
|
263 */
|
danielebarchiesi@0
|
264 function bulk_export_export_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
265 $code = array();
|
danielebarchiesi@0
|
266 $name = empty($form_state['values']['name']) ? 'foo' : $form_state['values']['name'];
|
danielebarchiesi@0
|
267 $tables = $form_state['values']['tables'];
|
danielebarchiesi@0
|
268
|
danielebarchiesi@0
|
269 foreach ($tables as $table) {
|
danielebarchiesi@0
|
270 $names = array_keys(array_filter($form_state['values'][$table]));
|
danielebarchiesi@0
|
271 if ($names) {
|
danielebarchiesi@0
|
272 natcasesort($names);
|
danielebarchiesi@0
|
273 ctools_export_to_hook_code($code, $table, $names, $name);
|
danielebarchiesi@0
|
274 }
|
danielebarchiesi@0
|
275 }
|
danielebarchiesi@0
|
276
|
danielebarchiesi@0
|
277 $form_state['code'] = $code;
|
danielebarchiesi@0
|
278 $form_state['module'] = $name;
|
danielebarchiesi@0
|
279 }
|