コード例 #1
0
 public static function handleCollectionsRequest()
 {
     $tags = DB::allRecords('SELECT Tag.*, (SELECT COUNT(*) FROM `%2$s` AS TagItem WHERE Tag.`%3$s` = TagItem.`%4$s` AND TagItem.`%6$s` = "Media") AS itemsCount FROM `%1$s` AS Tag ORDER BY itemsCount', array(Tag::$tableName, TagItem::$tableName, Tag::getColumnName('ID'), TagItem::getColumnName('TagID'), Tag::getColumnName('Title'), TagItem::getColumnName('ContextClass')));
     $allMediaCollection = array('Title' => 'All Media', 'itemsCount' => DB::oneValue('SELECT COUNT(*) FROM `%s`', Media::$tableName), 'nodeType' => 'allMedia');
     $tagsCollection = array('Title' => 'Tagged Media', 'itemsCount' => array_sum(array_map(function ($tag) {
         return $tag['itemsCount'];
     }, $tags)), 'nodeType' => 'tags', 'children' => array_map(function ($tag) {
         $tag['nodeType'] = 'tag';
         return $tag;
     }, $tags));
     return static::respond('collections', array($allMediaCollection, $tagsCollection));
 }
コード例 #2
0
 public static function getTagsSummary($options = array())
 {
     $options = array_merge(array('tagConditions' => array(), 'itemConditions' => array(), 'Class' => false, 'classConditions' => array(), 'overlayTag' => false, 'order' => 'itemsCount DESC', 'excludeEmpty' => true, 'limit' => false), $options);
     // initialize conditions
     $options['tagConditions'] = Tag::mapConditions($options['tagConditions']);
     if (!empty($options['Class'])) {
         $options['classConditions'] = $options['Class']::mapConditions($options['classConditions']);
     }
     $options['itemConditions'] = TagItem::mapConditions($options['itemConditions']);
     // build query
     if (!empty($options['classConditions'])) {
         $classSubquery = 'SELECT `%s` FROM `%s` WHERE (%s)';
         $classParams = array($options['Class']::getColumnName('ID'), $options['Class']::$tableName, join(') AND (', $options['classConditions']));
     }
     $itemsCountQuery = 'SELECT COUNT(*) FROM `%s` TagItem WHERE TagItem.`%s` = Tag.`%s` AND (%s)';
     $itemsCountParams = array(TagItem::$tableName, TagItem::getColumnName('TagID'), Tag::getColumnName('ID'), count($options['itemConditions']) ? join(') AND (', $options['itemConditions']) : '1');
     if (!empty($options['overlayTag'])) {
         if (!is_object($OverlayTag = $options['overlayTag']) && !($OverlayTag = Tag::getByHandle($options['overlayTag']))) {
             throw new Excoption('Overlay tag not found');
         }
         $itemsCountQuery .= sprintf(' AND (TagItem.`%s`,TagItem.`%s`) IN (SELECT OverlayTagItem.`%s`, OverlayTagItem.`%s` FROM `%s` OverlayTagItem WHERE OverlayTagItem.`%s` = %u)', TagItem::getColumnName('ContextClass'), TagItem::getColumnName('ContextID'), TagItem::getColumnName('ContextClass'), TagItem::getColumnName('ContextID'), TagItem::$tableName, TagItem::getColumnName('TagID'), $OverlayTag->ID);
     }
     if (isset($classSubquery)) {
         $itemsCountQuery .= sprintf(' AND TagItem.`%s` = "%s" AND TagItem.`%s` IN (%s)', TagItem::getColumnName('ContextClass'), $options['Class']::getStaticRootClass(), TagItem::getColumnName('ContextID'), DB::prepareQuery($classSubquery, $classParams));
     }
     $tagSummaryQuery = 'SELECT Tag.*, (%s) AS itemsCount FROM `%s` Tag WHERE (%s)';
     $tagSummaryParams = array(DB::prepareQuery($itemsCountQuery, $itemsCountParams), Tag::$tableName, count($options['tagConditions']) ? join(') AND (', $options['tagConditions']) : '1');
     // exclude empty
     if ($options['excludeEmpty']) {
         $tagSummaryQuery .= ' HAVING itemsCount > 0';
     }
     // add order options
     if ($options['order']) {
         $tagSummaryQuery .= ' ORDER BY ' . join(',', static::_mapFieldOrder($options['order']));
     }
     // add limit options
     if ($options['limit']) {
         $tagSummaryQuery .= sprintf(' LIMIT %u,%u', $options['offset'], $options['limit']);
     }
     try {
         // return indexed table or list
         if ($options['indexField']) {
             return DB::table(Tag::getColumnName($options['indexField']), $tagSummaryQuery, $tagSummaryParams);
         } else {
             return DB::allRecords($tagSummaryQuery, $tagSummaryParams);
         }
     } catch (TableNotFoundException $e) {
         return array();
     }
 }
コード例 #3
0
ファイル: Tag.class.php プロジェクト: nbey/Emergence-Skeleton
 public function getItemsByClass($class, $options = array())
 {
     // apply defaults
     $options = array_merge(array('conditions' => false, 'order' => false, 'limit' => is_numeric($options) ? $options : false, 'offset' => 0, 'overlayTag' => false, 'calcFoundRows' => false), $options);
     // build TagItem query
     $tagWhere = array();
     $tagWhere[] = sprintf('`%s` = %u', TagItem::getColumnName('TagID'), $this->ID);
     $tagWhere[] = sprintf('`%s` = "%s"', TagItem::getColumnName('ContextClass'), DB::escape($class::getStaticRootClass()));
     $tagQuery = sprintf('SELECT ContextID FROM `%s` TagItem WHERE (%s)', TagItem::$tableName, count($tagWhere) ? join(') AND (', $tagWhere) : '1', $options['limit'] ? sprintf('LIMIT %u', $options['limit']) : '');
     if (!empty($options['overlayTag'])) {
         if (!is_object($OverlayTag = $options['overlayTag']) && !($OverlayTag = Tag::getByHandle($options['overlayTag']))) {
             throw new Exception('Overlay tag not found');
         }
         $tagQuery .= sprintf(' AND (TagItem.`%s`,TagItem.`%s`) IN (SELECT OverlayTagItem.`%s`, OverlayTagItem.`%s` FROM `%s` OverlayTagItem WHERE OverlayTagItem.`%s` = %u)', TagItem::getColumnName('ContextClass'), TagItem::getColumnName('ContextID'), TagItem::getColumnName('ContextClass'), TagItem::getColumnName('ContextID'), TagItem::$tableName, TagItem::getColumnName('TagID'), $OverlayTag->ID);
     }
     // built class table query
     if ($options['conditions']) {
         if (!is_array($options['conditions'])) {
             $options['conditions'] = array($options['conditions']);
         }
         $classWhere = $class::_mapConditions($options['conditions']);
     } else {
         $classWhere = array();
     }
     // return objects
     $classQuery = sprintf('SELECT %s' . ' Content.*' . ' FROM (%s) TagItem' . ' JOIN `%s` Content ON (Content.ID = TagItem.ContextID)' . ' WHERE (%s)', $options['calcFoundRows'] ? 'SQL_CALC_FOUND_ROWS' : '', $tagQuery, $class::$tableName, count($classWhere) ? join(') AND (', $classWhere) : '1');
     if ($options['order']) {
         $classQuery .= ' ORDER BY ' . join(',', $class::_mapFieldOrder($options['order']));
     }
     if ($options['limit']) {
         $classQuery .= sprintf(' LIMIT %u,%u', $options['offset'], $options['limit']);
     }
     return $class::instantiateRecords(DB::allRecords($classQuery));
 }