17c5fd8d6SMichael Grosse<?php 2d6d97f60SAnna Dabrowska 37c5fd8d6SMichael Grosse/** 47c5fd8d6SMichael Grosse * DokuWiki Plugin struct (Helper Component) 57c5fd8d6SMichael Grosse * 67c5fd8d6SMichael Grosse * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 77c5fd8d6SMichael Grosse * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 87c5fd8d6SMichael Grosse */ 97c5fd8d6SMichael Grosse 107cbcfbdbSAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments; 11aeca15adSMichael Grosseuse dokuwiki\plugin\struct\meta\Schema; 12aeca15adSMichael Grosse 13d6d97f60SAnna Dabrowskaclass helper_plugin_struct_imexport extends DokuWiki_Plugin 14d6d97f60SAnna Dabrowska{ 157c5fd8d6SMichael Grosse private $sqlite; 167c5fd8d6SMichael Grosse 17fa7b96aaSMichael Grosse /** 18fa7b96aaSMichael Grosse * this possibly duplicates @see helper_plugin_struct::getSchema() 19fa7b96aaSMichael Grosse */ 20d6d97f60SAnna Dabrowska public function getAllSchemasList() 21d6d97f60SAnna Dabrowska { 22aeca15adSMichael Grosse return Schema::getAll(); 237c5fd8d6SMichael Grosse } 247c5fd8d6SMichael Grosse 257c5fd8d6SMichael Grosse /** 26c4ce7499SMichael Grosse * Delete all existing assignment patterns of a schema and replace them with the provided ones. 27c4ce7499SMichael Grosse * 28c4ce7499SMichael Grosse * @param string $schemaName 29aeca15adSMichael Grosse * @param string[] $patterns 307c5fd8d6SMichael Grosse */ 31d6d97f60SAnna Dabrowska public function replaceSchemaAssignmentPatterns($schemaName, $patterns) 32d6d97f60SAnna Dabrowska { 337c5fd8d6SMichael Grosse /** @var \helper_plugin_struct_db $helper */ 34aeca15adSMichael Grosse $helper = plugin_load('helper', 'struct_db'); 357cbcfbdbSAndreas Gohr $this->sqlite = $helper->getDB(false); 367cbcfbdbSAndreas Gohr if (!$this->sqlite) return; 377cbcfbdbSAndreas Gohr 38c4ce7499SMichael Grosse $schemaName = $this->sqlite->escape_string($schemaName); 397c5fd8d6SMichael Grosse $sql = array(); 40c4ce7499SMichael Grosse $sql[] = "DELETE FROM schema_assignments_patterns WHERE tbl = '$schemaName'"; 41c4ce7499SMichael Grosse $sql[] = "DELETE FROM schema_assignments WHERE tbl = '$schemaName'"; 427c5fd8d6SMichael Grosse foreach ($patterns as $pattern) { 431bd268d2SMichael Grosse $pattern = $this->sqlite->escape_string($pattern); 44c4ce7499SMichael Grosse $sql[] = "INSERT INTO schema_assignments_patterns (pattern, tbl) VALUES ('$pattern','$schemaName')"; 457c5fd8d6SMichael Grosse } 467c5fd8d6SMichael Grosse 477c5fd8d6SMichael Grosse $this->sqlite->doTransaction($sql); 487cbcfbdbSAndreas Gohr $assignments = Assignments::getInstance(); 49c4ce7499SMichael Grosse $assignments->propagatePageAssignments($schemaName); 507c5fd8d6SMichael Grosse } 517c5fd8d6SMichael Grosse 52c4ce7499SMichael Grosse /** 53c4ce7499SMichael Grosse * Returns array of patterns for the given Schema 54c4ce7499SMichael Grosse * 55c4ce7499SMichael Grosse * @param string $schemaName 56c4ce7499SMichael Grosse * @return string[] 57c4ce7499SMichael Grosse */ 58d6d97f60SAnna Dabrowska public function getSchemaAssignmentPatterns($schemaName) 59d6d97f60SAnna Dabrowska { 607c5fd8d6SMichael Grosse /** @var \helper_plugin_struct_db $helper */ 61aeca15adSMichael Grosse $helper = plugin_load('helper', 'struct_db'); 627cbcfbdbSAndreas Gohr $this->sqlite = $helper->getDB(false); 637cbcfbdbSAndreas Gohr if (!$this->sqlite) return array(); 647c5fd8d6SMichael Grosse 657c5fd8d6SMichael Grosse $sql = 'SELECT pattern FROM schema_assignments_patterns WHERE tbl = ?'; 66*79b29326SAnna Dabrowska $patterns = $this->sqlite->queryAll($sql, $schemaName); 67d6d97f60SAnna Dabrowska return array_map(function ($elem) { 68d6d97f60SAnna Dabrowska return $elem['pattern']; 69d6d97f60SAnna Dabrowska }, $patterns); 707c5fd8d6SMichael Grosse } 717c5fd8d6SMichael Grosse 72c4ce7499SMichael Grosse /** 7326d59c4aSMichael Grosse * Get the json of the current version of the given schema or false if the schema doesn't exist. 74c4ce7499SMichael Grosse * 75c4ce7499SMichael Grosse * @param string $schemaName 7626d59c4aSMichael Grosse * @return string|bool The json string or false if the schema doesn't exist 77c4ce7499SMichael Grosse */ 78d6d97f60SAnna Dabrowska public function getCurrentSchemaJSON($schemaName) 79d6d97f60SAnna Dabrowska { 8026d59c4aSMichael Grosse $schema = new Schema($schemaName); 8126d59c4aSMichael Grosse if ($schema->getId() == 0) { 8226d59c4aSMichael Grosse return false; 8326d59c4aSMichael Grosse } 8426d59c4aSMichael Grosse return $schema->toJSON(); 85fa7b96aaSMichael Grosse } 86fa7b96aaSMichael Grosse 87c4ce7499SMichael Grosse /** 88c4ce7499SMichael Grosse * Import a schema. If a schema with the given name already exists, then it will be overwritten. Otherwise a new 89c4ce7499SMichael Grosse * schema will be created. 90c4ce7499SMichael Grosse * 91c4ce7499SMichael Grosse * @param string $schemaName The name of the schema 92c4ce7499SMichael Grosse * @param string $schemaJSON The structure of the schema as exportet by structs export functionality 93748e747fSAnna Dabrowska * @param string $user optional, the user that should be set in the schemas history. 94748e747fSAnna Dabrowska * If blank, the current user is used. 95c4ce7499SMichael Grosse * @return bool|int the id of the new schema version or false on error. 9657920350SMichael Grosse * 9757920350SMichael Grosse * @throws dokuwiki\plugin\struct\meta\StructException 98c4ce7499SMichael Grosse */ 99d6d97f60SAnna Dabrowska public function importSchema($schemaName, $schemaJSON, $user = null) 100d6d97f60SAnna Dabrowska { 101c4ce7499SMichael Grosse $importer = new \dokuwiki\plugin\struct\meta\SchemaImporter($schemaName, $schemaJSON); 10278bff02fSMichael Grosse if (!blank($user)) { 10378bff02fSMichael Grosse $importer->setUser($user); 10478bff02fSMichael Grosse } 10578bff02fSMichael Grosse $ok = $importer->build(); 106fa7b96aaSMichael Grosse return $ok; 107fa7b96aaSMichael Grosse } 1087c5fd8d6SMichael Grosse} 109