Exemple #1
0
 /**
  * Get a set of records from the requested favorite list.
  *
  * @param string $user   ID of user owning favorite list
  * @param string $list   ID of list to retrieve (null for all favorites)
  * @param array  $tags   Tags to use for limiting results
  * @param string $sort   Resource table field to use for sorting (null for
  * no particular sort).
  * @param int    $offset Offset for results
  * @param int    $limit  Limit for results (null for none)
  *
  * @return \Zend\Db\ResultSet\AbstractResultSet
  */
 public function getFavorites($user, $list = null, $tags = [], $sort = null, $offset = 0, $limit = null)
 {
     $sort = isset($_GET['sort']) ? $_GET['sort'] : false;
     if (!$sort) {
         $sort = 'saved';
     }
     if ($sort == 'format') {
         $translator = $this->getServiceLocator()->getTranslator();
     }
     $userResource = $this->getDbTable('UserResource');
     $favorites = parent::getFavorites($user, $list, $tags, null, $offset, $limit);
     $favoritesSorted = [];
     foreach ($favorites as $fav) {
         $source = $fav->source;
         try {
             $driver = $this->getServiceLocator()->getServiceLocator()->get('VuFind\\RecordLoader')->load($fav->record_id, $source);
         } catch (\Exception $e) {
             continue;
         }
         switch ($sort) {
             case 'title':
                 $sortKey = $driver->getSortTitle();
                 break;
             case 'author':
                 $sortKey = $driver->getPrimaryAuthor();
                 break;
             case 'date':
                 if ($year = $driver->tryMethod('getYear', [])) {
                     $sortKey = $year;
                 } else {
                     $years = $driver->getPublicationDates();
                     if (isset($years[0])) {
                         $sortKey = $years[0];
                     } else {
                         $sortKey = '';
                     }
                 }
                 break;
             case 'format':
                 $formats = $driver->getFormats();
                 $sortKey = count($formats) ? $translator->translate(end($formats)) : '';
                 break;
             default:
                 $params = ['resource_id' => $fav->id, 'user_id' => $user];
                 if ($list) {
                     $params['list_id'] = $list;
                 }
                 $res = $userResource->select($params)->current();
                 $sortKey = $res->saved;
                 break;
         }
         $sortKey = mb_strtolower($sortKey, 'UTF-8');
         $sortKey .= '_' . $fav->record_id;
         $favoritesSorted[$sortKey] = $fav;
     }
     ksort($favoritesSorted);
     return array_values($favoritesSorted);
 }
Exemple #2
0
 /**
  * Get all resources associated with the current tag.
  *
  * @param string $source Record source (optional limiter)
  * @param string $sort   Resource field to sort on (optional)
  * @param int    $offset Offset for results
  * @param int    $limit  Limit for results (null for none)
  *
  * @return array
  * @access public
  */
 public function getResources($source = null, $sort = null, $offset = 0, $limit = null)
 {
     // Set up base query:
     $tag = $this;
     $callback = function ($select) use($tag, $source, $sort, $offset, $limit) {
         $select->columns(array(new Expression('DISTINCT(?)', array('resource.id'), array(Expression::TYPE_IDENTIFIER)), '*'));
         $select->join(array('rt' => 'resource_tags'), 'resource.id = rt.resource_id', array());
         $select->where->equalTo('rt.tag_id', $tag->id);
         if (!empty($source)) {
             $select->where->equalTo('source', $source);
         }
         if (!empty($sort)) {
             ResourceTable::applySort($select, $sort);
         }
         if ($offset > 0) {
             $select->offset($offset);
         }
         if (!is_null($limit)) {
             $select->limit($limit);
         }
     };
     $table = $this->getDbTable('Resource');
     return $table->select($callback);
 }
Exemple #3
0
 /**
  * Get all resources associated with the provided tag query.
  *
  * @param string $query  Search query
  * @param string $source Record source (optional limiter)
  * @param string $sort   Resource field to sort on (optional)
  * @param int    $offset Offset for results
  * @param int    $limit  Limit for results (null for none)
  *
  * @return array
  */
 public function fuzzyResourceSearch($query, $source = null, $sort = null, $offset = 0, $limit = null)
 {
     $cb = function ($select) use($query, $source, $sort, $offset, $limit) {
         $select->columns([new Expression('DISTINCT(?)', ['resource.id'], [Expression::TYPE_IDENTIFIER])]);
         $select->join(['rt' => 'resource_tags'], 'tags.id = rt.tag_id', []);
         $select->join(['resource' => 'resource'], 'rt.resource_id = resource.id', '*');
         $select->where->literal('lower(tags.tag) like lower(?)', [$query]);
         if (!empty($source)) {
             $select->where->equalTo('source', $source);
         }
         if (!empty($sort)) {
             Resource::applySort($select, $sort);
         }
         if ($offset > 0) {
             $select->offset($offset);
         }
         if (null !== $limit) {
             $select->limit($limit);
         }
     };
     return $this->select($cb);
 }
Exemple #4
0
 /**
  * Get a set of records from the requested favorite list.
  *
  * @param string $user   ID of user owning favorite list
  * @param string $list   ID of list to retrieve (null for all favorites)
  * @param array  $tags   Tags to use for limiting results
  * @param string $sort   Resource table field to use for sorting (null for
  * no particular sort).
  * @param int    $offset Offset for results
  * @param int    $limit  Limit for results (null for none)
  *
  * @return \Zend\Db\ResultSet\AbstractResultSet
  */
 public function getFavorites($user, $list = null, $tags = [], $sort = null, $offset = 0, $limit = null)
 {
     // Set up base query:
     $obj =& $this;
     return $this->select(function ($s) use($user, $list, $tags, $sort, $offset, $limit, $obj) {
         $s->columns([new Expression('DISTINCT(?)', ['resource.id'], [Expression::TYPE_IDENTIFIER]), '*']);
         $s->join(['ur' => 'user_resource'], 'resource.id = ur.resource_id', []);
         $s->where->equalTo('ur.user_id', $user);
         // Adjust for list if necessary:
         if (!is_null($list)) {
             $s->where->equalTo('ur.list_id', $list);
         }
         if ($offset > 0) {
             $s->offset($offset);
         }
         if (!is_null($limit)) {
             $s->limit($limit);
         }
         // Adjust for tags if necessary:
         if (!empty($tags)) {
             $linkingTable = $obj->getDbTable('ResourceTags');
             foreach ($tags as $tag) {
                 $matches = $linkingTable->getResourcesForTag($tag, $user, $list)->toArray();
                 $getId = function ($i) {
                     return $i['resource_id'];
                 };
                 $s->where->in('resource.id', array_map($getId, $matches));
             }
         }
         // Apply sorting, if necessary:
         if (!empty($sort)) {
             Resource::applySort($s, $sort);
         }
     });
 }