PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/php/lib/data_manager/mdb2.class.php

https://bitbucket.org/chamilo/chamilo-app-wiki-dev/
PHP | 291 lines | 221 code | 54 blank | 16 comment | 14 complexity | d57f5515062e638a1d29572b4357cbe6 MD5 | raw file
  1. <?php
  2. namespace application\wiki;
  3. use common\libraries\Mdb2Database;
  4. use common\libraries\EqualityCondition;
  5. use common\libraries\InCondition;
  6. use common\libraries\Translation;
  7. use common\libraries\ConditionTranslator;
  8. use repository\RepositoryDataManager;
  9. use repository\ContentObjectPublicationAttributes;
  10. use repository\ContentObject;
  11. use common\libraries\Session;
  12. /**
  13. * @package application.lib.wiki.data_manager
  14. */
  15. /**
  16. * This is a data manager that uses a database for storage. It was written
  17. * for MySQL, but should be compatible with most SQL flavors.
  18. *
  19. * @author Sven Vanpoucke & Stefan Billiet
  20. */
  21. class Mdb2WikiDataManager extends Mdb2Database implements WikiDataManagerInterface
  22. {
  23. function initialize()
  24. {
  25. parent :: initialize();
  26. $this->set_prefix('wiki_');
  27. }
  28. function create_wiki_publication($wiki_publication)
  29. {
  30. return $this->create($wiki_publication);
  31. }
  32. function update_wiki_publication($wiki_publication)
  33. {
  34. $condition = new EqualityCondition(WikiPublication :: PROPERTY_ID, $wiki_publication->get_id());
  35. return $this->update($wiki_publication, $condition);
  36. }
  37. function delete_wiki_publication($wiki_publication)
  38. {
  39. $condition = new EqualityCondition(WikiPublication :: PROPERTY_ID, $wiki_publication->get_id());
  40. return $this->delete($wiki_publication->get_table_name(), $condition);
  41. }
  42. function count_wiki_publications($condition = null)
  43. {
  44. $rpm = RepositoryDataManager :: get_instance();
  45. $publication_alias = $this->get_alias(WikiPublication :: get_table_name());
  46. $content_object_alias = $rpm->get_alias(ContentObject :: get_table_name());
  47. $query = 'SELECT ' . $publication_alias . '.*, ';
  48. $query .= $rpm->escape_column_name(ContentObject :: PROPERTY_TITLE, $content_object_alias) . ', ';
  49. $query .= $rpm->escape_column_name(ContentObject :: PROPERTY_DESCRIPTION, $content_object_alias);
  50. $query .= ' FROM ' . $this->escape_table_name(WikiPublication :: get_table_name()) . ' AS ' . $publication_alias;
  51. // join for object name - description
  52. $query .= ' JOIN ' . $rpm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $rpm->get_alias(ContentObject :: get_table_name());
  53. $query .= ' ON ' . $this->escape_column_name(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $publication_alias) . ' = ';
  54. $query .= $rpm->escape_column_name(ContentObject :: PROPERTY_ID, $rpm->get_alias(ContentObject :: get_table_name()));
  55. return $this->count_result_set($query, WikiPublication :: get_table_name(), $condition);
  56. }
  57. function retrieve_wiki_publication($id)
  58. {
  59. $condition = new EqualityCondition(WikiPublication :: PROPERTY_ID, $id);
  60. return $this->retrieve_object(WikiPublication :: get_table_name(), $condition, array(), WikiPublication :: CLASS_NAME);
  61. // $object->set_default_property('content_object_id', RepositoryDataManager :: get_instance()->retrieve_content_object($object->get_default_property('content_object_id')));
  62. // return $object;
  63. }
  64. function retrieve_wiki_publications($condition = null, $offset = null, $max_objects = null, $order_by = null)
  65. {
  66. $rpm = RepositoryDataManager :: get_instance();
  67. $publication_alias = $this->get_alias(WikiPublication :: get_table_name());
  68. $content_object_alias = $rpm->get_alias(ContentObject :: get_table_name());
  69. $query = 'SELECT ' . $publication_alias . '.*, ';
  70. $query .= $rpm->escape_column_name(ContentObject :: PROPERTY_TITLE, $content_object_alias) . ', ';
  71. $query .= $rpm->escape_column_name(ContentObject :: PROPERTY_DESCRIPTION, $content_object_alias);
  72. $query .= ' FROM ' . $this->escape_table_name(WikiPublication :: get_table_name()) . ' AS ' . $publication_alias;
  73. // join for object name - description
  74. $query .= ' JOIN ' . $rpm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $rpm->get_alias(ContentObject :: get_table_name());
  75. $query .= ' ON ' . $this->escape_column_name(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $publication_alias) . ' = ';
  76. $query .= $rpm->escape_column_name(ContentObject :: PROPERTY_ID, $rpm->get_alias(ContentObject :: get_table_name()));
  77. return $this->retrieve_object_set($query, WikiPublication :: get_table_name(), $condition, $offset, $max_objects, $order_by, WikiPublication :: CLASS_NAME);
  78. }
  79. function retrieve_wiki_pub_feedback($id)
  80. {
  81. $condition = new EqualityCondition(WikiPublication :: PROPERTY_ID, $id);
  82. $object = $this->retrieve_object(WikiPubFeedback :: get_table_name(), $condition);
  83. return $object;
  84. }
  85. function retrieve_wiki_pub_feedbacks($condition = null, $offset = null, $max_objects = null, $order_by = null)
  86. {
  87. return $this->retrieve_objects(WikiPubFeedback :: get_table_name(), $condition, $offset, $max_objects, $order_by);
  88. }
  89. function create_wiki_pub_feedback($feedback)
  90. {
  91. return $this->create($feedback);
  92. }
  93. function update_wiki_pub_feedback($feedback)
  94. {
  95. $condition = new EqualityCondition(WikiPubFeedback :: PROPERTY_ID, $feedback->get_id());
  96. return $this->update($feedback, $condition);
  97. }
  98. function delete_wiki_pub_feedback($feedback)
  99. {
  100. $condition = new EqualityCondition(WikiPublication :: PROPERTY_ID, $feedback->get_id());
  101. return $this->delete(WikiPubFeedback :: get_table_name(), $condition);
  102. }
  103. // Publication attributes
  104. function content_object_is_published($object_id)
  105. {
  106. return $this->any_content_object_is_published(array($object_id));
  107. }
  108. function any_content_object_is_published($object_ids)
  109. {
  110. $condition = new InCondition(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_ids);
  111. return $this->count_objects(WikiPublication :: get_table_name(), $condition) >= 1;
  112. }
  113. function get_content_object_publication_attributes($object_id, $type = null, $offset = null, $count = null, $order_properties = null)
  114. {
  115. if (isset($type))
  116. {
  117. if ($type == 'user')
  118. {
  119. $rdm = RepositoryDataManager :: get_instance();
  120. $co_alias = $rdm->get_alias(ContentObject :: get_table_name());
  121. $pub_alias = $this->get_alias(WikiPublication :: get_table_name());
  122. $query = 'SELECT ' . $pub_alias . '.*, ' . $co_alias . '.' . $this->escape_column_name(ContentObject :: PROPERTY_TITLE) . ' FROM ' . $this->escape_table_name(WikiPublication :: get_table_name()) . ' AS ' . $pub_alias . ' JOIN ' . $rdm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $co_alias . ' ON ' . $this->escape_column_name(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $pub_alias) . '=' . $this->escape_column_name(ContentObject :: PROPERTY_ID, $co_alias);
  123. $condition = new EqualityCondition(WikiPublication :: PROPERTY_PUBLISHER, Session :: get_user_id());
  124. $translator = ConditionTranslator :: factory($this);
  125. $query .= $translator->render_query($condition);
  126. $order = array();
  127. foreach ($order_properties as $order_property)
  128. {
  129. if ($order_property->get_property() == 'application')
  130. {
  131. }
  132. elseif ($order_property->get_property() == 'location')
  133. {
  134. }
  135. elseif ($order_property->get_property() == 'title')
  136. {
  137. $order[] = $this->escape_column_name('title') . ' ' . ($order_property->get_direction() == SORT_DESC ? 'DESC' : 'ASC');
  138. }
  139. else
  140. {
  141. $order[] = $this->escape_column_name($order_property->get_property()) . ' ' . ($order_property->get_direction() == SORT_DESC ? 'DESC' : 'ASC');
  142. }
  143. }
  144. if (count($order) > 0)
  145. $query .= ' ORDER BY ' . implode(', ', $order);
  146. }
  147. }
  148. else
  149. {
  150. $query = 'SELECT * FROM ' . $this->escape_table_name(WikiPublication :: get_table_name());
  151. $condition = new EqualityCondition(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  152. $translator = ConditionTranslator :: factory($this);
  153. $query .= $translator->render_query($condition);
  154. }
  155. $this->set_limit($count, $offset);
  156. $res = $this->query($query);
  157. $publication_attr = array();
  158. while ($record = $res->fetchRow(MDB2_FETCHMODE_ASSOC))
  159. {
  160. $info = new ContentObjectPublicationAttributes();
  161. $info->set_id($record[WikiPublication :: PROPERTY_ID]);
  162. $info->set_publisher_user_id($record[WikiPublication :: PROPERTY_PUBLISHER]);
  163. $info->set_publication_date($record[WikiPublication :: PROPERTY_PUBLISHED]);
  164. $info->set_application(WikiManager :: APPLICATION_NAME);
  165. //TODO: i8n location string
  166. $info->set_location(Translation :: get('Wiki'));
  167. $info->set_url('index.php?application=wiki&go=' . WikiManager :: ACTION_VIEW_WIKI . '&wiki_publication=' . $record[WikiPublication :: PROPERTY_ID]);
  168. $info->set_publication_object_id($record[WikiPublication :: PROPERTY_CONTENT_OBJECT_ID]);
  169. $publication_attr[] = $info;
  170. }
  171. $res->free();
  172. return $publication_attr;
  173. }
  174. function get_content_object_publication_attribute($publication_id)
  175. {
  176. $query = 'SELECT * FROM ' . $this->escape_table_name(WikiPublication :: get_table_name()) . ' WHERE ' . $this->escape_column_name(WikiPublication :: PROPERTY_ID) . '=' . $this->quote($publication_id);
  177. $this->set_limit(1, 0);
  178. $res = $this->query($query);
  179. $publication_attr = array();
  180. $record = $res->fetchRow(MDB2_FETCHMODE_ASSOC);
  181. $publication_attr = new ContentObjectPublicationAttributes();
  182. $publication_attr->set_id($record[WikiPublication :: PROPERTY_ID]);
  183. $publication_attr->set_publisher_user_id($record[WikiPublication :: PROPERTY_PUBLISHER]);
  184. $publication_attr->set_publication_date($record[WikiPublication :: PROPERTY_PUBLISHED]);
  185. $publication_attr->set_application(WikiManager :: APPLICATION_NAME);
  186. //TODO: i8n location string
  187. $publication_attr->set_location(Translation :: get('Wiki'));
  188. $publication_attr->set_url('index.php?application=wiki&go=browse');
  189. $publication_attr->set_publication_object_id($record[WikiPublication :: PROPERTY_CONTENT_OBJECT_ID]);
  190. $res->free();
  191. return $publication_attr;
  192. }
  193. function count_publication_attributes($user = null, $object_id = null, $condition = null)
  194. {
  195. if (! $object_id)
  196. {
  197. $condition = new EqualityCondition(WikiPublication :: PROPERTY_PUBLISHER, $user->get_id());
  198. }
  199. else
  200. {
  201. $condition = new EqualityCondition(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  202. }
  203. return $this->count_objects(WikiPublication :: get_table_name(), $condition);
  204. }
  205. function delete_content_object_publications($object_id)
  206. {
  207. $condition = new EqualityCondition(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  208. $publications = $this->retrieve_wiki_publications($condition);
  209. $succes = true;
  210. while ($publication = $publications->next_result())
  211. {
  212. $succes &= $publication->delete();
  213. }
  214. return $succes;
  215. }
  216. function delete_content_object_publication($publication_id)
  217. {
  218. $condition = new EqualityCondition(WikiPublication :: PROPERTY_ID, $publication_id);
  219. return $this->delete(WikiPublication :: get_table_name(), $condition);
  220. }
  221. function update_content_object_publication_id($publication_attr)
  222. {
  223. $where = $this->escape_column_name(WikiPublication :: PROPERTY_ID) . '=' . $publication_attr->get_id();
  224. $props = array();
  225. $props[$this->escape_column_name(WikiPublication :: PROPERTY_CONTENT_OBJECT_ID)] = $publication_attr->get_publication_object_id();
  226. $this->get_connection()->loadModule('Extended');
  227. if ($this->get_connection()->extended->autoExecute($this->get_table_name(WikiPublication :: get_table_name()), $props, MDB2_AUTOQUERY_UPDATE, $where))
  228. {
  229. return true;
  230. }
  231. else
  232. {
  233. return false;
  234. }
  235. }
  236. }
  237. ?>