2017-02-09 3 views
1

Я делаю простую галерею, используя OctoberCMS, на основе Laravel и Twig.Как фильтровать записи по категориям в PHP Laravel Twig?

Как фильтровать записи по категориям?

Вот как я это делаю, но я не думаю, что это хорошее решение:

Я фильтровать HTML, но полные записи по-прежнему существует для всех элементов вне категории, в результате чего дополнительную разбивку на страницы и пустые страницы.

'Галерея' Database

  • А таблица содержит список имен категорий.

  • В таблицах «изображения» хранятся имена изображений и их помеченные категории.

Изображение Список

Параметры URL являются/галерея /: категория /: страница?

Посещение url like/gallery/nature/1 будет фильтровать изображения по категориям, используя цикл for.

<!-- Gallery Category Record Variable --> 
{% set category = record.category %} 

<!-- Image List --> 
{% for record in records %} 

    <!-- If Image Category Tag matches Gallery Category Name --> 
    {% if record.category_tag == category %} 
     <img src="/{{ record.name }}.jpg"> 
    {% endif %} 

{% endfor %} 

Записи

Результаты для 'записи' и 'записи'.

Цикл for показывает 'gallery → category' record in 'images → category_tag' records.

На странице показаны все записи «изображения → имя».

{% for record in records %} = (All in 'images') 
{{ records }} = {<ul><li>...<a href="gallery/nature?page=2">2</a>} (All in 'images') 
{{ record }} = {"category":"nature","id":7} (Current category in 'gallery') 

Решение?

Есть ли способ фильтровать «записи» по категориям, прежде чем генерировать список html?

+1

Не уверен, что, если я неправильно понял, но не проще для извлечения записей, которые соответствуют критериям, прежде чем передать его вид? например 'Gallery :: где ('category_id', $ catId) -> get()'. Конечно, вам сначала нужно получить идентификатор категории, используя имя, взятое из параметров –

+0

@ChristopherFrancisco Через OctoberCMS вы перетаскиваете список записей или записи, а затем устанавливаете класс модели и столбец отображения. Оттуда вы можете использовать синтаксис Twig для использования записей. Я новичок в этом и использую Laravel за пределами Twig. –

+0

Неплохо, ссылка на OctoberCMS перенаправлена ​​на страницу разбивки на страницы, так что я предположил, что это всего лишь компонент разбиения на страницы (хотя название говорит CMS, глупо меня хахаха) –

ответ

2

Это, как я хотел бы подойти к нему:

  • Создание области в изображениях модели, которая фильтрует постранично, Категория ЭСТ ..
  • Handle свойства URL и логики в компоненте не смотреть

Скажем Галерея компонент:

URL: page.com/:cat/:page?

public function defineProperties() 
    { 
     return [ 
      // Page # for pagination.. 
      'pageNumber' => [ 
       'title'  => 'Page #', 
       'description' => 'Gallery Page #', 
       'type'  => 'string', 
       'default'  => '{{ :page }}', 
      ], 
      // Category slug 
      'category' => [ 
       'title'  => 'Category', 
       'description' => 'Gallery Cat', 
       'type'  => 'string', 
       'default'  => '{{ :cat }}', 
      ], 
      // Images to show per page 
      'perPage' => [ 
       'title'    => 'Images per page', 
       'type'    => 'string', 
       'validationPattern' => '^[0-9]+$', // validation 
       'validationMessage' => 'VValidation Error', 
       'default'   => '15', 
      ], 
      // if you want to add sorting 
      'sortOrder' => [ 
       'title'  => 'Sort Order', 
       'description' => 'Images Sort Order', 
       'type'  => 'dropdown', 
       'default'  => 'updated_at desc' 
      ], 
     ]; 
    } 

public function getSortOrderOptions() 
{ 
    return Image::$allowedSortingOptions; 
} 


public function init() 
{ 
    $this->pageNumber = empty($this->property('pageNumber')) ? 1 : $this->property('pageNumber'); 
    $this->perPage  = $this->property('perPage'); 
    $this->sortOrder = $this->property('sortOrder'); 
    $this->category  = $this->property('category'); 
} 

public function onRun() 
{ 

    // here you may want to do some checks 
// and add logic before querying your DB 

    return $this->listImages($this->pageNumber , $this->sortOrder, $this->perPage, $this->category); 

} 

public function listImages($pageNumber, $sortOrder, $perPage, $category){ 

    // this is the scope you will define in your Images Model 
// to handle pagination, sorting, category filtering ect.. 

    $images = Images::listFrontEnd([ 
     'page'   => $pageNumber, 
     'sort'   => $sortOrder, 
     'perPage'  => $perPage, 
     'category'  => $category, 
    ]); 



    // small helper if the pagination # is > than last page 
    // redirect to last page.. 

    $lastPage = $images->lastPage(); 

    if ($this->pageNumber > $lastPage && $this->pageNumber > 1){ 
      return Redirect::to($this->currentPageUrl(["page" => $lastPage])); 
     } 


$this->images = $this->page['images'] = $images; 

} 

в вашей модели Изображение:

// list the allowed sorting options that will show up in your component 

public static $allowedSortingOptions = array(
    'created_at asc'   => 'Images Created (ascending)', 
    'created_at desc'   => 'Images Created (descending)', 
    'updated_at asc'   => 'Images Updated (ascending)', 

    //  ect.... 
); 


// Scope for your component 
public function scopelistImages($query, $options) 
    { 
     /* 
     * Default options 
     */ 
     extract(array_merge([ 
      'page'    => 1, 
      'perPage'   => 15, 
      'sort'    => 'updated_at', 
      'category'   => null 
     ], $options)); 



     // SORTING 
     if (!is_array($sort)) { 
      $sort = [$sort]; 
     } 

     foreach ($sort as $_sort) { 

      if (in_array($_sort, array_keys(self::$allowedSortingOptions))) { 
       $parts = explode(' ', $_sort); 
       if (count($parts) < 2) { 
        array_push($parts, 'desc'); 
       } 
       list($sortField, $sortDirection) = $parts; 
       if ($sortField == 'random') { 
        $sortField = Db::raw('RAND()'); 
       } 
       $query->orderBy($sortField, $sortDirection); 
      } 
     } 

     // Filter by category 
     ........ 


     return $query->paginate($perPage, $page); 
    } 

Ответ вдохновленный от RainLab Blog Plugin

Смежные вопросы