/lib/_WV2/MetaInfo.php
PHP | 372 lines | 154 code | 47 blank | 171 comment | 10 complexity | 36ede6f83e613aac824cd092b2e8b6f8 MD5 | raw file
- <?php
- /*
- * Copyright (c) 2010, webvariants GbR, http://www.webvariants.de
- *
- * This file is released under the terms of the MIT license. You can find the
- * complete text in the attached LICENSE file or online at:
- *
- * http://www.opensource.org/licenses/mit-license.php
- */
- /**
- * @defgroup objects Objekt-Abstraktion
- */
- /**
- * Metainformation
- *
- * Eine Metainformation ist eine zusätzliche Information, die einem Artikel /
- * Kategorie / Medium zugewiesen werden kann. Sie besteht aus einem internen
- * Namen, einem Ttel, einem Datentyp sowie einigen weiteren Daten.
- *
- * Metainformationen können über Artikeltypen gruppiert werden. Auf diese Weise
- * kann einem Artikel immer eine ganz bestimmte Teilmenge aller verfügbaren
- * Metainformationen zugewiesen werden.
- *
- * Eine einzelne Metainformation kann nur entweder für Artikel oder für Kategorien
- * oder für Medien verwendet werden. Die internen Namen müssen für jeden dieser
- * drei Bereiche jeweils eindeutig sein.
- *
- * Artikel-Metainformationen können noch einmal in zwei Bereiche unterteilt
- * werden:
- *
- * - Content-Seite: Die Information (das Formular) wird direkt auf der
- * Slice-Seite eines Artikels angezeigt.
- * - Extra-Seite: Die Information wird auf der separaten Meta-Seite von
- * Redaxo angezeigt.
- *
- * @ingroup objects
- * @author Christoph
- */
- class _WV2_MetaInfo extends WV_Object implements _WV_IProperty {
- protected $id; ///< int die interne ID
- protected $name; ///< string der interne Name
- protected $title; ///< string der angezeigte Name (Titel)
- protected $position; ///< int Position in der Sortierreihenfolge
- protected $datatype; ///< int die Datentyp-ID
- protected $params; ///< string die Datentyp-Parameter
- protected $default; ///< string der Standardwert der Metainformation
- protected $separatePage; ///< boolean wenn true, wird die Information nur auf der separaten Meta-Seite von Artikeln angezeigt
- protected $articleTypes; ///< array Liste von Artikeltypen, denen diese Information zugewiesen ist
- protected $type; ///< int Typ (Artikel-, Kategorie- oder Medium-Metainformation)
- protected $helptext; ///< string der Hilfetext
- protected $hidden; ///< boolean wenn true wird die Info im Backend nicht angezeigt
- protected $origArticleTypes;
- protected static $instances = array();
- /**
- * Singleton
- *
- * Gibt eine Instanz der Klasse zurück.
- *
- * @throws WV2_Exception falls die ID nicht gefunden wurde
- * @param mixed $idOrName die ID (int) oder der interne Name (string) der Metainformation
- * @param int $type der Typ
- * @param array $prefetchedData falls durch eine SQL-Anfrage bereits ganze Tupel geholt werden, können diese hier angegeben werden, um eine SQL-Anfrage zu sparen
- * @return _WV2_MetaInfo
- */
- public static function getInstance($idOrName, $type) {
- $id = self::getIDForName($idOrName, $type);
- $key = $id.'_'.intval($type);
- if (empty(self::$instances[$key])) {
- $callback = array(__CLASS__, '_getInstance');
- $instance = self::getFromCache('metainfoex.objects', $key, $callback, array($id, $type));
- self::$instances[$key] = $instance;
- }
- return self::$instances[$key];
- }
- protected static function _getInstance($id, $type) {
- return new self($id, $type);
- }
- /**
- * Konstruktor
- *
- * Holt (wenn nötig) die Daten der Metainformation und erzeugt das Objekt.
- *
- * @throws WV2_Exception falls die ID nicht gefunden wurde
- * @param mixed $id die ID (int) der Metainformation
- * @param int $type der Typ
- * @param array $prefetchedData falls durch eine SQL-Anfrage bereits ganze Tupel geholt werden, können diese hier angegeben werden, um eine SQL-Anfrage zu sparen
- */
- protected function __construct($id, $type)
- {
- $sql = WV_SQLEx::getInstance();
- $data = $sql->safeFetch('*', 'wv2_metainfo', 'id = ?', $id);
- if (!$data) {
- throw new WV2_Exception('Die Metainfo #'.$id.' konnte nicht gefunden werden!');
- }
- $this->id = (int) $data['id'];
- $this->name = $data['name'];
- $this->title = $data['title'];
- $this->position = (int) $data['position'];
- $this->datatype = (int) $data['datatype'];
- $this->params = $data['params'];
- $this->default = $data['default_option'];
- $this->separatePage = (bool) $data['separate_page'];
- $this->helptext = $data['helptext'];
- $this->hidden = (bool) $data['hidden'];
- $this->type = (int) $type;
- $this->articleTypes = array();
- if ($type == WV2_Metainfoex::TYPE_ARTICLE) {
- $this->articleTypes = $sql->getArray('SELECT type_id FROM ~wv2_metainfo_type WHERE metainfo_id = ?', $this->id, '~');
- $this->origArticleTypes = $this->articleTypes;
- }
- }
- /**
- * Datensatz aktualisieren
- *
- * Diese Methode prüft und speichert die über die Setter-Methoden gemachten
- * Änderungen permanent in der Datenbank. Sollte es dabei zu einem Konflikt
- * mit den Datentypen kommen, so wird die Methode standardmäßig die
- * notwendigen Konvertierungen direkt vornehmen, es sei denn, ihr wird dies
- * mit $convertDataIfRequired verboten.
- *
- * Geprüft wird, ob die nötigen Rechte bestehen, die Metainformation zu
- * bearbeiten und ob der (ggf. neue, geänderte) interne Name immer noch
- * eindeutig ist.
- *
- * Zusätzlich werden, falls sich die Zuordnung zu Artikeltypen geändert hat,
- * die nun nicht mehr benötigten / erlaubten Metadaten von Objekten entfernt.
- *
- * @throws WV2_Exception falls nicht genug Rechte bestehen oder der interne Name nicht eindeutig ist
- * @param boolean $convertDataIfRequired wenn true, werden Konflikte beim Datentyp automatisch bearbeitet
- * @param boolean $applyDefaults wenn true wird der Standardwert auf alle Artikel mit dieser Metainformation angewandt
- */
- public function update($convertDataIfRequired = true, $applyDefaults = false) {
- $crud = new _WV2_MetaInfo_CRUD($this, $this->origArticleTypes);
- $params = array($convertDataIfRequired, $applyDefaults);
- $retval = self::transactionGuard(array($crud, 'update'), $params, 'WV2_Exception');
- $this->origArticleTypes = $this->articleTypes;
- return $retval;
- }
- /**
- * Neue Metainformation erzeugen
- *
- * Diese Methode legt in der Datenbank eine neue Metainformation an. Dabei
- * werden die Rechte sowie die Eindeutigkeit des intenen Namens geprüft.
- *
- * @throws WV2_Exception falls die Rechte nicht ausreichen oder der interne Name nicht eindeutig ist
- * @param string $name interner Name
- * @param string $title angezeigter Titel
- * @param boolean $separatePage auf Slice-Seite (true) oder auf Meta-Seite (false)?
- * @param int $datatype Datentyp-ID
- * @param string $params Datentyp-Parameter
- * @param string $default der Standardwert (abhängig vom Datentyp)
- * @param string $helptext Hilfetext
- * @param array $arttypes Liste von Artikeltyp-IDs (int) (wird bei nicht-Artikel-Metainfos ignoriert)
- * @param int $type Typ (Artikel, Kategorie, Medium) (WV2_Metainfoex::TYPE-Konstante)
- * @param boolean $hidden wenn true wird die Metainfo im Backend nicht angezeigt
- * @return int die ID der neuen Metainfo
- */
- public static function create($name, $title, $separatePage, $datatype, $params, $default, $helptext, $arttypes, $type, $hidden = false) {
- $params = array($name, $title, $separatePage, $datatype, $params, $default, $helptext, $arttypes, $type, $hidden);
- return self::transactionGuard(array('_WV2_MetaInfo_CRUD', 'create'), $params, 'WV2_Exception');
- }
- /**
- * Metainformation löschen
- *
- * Hiermit wird eine Metainfo inkl. der zu ihr gehörenden Metadaten aus der
- * Datenbank entfernt. Das Löschen ist nur erlaubt, wenn der Benutzer das
- * Recht metainfo_complete hat.
- */
- public function delete() {
- $crud = new _WV2_MetaInfo_CRUD($this, array());
- return self::transactionGuard(array($crud, 'delete'), array(), 'WV2_Exception');
- }
- /**
- * Verschieben
- *
- * Diese Methode wird vom Ajax-Handler aufgerufen, um eine Metainformation
- * zu verschieben. Die neue Position ist dabei eindeutig innerhalb von
- * Metainfo-Typen (d.h., die drei Listen von Metainfos werden einzeln
- * nummeriert).
- *
- * @param int $position die neue Position (1 bis n)
- */
- public function shift($position) {
- $crud = new _WV2_MetaInfo_CRUD($this, array());
- $retval = self::transactionGuard(array($crud, 'shift'), $position, 'WV2_Exception');
- $this->position = $position;
- return $retval;
- }
- /**
- * Datentyp/Parameter-Kompatibilität prüfen
- *
- * Diese Methode prüft, ob bei einer Datentyp-Änderung die neuen Typen
- * ineinander konvertiert werden können. Falls sich die Parameter geändert
- * haben, wird geprüft, ob diese weiterhin kompatibel sind.
- *
- * Tritt eine Inkompatibilität auf, wird der Benutzer informiert und eine
- * Bestätigung von ihm eingefordert.
- *
- * @param boolean $confirmed wenn true, beendet die Methode direkt mit true
- * @param _WV2_MetaInfo $metainfo die betreffende Metainformation
- * @param int $newDatatype die ID des neuen Datentyps
- * @return boolean true, wenn alles i.O. ist, false, wenn ein Formular generiert wurde und der Controller anhalten soll
- */
- public static function checkCompatibility($confirmed, $metainfo, $newDatatype) {
- $params = array($confirmed, $metainfo, $newDatatype);
- return call_user_func_array(array('_WV2_MetaInfo_CRUD', 'checkCompatibility'), $params);
- }
- /**
- * Datentyp und Parameter ermitteln
- *
- * Gibt die ID des Datentyps und die Parameter für eine beliebige
- * Metainformation zurück. NICHT für das aktuelle MetaInfo-Objekt!
- *
- * @throws WV2_Exception falls der Name als String nicht gefunden wurde
- * @param mixed $metainfo der interne Name (string), die ID (int) oder direkt ein _WV2_MetaInfo-Objekt
- * @param int $type der Typ der Metainformation
- * @return array assoziatives Array mit 'datatype' und 'params' als Schlüssel
- */
- public static function getDatatypeWithParams($metainfo, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- if ($metainfo instanceof self) {
- return array('datatype' => $metainfo->getDatatypeID(), 'params' => $metainfo->getParams());
- }
- elseif ($metainfo instanceof _WV2_MetaInfo_CRUD) {
- return array('datatype' => $metainfo->call('getDatatypeID'), 'params' => $metainfo->call('getParams'));
- }
- $metainfo = self::getIDForName($metainfo, $type);
- return WV_SQLEx::getInstance()->fetch('datatype,params', 'wv2_metainfo', 'id = ?', $metainfo);
- }
- /**
- * ID ermitteln
- *
- * Gibt die ID einer Metainfo für deren Namen zurück.
- *
- * @throws WV2_Exception falls der Name nicht gefunden wurde
- * @param string $name der interne Name der Metainformation
- * @param int $type der Typ der Metainformation
- * @return int die ID
- */
- public static function getIDForName($name, $type = WV2_Metainfoex::TYPE_ARTICLE)
- {
- if (sly_Util_String::isInteger($name)) {
- return (int) $name;
- }
- $cache = WV_DeveloperUtils::getCache();
- $namespace = 'metainfoex.idmappings';
- $cacheKey = WV_Cache::generateKey('metainfo', $name, $type);
- $id = $cache->get($namespace, $cacheKey, -1);
- if ($id >= 0) {
- return (int) $id;
- }
- $id = WV_SQLEx::getInstance()->safeFetch('id', 'wv2_metainfo', 'name = ? AND meta_type = ?', array($name, $type));
- if ($id === false) {
- throw new WV2_Exception(t('metainfo_infonotfound', $name));
- }
- $cache->set($namespace, $cacheKey, (int) $id);
- return (int) $id;
- }
- /*@{*/
- /**
- * Getter
- *
- * Gibt die entsprechende Eigenschaft ungefiltert zurück.
- *
- * @return mixed die entsprechende Eigenschaft
- */
- public function getID() { return $this->id; }
- public function getName() { return $this->name; }
- public function getTitle() { return $this->title; }
- public function getPosition() { return $this->position; }
- public function getDatatype() { return $this->datatype; }
- public function getDatatypeID() { return $this->datatype; }
- public function getParams() { return $this->params; }
- public function getDefault() { return $this->default; }
- public function getArticleTypes() { return $this->articleTypes; }
- public function getSeparatePage() { return $this->separatePage; }
- public function getType() { return $this->type; }
- public function getHelpText() { return $this->helptext; }
- public function isHidden() { return $this->hidden; }
- public function isMultilingual() { return false; }
- /*@}*/
- /*@{*/
- /**
- * Setter
- *
- * Setzt die entsprechende Eigenschaft. Für alle bis auf den Artikeltyp
- * wird das Recht metainfo_complete benötigt. Für den Artikeltyp benötigt
- * man metainfo_articletype.
- * Das Überprüfen der Werte übernimmt erst die update()-Methode.
- *
- * @param mixed $value der neue Wert
- */
- public function setDatatype($value) {
- $this->datatype = (int) $value;
- }
- public function setDefault($value) {
- $this->default = trim($value);
- }
- public function setHelpText($value) {
- $this->helptext = trim($value);
- }
- public function setName($value) {
- $value = trim($value);
- if (empty($value)) {
- throw new WV2_Exception(t('metainfo_intnameempty'));
- }
- $this->name = $value;
- }
- public function setParams($value) {
- $this->params = $value;
- }
- public function setTitle($value) {
- $value = trim($value);
- if (empty($value)) {
- throw new WV2_Exception(t('metainfo_titleempty'));
- }
- $this->title = $value;
- }
- public function setArticleTypes($value) {
- $this->articleTypes = array_unique(array_map('intval', sly_makeArray($value)));
- }
- public function setSeparatePage($value) {
- $this->separatePage = (bool) $value;
- }
- /*@}*/
- }