1 <?php
 2 
 3 /**
 4  * MetaForm Addon.
 5  *
 6  * @author markus[dot]staab[at]redaxo[dot]de Markus Staab
 7  *
 8  * @package redaxo\metainfo
 9  */
10 
11 rex_extension::register('BACKUP_BEFORE_DB_IMPORT', 'rex_metainfo_cleanup');
12 
13 /**
14  * Alle Metafelder löschen, nicht das nach einem Import in der Parameter Tabelle
15  * noch Datensätze zu Feldern stehen, welche nicht als Spalten in der
16  * rex_article angelegt wurden!
17  */
18 function rex_metainfo_cleanup($epOrParams)
19 {
20     $params = $epOrParams instanceof rex_extension_point ? $epOrParams->getParams() : $epOrParams;
21     // Cleanup nur durchführen, wenn auch die rex_article Tabelle neu angelegt wird
22     if (isset($params['force']) && $params['force'] != true &&
23          strpos($params['content'], 'CREATE TABLE `' . rex::getTablePrefix() . 'article`') === false &&
24          strpos($params['content'], 'CREATE TABLE ' . rex::getTablePrefix() . 'article') === false
25     ) {
26         return;
27     }
28 
29     // check wheter tables exists
30     $tables = rex_sql::showTables();
31     if (!isset($tables[rex::getTablePrefix() . 'metainfo_field'])) {
32         return false;
33     }
34 
35     // since this extension may be used also when the addon is not yet installed,
36     // require needed classes manually
37     require_once __DIR__ . '/../lib/table_manager.php';
38 
39     $sql = rex_sql::factory();
40     $sql->setQuery('SELECT name FROM ' . rex::getTablePrefix() . 'metainfo_field');
41 
42     for ($i = 0; $i < $sql->getRows(); ++$i) {
43         $prefix = rex_metainfo_meta_prefix($sql->getValue('name'));
44         $table = rex_metainfo_meta_table($prefix);
45         $tableManager = new rex_metainfo_table_manager($table);
46 
47         $tableManager->deleteColumn($sql->getValue('name'));
48 
49         $sql->next();
50     }
51 
52     // evtl reste aufräumen
53     $tablePrefixes = ['article' => ['art_', 'cat_'], 'media' => ['med_'], 'clang' => ['clang_']];
54     foreach ($tablePrefixes as $table => $prefixes) {
55         $table = rex::getTablePrefix() . $table;
56         $tableManager = new rex_metainfo_table_manager($table);
57 
58         foreach (rex_sql::showColumns($table) as $column) {
59             $column = $column['name'];
60             if (in_array(substr($column, 0, 4), $prefixes)) {
61                 $tableManager->deleteColumn($column);
62             }
63         }
64     }
65 
66     $sql = rex_sql::factory();
67     $sql->setQuery('DELETE FROM ' . rex::getTablePrefix() . 'metainfo_field');
68 }
69