/lib/WV2/MetaProvider.php
PHP | 1484 lines | 799 code | 287 blank | 398 comment | 99 complexity | 76a937929557df3864e13fe451345767 MD5 | raw file
- <?php
- /**
- * @defgroup external Externe, öffentliche API
- */
- /**
- * Meta-Provider
- *
- * Diese Klasse stellt die API zum Zugriff auf die erweiterten Metainfos dar.
- * Sämtlicher Zugriff auf die Metadaten/-infos sollte von außerhalb dieses
- * AddOns *NUR* über diese Methoden erfolgen. Hier kann in keinem Fall Schaden
- * angerichtet werden.
- *
- * Von einigen Methoden gibt es 4fache Ausführungen: Eine für Artikel-Metadaten,
- * eine für Kategorien, eine für Medien und eine zusammengefasste für Objekte
- * aller Art. Der Methode für Objekte muss zusätzlich der Typ der Metadaten/-infos
- * mit übergeben werden. Es wird empfohlen, die spezifischen Methoden direkt
- * zu nutzen, da diese einfacher anzuwenden sind (bieten nur die wirklich
- * benötigten Parameter).Einzige Ausnahme ist getObjectMetaData, die Mutter aller
- * Hilfsmethoden: Da diese eine SQL-Abfrage erwartet ist sie nicht public. Dort
- * ist der Anwender demzufolge zum Nutzen der spezifischen Methoden gezwungen.
- *
- * Alle Methoden, die eine Angabe zum Artikeltyp erlauben, akzeptieren diese
- * als String (interner Name) oder als Zahl (ID). Die Umwandlung in das
- * benötigte Format erfolgt automatisch, um den Nutzer von der lästigen Arbeit,
- * selber getIdForName() aufrufen zu müssen, zu befreien.
- *
- * @ingroup external
- */
- abstract class WV2_MetaProvider {
- /** @name Daten cachen */
- /*@{*/
- /**
- * Daten für ein bestimmtes Objekt cachen
- *
- * Diese Method ruft für ein bestimmtes Objekt die Metadaten auf Vorrat ab,
- * um nachfolgende Aufrufe zu beschleunigen. Der Cache ist flüchtig und nur
- * für den aktuellen Request gültig.
- *
- * Alle Methoden, die Metadaten abrufen, holen ihre Daten aus dem Cache, wenn
- * sie vorhanden ist. Wenn nicht, legen sie sie immerhin im Anschluss an ihre
- * Arbeit dort ab.
- *
- * Im Regelfall ist es nicht nötig, Daten manuell über diese Methode in den
- * Cache zu laden. Wenn jedoch im Frontend von einem Objekt beispielsweise 20
- * Informationen abgerufen werden sollen, kann es Sinn machen, doch den Cache
- * vorher manuell zu befüllen.
- *
- * Achtung: Der Cache ist für den gesamten Request persistent. Das heißt,
- * dass Änderungen an den Metadaten in der Datenbank nicht dazu führen, dass
- * die Daten hier im Cache ungültig werden. Der MetaProvider wird weiterhin
- * für die Dauer des Requests die alten Daten zurückgeben.
- *
- * @param mixed $object das Objekt, für das die Daten geholt werden sollen
- * @param mixed $article der Artikel, für den die Daten geholt werden sollen
- * @param mixed $category die Kategorie, für die die Daten geholt werden sollen
- * @param mixed $medium die Datei, für die die Daten geholt werden sollen
- * @param int $clang die Sprache, für die die Daten geholt werden sollen
- * @param int $type der Objekttyp
- * @return int die Anzahl der abgerufenen Metadaten (0 auch im Fehlerfalle)
- */
- public static function prefetchMetaData($object, $clang = WV_Sally::CLANG_CURRENT, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- $objectID = WV2_Metainfoex::getIDForObject($object, false);
- $clang = WV_Sally::clang($clang);
- $type = (int) $type;
- $data = sly_makeArray(self::getMetaDataForObject($objectID, null, null, $clang, $type));
- $ids = array();
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.data';
- if ($data === null) {
- return 0;
- }
- foreach ($data as $date) {
- $ids[] = $date->getMetaInfoID();
- $key = sly_Cache::generateKey('type', $type, $objectID, $clang, $date->getMetaInfoID());
- $cache->set($namespace, $key, array(
- 'object' => $date,
- 'name' => $date->getMetainfoName()
- ));
- }
- // Kennzeichnen, dass wir für dieses Objekt definitv alle im Moment verfügbaren Daten geholt haben.
- // Dann können andere Methoden davon ausgehen, dass es nicht mehr zu holen gibt, als hier vorliegen.
- $key = sly_Cache::generateKey('type', $type, $objectID, $clang);
- $cache->set($namespace, $key, $ids);
- return count($ids);
- }
- public static function prefetchArticleMetaData($article, $clang = WV_Sally::CLANG_CURRENT) {
- return self::prefetchMetaData(WV2_Metainfoex::getIDForArticle($article), $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function prefetchCategoryMetaData($categoryID, $clang = WV_Sally::CLANG_CURRENT) {
- return self::prefetchMetaData(WV2_Metainfoex::getIDForCategory($category), $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function prefetchMediumMetaData($medium, $clang = WV_Sally::CLANG_CURRENT) {
- return self::prefetchMetaData(WV2_Metainfoex::getIDForMedium($medium), $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- /*@}*/
- /**
- * Artikeltyp ermitteln
- *
- * Diese Methode gibt die ID des Typs eines Artikels zurück.
- *
- * @param mixed $article der Artikel
- * @return mixed der Name des Artikeltyps oder false, falls noch keiner zugewiesen wurde
- */
- public static function getArticleTypeName($article = null) {
- $typeID = self::getArticleType($article);
- return $typeID == -1 ? false : _WV2_ArticleType::getInstance($typeID)->getName();
- }
- /**
- * Artikeltyp ermitteln
- *
- * Diese Methode gibt die ID des Typs eines Artikels zurück.
- *
- * @param mixed $article der Artikel
- * @return int die ID des Artikeltyps oder -1, falls der Artikel noch keinem Typ zugeordnet wurde
- */
- public static function getArticleType($article = null) {
- $articleID = $article ? WV2_Metainfoex::getIDForArticle($article) : WV_Sally::getCurrentArticleID();
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.atypes';
- $cacheKey = 'idfor_'.$articleID;
- $foundID = $cache->get($namespace, $cacheKey, -1);
- if ($foundID != -1) {
- return (int) $foundID;
- }
- $sql = WV_SQLEx::getInstance();
- $type = $sql->safeFetch('type_id', 'wv2_article_type', 'article_id = ?', $articleID);
- $type = $type === false ? -1 : (int) $type;
- $cache->set($namespace, $cacheKey, $type);
- return $type;
- }
- /**
- * Artikeltyp als Objekt ermitteln
- *
- * Diese Methode gibt ein _WV2_ArticleType-Objekt zurück, anstatt nur der ID.
- *
- * @param mixed $article der Artikel
- * @return _WV2_ArticleType der Artikeltyp oder null, falls der Artikel noch keinem Typ zugeordnet wurde
- */
- public static function getArticleTypeAsObject($article) {
- $type = self::getArticleType($article);
- return $type == -1 ? null : _WV2_ArticleType::getInstance($type);
- }
- /**
- * Prüft, ob ein Artikel von einem bestimmten Typ ist.
- *
- * @param mixed $article der Artikel
- * @param mixed $articleType die ID / der Name des Artikeltyps oder null, falls alle
- * @return bool true oder false
- */
- public static function isArticeOfType($articleType, $article = null) {
- $article = $article === null ? WV_Sally::getCurrentArticleID() : WV2_Metainfoex::getIDForArticle($article);
- return WV2_Metainfoex::getIDForArticleType($articleType, false) == self::getArticleType($article);
- }
- /**
- * Artikeltyp ermitteln
- *
- * Diese Methode gibt eine Liste aller Artikeltypen als _WV2_ArticleType-Objekte zurück.
- *
- * @param string $sortby das Sortierkriterium (kann jedes Attribut der Relation sein)
- * @param string $direction die Sortierreihenfolge ("ASC" oder "DESC")
- * @param string $where zusätzliches WHERE-Kriterium (Tabelle: sly_wv2_arttypes)
- * @return array eine Liste von _WV2_ArticleType-Objekten, die passen
- */
- public static function getAllArticleTypes($sortby = 'title', $direction = 'ASC', $where = '1') {
- $types = array();
- $data = array();
- $namespace = 'metainfoex.types';
- $cache = sly_Core::cache();
- $key = sly_Cache::generateKey('all_by', $sortby, $direction, $where);
- if (0 && $cache->exists($namespace, $key)) {
- $data = $cache->get($namespace, $key);
- }
- else {
- $sql = WV_SQLEx::getInstance();
- $data = $sql->getArray('SELECT id FROM ~wv2_arttypes WHERE '.$where.' ORDER BY '.$sortby.' '.$direction, array(), '~');
- $cache->set($namespace, $key, $data);
- }
- foreach ($data as $id) {
- $types[$id] = _WV2_ArticleType::getInstance($id);
- }
- return $types;
- }
- /**
- * (Benötigte) Metainfos ermitteln
- *
- * Diese Methode ermittelt für einen Artikeltyp
- * die dazugehörigen Metainfos. Wird für den
- * Artikeltyp -1 übergeben, so wird ein leeres
- * Array zurückgegeben, da der Typ "kein Typ"
- * keine Metainfos besitzt.
- *
- * @param mixed $articleType die ID / der Name des Artikeltyps
- * @return array eine Liste von _WV2_MetaInfo-Objekten
- */
- public static function getMetaInfosForArticleType($articleType) {
- $infos = array();
- $data = array();
- $namespace = 'metainfoex.infos';
- $cache = sly_Core::cache();
- $key = 'for_'.WV2_Metainfoex::TYPE_ARTICLE.'_'.WV2_Metainfoex::getIDForArticleType($articleType, false);
- if ($cache->exists($namespace, $key)) {
- $data = $cache->get($namespace, $key);
- }
- else {
- $sql = WV_SQLEx::getInstance();
- $data = $sql->getArray(
- 'SELECT ~wv2_metainfo.* FROM ~wv2_metainfo_type, ~wv2_metainfo '.
- 'WHERE id = metainfo_id AND type_id = ? AND meta_type = ? ORDER BY hidden ASC, position ASC',
- array(WV2_Metainfoex::getIDForArticleType($articleType, false), WV2_Metainfoex::TYPE_ARTICLE), '~'
- );
- $cache->set($namespace, $key, $data);
- }
- foreach ($data as $id => $row) {
- $infos[$id] = _WV2_MetaInfo::getInstance($id, WV2_Metainfoex::TYPE_ARTICLE, array_merge(array('id' => $id), $row));
- }
- return $infos;
- }
- /**
- * Artikelanzahl ermitteln
- *
- * Diese Methode ermittelt, wie viele Artikel einem Artikeltyp angehören.
- *
- * @param mixed $articleType der Artikeltyp als ID oder Name
- * @return int die Anzahl der zugehörigen Artikel
- */
- public static function getArticleCountByType($articleType, $onlineOnly = true) {
- // Sorgen um clang sind egal, für jeden Artikel existiert hier nur ein Eintrag
- $namespace = 'metainfoex.acount';
- $cache = sly_Core::cache();
- $typeID = WV2_Metainfoex::getIDForArticleType($articleType, false);
- $key = 'by_type_'.$typeID;
- if ($cache->exists($namespace, $key)) {
- $count = $cache->get($namespace, $key);
- }
- else {
- $count = 0;
- $sql = WV_SQLEx::getInstance();
- if (!$onlineOnly) {
- $count = $sql->count('wv2_article_type', 'type_id = ?', $typeID);
- }
- else {
- $query =
- 'SELECT COUNT(*) as count FROM ~wv2_article_type at '.
- 'JOIN ~article a ON (at.article_id = a.id) '.
- 'WHERE at.type_id = ? AND a.status = 1';
- $sql->queryEx($query, $typeID, '~');
- $row = $sql->row();
- $count = (int) $row['count'];
- }
- $cache->set($namespace, $key, $count);
- }
- return $count;
- }
- /**
- * Artikelliste ermitteln
- *
- * Diese Methode erzeugt eine Liste von OOArticle-Objekten basierend auf den
- * gegebenen Filterkriterien zurück.
- *
- * Für das Sortierkriterium ($sortby) stehen die Tabellen-Aliase
- *
- * - at (article_type)
- * - a (sly_article)
- *
- * bereit.
- *
- * @param mixed $articleType der Artikeltyp als ID oder Name
- * @param bool $onlineOnly wenn true, werden nur online Artikel berücksichtigt
- * @param string $sortby das Sortierkriterium (aus der Relation article oder wv2_article_type)
- * @param string $direction die Sortierrichtung
- * @param string $limitClause eine optionale "LIMIT a,b"-Angabe
- * @param int $clang die gewünschte Sprache
- * @return array Liste von passenden OOArticle-Objekten
- */
- public static function getArticlesByType($articleType, $onlineOnly = true, $sortby = 'updatedate', $direction = 'ASC', $limitClause = '', $clang = WV_Sally::CLANG_CURRENT, $asObjects = true) {
- $cache = sly_Core::cache();
- $articleType = WV2_Metainfoex::getIDForArticleType($articleType, false);
- $clang = WV_Sally::clang($clang);
- $return = array();
- $data = array();
- $namespace = 'metainfoex.alist';
- $key = sly_Cache::generateKey('type', $articleType, $clang, $onlineOnly, $sortby, $direction, $limitClause);
- if ($cache->exists($namespace, $key)) {
- $data = $cache->get($namespace, $key);
- }
- else {
- $sql = WV_SQLEx::getInstance();
- $params = array($articleType);
- $query = 'SELECT article_id, clang FROM ~wv2_article_type at, ~article a WHERE at.article_id = a.id AND type_id = ?';
- if ($clang != WV_Sally::CLANG_ALL) {
- $params[] = $clang;
- $query .= ' AND clang = ?';
- }
- if ($onlineOnly) {
- $query .= ' AND status = 1';
- }
- $sql->queryEx($query.' ORDER BY '.$sortby.' '.$direction.' '.$limitClause, $params, '~');
- foreach ($sql as $row) {
- $data[] = array_map('intval', $row);
- }
- $cache->set($namespace, $key, $data);
- }
- if (!$asObjects) {
- return $data;
- }
- foreach ($data as $row) {
- $return[] = OOArticle::getArticleById($row['article_id'], $row['clang']);
- }
- return $return;
- }
- /**
- * Artikelliste ermitteln
- *
- * Diese Methode erzeugt eine Liste von OOArticle-Objekten basierend auf den
- * gegebenen Filterkriterien zurück. Das Sortierkriterium muss eine Spalte in
- * der Tabelle sly_article sein.
- *
- * @param mixed $category die Artikelkategorie
- * @param boolean $onlineOnly wenn true, werden nur online Artikel berücksichtigt (default: true)
- * @param string $sortby das Sortierkriterium (aus der Relation article oder wv2_article_type)
- * @param string $direction die Sortierrichtung
- * @param string $limitClause eine optionale "LIMIT a,b"-Angabe
- * @param int $clang die gewünschte Sprache
- * @return array Liste von passenden OOArticle-Objekten
- */
- public static function getArticlesByCategory($category, $onlineOnly = true, $sortby = 'updatedate', $direction = 'ASC', $limitClause = '', $clang = WV_Sally::CLANG_CURRENT) {
- $cache = sly_Core::cache();
- $category = WV2_Metainfoex::getIDForCategory($category);
- $clang = WV_Sally::clang($clang);
- $return = array();
- $data = array();
- $namespace = 'metainfoex.alist';
- $key = sly_Cache::generateKey('category', $category, $clang, $onlineOnly, $sortby, $direction, $limitClause);
- if ($cache->exists($namespace, $key)) {
- $data = $cache->get($namespace, $key);
- }
- else {
- $sql = WV_SQLEx::getInstance();
- $data = array($category);
- $query = 'SELECT id,clang FROM ~article WHERE re_id = ?';
- if ($clang != WV_Sally::CLANG_ALL) {
- $data[] = $clang;
- $query .= ' AND clang = ?';
- }
- if ($onlineOnly) {
- $query .= ' AND status = 1';
- }
- $sql->queryEx($query.'ORDER BY '.$sortby.' '.$direction.' '.$limitClause, $data, '~');
- foreach ($sql as $row) {
- $data[] = $row;
- }
- $cache->set($namespace, $key, $data);
- }
- foreach ($data as $row) {
- $return[] = OOArticle::getArticleById($row['id'], $row['clang']);
- }
- return $return;
- }
- /** @name Alle verfügbaren Metainfos holen */
- /*@{*/
- /**
- * Alle verfügbaren Metainfos holen
- *
- * Diese Methode gibt alle vorhandenen Metainfos (nicht die Metadaten!)
- * zurück. Dabei kann ein WHERE-Statement für die wv2_metainfo-Relation
- * sowie Sortierkriterium und -richtung angegeben werden.
- *
- * @param string $where das WHERE-Kriterium
- * @param string $sortby das Sortierkriterium (kann jedes Attribut der Relation sein)
- * @param string $direction die Sortierreihenfolge ("ASC" oder "DESC")
- * @param int $type der Typ (WV2_Metainfoex::TYPE-Konstanten)
- * @return array eine Liste von _WV2_MetaInfo-Objekten, die passen
- */
- protected static function getAllObjectMetaInfos($where = '1', $sortby = 'position', $direction = 'ASC', $type = WV2_Metainfoex::TYPE_ARTICLE) {
- $infos = array();
- $data = array();
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.infos';
- $key = sly_Cache::generateKey('for', $type, $where, $sortby, $direction);
- if ($cache->exists($namespace, $key)) {
- $data = $cache->get($namespace, $key);
- }
- else {
- $sql = WV_SQLEx::getInstance();
- $prefix = WV_SQLEx::getPrefix();
- $data = $sql->getArray('SELECT id FROM '.$prefix.'wv2_metainfo WHERE '.$where.' AND meta_type = '.$type.' ORDER BY '.$sortby.' '.$direction);
- $cache->set($namespace, $key, $data);
- }
- foreach ($data as $id) {
- $infos[$id] = _WV2_MetaInfo::getInstance($id, $type);
- }
- return $infos;
- }
- public static function getAllArticleMetaInfos($where = '1', $sortby = 'position', $direction = 'ASC') {
- return self::getAllObjectMetaInfos($where, $sortby, $direction, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function getAllCategoryMetaInfos($where = '1', $sortby = 'position', $direction = 'ASC') {
- return self::getAllObjectMetaInfos($where, $sortby, $direction, WV2_Metainfoex::TYPE_CATEGORY);
- }
- public static function getAllMediumMetaInfos($where = '1', $sortby = 'position', $direction = 'ASC') {
- return self::getAllObjectMetaInfos($where, $sortby, $direction, WV2_Metainfoex::TYPE_MEDIUM);
- }
- /*@}*/
- /** @name Metadaten für ein einzelnes Objekt ermitteln */
- /*@{*/
- /**
- * Metadaten für ein einzelnes Objekt ermitteln
- *
- * Diese Methode ermittelt für ein bestimmtes Objekt die angelegten
- * Metadaten. Zurückgegeben wird ein Array aus _WV2_MetaData-Objekten. Gibt
- * es nur ein Metadatum, wird dieses direkt (ohne Array) zurückgegeben. Gibt
- * es kein Metadatum, so wird ein MetaData-Objekt mit dem Standardwert
- * zurückgegeben. Ist der Standardwert null, wird in diesem Fall direkt null
- * zurückgegeben.
- *
- * Wenn ein Array zurückgegeben wird, so ist es assoziativ mit den
- * Metainfo-Namen als Schlüsseln.
- *
- * Wenn als als Standardwert etwas anderes als null angegeben wird und der
- * Anwender sicher ist, dass es nur ein Metadatum geben kann (weil er z.B.
- * $metainfoToken angegeben hat), kann man immer direkt getValue() bzw.
- * getKey() auf den Rückgabewert dieser Methode anwenden.
- *
- * @param int $object die ID des Objekts oder ein Objekt eines bestimmten Typs (OOArticle, OOCategory, ...)
- * @param mixed $article der Artikel
- * @param mixed $category die Kategorie
- * @param mixed $medium das Medium
- * @param mixed $metainfo der Name der Metainformation oder null für alle
- * @param mixed $default der Standardwert, falls kein Metadatum gefunden wurde
- * @param int $clang die gewünschte Sprache
- * @param int $type der Typ (WV2_Metainfoex::TYPE-Konstanten)
- * @return array Liste der Metdaten wie oben beschrieben
- */
- protected static function getMetaDataForObject($object, $metainfo = null, $default = null, $clang = WV_Sally::CLANG_CURRENT, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- $clang = WV_Sally::clang($clang);
- $type = (int) $type;
- $objectID = WV2_Metainfoex::getIDForObject($object, false);
- $metainfo = WV2_Metainfoex::getIDForMetainfo($metainfo, $type, true);
- $return = array();
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.data';
- $key = sly_Cache::generateKey('type', $type, $objectID, $clang);
- // Wurden alle Metadaten angefragt? Haben wir bereits alle Daten für dieses Objekt?
- if ($metainfo === null && $cache->exists($namespace, $key)) {
- $metainfos = $cache->get($namespace, $key);
- // Hat dieses Objekt keine Metadaten?
- if (empty($metainfos)) {
- return is_null($default) ? null : new _WV2_MetaData($default, null, null, null, $type);
- }
- // Bei genau einem Metadatum geben wir dieses direkt zurück.
- if (count($metainfos) == 1) {
- $id = reset($metainfos);
- $date = $cache->get($namespace, $key.'_'.$id);
- return $date['object'];
- }
- // Das Objekt hat mehr als ein Metadatum.
- $infos = array();
- foreach ($metainfos as $id) {
- $date = $cache->get($namespace, $key.'_'.$id);
- $infos[$date['name']] = $date['object'];
- }
- return $infos;
- }
- // Wurde eine bestimmte Metainfo angefragt?
- elseif ($metainfo !== null) {
- // Metadatum bereits geholt. Cool!
- if ($cache->exists($namespace, $key.'_'.$metainfo)) {
- $date = $cache->get($namespace, $key.'_'.$metainfo);
- return $date['object'];
- }
- // Metadatum existiert nicht. Aber vielleicht haben wir schon alle Daten geholt und die Anfrage
- // des Anwenders zielt auf eine eh nicht vorhandene? Dann können wir direkt den Standardwert
- // zurückgeben, da wir wissen, dass das Metdatum nicht existieren kann.
- if ($cache->exists($namespace, $key)) {
- return is_null($default) ? null : new _WV2_MetaData($default, null, null, null, $type);
- }
- }
- // Cache-Miss. Mist. Dann eben in die Datenbank...
- $ids = array();
- $filter = new WV_Filter_And(new WV2_Filter_MetaType($type), new WV2_Filter_ObjectID($objectID));
- if ($metainfo) {
- $filter->add(new WV2_Filter_MetainfoID($metainfo));
- }
- if ($clang != WV_Sally::CLANG_ALL) {
- $filter->add(new WV2_Filter_MetaCLang($clang));
- }
- foreach (self::filterMetaData($filter) as $row) {
- $metainfoID = $row['metainfo_id'];
- $return[$row['name']] = new _WV2_MetaData($row['value'], $metainfoID, $objectID, $row['clang'], $type);
- // Daten cachen
- $cache->set($namespace, $key.'_'.$metainfoID, array(
- 'object' => $return[$row['name']],
- 'name' => $row['name']
- ));
- $ids[] = $metainfoID;
- }
- // Wenn wir alle Metadaten geholt haben, merken wir uns eine Liste der IDs.
- if ($metainfo === null) {
- $key = sly_Cache::generateKey('type', $type, $objectID, $clang);
- $cache->set($namespace, $key, $ids);
- }
- // Nichts gefunden? Dann Standardwert oder null.
- if (empty($return)) {
- return is_null($default) ? null : new _WV2_MetaData($default, null, null, null, $type);
- }
- // dearrayfizieren
- return count($return) == 1 ? reset($return) : $return;
- }
- public static function articleData($metainfo = null, $default = null, $clang = WV_Sally::CLANG_CURRENT, $article = null) {
- $article = $article ? WV2_Metainfoex::getIDForArticle($article) : WV_Sally::getCurrentArticle();
- return self::getMetaDataForObject($article, $metainfo, $default, $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function categoryData($metainfo = null, $default = null, $clang = WV_Sally::CLANG_CURRENT, $category = null) {
- $category = $category ? WV2_Metainfoex::getIDForCategory($category) : WV_Sally::getCurrentCategory();
- return self::getMetaDataForObject(WV2_Metainfoex::getIDForCategory($category), $metainfo, $default, $clang, WV2_Metainfoex::TYPE_CATEGORY);
- }
- public static function mediumData($medium, $metainfo = null, $default = null, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getMetaDataForObject(WV2_Metainfoex::getIDForMedium($medium), $metainfo, $default, $clang, WV2_Metainfoex::TYPE_MEDIUM);
- }
- public static function objectData($object, $type, $metainfo = null, $default = null, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getMetaDataForObject(WV2_Metainfoex::getIDForObject($object), $metainfo, $default, $clang, $type);
- }
- /*@}*/
- /** @name Passende Objekte anhand ihrer Metadaten ermitteln */
- /*@{*/
- /**
- * Passende Objekte anhand ihrer Metadaten ermitteln
- *
- * Gibt ein Array aus OOArticle/OOCategory/OOMedia-Objekten zurück, die
- * einen bestimmten Typ und eine bestimmte MetaInfo haben. Zusätzlich kann
- * angegeben werden, ob die Metainfo einen bestimmten Wert hat ($value) und
- * wie dieser Wert zu verstehen ist (ob er nur enthalten sein muss oder ob
- * der Wert exakt dem Suchbegriff entsprechen muss).
- *
- * Die nötigen Konstanten für den $operator-Parameter sind in der Klasse WV2
- * definiert. Nicht jeder Datentyp unterstützt jeden Filterparameter.
- *
- * Es wird empfohlen, direkt die Methoden getXXXWithMetaData zu verwenden, da
- * diese auch nur die benötigten / erlaubten Parameter enthalten.
- *
- * Als Sortierkriterium muss eine Angabe der Form "tabelle.spalte" angegeben
- * werden. Mögliche Tabellen sind
- *
- * - article (sly_article)
- * - metadata (wv2_meta)
- * - metainfo (wv2_metainfo)
- * - articletype (nur für Artikel relevant)
- * - file (nur für Medien relevant)
- * - medium (Alias für file)
- *
- * Wird eine nicht bekannte Tabelle angegeben, wird die Angabe einfach
- * ignoriert.
- *
- * @param mixed $metainfo der Name der Metainformation
- * @param boolean $onlineOnly wenn true, werden nur online Artikel berücksichtigt (default: true)
- * @param string $value der gesuchte Metdaten-Wert oder null, falls egal
- * @param int $operator Anweisungen an den Datentyp, wie die Suche nach dem Wert ($value) zu erfolgen hat
- * @param string $sort ine optionale "ORDER BY"-Klausel (ohne "ORDER BY")
- * @param mixed $articleType die ID / der Name des Artikeltyps oder null, falls alle
- * @param int $clang die Sprache der Artikel / Kategorien / Medien (WV_Sally::CLANG-Konstanten)
- * @param int $type der Typ (WV2_Metainfoex::TYPE-Konstanten)
- * @return array eine Liste von passenden Artikeln / Kategorien / Medien
- */
- public static function getObjectsWithMetaData($metainfo, $onlineOnly = true, $value = null, $operator = null, $sort = null, $articleType = null, $clang = WV_Sally::CLANG_CURRENT, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- $clang = WV_Sally::clang($clang);
- $metainfo = WV2_Metainfoex::getIDForMetainfo($metainfo, $type, false);
- $articleType = WV2_Metainfoex::getIDForArticleType($articleType, true);
- // Prüfen, ob die Ergebnisse schon im Cache liegen
- $return = array();
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.objects';
- $cacheKey = sly_Cache::generateKey('metainfo', $metainfo, $onlineOnly, $value, $operator, $sort, $articleType, $clang, $type);
- $data = $cache->get($namespace, $cacheKey, false);
- if ($data === false) {
- //////////////////////////////////////////////////////////////////////////
- // Objekte finden, die die gesuchte Metainformation besitzen
- // Ob der gesuchte Wert enthalten ist, prüfen später die Datentypen
- // selbstständig.
- $sortTable = strpos($sort, '.') === false ? '' : substr($sort, 0, strpos($sort, '.'));
- $sortColumn = strpos($sort, '.') === false ? $sort : substr($sort, strpos($sort, '.') + 1);
- $params = array($metainfo);
- switch ($type) {
- case WV2_Metainfoex::TYPE_ARTICLE:
- switch ($sortTable) {
- case 'metadata': $sortTable = 'm'; break;
- case 'metainfo': $sortTable = 'mi'; break;
- case 'articletype': $sortTable = 'art'; break;
- case 'article': $sortTable = 'aart'; break;
- default: $sortTable = '';
- }
- $query =
- 'SELECT m.metainfo_id, m.object_id, m.clang, m.value '.
- 'FROM ~wv2_meta m '.
- 'LEFT JOIN ~wv2_metainfo mi ON m.metainfo_id = mi.id '.
- 'LEFT JOIN ~wv2_article_type art ON art.article_id = m.object_id '.
- 'LEFT JOIN ~article aart ON aart.id = m.object_id AND aart.clang = m.clang '.
- 'WHERE mi.id = ?';
- if ($articleType != null) {
- $query .= ' AND type_id = ?';
- $params[] = $articleType;
- }
- if ($onlineOnly) {
- $query .= ' AND aart.status = 1';
- }
- break;
- case WV2_Metainfoex::TYPE_CATEGORY:
- switch ($sortTable) {
- case 'metadata': $sortTable = 'm'; break;
- case 'metainfo': $sortTable = 'mi'; break;
- case 'article': $sortTable = 'aart'; break;
- default: $sortTable = '';
- }
- $query =
- 'SELECT m.metainfo_id, m.object_id, m.clang, m.value '.
- 'FROM ~wv2_meta m '.
- 'LEFT JOIN ~wv2_metainfo mi ON m.metainfo_id = mi.id '.
- 'LEFT JOIN ~article aart ON aart.id = m.object_id AND aart.clang = m.clang '.
- 'WHERE mi.id = ?';
- if ($onlineOnly) {
- $query .= ' AND aart.status = 1';
- }
- break;
- case WV2_Metainfoex::TYPE_MEDIUM:
- switch ($sortTable) {
- case 'metadata': $sortTable = 'm'; break;
- case 'metainfo': $sortTable = 'mi'; break;
- case 'medium':
- case 'file': $sortTable = 'f'; break;
- default: $sortTable = '';
- }
- $column = class_exists('sly_I18N') ? 'id' : 'file_id'; // 'id' as of Sally 0.3
- $query =
- 'SELECT m.metainfo_id, m.object_id, m.clang, m.value '.
- 'FROM ~wv2_meta m '.
- 'LEFT JOIN ~wv2_metainfo mi ON m.metainfo_id = m.id '.
- 'LEFT JOIN ~file f ON f.'.$column.' = m.object_id '.
- 'WHERE mi.id = ?';
- break;
- default:
- trigger_error('Unrecognized type ID '.$type.' given for getObjectsWithMetaData()', E_USER_ERROR);
- }
- // Allgemeine Parameter hinzufügen
- if ($clang != WV_Sally::CLANG_ALL) {
- $query .= ' AND m.clang = ?';
- $params[] = $clang;
- }
- if ($sortTable) {
- $query .= ' ORDER BY '.$sortTable.'.'.$sortColumn;
- }
- $sql = WV_SQLEx::getClone();
- $sql->queryEx($query, $params, '~');
- // Nichts gefunden? Und tschüss!
- if ($sql->rows() == 0) {
- $sql = null;
- $cache->set($namespace, $cacheKey, array());
- return array();
- }
- // Datentyp ermitteln
- $datatype = _WV2_MetaInfo::getDatatypeWithParams($metainfo, $type);
- $params = $datatype['params'];
- $data = array();
- // Gefundene Daten durchgehen
- foreach ($sql as $row) {
- if ($value === null) {
- $obj = WV2_Metainfoex::getObject($row['object_id'], $row['clang'], $type);
- if ($obj) {
- $data[] = array('object_id' => $row['object_id'], 'clang' => $row['clang']);
- }
- }
- else {
- $contained = WV_Datatype::call(
- $datatype['datatype'], 'isValueContained',
- array($value, $row['value'], $params, $operator)
- );
- if ($contained) {
- $obj = WV2_Metainfoex::getObject($row['object_id'], $row['clang'], $type);
- if ($obj) {
- $data[] = array('object_id' => $row['object_id'], 'clang' => $row['clang']);
- }
- }
- }
- }
- $sql = null;
- $cache->set($namespace, $cacheKey, $data);
- }
- foreach ($data as $date) {
- $obj = WV2_Metainfoex::getObject($date['object_id'], $date['clang'], $type);
- if ($obj) $return[] = $obj;
- }
- return $return;
- }
- public static function getArticlesWithMetaData($metainfo, $onlineOnly = true, $value = null, $operator = null, $sort = null, $articleType = null, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getObjectsWithMetaData($metainfo, $onlineOnly, $value, $operator, $sort, $articleType, $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function getCategoriesWithMetaData($metainfo, $onlineOnly = true, $value = null, $operator = null, $sort = null, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getObjectsWithMetaData($metainfo, $onlineOnly, $value, $operator, $sort, null, $clang, WV2_Metainfoex::TYPE_CATEGORY);
- }
- public static function getMediaWithMetaData($metainfo, $value = null, $operator = null, $sort = null) {
- return self::getObjectsWithMetaData($metainfo, true, $value, $operator, $sort, null, WV_Sally::CLANG_CURRENT, WV2_Metainfoex::TYPE_MEDIUM);
- }
- /*@}*/
- /** @name Werte einer Metainfo erfahren */
- /*@{*/
- /**
- * Werte einer Metainfo erfahren
- *
- * Diese Methode ermittelt alle möglichen Werte, die eine Metainfo annehmen
- * kann bzw. angenommen hat. Bei Strings macht nur die Suche nach
- * angenommenen Werten Sinn, bei SELECTs auch die Suche nach den möglichen
- * Werten.
- *
- * @param mixed $metainfo die Metainfo
- * @param bool $getOnlyExisting wenn true, werden nur die Werte zurückgegeben, die eine Metainfo auch wirklich angenommen hat
- * @param int $type der Typ (WV2_Metainfoex::TYPE-Konstanten)
- * @return array eine Liste von Alternativen
- */
- protected static function getObjectMetaInfoValueSet($metainfo, $getOnlyExisting = false, $clang = WV_Sally::CLANG_CURRENT, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- $clang = WV_Sally::clang($clang);
- $metainfo = WV2_Metainfoex::getIDForMetainfo($metainfo, $type, false);
- $data = _WV2_MetaInfo::getDatatypeWithParams($metainfo, $type);
- if (!$data) {
- return array();
- }
- // Da PHP keine Arrays zulässt, bei denen die Keys zwar
- // Strings, aber Zahlen sind ("8" wird immer zu 8 konvertiert),
- // muss der Datentyp explizit angeben, ob seine Liste assoziativ
- // oder normal zu behandeln ist.
- $sql = WV_SQLEx::getInstance();
- $datalist = array();
- $isAssoc = WV_Datatype::call($data['datatype'], 'usesAssociativeResults', array());
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.valuesets';
- $cacheKey = sly_Cache::generateKey('metainfo', $metainfo, $getOnlyExisting, $clang, $type);
- $cachedData = $cache->get($namespace, $cacheKey);
- if (!empty($cachedData)) {
- return $cachedData;
- }
- if ($getOnlyExisting) {
- $records = $sql->getArray('SELECT DISTINCT value FROM ~wv2_meta WHERE metainfo_id = ? AND clang = ?', array($metainfo, $clang), '~');
- foreach ($records as $value) {
- $value = WV_Datatype::call($data['datatype'], 'deserializeValue', array($value, $data['params']));
- $datalist = $isAssoc ? wv_merge($datalist, $value) : array_merge($datalist, wv_makeArray($value));
- }
- $records = null;
- $datalist = array_unique($datalist);
- }
- else {
- $datalist = WV_Datatype::call($data['datatype'], 'extractValuesFromParams', $data['params']);
- }
- $cache->set($namespace, $cacheKey, $datalist);
- return $datalist;
- }
- public static function getArticleMetaInfoValueSet($metainfo, $getOnlyExisting = false, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getObjectMetaInfoValueSet($metainfo, $getOnlyExisting, $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function getCategoryMetaInfoValueSet($metainfo, $getOnlyExisting = false, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getObjectMetaInfoValueSet($metainfo, $getOnlyExisting, $clang, WV2_Metainfoex::TYPE_CATEGORY);
- }
- public static function getMediumMetaInfoValueSet($metainfo, $getOnlyExisting = false, $clang = WV_Sally::CLANG_CURRENT) {
- return self::getObjectMetaInfoValueSet($metainfo, $getOnlyExisting, $clang, WV2_Metainfoex::TYPE_MEDIUM);
- }
- /*@}*/
- /** @name Prüfen, ob Wert vorhanden ist */
- /*@{*/
- /**
- * Prüfen, ob Wert vorhanden ist
- *
- * Diese Methode prüft, ob ein bstimmtes Objekt ein bestimmtes Metadatum
- * besitzt.
- *
- * @param mixed $object das Objekt
- * @param mixed $article der Artikel
- * @param mixed $category die Kategorie
- * @param mixed $medium das Medium
- * @param mixed $metainfo die Metainfo
- * @param mixed $value der gesuchte Wert
- * @param int $clang die Sprache des Objekts
- * @param int $type der Typ des Objekts
- * @return boolean true, wenn der Artikel die gesuchte Information bestitzt, sonst false
- */
- protected static function hasObjectValue($object, $metainfo, $value, $clang = WV_Sally::CLANG_CURRENT, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- $metadata = self::getMetaDataForObject($object, $metainfo, null, $clang, $type);
- if (!$metadata) return false;
- $v = $metadata->getValue();
- if (!is_array($v)) return $value == $v;
- return in_array($value, array_keys($v)) || in_array($value, array_values($v));
- }
- public static function hasArticleValue($metainfo, $value, $clang = WV_Sally::CLANG_CURRENT, $article) {
- return self::hasObjectValue(WV2_Metainfoex::getIDForArticle($article), $metainfo, $value, $clang, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function hasCategoryValue($metainfo, $value, $clang = WV_Sally::CLANG_CURRENT, $category) {
- return self::hasObjectValue(WV2_Metainfoex::getIDForCategory($category), $metainfo, $value, $clang, WV2_Metainfoex::TYPE_CATEGORY);
- }
- public static function hasMediumValue($medium, $metainfo, $value, $clang = WV_Sally::CLANG_CURRENT) {
- return self::hasObjectValue(WV2_Metainfoex::getIDForMedium($medium), $metainfo, $value, $clang, WV2_Metainfoex::TYPE_MEDIUM);
- }
- /*@}*/
- /** @name Metadaten für alle Objekte ermitteln */
- /*@{*/
- /**
- * Metadaten für alle Objekte ermitteln
- *
- * Diese Methode liefert NICHT die Metadaten eines einzelnes Objekt zurück,
- * sondern die Metadaten aller Objekte, die die gewählte Metainformation
- * besitzen. Daher kann man ihr auch nicht die ID eines Objekts übergeben.
- * Sie dient primär als Hilfsmethode für getXXXValueSet().
- *
- * @param mixed $metainfo die Metainfo
- * @param int|string $articleType die ID / der Name des gesuchten Artikeltyps oder null für keine Angabe
- * @param int $clang die gewünschte Sprache
- * @param int $type der Typ des Objekts
- * @return array Liste von _WV2_MetaData-Objekten
- */
- public static function getObjectMetaDataForToken($metainfo = null, $clang = WV_Sally::CLANG_CURRENT, $type = WV2_Metainfoex::TYPE_ARTICLE) {
- switch ($type) {
- case WV2_Metainfoex::TYPE_ARTICLE: return self::getArticleMetaDataForToken($metainfo, null, $clang);
- case WV2_Metainfoex::TYPE_CATEGORY: return self::getCategoryMetaDataForToken($metainfo, $clang);
- case WV2_Metainfoex::TYPE_MEDIUM: return self::getMediumMetaDataForToken($metainfo, $clang);
- }
- }
- public static function getArticleMetaDataForToken($metainfo = null, $articleType = null, $clang = WV_Sally::CLANG_CURRENT) {
- $metainfo = WV2_Metainfoex::getIDForMetainfo($metainfo, WV2_Metainfoex::TYPE_ARTICLE, true);
- $articleType = WV2_Metainfoex::getIDForArticleType($articleType, true);
- $params['clang'] = (int) $clang;
- if ($metainfo) $params['id'] = $metainfo;
- if ($articleType) $params['typeID'] = $articleType;
- return self::getArticleMetaData($params);
- }
- public static function getCategoryMetaDataForToken($metainfo = null, $clang = WV_Sally::CLANG_CURRENT) {
- $metainfo = WV2_Metainfoex::getIDForMetainfo($metainfo, WV2_Metainfoex::TYPE_CATEGORY, true);
- $params['clang'] = (int) $clang;
- if ($metainfo) {
- $params['id'] = $metainfo;
- }
- return self::getCategoryMetaData($params);
- }
- public static function getMediumMetaDataForToken($metainfo = null, $clang = WV_Sally::CLANG_CURRENT) {
- $metainfo = WV2_Metainfoex::getIDForMetainfo($metainfo, WV2_Metainfoex::TYPE_MEDIUM, true);
- $params['clang'] = (int) $clang;
- if ($metainfo) {
- $params['id'] = $metainfo;
- }
- return self::getMediumMetaData($params);
- }
- /*@}*/
- /** @name Metadaten ermitteln */
- /*@{*/
- /**
- * Metadaten ermitteln
- *
- * Gibt eine Liste von Metadaten zurück. Sie dient als Basismethode zur
- * Abfrage von Metdaten von Artikeln und bietet verschiedene Parameter zur
- * Selektion, Gruppierung oder Sortierung. Die anderen MetaData-Methoden
- * sind quasi Shortcuts für häufig benutzte "Queries".
- *
- * Im $params-Array werden folgende Elemente in der folgenden Reihenfolge
- * abgearbeitet:
- *
- * - 'articleID' => int | array
- * (wenn gesetzt, werden nur die Metadaten für einen Artikel / eine Menge
- * von Artikeln ermittelt)
- * - 'name' => string | array
- * (wenn gesetzt, werden nur die Metadaten für eine bestimmte Metainfo
- * geholt (kann als Alternative zu 'id' dienen))
- * - 'id' => int | array
- * (wenn gesetzt, werden nur die Metadaten für eine bestimmte Metainfo
- * geholt (kann als Alternative zu 'name' dienen))
- * - 'categoryID' => int | array
- * (wenn gesetzt, werden nur Artikel einer bestimmten Kategorie / von
- * bestimmten Kategorien ermittelt)
- * - 'typeID' => int | string | array
- * (wenn gesetzt, werden die ermittelten Artikel nochmals nach ihrem Typ /
- * ihren Typen gefiltert)
- * - 'orderby' => string
- * (kann jedes Attribut aus den Relationen article, wv2_article_meta und
- * wv2_metainfo sein; Standard ist "id")
- * - 'direction' => ASC | DESC
- * (die Sortierreihenfolge als String; Standard ist ASC)
- *
- * Die Parameter in $params können auch als ein JSON-kodierter String
- * angegeben werden ("{articleID:5}").
- *
- * Als Rückgabe generiert die Methode ein Array aus _WV2_MetaData-Objekten.
- *
- * @param array $params die Suchparameter
- * @return array die Liste der passenden Metadaten
- */
- protected static function getObjectMetaData($params, $type) {
- $query = '';
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.data';
- $cacheKey = sly_Cache::generateKey('params', $params, $type);
- $data = $cache->get($namespace, $cacheKey);
- if (!empty($data)) {
- $result = array();
- foreach ($data as $record) {
- $result[] = new _WV2_MetaData($record['value'], $record['metainfo_id'], $record['object_id'], $record['clang'], $type);
- }
- return $result;
- }
- if (!is_array($params)) {
- $params = json_decode($params, true);
- }
- switch ($type) {
- case WV2_Metainfoex::TYPE_ARTICLE:
- $query =
- 'SELECT m.* '.
- 'FROM ~wv2_meta m '.
- 'LEFT JOIN ~wv2_metainfo infos ON m.metainfo_id = infos.id '.
- 'LEFT JOIN ~wv2_article_type art ON m.object_id = art.article_id '.
- 'LEFT JOIN ~article a ON m.object_id = a.id AND m.clang = a.clang '.
- 'WHERE %where% 1';
- break;
- case WV2_Metainfoex::TYPE_CATEGORY:
- case WV2_Metainfoex::TYPE_MEDIUM:
- $query =
- 'SELECT m.* '.
- 'FROM ~wv2_meta m '.
- 'LEFT JOIN ~wv2_metainfo infos ON m.metainfo_id = infos.id '.
- 'LEFT JOIN ~article a ON m.object_id = a.id AND m.clang = a.clang '.
- 'WHERE %where% 1';
- break;
- }
- // Parameter auspacken. extract() wäre uns zu unsicher, daher lieber
- // Stück für Stück von Hand.
- $articleID = sly_makeArray(isset($params['articleID']) ? $params['articleID'] : null);
- $categoryID = sly_makeArray(isset($params['categoryID']) ? $params['categoryID'] : null);
- $mediumID = sly_makeArray(isset($params['mediumID']) ? $params['mediumID'] : null);
- $clang = sly_makeArray(isset($params['clang']) ? $params['clang'] : null);
- $typeID = sly_makeArray(isset($params['typeID']) ? $params['typeID'] : null);
- $name = sly_makeArray(isset($params['name']) ? $params['name'] : null);
- $id = sly_makeArray(isset($params['id']) ? $params['id'] : null);
- // Parameter vorbereiten und entschärfen
- $articleID = array_map('intval', $articleID);
- $categoryID = array_map('intval', $categoryID);
- $mediumID = array_map('intval', $mediumID);
- $typeID = array_map('intval', $typeID);
- $clang = array_map('intval', $clang);
- $id = array_map('intval', $id);
- foreach ($name as $metainfoName) {
- $id[] = WV2_Metainfoex::getIDForMetainfo($metainfoName, $type);
- }
- // Minimieren
- $articleID = array_unique($articleID);
- $categoryID = array_unique($categoryID);
- $mediumID = array_unique($mediumID);
- $typeID = array_unique($typeID);
- $clang = array_unique($clang);
- $id = array_unique($id);
- // Sprach-Konstanten ersetzen
- $clang = wv_arrayReplace($clang, WV_Sally::CLANG_CURRENT, WV_Sally::clang());
- if (in_array(WV_Sally::CLANG_ALL, $clang)) {
- $clang = array();
- }
- // In Query einsetzen
- if (!empty($articleID)) $query = str_replace('%where%', 'object_id IN ('.implode(',', $articleID).') AND %where%', $query);
- if (!empty($mediumID)) $query = str_replace('%where%', 'object_id IN ('.implode(',', $mediumID).') AND %where%', $query);
- if (!empty($typeID)) $query = str_replace('%where%', 'type_id IN ('.implode(',', $typeID).') AND %where%', $query);
- if (!empty($clang)) $query = str_replace('%where%', 'm.clang IN ('.implode(',', $clang).') AND %where%', $query);
- if (!empty($id)) $query = str_replace('%where%', 'infos.id IN ('.implode(',', $id).') AND %where%', $query);
- // Die Angabe der Kategorie ist mehrdeutig. Ist sie die einzige Angabe,
- // ist die ID der Metadaten (object_id) für Kategorie-Metadaten gemeint.
- // Ist jedoch auch $articleID gesetzt, so ist sie eine zusätzliche
- // Einschränkung für Artikel-Metadaten. Die beiden public-Methoden kümmern
- // sich bereits darum, nur die gewünschten Parameter durchzulassen.
- $column = 'object_id';
- if (isset($params['articleID'])) {
- $column = 're_id';
- }
- if (!empty($categoryID)) {
- $query = str_replace('%where%', $column.' IN ('.implode(',', $categoryID).') AND %where%', $query);
- }
- // Query ist (fast) fertig.
- $orderby = isset($params['orderby']) ? $params['orderby'] : 'a.id';
- $direction = isset($params['direction']) ? $params['direction'] : 'ASC';
- $query = str_replace(array('~', '%where%'), array(WV_SQLEx::getPrefix(), ''), $query);
- $query .= ' ORDER BY '.$orderby.' '.$direction;
- $result = array();
- $sql = WV_SQLEx::getClone();
- $cacheData = array();
- $sql->queryEx($query, array(), '');
- foreach ($sql as $row) {
- $result[] = new _WV2_MetaData($row['value'], (int) $row['metainfo_id'], (int) $row['object_id'], (int) $row['clang'], $type);
- $cacheData[] = array(
- 'value' => $row['value'],
- 'metainfo_id' => (int) $row['metainfo_id'],
- 'object_id' => (int) $row['object_id'],
- 'clang' => (int) $row['clang']
- );
- }
- $cache->set($namespace, $cacheKey, $cacheData);
- return $result;
- }
- public static function getArticleMetaData($params = null) {
- return self::getObjectMetaData($params, WV2_Metainfoex::TYPE_ARTICLE);
- }
- public static function getCategoryMetaData($params = null) {
- if (is_array($params) && isset($params['articleID'])) unset($params['articleID']);
- return self::getObjectMetaData($params, WV2_Metainfoex::TYPE_CATEGORY);
- }
- public static function getMediumMetaData($params = null) {
- return self::getObjectMetaData($params, WV2_Metainfoex::TYPE_MEDIUM);
- }
- /*@}*/
- public static function filterArticles(WV_IFilter $filter, $sortby = 'article.prior', $direction = 'ASC') {
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.filter.articles';
- $cacheKey = sly_Cache::generateKey('filter', $filter, $sortby, $direction);
- $data = $cache->get($namespace, $cacheKey);
- if (!empty($data)) {
- $articles = array();
- foreach ($data as $record) {
- $articles[] = OOArticle::getArticleById($record['id'], $record['clang']);
- }
- return $articles;
- }
- $filter = new WV_Filter_And($filter, new WV_Filter_IsArticle());
- $tables = array('article');
- $tables = array_unique(array_merge($tables, $filter->getRequiredTables()));
- // JOIN-Bedingungen
- $connectors = array(
- 'wv2_arttypes' => '1',
- 'wv2_article_type' => '~wv2_article_type.article_id = ~article.id AND ~wv2_arttypes.id = ~wv2_article_type.type_id',
- 'wv2_meta' => '~wv2_meta.object_id = ~article.id AND ~wv2_meta.clang = ~article.clang AND ~wv2_meta.meta_type = '.WV2_Metainfoex::TYPE_ARTICLE,
- 'wv2_metainfo' => '~wv2_meta.metainfo_id = ~wv2_metainfo.id'
- );
- // Query zusammensetzen
- $prefix = WV_SQLEx::getPrefix();
- $columnsToSelect = array($prefix.'article.id', $prefix.'article.clang');
- if (in_array('getExtraColumns', get_class_methods($filter))) {
- $columnsToSelect = array_merge($columnsToSelect, $filter->getExtraColumns($tables));
- }
- $cacheData = array();
- $sql = WV_SQLEx::getInstance();
- $articles = array();
- if (strpos($sortby, '.') !== false) {
- $sortby = $prefix.$sortby;
- }
- $sql->queryEx(
- 'SELECT '.implode(', ', $columnsToSelect).' '.
- 'FROM '.self::constructFilterQuery($tables, $connectors, $filter, 'article').' '.
- 'ORDER BY '.$sortby.' '.$direction
- );
- foreach ($sql as $row) {
- $articles[] = OOArticle::getArticleById($row['id'], $row['clang']);
- $cacheData[] = $row;
- }
- $cache->set($namespace, $cacheKey, $cacheData);
- return $articles;
- }
- public static function filterCategories(WV_IFilter $filter, $sortby = 'article.prior', $direction = 'ASC') {
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.filter.categories';
- $cacheKey = sly_Cache::generateKey('filter', $filter, $sortby, $direction);
- $data = $cache->get($namespace, $cacheKey);
- if (!empty($data)) {
- $categories = array();
- foreach ($data as $record) {
- $categories[] = OOCategory::getCategoryById($record['id'], $record['clang']);
- }
- return $categories;
- }
- $filter = new WV_Filter_And($filter, new WV_Filter_IsCategory());
- $tables = array('article');
- $tables = array_unique(array_merge($tables, $filter->getRequiredTables()));
- // JOIN-Bedingungen
- $connectors = array(
- 'wv2_meta' => '~wv2_meta.object_id = ~article.id AND ~wv2_meta.meta_type = '.WV2_Metainfoex::TYPE_CATEGORY,
- 'wv2_metainfo' => '~wv2_meta.metainfo_id = ~wv2_metainfo.id'
- );
- // Query zusammensetzen
- $prefix = WV_SQLEx::getPrefix();
- $columnsToSelect = array($prefix.'article.id', $prefix.'article.clang');
- if (in_array('getExtraColumns', get_class_methods($filter))) {
- $columnsToSelect = array_merge($columnsToSelect, $filter->getExtraColumns($tables));
- }
- $sql = WV_SQLEx::getInstance();
- $categories = array();
- $cacheData = array();
- if (strpos($sortby, '.') !== false) {
- $sortby = $prefix.$sortby;
- }
- $sql->queryEx(
- 'SELECT '.implode(', ', $columnsToSelect).' '.
- 'FROM '.self::constructFilterQuery($tables, $connectors, $filter, 'article').' '.
- 'ORDER BY '.$sortby.' '.$direction
- );
- foreach ($sql as $row) {
- $categories[] = OOCategory::getCategoryById($row['id'], $row['clang']);
- $cacheData[] = $row;
- }
- $cache->set($namespace, $cacheKey, $cacheData);
- return $categories;
- }
- public static function filterMedia(WV_IFilter $filter, $sortby = 'file.id', $direction = 'ASC') {
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.filter.media';
- $cacheKey = sly_Cache::generateKey('filter', $filter, $sortby, $direction);
- $data = $cache->get($namespace, $cacheKey);
- if (!empty($data)) {
- $media = array();
- foreach ($data as $record) {
- $media[] = OOMedia::getMediaById($record);
- }
- return $media;
- }
- $tables = array('file');
- $tables = array_unique(array_merge($tables, $filter->getRequiredTables()));
- // JOIN-Bedingungen
- $connectors = array(
- 'wv2_meta' => '~wv2_meta.object_id = ~article.id AND ~wv2_meta.meta_type = '.WV2_Metainfoex::TYPE_MEDIUM,
- 'wv2_metainfo' => '~wv2_meta.metainfo_id = ~wv2_metainfo.id'
- );
- // Query zusammensetzen
- $prefix = WV_SQLEx::getPrefix();
- $columnsToSelect = array($prefix.'file.id');
- if (in_array('getExtraColumns', get_class_methods($filter))) {
- $columnsToSelect = array_merge($columnsToSelect, $filter->getExtraColumns($tables));
- }
- $sql = WV_SQLEx::getInstance();
- $media = array();
- $cacheData = array();
- if (strpos($sortby, '.') !== false) {
- $sortby = $prefix.$sortby;
- }
- $sql->queryEx(
- 'SELECT '.implode(', ', $columnsToSelect).' '.
- 'FROM '.self::constructFilterQuery($tables, $connectors, $filter, 'file').' '.
- 'ORDER BY '.$sortby.' '.$direction
- );
- foreach ($sql as $row) {
- $media[] = OOMedia::getMediaById($row['id']);
- $cacheData[] = $row['id'];
- }
- $cache->set($namespace, $cacheKey, $cacheData);
- return $media;
- }
- public static function filterMetaData(WV_IFilter $filter, $sortby = 'wv2_meta.metainfo_id', $direction = 'ASC') {
- $cache = sly_Core::cache();
- $namespace = 'metainfoex.filter.data';
- $cacheKey = sly_Cache::generateKey('filter', $filter, $sortby, $direction);
- // $data = $cache->get($namespace, $cacheKey);
- //
- // if (!empty($data)) {
- // return $data;
- // }
- $tables = array('wv2_meta', 'wv2_metainfo');
- $tables = array_unique(array_merge($tables, $filter->getRequiredTables()));
- // JOIN-Bedingungen
- $connectors = array(
- 'article' => '~wv2_meta.object_id = ~article.id',
- 'wv2_arttypes' => '~wv2_article_type.type_id = ~wv2_arttypes.id',
- 'wv2_article_type' => '~wv2_meta.object_id = ~wv2_article_type.article_id',
- 'file' => '~wv2_meta.object_id = ~file.id AND ~wv2_meta.meta_type = '.WV2_Metainfoex::TYPE_MEDIUM,
- 'wv2_metainfo' => '~wv2_meta.metainfo_id = ~wv2_metainfo.id'
- );
- // Query zusammensetzen
- $sql = WV_SQLEx::getInstance();
- $prefix = WV_SQLEx::getPrefix();
- $data = array();
- $sql->queryEx(
- 'SELECT '.
- $prefix.'wv2_metainfo.name, '.
- $prefix.'wv2_meta.value, '.
- $prefix.'wv2_meta.object_id, '.
- $prefix.'wv2_meta.meta_type, '.
- $prefix.'wv2_meta.clang, '.
- $prefix.'wv2_meta.metainfo_id '.
- 'FROM '.self::constructFilterQuery($tables, $connectors, $filter, 'wv2_meta').' '.
- 'ORDER BY '.$prefix.$sortby.' '.$direction
- );
- foreach ($sql as $row) {
- $data[] = $row;
- }
- // $cache->set($namespace, $cacheKey, $data);
- return $data;
- }
- protected static function constructFilterQuery(&$tables, &$connectors, $filter, $masterTable) {
- $prefix = WV_SQLEx::getPrefix();
- $joinConditions = array('1');
- foreach ($tables as &$table) {
- if ($table != $masterTable) { // Die Haupttabelle muss sich nicht an sich selbst joinen.
- $connector = $connectors[$table];
- $connector = str_replace('~', $prefix, $connector);
- $joinConditions[] = $connector;
- }
- $table = $prefix.$table;
- }
- // Den Filtern die Möglichkeit geben, die Liste der Tabellen nochmals
- // zu erweitern (notwendig, wenn eine Tabelle mehrfach gejoined werden
- // soll).
- if (in_array('getExtraTables', get_class_methods($filter))) {
- $tables = array_merge($tables, $filter->getExtraTables($tables));
- }
- return implode(', ', $tables).' WHERE ('.implode(' AND ', $joinConditions).') AND ('.$filter->toSQL().')';
- }
- }