2017-02-09 5 views
1

Ich mache eine einfache Galerie mit OctoberCMS, basierend auf Laravel und Twig.Wie Datensätze nach Kategorie in PHP Laravel Twig filtern?

Wie kann ich Datensätze nach Kategorien filtern?

Hier ist, wie ich es jetzt tue, aber ich glaube nicht, das ist eine gute Lösung:

ich den HTML-Filter, aber die vollständige Aufzeichnungen noch existiert für alle Elemente außerhalb der Kategorie, verursacht zusätzliche Paginierung und leere Seiten.

Datenbank

  • A Table 'Galerie' hält Liste der Kategorienamen.

  • Eine Tabelle 'Bilder' enthält die Bildnamen und ihre markierten Kategorien.

Bildliste

Die URL-Parameter sind/gallery /: Kategorie /:? Page?

Wenn Sie eine URL wie/gallery/nature/1 aufrufen, werden Bilder anhand einer for-Schleife nach Kategorien gefiltert.

<!-- 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 %} 

Aufzeichnungen

Ergebnisse für 'records' und 'record'.

Die for-Schleife zeigt den Datensatz 'gallery → category' in den 'images → category_tag' Datensätzen an.

Die Seitennummerierung zeigt alle 'images → name' Datensätze.

{% 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') 

Lösung?

Gibt es eine Möglichkeit, die 'Datensätze' nach Kategorie zu filtern, bevor die HTML-Liste generiert wird?

+1

Nicht sicher RainLab Blog Plugin inspiriert, wenn ich aber falsch verstanden, ist es nicht einfacher Datensätze abzurufen, die die Kriterien erfüllt, bevor es vorbei die Aussicht? wie 'Gallery :: wo ('category_id', $ catId) -> get()'. Natürlich müssen Sie zuerst die Kategorie-ID mit dem Namen aus den Parametern –

+0

@ChristopherFrancisco holen. Durch OctoberCMS ziehen Sie die Aufnahmeliste oder Datensatzdetails und legen dann die Modellklasse und die Anzeigespalte fest. Von dort können Sie die Twig-Syntax verwenden, um die Datensätze zu verwenden. Ich bin neu und benutze Laravel außerhalb von Twig. –

+0

Mein Fehler, der Link für OctoberCMS wurde auf die Paginierungsseite umgeleitet, also nahm ich an, dass es nur eine Seitenumbruchkomponente war (obwohl der Name CMS sagte, alberne mich hahaha) –

Antwort

2

Dies ist, wie ich es Ansatz würde:

  • einen Scope in Ihren Bildern Modell erstellen, die von Seite Filter, Kategorie ect ..
  • die Eigenschaften URL Griff und Logik nicht in der Komponente anzuzeigen

Lassen Sie uns Gallery Komponente sagen:

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; 

} 

im Bild ein Modell:

// 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); 
    } 

Antwort vom

Verwandte Themen