source: sipes/modules_contrib/views/includes/convert.inc @ 65dadeb

stableversion-3.0
Last change on this file since 65dadeb was 59029b2, checked in by José Gregorio Puentes <jpuentes@…>, 8 años ago

se actualizo la version del modulo views

  • Propiedad mode establecida a 100644
File size: 19.3 KB
Línea 
1<?php
2/**
3 * @file convert.inc
4 *
5 * Contains forms and routines to convert older views to newer views.
6 */
7
8/**
9 * Page callback for the tools - Views 1 convert page
10 */
11function views_ui_admin_convert() {
12  if (!db_table_exists('view_view')) {
13    return t('There are no Views 1 views stored in the database to convert.');
14  }
15  $items = array();
16  $sorts = array();
17
18  $header = array(
19    array('data' => t('View name'), 'field' => 'name', 'sort' => 'asc'),
20    array('data' => t('Description')),
21    array('data' => t('Operations')),
22  );
23  $current_views = views_get_all_views();
24
25  $result = db_query("SELECT v.* FROM {view_view} v");
26  while ($view = db_fetch_object($result)) {
27    $ops = array();
28    if (!isset($current_views[$view->name])) {
29      $ops[] = l(t('Convert'), "admin/build/views1/convert/$view->name");
30    }
31    else {
32      $ops[] = t('Converted');
33    }
34    $ops[] = l(t('Delete'), "admin/build/views1/delete/$view->name");
35
36    $item = array();
37    $item[] = check_plain($view->name);
38    $item[] = check_plain($view->description);
39    $item[] = implode(' | ', $ops);
40    $items[] = $item;
41
42    $ts = tablesort_init($header);
43    switch ($ts['sql']) {
44      case 'name':
45      default:
46        $sorts[] = $item[0];
47        break;
48      case 'title':
49        $sorts[] = $item[1];
50        break;
51    }
52  }
53
54  if (!empty($ts)) {
55    if (strtolower($ts['sort']) == 'desc') {
56      arsort($sorts);
57    }
58    else {
59      asort($sorts);
60    }
61  }
62
63  $i = array();
64  foreach ($sorts as $id => $title) {
65    $i[] = $items[$id];
66  }
67  $output = t('The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name.');
68  $output .= theme('table', $header, $i);
69
70  $output .= drupal_get_form('views_ui_convert_cleanup_form');
71  return $output;
72}
73
74/**
75 * Provide form to clean up Views 1 tables.
76 */
77function views_ui_convert_cleanup_form() {
78  $form['verify'] = array(
79    '#type' => 'checkbox',
80    '#title' => t('Remove all Views 1 tables'),
81    '#description' => t('Check this box and then click clean up to drop all Views 1 tables. Warning: this operation will not be reversible! Do this only if you are sure you no longer need this data.'),
82    '#required' => TRUE,
83  );
84
85  $form['submit'] = array(
86    '#type' => 'submit',
87    '#value' => t('Clean up'),
88  );
89
90  return $form;
91}
92
93function views_ui_convert_cleanup_form_submit($form, $form_state) {
94  if (empty($form_state['values']['verify'])) {
95    drupal_set_message('Please check the box to verify you want to destroy your Views 1 table data.');
96    return;
97  }
98
99  $ret = array();
100  if (db_table_exists('view_view')) {
101    db_drop_table($ret, 'view_view');
102  }
103  if (db_table_exists('view_sort')) {
104    db_drop_table($ret, 'view_sort');
105  }
106  if (db_table_exists('view_argument')) {
107    db_drop_table($ret, 'view_argument');
108  }
109  if (db_table_exists('view_tablefield')) {
110    db_drop_table($ret, 'view_tablefield');
111  }
112  if (db_table_exists('view_filter')) {
113    db_drop_table($ret, 'view_filter');
114  }
115  if (db_table_exists('view_exposed_filter')) {
116    db_drop_table($ret, 'view_exposed_filter');
117  }
118
119  drupal_set_message(t('All Views 1 tables have been removed.'));
120}
121
122/**
123 * Page callback for the tools - Views 1 convert page
124 */
125function views_ui_convert1($name) {
126  $old = views1_load($name);
127  if (!$old) {
128    return t('Unable to find view.');
129  }
130
131  $view = views1_import($old);
132
133  if ($view) {
134    views_ui_cache_set($view);
135    drupal_goto('admin/build/views/edit/' . $view->name);
136  }
137  else {
138    return t('Unable to convert view.');
139  }
140}
141
142/**
143 * Page to delete a Views 1 view.
144 */
145function views_ui_delete1_confirm(&$form_state, $vid) {
146  $form_state['vid'] = $vid;
147  $form = array();
148
149  $cancel = 'admin/build/views/tools/convert';
150  if (!empty($_REQUEST['cancel'])) {
151    $cancel = $_REQUEST['cancel'];
152  }
153  return confirm_form($form,
154                  t('Are you sure you want to delete the view %name?', array('%name' => $view->name)),
155                  $cancel,
156                  t('This action cannot be undone.'),
157                  t('Delete'),
158                  t('Cancel'));
159}
160
161/**
162 * Submit handler to delete a view.
163 */
164function views_ui_delete1_confirm_submit(&$form, &$form_state) {
165  views1_delete($form_state['vid']);
166  drupal_set_message(t('The view has been deleted'));
167  $form_state['redirect'] = 'admin/build/views/tools/convert';
168}
169
170/**
171 * Convert a Views 1 view to a Views 2 view.
172 */
173function views1_import($imported) {
174  views_include_handlers();
175  views_module_include('views_convert.inc');
176
177  $view = views_new_view();
178
179  $view->name = $imported->name;
180  $view->description = $imported->description;
181
182  if (!empty($imported->page) && !empty($imported->url)) {
183    $page_display = $view->add_display('page');
184  }
185  if (!empty($imported->block)) {
186    $block_display = $view->add_display('block');
187  }
188  $view->init_display();
189
190  $handler = &$view->display['default']->handler;
191  $handler->set_option('title', $imported->page_title);
192  $handler->set_option('header', $imported->page_header);
193  $handler->set_option('header_format', $imported->page_header_format);
194  $handler->set_option('footer', $imported->page_footer);
195  $handler->set_option('footer_format', $imported->page_footer_format);
196  $handler->set_option('empty', $imported->page_empty);
197  $handler->set_option('empty_format', $imported->page_empty_format);
198
199  $handler->set_option('use_pager', $imported->use_pager);
200  $handler->set_option('items_per_page', $imported->nodes_per_page);
201  $handler->set_option('pager_element', 0);
202  $handler->set_option('offset', 0);
203
204  $access = array('type' => 'none', 'role' => array(), 'perm' => '');
205  if ($imported->access) {
206    $access['type'] = 'role';
207    $access['role'] = drupal_map_assoc($imported->access);
208  }
209
210  $handler->set_option('access', $access);
211  if (!empty($imported->page) && !empty($imported->url)) {
212    $handler = &$view->display[$page_display]->handler;
213    $url = str_replace('$arg', '%', $imported->url);
214    $handler->set_option('path', $url);
215    if ($imported->menu) {
216      $menu = array('type' => 'normal');
217      if ($imported->menu_tab) {
218        $menu['type'] = 'tab';
219      }
220      if ($imported->menu_tab_default) {
221        $menu['type'] = 'default tab';
222      }
223      $menu['title'] = $imported->menu_title ? $imported->menu_title : $imported->page_title;
224      $handler->set_option('menu', $menu);
225
226      if ($menu['type'] == 'default tab') {
227        $tab_options = array('type' => 'none');
228        switch ($imported->menu_tab_default_parent_type) {
229          case 'tab':
230          case 'normal':
231            $tab_options['type'] = $imported->menu_tab_default_parent_type;
232            break;
233        }
234      }
235      $tab_options['title'] = $imported->menu_parent_title;
236      $tab_options['weight'] = $imported->menu_parent_tab_weight;
237      $handler->set_option('tab_options', $tab_options);
238    }
239  }
240
241  views1_convert_style($view, $handler, $imported->page_type);
242
243  if (!empty($imported->block)) {
244    $handler = &$view->display[$block_display]->handler;
245
246    if (!empty($imported->block_title)) {
247      if (!empty($imported->page)) {
248        $handler->set_override('title');
249      }
250      $handler->set_option('title', $imported->block_title);
251    }
252
253    if (!empty($imported->page)) {
254      $handler->set_override('use_pager');
255    }
256    $handler->set_option('use_pager', FALSE);
257
258    if ($imported->nodes_per_block != $imported->nodes_per_page) {
259      $handler->set_option('items_per_page', $imported->nodes_per_block);
260      $handler->set_option('offset', 0);
261    }
262
263    if (empty($imported->block_use_page_header)) {
264      if (!empty($imported->page)) {
265        $handler->set_override('header');
266      }
267      if (!empty($imported->block_header)) {
268        $handler->set_option('header', $imported->block_header);
269        $handler->set_option('header_format', $imported->block_header_format);
270      }
271    }
272    if (empty($imported->block_use_page_footer)) {
273      if (!empty($imported->page)) {
274        $handler->set_override('footer');
275      }
276      if (!empty($imported->block_footer)) {
277        $handler->set_option('footer', $imported->block_footer);
278        $handler->set_option('footer_format', $imported->block_footer_format);
279      }
280    }
281    if (empty($imported->block_use_page_empty)) {
282      if (!empty($imported->page)) {
283        $handler->set_override('empty');
284      }
285      if (!empty($imported->block_empty)) {
286        $handler->set_option('empty', $imported->block_empty);
287        $handler->set_option('empty_format', $imported->block_empty_format);
288      }
289    }
290
291    $handler->set_option('use_more', $imported->block_more);
292
293    if (!empty($imported->page)) {
294      $handler->set_override('style_plugin');
295    }
296    views1_convert_style($view, $handler, $imported->block_type);
297  }
298
299  // For each of the fields, arguments, filters, and sorts in the old view,
300  // check if a handler for this item exists in Views 2 and add it,
301  // then see if any other modules want to adapt it using hook_views_convert().
302
303  foreach ($imported->field as $field) {
304    $id = $view->add_item('default', 'field', $field['tablename'], $field['field'], array('label' => $field['label']));
305    if ($view->display_handler->get_option('style_plugin') == 'table') {
306      $options = $view->display_handler->get_option('style_options');
307      if (!empty($field['sortable'])) {
308        $options['info'][$id]['sortable'] = TRUE;
309        if (!empty($field['defaultsort'])) {
310          $options['default'] = $id;
311        }
312      }
313      $view->display_handler->set_option('style_options', $options);
314    }
315    foreach (module_implements('views_convert') as $module) {
316      module_invoke($module, 'views_convert', 'default', 'field', $view, $field, $id);
317    }
318  }
319  foreach ($imported->sort as $field) {
320    $id = $view->add_item('default', 'sort', $field['tablename'], $field['field'], array('order' => $field['sortorder']));
321    foreach (module_implements('views_convert') as $module) {
322      module_invoke($module, 'views_convert', 'default', 'sort', $view, $field, $id);
323    }
324  }
325  $actions = array('ignore', 'not found', 'ignore', 'summary asc', 'summary asc', 'summary desc', 'summary asc', 'empty');
326  foreach ($imported->argument as $id => $field) {
327    if ($field['type'] == 'rss_feed') {
328      $feed_display = $view->new_display('feed');
329      $feed_display->set_option('style_plugin', 'rss');
330      $feed_display->set_option('row_plugin', 'node_rss');
331      $feed_display->set_option('path', $view->display[$page_display]->handler->get_option('path') .'/feed');
332      $feed_display->set_option('page', $view->display[$page_display]->handler->get_option('pager'));
333
334      $displays = array();
335      if (!empty($page_display)) {
336        $displays[$page_display] = $page_display;
337      }
338      if (!empty($block_display)) {
339        $displays[$block_display] = $block_display;
340      }
341      $feed_display->set_option('displays', $displays);
342    }
343    else {
344      if (!empty($imported->view_args_php)) {
345        $field['argoptions']['default_action'] = 'default';
346        $field['argoptions']['default_argument_type'] = 'php';
347        $field['argoptions']['default_argument_php'] = '$args = eval(\''. str_replace("'", "\\'", $imported->view_args_php) .'\');'."\n";
348        $field['argoptions']['default_argument_php'] .= 'if (isset($args['. $field['position'] .'])) {'."\n";
349        $field['argoptions']['default_argument_php'] .= '  return $args['. $field['position'] .'];'."\n";
350        $field['argoptions']['default_argument_php'] .= '}';
351        $field['argoptions']['validate_fail'] = $actions[$field['argdefault']];
352      }
353      else {
354        $field['argoptions']['default_action'] = $actions[$field['argdefault']];
355      }
356      if (!empty($field['title'])) {
357        $field['argoptions']['title'] = $field['title'];
358      }
359      if (!empty($field['wildcard'])) {
360        $field['argoptions']['wildcard'] = $field['wildcard'];
361      }
362      if (!empty($field['wildcard_substitution'])) {
363        $field['argoptions']['wildcard_substitution'] = $field['wildcard_substitution'];
364      }
365      // Arguments didn't used to be identified by table.name so we just have to
366      // leave that out.
367      foreach (module_implements('views_convert') as $module) {
368        module_invoke($module, 'views_convert', 'default', 'argument', $view, $field, NULL);
369      }
370    }
371  }
372  foreach ($imported->filter as $key => $field) {
373    $options = $field['value'] == '' ? array() : array('value' => $field['value']);
374    $id = $view->add_item('default', 'filter', $field['tablename'], $field['field'], $options);
375    foreach (module_implements('views_convert') as $module) {
376      module_invoke($module, 'views_convert', 'default', 'filter', $view, $field, $id);
377    }
378    // Store the id in the exposed filter if there is one.
379    foreach ($imported->exposed_filter as $key => $filter) {
380      if ($field['tablename'] == $filter['tablename'] && $field['field'] == $filter['field']) {
381        $imported->exposed_filter[$key]['id'] = $id;
382      }
383    }
384  }
385  // Exposed filters now get added to the filter array, not as a separate array.
386  $count = 0;
387  foreach ($imported->exposed_filter as $field) {
388    $id = $field['id'];
389    $item = $view->get_item('default', 'filter', $id);
390    if (views_get_handler($item['table'], $item['field'], 'filter')) {
391      $item['exposed'] = TRUE;
392
393      // Use the count to emulate the old, hardcoded filter naming.
394      $item['expose']['identifier'] = 'filter' . $count;
395      $item['expose']['label'] = $field['label'];
396      $item['expose']['operator'] = $field['operator'] ? 'op' . $count : '';
397      $item['expose']['optional'] = $field['optional'];
398      $item['expose']['single'] = $field['single'];
399      $view->set_item('default', 'filter', $id, $item);
400    }
401    $count++;
402    foreach (module_implements('views_convert') as $module) {
403      module_invoke($module, 'views_convert', 'default', 'exposed_filter', $view, $field, $id);
404    }
405  }
406
407  return $view;
408}
409
410function views1_convert_style(&$view, &$handler, $type) {
411  switch ($type) {
412    case 'list':
413      $handler->set_option('style_plugin', 'list');
414      $handler->set_option('style_options', array('type' => 'ul'));
415      $handler->set_option('row_plugin', 'fields');
416      break;
417    case 'node':
418      $handler->set_option('row_plugin', 'node');
419      $handler->set_option('row_options', array('teaser' => FALSE, 'links' => TRUE));
420      break;
421    case 'teaser':
422      $handler->set_option('row_plugin', 'node');
423      $handler->set_option('row_options', array('teaser' => TRUE, 'links' => TRUE));
424      break;
425    case 'table':
426      $options = array();
427      $options['columns'] = array();
428      $options['default'] = '';
429      $options['info'] = array();
430      $options['override'] = FALSE;
431      $options['order'] = 'asc';
432
433      $handler->set_option('style_plugin', 'table');
434      $handler->set_option('style_options', $options);
435      break;
436    case 'views_rss':
437      $feed_display = $view->add_display('feed');
438      $feed_display->set_option('style_plugin', 'rss');
439      $feed_display->set_option('row_plugin', 'node_rss');
440      $feed_display->set_option('path', $handler->get_option('path'));
441      $feed_display->set_options('displays', array($handler->id));
442      $feed_display->set_option('page', $handler->get_option('pager'));
443      break;
444    default:
445      // Ask around if anybody else knows.
446      foreach (module_implements('views_convert') as $module) {
447        module_invoke($module, 'views_convert', $handler->display->id, 'style', $view, $type);
448      }
449  }
450}
451/**
452 * Load a version 1 view from the database.
453 *
454 */
455function views1_load($arg) {
456  static $cache = array();
457  $which = is_numeric($arg) ? 'vid' : 'name';
458  if (isset($cache[$which][$arg])) {
459    return $cache[$which][$arg];
460  }
461
462  $where = (is_numeric($arg) ? "v.vid =  %d" : "v.name = '%s'");
463  $view = db_fetch_object(db_query("SELECT v.* FROM {view_view} v WHERE $where", $arg));
464
465  if (!$view->name) {
466    return NULL;
467  }
468
469  $view->access = ($view->access ? explode(', ', $view->access) : array());
470
471  // load the sorting criteria too.
472  $result = db_query("SELECT * FROM {view_sort} vs WHERE vid = $view->vid ORDER BY position ASC");
473
474  $view->sort = array();
475  while ($sort = db_fetch_array($result)) {
476    if (substr($sort['field'], 0, 2) == 'n.') {
477      $sort['field'] = 'node' . substr($sort['field'], 1);
478    }
479    $sort['id'] = $sort['field'];
480    $bits = explode('.', $sort['field']);
481    $sort['tablename'] = $bits[0];
482    $sort['field'] = $bits[1];
483    $view->sort[$sort['position']] = $sort;
484  }
485
486  $result = db_query("SELECT * FROM {view_argument} WHERE vid = $view->vid ORDER BY position ASC");
487
488  $view->argument = array();
489  while ($arg = db_fetch_array($result)) {
490    $arg['id'] = $arg['type'];
491    $view->argument[$arg['position']] = $arg;
492  }
493
494  $result = db_query("SELECT * FROM {view_tablefield} WHERE vid = $view->vid ORDER BY position ASC");
495
496  $view->field = array();
497  while ($arg = db_fetch_array($result)) {
498    if ($arg['tablename'] == 'n') {
499      $arg['tablename'] = 'node';
500    }
501    $arg['id'] = $arg['fullname'] = "$arg[tablename].$arg[field]";
502    $arg['queryname'] = "$arg[tablename]_$arg[field]";
503    $view->field[] = $arg;
504  }
505
506  $result = db_query("SELECT * FROM {view_filter} WHERE vid = $view->vid ORDER BY position ASC");
507
508  // TODO - Is it safe to ignore this $filters variable? This function depends
509  // on lots of additional code needed to call hook_implements and construct
510  // all the views tables, so using it will add a lot of code to this file.
511  //$filters = _views_get_filters();
512  $view->filter = array();
513  while ($filter = db_fetch_array($result)) {
514    if (substr($filter['field'], 0, 2) == 'n.') {
515      $filter['field'] = 'node' . substr($filter['field'], 1);
516    }
517
518    if ($filter['operator'] == 'AND' ||
519        $filter['operator'] == 'OR' ||
520        $filter['operator'] == 'NOR') {
521        // TODO - need another way to identify this type of filter
522        // without being able to call hook_implements().
523        //|| $filters[$filter['field']]['value-type'] == 'array' ) {
524      if ($filter['value'] !== NULL && $filter['value'] !== '') {
525        $filter['value'] = explode(',', $filter['value']);
526      }
527      else {
528        $filter['value'] = array();
529      }
530    }
531    $filter['id'] = $filter['field'];
532    $bits = explode('.', $filter['field']);
533    $filter['tablename'] = $bits[0];
534    $filter['field'] = $bits[1];
535    $view->filter[$filter['position']] = $filter;
536  }
537
538  $result = db_query("SELECT * FROM {view_exposed_filter} WHERE vid = $view->vid ORDER BY position ASC");
539
540  $view->exposed_filter = array();
541  while ($arg = db_fetch_array($result)) {
542    $arg['id'] = $arg['field'];
543    $view->exposed_filter[] = $arg;
544  }
545
546  $cache['vid'][$view->vid] = $view;
547  $cache['name'][$view->name] = $view;
548
549  return $view;
550}
551
552/**
553 * Delete a version 1 view from the database.
554 *
555 */
556function views1_delete($arg) {
557  static $cache = array();
558  $where = (is_numeric($arg) ? "v.vid =  %d" : "v.name = '%s'");
559  $view = db_fetch_object(db_query("SELECT v.* FROM {view_view} v WHERE $where", $arg));
560
561  if (!$view->name) {
562    return NULL;
563  }
564
565
566
567  $result = db_query("DELETE FROM {view_sort} WHERE vid = $view->vid");
568  $result = db_query("DELETE FROM {view_argument} WHERE vid = $view->vid");
569  $result = db_query("DELETE FROM {view_tablefield} WHERE vid = $view->vid");
570  $result = db_query("DELETE FROM {view_filter} WHERE vid = $view->vid");
571  $result = db_query("DELETE FROM {view_exposed_filter} WHERE vid = $view->vid");
572  $result = db_query("DELETE FROM {view_view} WHERE vid = $view->vid");
573}
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.