Beispiel #1
0
 /**
  * Get an EntryCollection based on the state of ee()->TMPL
  *
  * @param  Closure|null                              $callback receieves a query builder object as the first parameter
  * @return \rsanchez\Deep\Collection\EntryCollection
  */
 protected function getEntries(Closure $callback = null)
 {
     foreach ($this->getEntriesDefaultParameters() as $key => $value) {
         if (!isset(ee()->TMPL->tagparams[$key])) {
             ee()->TMPL->tagparams[$key] = $value;
         }
     }
     $disabled = empty(ee()->TMPL->tagparams['disable']) ? array() : explode('|', ee()->TMPL->tagparams['disable']);
     $this->paginator = ee()->pagination->create();
     $limit = ee()->TMPL->fetch_param('limit');
     ee()->TMPL->tagdata = $this->paginator->prepare(ee()->TMPL->tagdata);
     $customFieldsEnabled = !in_array('custom_fields', $disabled);
     $memberDataEnabled = !in_array('members', $disabled);
     $paginationEnabled = !in_array('pagination', $disabled);
     $categoriesEnabled = !in_array('categories', $disabled);
     $categoryFieldsEnabled = $categoriesEnabled && !in_array('category_fields', $disabled);
     if ($limit && $paginationEnabled) {
         unset(ee()->TMPL->tagparams['offset']);
     } else {
         $this->paginator->paginate = false;
     }
     $uri = ee()->uri->page_query_string ?: ee()->uri->query_string;
     if (preg_match('#^((.*?)/)?P\\d+/?$#', $uri, $match)) {
         $uri = $match[2];
     }
     if (!$uri && ee()->TMPL->fetch_param('require_entry') === 'yes') {
         return ee()->TMPL->no_results();
     }
     ee()->TMPL->tagparams['category_request'] = false;
     $singleEntry = false;
     $relatedCategoriesMode = ee()->TMPL->fetch_param('related_categories_mode') === 'yes';
     $dynamic = ee()->TMPL->fetch_param('dynamic', 'yes') === 'yes';
     $query = $this->app->make($customFieldsEnabled ? 'Entry' : 'Title')->newQuery();
     if ($uri && ($dynamic || $relatedCategoriesMode)) {
         $segments = explode('/', $uri);
         $lastSegment = array_pop($segments);
         $penultimateSegment = array_pop($segments);
         if (preg_match('#(^|/)(\\d{4})/(\\d{2})(/(\\d{2}))?/?$#', $uri, $match)) {
             ee()->TMPL->tagparams['year'] = $match[2];
             ee()->TMPL->tagparams['month'] = $match[3];
             if (isset($match[5])) {
                 ee()->TMPL->tagparams['day'] = $match[5];
             }
         } elseif (is_numeric($lastSegment)) {
             if ($relatedCategoriesMode) {
                 $singleEntry = true;
                 $query->relatedCategories($lastSegment);
                 ee()->TMPL->tagparams['dynamic'] = 'no';
             } else {
                 ee()->TMPL->tagparams['entry_id'] = $lastSegment;
             }
         } elseif (ee()->config->item('use_category_name') === 'y' && $penultimateSegment === ee()->config->item('reserved_category_word')) {
             ee()->TMPL->tagparams['category_name'] = $lastSegment;
             ee()->TMPL->tagparams['category_request'] = true;
         } elseif (ee()->config->item('use_category_name') !== 'y' && preg_match('#(^|/)C(\\d+)#', $uri, $match)) {
             ee()->TMPL->tagparams['category'] = $match[2];
             ee()->TMPL->tagparams['category_request'] = true;
         } else {
             if ($relatedCategoriesMode) {
                 $singleEntry = true;
                 $query->relatedCategoriesUrlTitle($lastSegment);
                 ee()->TMPL->tagparams['dynamic'] = 'no';
             } else {
                 ee()->TMPL->tagparams['url_title'] = $lastSegment;
             }
         }
     }
     if ($relatedCategoriesMode && !$singleEntry) {
         return ee()->TMPL->no_results();
     }
     $query->tagparams(ee()->TMPL->tagparams);
     if ($categoriesEnabled) {
         $query->withCategories(function ($query) use($categoryFieldsEnabled) {
             if ($categoryFieldsEnabled) {
                 $query->withFields();
             }
             return $query->orderBy('categories.group_id')->orderBy('categories.parent_id')->orderBy('categories.cat_order');
         });
     }
     if ($memberDataEnabled) {
         $query->withAuthorFields();
     }
     $connection = $query->getQuery()->getConnection();
     $tablePrefix = $connection->getTablePrefix();
     if (strpos(ee()->TMPL->tagdata, 'comment_subscriber_total') !== false) {
         $subquery = "(select count(*) " . "from `{$tablePrefix}comment_subscriptions` " . "where `{$tablePrefix}comment_subscriptions`.`entry_id` " . "= `{$tablePrefix}`channel_titles`.`entry_id`) " . "as `comment_subscriber_total`";
         $query->addSelect($connection->raw($subquery));
     }
     $prefix = ee()->TMPL->fetch_param('var_prefix') ? ee()->TMPL->fetch_param('var_prefix') . ':' : '';
     if (strpos(ee()->TMPL->tagdata, '{' . $prefix . 'parents') !== false) {
         $query->withParents();
     }
     if (strpos(ee()->TMPL->tagdata, '{' . $prefix . 'siblings') !== false) {
         $query->withSiblings();
     }
     if (is_callable($callback)) {
         $callback($query);
     }
     ee()->TMPL->tagparams['absolute_results'] = $limit;
     if ($this->paginator->paginate) {
         ee()->TMPL->tagparams['absolute_results'] = $query->getQuery()->getPaginationCount();
         $this->paginator->build(ee()->TMPL->tagparams['absolute_results'], $limit);
         if ($this->paginator->offset) {
             $query->skip($this->paginator->offset);
             ee()->TMPL->tagparams['offset'] = $this->paginator->offset;
         }
     }
     return $query->get();
 }