Esempio n. 1
0
 /**
  * Комплексная функция для сложного запроса с сортировкой и фильтрацией
  * @param int $start номер первой записи (для постраничного чтения)
  * @param int $limit количество записей (для постраничного чтения)
  * @param bool $all если false, то только опубликованные
  * @param array $sort поле и направление сортировки array('field' => 'поле', 'dir' => 'направление')
  * @param array $filter массив фильтров, получается из url array(['field' => <название поля>, 'value' => <значение>], ...), можно посмотреть в контроллере node стр. 375 getFilter($f3, $path, $model) 
  * @param string $additional_confitions строка дополнительных условий, полученная, например, из классов сложных фильров или просто кусок запроса WHERE, который будет добавлен к основному условию через AND
  * @param bool $with_related_fields включать или не включать связанные по один-ко-многим поля (название и slug)
  * @return array результат запроса
  */
 public function get($start = 0, $limit = 10, $all = true, $sort = null, $filter = null, $additional_conditions = null, $with_related_fields = true)
 {
     $params = array();
     $params[] = '';
     $query = new DBALQuery();
     $query->select($this->table . '.*')->from($this->table)->options(array('order' => $this->getSortQueryPart($sort)));
     if ($additional_conditions) {
         $query->conditions([$additional_conditions]);
     }
     //		echo $this->table.' '.$limit;
     //              \helpers\Debug::prePrintR($filter);
     $clear_filter = $this->getFilterQueryPart($filter);
     //              \helpers\Debug::prePrintR($clear_filter);
     // Проверка на наличие pid в фильтре, в этом случае надо посчитать кол-во потомков
     foreach ($clear_filter as $k => $c_filter) {
         if ($c_filter['field'] == 'pid') {
             $clear_filter[$k]['field'] = $this->table . '.pid';
             // Чтобы не было ambigious
             $query->join($this->table);
             $query->options(['group' => [$this->table . '.id']]);
             break;
         }
     }
     if (!$all) {
         $clear_filter[] = array('field' => $this->table . '.published', 'value' => 1);
     }
     //		\helpers\Debug::prePrintR($query);
     $query->filters($clear_filter);
     //		\helpers\Debug::prePrintR($query);
     if ($with_related_fields) {
         $this->addVirtualFieldsToQuery($query);
         //			\helpers\Debug::prePrintR($query);
     }
     if ($this->tableMeta->isSortable()) {
         $list['subset'] = $query->exec();
     } else {
         $list = $query->paginate($start, $limit);
     }
     //		\helpers\Debug::prePrintR($list['subset']);
     if ($this->tableMeta->hasItems()) {
         $item_model = \models\ContentItem::getInstance($this->table);
     }
     $nodes = array('pos' => $list['pos'], 'count' => $list['count'], 'subset' => array());
     //		$related_cats = RelationsManager::getPlural($this->slug);
     foreach ($list['subset'] as $k => $item) {
         $nodes['subset'][$k] = array_map('stripslashes', $item);
         if ($this->tableMeta->hasItems()) {
             $nodes['subset'][$k]['content_count'] = $item_model->count($item['id']);
             $nodes['subset'][$k]['tn'] = $item_model->getThumbnailId($item['id']);
         } else {
             $nodes['subset'][$k]['content_count'] = 0;
             $nodes['subset'][$k]['tn'] = null;
         }
         //			if (count($related_cats) > 0) {
         //				foreach ($related_cats as $rel_cat) {
         ////					\helpers\Debug::prePrintR($rel_cat);
         //					$nodes['subset'][$k]['releated'][$rel_cat['label']] = RelationsManager::getPluralSelectedFull($item['id'], $this->slug, $rel_cat['full_table_name']);
         //					//$nc[$v['table']] = new NodeCategory($v['table']);
         //				}
         //			}
     }
     if (!$this->tableMeta->isSortable()) {
         $nodes['pages'] = $this->getPaginationPages($nodes['count'], $nodes['pos']);
     }
     //		\helpers\Debug::prePrintR($nodes);
     return $nodes;
 }