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 107234bfb1Ssplitbrainuse dokuwiki\Extension\Plugin; 117234bfb1Ssplitbrainuse dokuwiki\plugin\sqlite\SQLiteDB; 127234bfb1Ssplitbrainuse dokuwiki\plugin\struct\meta\StructException; 137234bfb1Ssplitbrainuse dokuwiki\plugin\struct\meta\SchemaImporter; 147cbcfbdbSAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments; 15aeca15adSMichael Grosseuse dokuwiki\plugin\struct\meta\Schema; 16aeca15adSMichael Grosse 177234bfb1Ssplitbrainclass helper_plugin_struct_imexport extends Plugin 18d6d97f60SAnna Dabrowska{ 197c5fd8d6SMichael Grosse private $sqlite; 207c5fd8d6SMichael Grosse 21fa7b96aaSMichael Grosse /** 22fa7b96aaSMichael Grosse * this possibly duplicates @see helper_plugin_struct::getSchema() 23fa7b96aaSMichael Grosse */ 24d6d97f60SAnna Dabrowska public function getAllSchemasList() 25d6d97f60SAnna Dabrowska { 26aeca15adSMichael Grosse return Schema::getAll(); 277c5fd8d6SMichael Grosse } 287c5fd8d6SMichael Grosse 297c5fd8d6SMichael Grosse /** 30c4ce7499SMichael Grosse * Delete all existing assignment patterns of a schema and replace them with the provided ones. 31c4ce7499SMichael Grosse * 32c4ce7499SMichael Grosse * @param string $schemaName 33aeca15adSMichael Grosse * @param string[] $patterns 347c5fd8d6SMichael Grosse */ 35d6d97f60SAnna Dabrowska public function replaceSchemaAssignmentPatterns($schemaName, $patterns) 36d6d97f60SAnna Dabrowska { 377c5fd8d6SMichael Grosse /** @var \helper_plugin_struct_db $helper */ 38aeca15adSMichael Grosse $helper = plugin_load('helper', 'struct_db'); 397cbcfbdbSAndreas Gohr $this->sqlite = $helper->getDB(false); 407234bfb1Ssplitbrain if (!$this->sqlite instanceof SQLiteDB) return; 417cbcfbdbSAndreas Gohr 42c4ce7499SMichael Grosse $schemaName = $this->sqlite->escape_string($schemaName); 437234bfb1Ssplitbrain $sql = []; 44c4ce7499SMichael Grosse $sql[] = "DELETE FROM schema_assignments_patterns WHERE tbl = '$schemaName'"; 45c4ce7499SMichael Grosse $sql[] = "DELETE FROM schema_assignments WHERE tbl = '$schemaName'"; 467c5fd8d6SMichael Grosse foreach ($patterns as $pattern) { 471bd268d2SMichael Grosse $pattern = $this->sqlite->escape_string($pattern); 48c4ce7499SMichael Grosse $sql[] = "INSERT INTO schema_assignments_patterns (pattern, tbl) VALUES ('$pattern','$schemaName')"; 497c5fd8d6SMichael Grosse } 507c5fd8d6SMichael Grosse 517c5fd8d6SMichael Grosse $this->sqlite->doTransaction($sql); 527cbcfbdbSAndreas Gohr $assignments = Assignments::getInstance(); 53c4ce7499SMichael Grosse $assignments->propagatePageAssignments($schemaName); 547c5fd8d6SMichael Grosse } 557c5fd8d6SMichael Grosse 56c4ce7499SMichael Grosse /** 57c4ce7499SMichael Grosse * Returns array of patterns for the given Schema 58c4ce7499SMichael Grosse * 59c4ce7499SMichael Grosse * @param string $schemaName 60c4ce7499SMichael Grosse * @return string[] 61c4ce7499SMichael Grosse */ 62d6d97f60SAnna Dabrowska public function getSchemaAssignmentPatterns($schemaName) 63d6d97f60SAnna Dabrowska { 647c5fd8d6SMichael Grosse /** @var \helper_plugin_struct_db $helper */ 65aeca15adSMichael Grosse $helper = plugin_load('helper', 'struct_db'); 667cbcfbdbSAndreas Gohr $this->sqlite = $helper->getDB(false); 677234bfb1Ssplitbrain if (!$this->sqlite instanceof SQLiteDB) return []; 687c5fd8d6SMichael Grosse 697c5fd8d6SMichael Grosse $sql = 'SELECT pattern FROM schema_assignments_patterns WHERE tbl = ?'; 7079b29326SAnna Dabrowska $patterns = $this->sqlite->queryAll($sql, $schemaName); 71*5e29103aSannda return array_map(static fn($elem) => $elem['pattern'], $patterns); 727c5fd8d6SMichael Grosse } 737c5fd8d6SMichael Grosse 74c4ce7499SMichael Grosse /** 7526d59c4aSMichael Grosse * Get the json of the current version of the given schema or false if the schema doesn't exist. 76c4ce7499SMichael Grosse * 77c4ce7499SMichael Grosse * @param string $schemaName 7826d59c4aSMichael Grosse * @return string|bool The json string or false if the schema doesn't exist 79c4ce7499SMichael Grosse */ 80d6d97f60SAnna Dabrowska public function getCurrentSchemaJSON($schemaName) 81d6d97f60SAnna Dabrowska { 8226d59c4aSMichael Grosse $schema = new Schema($schemaName); 8326d59c4aSMichael Grosse if ($schema->getId() == 0) { 8426d59c4aSMichael Grosse return false; 8526d59c4aSMichael Grosse } 8626d59c4aSMichael Grosse return $schema->toJSON(); 87fa7b96aaSMichael Grosse } 88fa7b96aaSMichael Grosse 89c4ce7499SMichael Grosse /** 90c4ce7499SMichael Grosse * Import a schema. If a schema with the given name already exists, then it will be overwritten. Otherwise a new 91c4ce7499SMichael Grosse * schema will be created. 92c4ce7499SMichael Grosse * 93c4ce7499SMichael Grosse * @param string $schemaName The name of the schema 94c4ce7499SMichael Grosse * @param string $schemaJSON The structure of the schema as exportet by structs export functionality 95748e747fSAnna Dabrowska * @param string $user optional, the user that should be set in the schemas history. 96748e747fSAnna Dabrowska * If blank, the current user is used. 97c4ce7499SMichael Grosse * @return bool|int the id of the new schema version or false on error. 9857920350SMichael Grosse * 997234bfb1Ssplitbrain * @throws StructException 100c4ce7499SMichael Grosse */ 101d6d97f60SAnna Dabrowska public function importSchema($schemaName, $schemaJSON, $user = null) 102d6d97f60SAnna Dabrowska { 1037234bfb1Ssplitbrain $importer = new SchemaImporter($schemaName, $schemaJSON); 10478bff02fSMichael Grosse if (!blank($user)) { 10578bff02fSMichael Grosse $importer->setUser($user); 10678bff02fSMichael Grosse } 10778bff02fSMichael Grosse $ok = $importer->build(); 108fa7b96aaSMichael Grosse return $ok; 109fa7b96aaSMichael Grosse } 1107c5fd8d6SMichael Grosse} 111