841
* Returns portfolio items (artefacts, views) owned by $owner and tagged
844
* @param string $tag Tag
845
* @param object $owner: owner type (user,group,institution), and id
846
* @param integer $limit
847
* @param integer $offset
848
* @param string $sort
849
* @param array $types view/artefacttype filters
850
* @param boolean $returntags Return all the tags that have been attached to each result
852
public static function portfolio_search_by_tag($tag, $owner, $limit, $offset, $sort, $types, $returntags) {
853
$viewfilter = is_null($types) || $types['view'] == true ? 'AND TRUE' : 'AND FALSE';
855
if (is_null($types)) {
856
$artefacttypefilter = '';
858
else if (!empty($types['artefact'])) {
859
$artefacttypefilter = ' AND a.artefacttype IN (' . join(',', array_map('db_quote', $types['artefact'])) . ')';
862
$artefacttypefilter = ' AND FALSE';
865
if (!is_null($tag)) {
866
$artefacttypefilter .= ' AND at.tag = ?';
867
$viewfilter .= ' AND vt.tag = ?';
868
$values = array($owner->id, $tag, $owner->id, $tag);
871
$values = array($owner->id, $owner->id);
875
(SELECT a.id, a.title, a.description, 'artefact' AS type, a.artefacttype, " . db_format_tsfield('a.ctime', 'ctime') . "
876
FROM {artefact} a JOIN {artefact_tag} at ON (a.id = at.artefact)
877
WHERE a.owner = ?" . $artefacttypefilter . ")
879
(SELECT v.id, v.title, v.description, 'view' AS type, NULL AS artefacttype, " . db_format_tsfield('v.ctime', 'ctime') . "
880
FROM {view} v JOIN {view_tag} vt ON (v.id = vt.view)
881
WHERE v.owner = ? " . $viewfilter . ")
884
$result = (object) array(
894
if ($count = count_records_sql('SELECT COUNT(*) ' . $from, $values, $offset, $limit)) {
895
$result->count = $count;
896
$sort = $sort == 'date' ? 'ctime DESC' : 'title ASC';
897
if ($data = get_records_sql_assoc("SELECT type || ':' || id AS tid, p.* " . $from . ' ORDER BY ' . $sort, $values, $offset, $limit)) {
899
$ids = array('view' => array(), 'artefact' => array());
900
foreach ($data as &$d) {
901
$ids[$d->type][$d->id] = 1;
903
if (!empty($ids['view'])) {
904
if ($viewtags = get_records_select_array('view_tag', 'view IN (' . join(',', array_keys($ids['view'])) . ')')) {
905
foreach ($viewtags as &$vt) {
906
$data['view:' . $vt->view]->tags[] = $vt->tag;
910
if (!empty($ids['artefact'])) {
911
if ($artefacttags = get_records_select_array('artefact_tag', 'artefact IN (' . join(',', array_keys($ids['artefact'])) . ')')) {
912
foreach ($artefacttags as &$at) {
913
$data['artefact:' . $at->artefact]->tags[] = $at->tag;
918
$result->data = $data;
836
926
* Parses a query string into SQL fragments for searching. Supports
837
927
* phrases, AND/OR etc.