PageRenderTime 41ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/WV2/Metainfoex.php

https://bitbucket.org/webvariants/extended-meta-infos
PHP | 329 lines | 148 code | 47 blank | 134 comment | 37 complexity | 553fc791cf7630db471bef73e0fca0d7 MD5 | raw file
  1. <?php
  2. /*
  3. * Copyright (c) 2010, webvariants GbR, http://www.webvariants.de
  4. *
  5. * This file is released under the terms of the MIT license. You can find the
  6. * complete text in the attached LICENSE file or online at:
  7. *
  8. * http://www.opensource.org/licenses/mit-license.php
  9. */
  10. /**
  11. * @defgroup external Externe, öffentliche API
  12. */
  13. /**
  14. * Hilfsklasse für das Addon
  15. *
  16. * Diese Klasse stellt eine Hand voll Methoden für die einzelnen Module dieses
  17. * Addons zur Verfügung.
  18. *
  19. * Diese Klasse ist nicht als öffentliche API gedacht, dafür gibt es
  20. * WV2_MetaProvider. Außerhalb des AddOns sollte sie daher *nicht* verwendet
  21. * werden. Die hier definierten Konstanten sind natürlich für jeden da, der ein
  22. * Interesse an ihnen hat ;-)
  23. *
  24. * @ingroup external
  25. */
  26. abstract class WV2_Metainfoex {
  27. const TYPE_ARTICLE = 0; ///< int Metainfo-Typ für Artikel
  28. const TYPE_CATEGORY = 1; ///< int Metainfo-Typ für Kategorien
  29. const TYPE_MEDIUM = 2; ///< int Metainfo-Typ für Medien
  30. protected static $statCache = array(); ///< array Cache für DB-Ergebnisse
  31. public static function clearStatCache() {
  32. self::$statCache = array();
  33. }
  34. public static function clearDataCache() {
  35. sly_Core::cache()->flush('metainfoex', true);
  36. }
  37. public static function clearAllCaches() {
  38. self::clearDataCache();
  39. self::clearStatCache();
  40. }
  41. /**
  42. * Hilfsmethode zu den Benutzerrechten
  43. *
  44. * Diese Methode ermittelt, ob der aktuelle Benutzer das angegebene Recht
  45. * hat.
  46. *
  47. * @param string $right das Benutzerrecht (nur ExtMetaInfos-Rechte!)
  48. * @return bool true, wenn das Recht vorhanden ist, sonst false
  49. */
  50. public static function isAllowed($right) {
  51. return _WV2_Metainfoex::isAllowed($right);
  52. }
  53. /**
  54. * Ermitteln einer Datei-ID
  55. *
  56. * Diese Methode ermittelt zu einem Dateinamen die dazugehörige ID.
  57. *
  58. * @param mixed $medium der Dateiname (ohne Pfad!) (String) oder die ID (wird als int ungeändert zurückgegeben)
  59. * @return int die ID oder -1 falls keine gefunden wurde
  60. */
  61. public static function getIDForMedium($medium) {
  62. if (sly_Util_String::isInteger($medium)) return (int) $medium;
  63. if ($medium instanceof OOMedia) return (int) $medium->getId();
  64. if (is_string($medium)) {
  65. $cacheKey = 'file_'.$medium;
  66. if (!isset(self::$statCache[$cacheKey])) {
  67. $sql = WV_SQLEx::getInstance();
  68. $id = $sql->safeFetch('id', 'file', 'filename = ?', $medium);
  69. if ($id === false) {
  70. trigger_error('Konnte Datei-ID für "'.$medium.'" nicht ermitteln!', E_USER_WARNING);
  71. }
  72. self::$statCache[$cacheKey] = $id === false ? -1 : (int) $id;
  73. }
  74. return self::$statCache[$cacheKey];
  75. }
  76. trigger_error('Konnte Datei-ID für "'.$medium.'" ('.gettype($medium).') nicht ermitteln!', E_USER_WARNING);
  77. return -1;
  78. }
  79. /**
  80. * Ermitteln einer Artikel-ID
  81. *
  82. * Diese Methode ermittelt zu einem Artikel die dazugehörige ID.
  83. *
  84. * @param mixed $article OOArticle, rex_article oder int
  85. * @return int die ID oder -1 falls keine gefunden wurde
  86. */
  87. public static function getIDForArticle($article) {
  88. return WV_Sally::getIDForArticle($article);
  89. }
  90. /**
  91. * Ermitteln einer Kategorie-ID
  92. *
  93. * Diese Methode ermittelt zu einer Kategorie die dazugehörige ID.
  94. *
  95. * @param mixed $category OOCategory, rex_article oder int
  96. * @return int die ID oder -1 falls keine gefunden wurde
  97. */
  98. public static function getIDForCategory($category) {
  99. if (sly_Util_String::isInteger($category)) return (int) $category;
  100. if ($category instanceof OOCategory) return (int) $category->getId();
  101. if ($category instanceof rex_article) return (int) $category->getArticleId();
  102. trigger_error('Konnte Kategorie-ID für "'.$category.'" ('.gettype($category).') nicht ermitteln!', E_USER_WARNING);
  103. return -1;
  104. }
  105. /**
  106. * Ermitteln einer Metainfo-ID
  107. *
  108. * Diese Methode ermittelt zu einer Metainfo die dazugehörige ID.
  109. *
  110. * @param mixed $metainfo int, string, _WV2_MetaInfo, _WV2_MetaData
  111. * @param int $type der Typ der Metainfo
  112. * @param bool $allowNull wenn true, wird für $metainfo = null auch null zurückgegeben
  113. * @return int die ID oder -1 falls keine gefunden wurde
  114. */
  115. public static function getIDForMetainfo($metainfo, $type = WV2_Metainfoex::TYPE_ARTICLE, $allowNull = true) {
  116. if ($metainfo === null && $allowNull) return null; /* <- bedeutet im MetaProvider: "gib mir alle Metainfos!" */
  117. if (sly_Util_String::isInteger($metainfo)) return (int) $metainfo;
  118. if (is_string($metainfo)) return _WV2_MetaInfo::getIDForName($metainfo, $type);
  119. if ($metainfo instanceof _WV2_MetaInfo) return (int) $metainfo->getID();
  120. if ($metainfo instanceof _WV2_MetaData) return (int) $metainfo->getMetaInfoID();
  121. trigger_error('Konnte Metainfo-ID für "'.$metainfo.'" ('.gettype($metainfo).') nicht ermitteln!', E_USER_WARNING);
  122. return -1;
  123. }
  124. /**
  125. * Ermitteln einer Objekt-ID
  126. *
  127. * Diese Methode ermittelt zu einem Objekt die dazugehörige ID.
  128. *
  129. * @param mixed $object int, null, OOArticle, OOCategory, OOMedia, rex_article
  130. * @param bool $allowNull wenn true, wird für $object = null auch null zurückgegeben
  131. * @return int die ID oder -1 falls keine gefunden wurde
  132. */
  133. public static function getIDForObject($object, $allowNull = true) {
  134. if ($object === null && $allowNull) return null; /* <- bedeutet im MetaProvider: "gib mir alle Metainfos!" */
  135. if (sly_Util_String::isInteger($object)) return (int) $object; /* <- Artikel, Kategorie, Medium? Keine Ahnung. */
  136. if ($object instanceof OOArticle) return (int) $object->getId();
  137. if ($object instanceof OOCategory) return (int) $object->getId();
  138. if ($object instanceof OOMedia) return (int) $object->getId();
  139. if ($object instanceof rex_article) return (int) $object->getArticleId();
  140. trigger_error('Konnte Object-ID für "'.$object.'" ('.gettype($object).') nicht ermitteln!', E_USER_WARNING);
  141. return -1;
  142. }
  143. /**
  144. * Wandelt Artikeltypen um
  145. *
  146. * Diese Hilfsmethode wandelt einen Artikeltyp, der als String gegeben wurde,
  147. * in seine ID um. Wird kein String übergeben, wird der Parameter ungeändert
  148. * zurückgegeben.
  149. *
  150. * @throws Exception falls der Artikeltyp als String gegeben ist, dieser aber nicht existiert
  151. * @param mixed $articleType der Artikeltyp als String oder Integer oder _WV2_ArticleType
  152. * @param bool $allowNull wenn true, wird für $articleType = null auch null zurückgegeben
  153. * @return int der Artikeltyp als Integer
  154. */
  155. public static function getIDForArticleType($articleType, $allowNull) {
  156. if ($articleType === null && $allowNull) return null;
  157. if ($articleType instanceof _WV2_ArticleType) return $articleType->getID();
  158. if (!sly_Util_String::isInteger($articleType)) return _WV2_ArticleType::getIDForName($articleType);
  159. return (int) $articleType;
  160. }
  161. /*@}*/
  162. /*
  163. ************************************************************
  164. Hilfsmethoden für Metainfo-Typen
  165. ************************************************************
  166. */
  167. /** @name Hilfsmethoden für Objekte und Metatypen */
  168. /*@{*/
  169. /**
  170. * Objekt erzeugen
  171. *
  172. * Diese Methode erzeugt für eine ID, eine Sprache und einen bestimmten Typ
  173. * das dazugehörige Objekt (OOArticle, OOCategory oder OOMedia). Damit sind
  174. * alle Methoden des AddOns von der lästigen Arbeit, ein 5-Zeilen-switch zu
  175. * schreiben, befreit.
  176. *
  177. * @see getTypeForObject
  178. * @throws WV2_Exception falls der Typ nicht erkannt wurde
  179. *
  180. * @param int $id die ID des Objekts
  181. * @param int $clang die Sprache des Objekts (für OOMedia irrelevant)
  182. * @param int $type der Typ des Objekts
  183. * @return object ein passendes Objekt
  184. */
  185. public static function getObject($id, $clang = WV_Sally::CLANG_CURRENT, $type = self::TYPE_ARTICLE) {
  186. $id = (int) $id;
  187. $clang = WV_Sally::clang($clang);
  188. switch ($type) {
  189. case self::TYPE_ARTICLE: return OOArticle::getArticleById($id, $clang);
  190. case self::TYPE_CATEGORY: return OOCategory::getCategoryById($id, $clang);
  191. case self::TYPE_MEDIUM: return OOMedia::getMediaById($id);
  192. }
  193. throw new WV2_Exception('Unrecognized object type given: '.$type);
  194. }
  195. /**
  196. * Typ ermitteln
  197. *
  198. * Diese Methode ermittelt für ein bestehendes Objekt die entsprechende
  199. * Typ-Konstante.
  200. *
  201. * Wird das Objekt nicht erkannt, wird mit einem E_USER_ERROR die Ausführung
  202. * des Scripts angehalten.
  203. *
  204. * @see getObject
  205. * @throws WV2_Exception falls das Objekt nicht erkannt wurde
  206. *
  207. * @param object $obj das Objekt, dessen Typ ermittelt werden soll
  208. * @return int die Typ-ID des Objekts
  209. */
  210. public static function getTypeForObject($obj) {
  211. if ($obj instanceof OOArticle) return self::TYPE_ARTICLE;
  212. if ($obj instanceof OOCategory) return self::TYPE_CATEGORY;
  213. if ($obj instanceof OOMedia) return self::TYPE_MEDIUM;
  214. throw new WV2_Exception('Unrecognizable class object given.');
  215. }
  216. /**
  217. * Gibt einen Artikeltyp zurück
  218. *
  219. * @param mixed $articleType der Artikeltyp als String oder Integer oder _WV2_ArticleType
  220. * @return _WV2_ArticleType der Artikeltyp als _WV2_ArticleType oder null, falls er nicht gefunden wurde
  221. */
  222. public static function getArticleType($articleType) {
  223. try {
  224. return _WV2_ArticleType::getInstance(self::getIDForArticleType($articleType, false));
  225. }
  226. catch (WV2_Exception $e) {
  227. return null;
  228. }
  229. }
  230. /*@}*/
  231. public static function createMetaInfo($type, $name, $title, $datatype, $params, $helptext, $default, $hidden = false, $separatePage = false, $arttypes = array()) {
  232. if (!in_array($type, array(self::TYPE_ARTICLE, self::TYPE_CATEGORY, self::TYPE_MEDIUM))) {
  233. throw new WV2_Exception('Unbekannter Metainfo-Typ!');
  234. }
  235. if ($type != self::TYPE_ARTICLE) {
  236. $arttypes = array();
  237. }
  238. else {
  239. $arttypes = sly_makeArray($arttypes);
  240. foreach ($arttypes as $idx => $arttype) {
  241. $arttype = self::getIDForArticleType($arttype, false);
  242. if ($arttype <= 0) {
  243. unset($arttypes[$idx]);
  244. }
  245. else {
  246. $arttypes[$idx] = $arttype;
  247. }
  248. }
  249. $arttypes = array_unique($arttypes);
  250. }
  251. $separatePage = (boolean) $separatePage;
  252. $datatype = (int) $datatype;
  253. $metainfoID = _WV2_MetaInfo::create($name, $title, $separatePage, $datatype, $params, $default, $helptext, $arttypes, $type, $hidden);
  254. return _WV2_MetaInfo::getInstance($metainfoID, $type);
  255. }
  256. public static function createArticleType($name, $title, $metainfos = array()) {
  257. $metainfos = sly_makeArray($metainfos);
  258. foreach ($metainfos as $idx => $metainfo) {
  259. $metainfo = self::getIDForMetainfo($metainfo, self::TYPE_ARTICLE, false);
  260. if ($metainfo <= 0) {
  261. unset($metainfos[$idx]);
  262. }
  263. else {
  264. $metainfos[$idx] = $metainfo;
  265. }
  266. }
  267. $metainfos = array_unique($metainfos);
  268. $typeID = _WV2_ArticleType::create($name, $title, $metainfos);
  269. return _WV2_ArticleType::getInstance($typeID);
  270. }
  271. public static function setMetaData($object, $clang, $metainfo, $value, $type) {
  272. $type = (int) $type;
  273. $clang = WV_Sally::clang($clang);
  274. $objectID = self::getIDForObject($object, false);
  275. $metainfoID = self::getIDForMetainfo($metainfo, $type, false);
  276. self::clearAllCaches();
  277. return WV_SQLEx::getInstance()->queryEx(
  278. 'UPDATE ~wv2_meta SET `value` = ? WHERE object_id = ? AND clang = ? AND metainfo_id = ? AND meta_type = ?',
  279. array($value, $objectID, $clang, $metainfoID, $type), '~'
  280. );
  281. }
  282. }