123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <?php
- /* For licensing terms, see /license.txt */
- /**
- * Link repository class definition
- * @package chamilo.link
- */
- /**
- * Init
- */
- namespace Link;
- use Database;
- /**
- * Database interface for Link
- *
- * @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Genevas
- * @license /license.txt
- */
- class LinkRepository
- {
- /**
- *
- * @return \Link\LinkRepository
- */
- public static function instance()
- {
- static $result = null;
- if (empty($result)) {
- $result = new self();
- }
- return $result;
- }
- public function save($link)
- {
- $id = $link->id;
- if (empty($id)) {
- return $this->insert($link);
- } else {
- return $this->update($link);
- }
- }
- /**
- *
- * @param \Link\Link $link
- * @return bool
- */
- public function insert($link)
- {
- $c_id = (int) $link->c_id;
- $session_id = (int) $link->session_id;
- $session_id = $session_id ? $session_id : '0';
- $url = trim($link->url);
- $url = Database::escape_string($url);
- $title = trim($link->title);
- $title = Database::escape_string($title);
- $description = trim($link->description);
- $description = Database::escape_string($description);
- $category_id = intval($link->category_id);
- $category_id = $category_id ? $category_id : '0';
- $display_order = $this->next_display_order($c_id);
- $on_homepage = $link->on_homepage;
- $on_homepage = $on_homepage ? '1' : '0';
- $target = $link->target;
- $target = Database::escape_string($target);
- $table = Database :: get_course_table(TABLE_LINK);
- $sql = "INSERT INTO $table
- (c_id, url, title, description, category_id, display_order, on_homepage, target, session_id)
- VALUES
- ($c_id , '$url', '$title', '$description', $category_id, $display_order, '$on_homepage', '$target', $session_id)";
- $result = (bool) Database :: query($sql);
- if ($result) {
- $id = Database::insert_id();
- $link->id = $id;
- $link->display_order = $display_order;
- $_course = api_get_course_info_by_id($c_id);
- $tool = TOOL_LINK;
- $user_id = api_get_user_id();
- api_item_property_update($_course, $tool, $id, 'LinkAdded', $user_id);
- }
- return $result;
- }
- function update($link)
- {
- $c_id = (int) $link->c_id;
- $id = (int) $link->id;
- $session_id = (int) $link->session_id;
- $session_id = $session_id ? $session_id : '0';
- $url = trim($link->url);
- $url = Database::escape_string($url);
- $title = trim($link->title);
- $title = Database::escape_string($title);
- $description = trim($link->description);
- $description = Database::escape_string($description);
- $category_id = intval($link->category_id);
- $category_id = $category_id ? $category_id : '0';
- $display_order = (int) $link->display_order;
- $on_homepage = $link->on_homepage;
- $on_homepage = $on_homepage ? '1' : '0';
- $target = $link->target;
- $target = Database::escape_string($target);
- $table = Database :: get_course_table(TABLE_LINK);
- $sql = "UPDATE $table SET
- url = '$url',
- title = '$title',
- description = '$description',
- category_id = $category_id,
- display_order = $display_order,
- on_homepage = '$on_homepage',
- target = '$target',
- session_id = $session_id
- WHERE
- c_id = $c_id AND
- id = $id";
- $result = (bool) Database :: query($sql);
- if ($result) {
- $_course = api_get_course_info_by_id($c_id);
- $tool = TOOL_LINK;
- $user_id = api_get_user_id();
- api_item_property_update($_course, $tool, $id, 'LinkUpdated', $user_id);
- }
- return $result;
- }
- public function remove_by_category($category)
- {
- $result = true;
- $c_id = (int) $category->c_id;
- $id = (int) $category->id;
- $where = "l.c_id=$c_id AND l.category_id=$id";
- $links = $links = $this->find($where);
- foreach ($links as $link) {
- $success = $this->remove($link);
- if (!$success) {
- $result = false;
- }
- }
- return $result;
- }
- public function remove_by_course($c_id, $session_id = 0)
- {
- $result = true;
- $session_where = api_get_session_condition($session_id, true, true);
- $where = "l.c_id=$c_id $session_where";
-
- $links = $links = $this->find($where);
- foreach ($links as $link) {
- $success = $this->remove($link);
- if (!$success) {
- $result = false;
- }
- }
-
-
- return $result;
- }
- /**
- *
- * Note:
- *
- * Note as ids are reused when objects are deleted it is either we delete
- * everything or nothing.
- *
- * @param \Link\Link|object $link
- * @return bool
- */
- public function remove($link)
- {
- $table = Database :: get_course_table(TABLE_LINK);
- $c_id = (int) $link->c_id;
- $id = (int) $link->id;
- $sql = "DELETE FROM $table WHERE c_id=$c_id AND id=$id";
- $result = Database :: query($sql);
- if ($result) {
- $tool = TOOL_LINK;
- $tbl_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- $sql = "DELETE FROM $tbl_property WHERE c_id=$c_id AND ref=$id AND tool='$tool'";
- Database :: query($sql);
-
-
- $id = "Link.$id";
- $table = Database :: get_course_table(TABLE_METADATA);
- $sql = "DELETE FROM $table WHERE c_id=$c_id AND eid='$id'";
- Database :: query($sql);
- }
- return (bool) $result;
- }
- /**
- *
- * @param string $where
- * @return \Link\Link
- */
- public function find_one($where)
- {
- $items = $this->find($where);
- foreach ($items as $item) {
- return $item;
- }
- return null;
- }
-
- /**
- *
- * @param int $c_id
- * @param int $id
- * @return \Link\Link
- */
- public function find_one_by_id($c_id, $id)
- {
- $where = "l.c_id = $c_id AND l.id = $id";
- return $this->find_one($where);
- }
-
- /**
- *
- * @param int $c_id
- * @param int $session_id
- * @param string $url
- * @return \Link\Link
- */
- public function find_one_by_course_and_url($c_id, $session_id, $url)
- {
- $c_id = (int)$c_id;
- $session_id = (int)$session_id;
- $url = Database::escape_string($url);
-
- $session_where =api_get_session_condition($session_id, true, true);
- $where = "l.c_id = $c_id $session_where AND l.url = '$url'";
- return $this->find_one($where);
- }
- /**
- *
- * @param string $where
- * @return array
- */
- public function find($where = '')
- {
- $result = array();
- $tbl_link = Database :: get_course_table(TABLE_LINK);
- $tbl_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- $tool = TOOL_LINK;
- $where = $where ? " AND ($where)" : '';
- $sql = "SELECT
- l.*,
- p.visibility
- FROM
- $tbl_link AS l,
- $tbl_property AS p
- WHERE
- p.tool='$tool' AND
- l.id = p.ref AND
- l.c_id = p.c_id
- $where
- ORDER BY
- l.display_order DESC";
- $rs = Database :: query($sql);
- while ($data = Database::fetch_object($rs)) {
- $result[] = Link::create($data);
- }
- return $result;
- }
- /**
- *
- * @param \Link\LinkCategory $category
- */
- public function find_by_category($category, $visible_only = false)
- {
- $session_id = $category->session_id;
- $id = $category->id;
- $where = $visible_only ? 'p.visibility=1' : '(p.visibility=0 OR p.visibility=1)';
- $where .=api_get_session_condition($session_id, true, true);
- $where .= "AND l.category_id = $id";
- return $this->find($where);
- }
- public function make_visible($c_id, $id)
- {
- $_course = api_get_course_info_by_id($c_id);
- $user_id = api_get_user_id();
- $result = api_item_property_update($_course, TOOL_LINK, $id, 'visible', $user_id);
- return $result;
- }
- public function make_invisible($c_id, $id)
- {
- $_course = api_get_course_info_by_id($c_id);
- $user_id = api_get_user_id();
- $result = api_item_property_update($_course, TOOL_LINK, $id, 'invisible', $user_id);
- return $result;
- }
- function next_display_order($c_id)
- {
- $table = Database :: get_course_table(TABLE_LINK);
- $sql = "SELECT MAX(display_order) FROM $table WHERE c_id = $c_id ";
- $rs = Database :: query($sql);
- list ($result) = Database :: fetch_row($rs);
- $result = $result + 1;
- $result = intval($result);
- return $result;
- }
- /**
- * Ensure $ids are sorted in the order given from greater to lower
- *
- * Simple algorithm, works only if all ids are given at the same time.
- * This would not work if pagination were used and only a subset were sorted.
- * On the other hand the algorithm is sturdy, it will work even if current
- * weights/display orders are not correctly set up in the db.
- *
- * @param int $c_id
- * @param array $ids
- */
- public function order($c_id, $ids)
- {
- $result = true;
- $ids = array_map('intval', $ids);
- $table = Database :: get_course_table(TABLE_LINK);
- $counter = 0;
- $weight = count($ids) + 1;
- foreach ($ids as $id) {
- $sql = "UPDATE $table SET display_order = $weight WHERE c_id = $c_id AND id = $id";
- $success = Database::query($sql);
- if (!$success) {
- $result = false;
- }
- --$weight;
- }
- return $result;
- }
- }
|