在Laravel October中按类别过滤项目

时间:2017-05-24 09:06:10

标签: laravel twig octobercms

我有一个带有$ belongsTo类别关系的文档模型,一切运行良好,我可以为文档分配类别并在前端列出所有类别,但我正在努力的是按类别过滤结果。

我有3个类别和3个col-md-4列,在每列中,文档应该按类别列出和过滤,如何使用组件使用twig?

我的documents.default组件文件如下所示:

 {% set documents = __SELF__.documents %} 
 <ul class="record-list list-unstyled ">  
     {% for document in documents %}
        <li class="ul-text-black">      
              {{document.name }}
        </li>
     {% endfor %}
 </ul>

我的文档组件代码:

 <?php namespace Myplugin\Documents\Components;

  use Cms\Classes\ComponentBase;
  use Myplugin\Documents\Models\Document;

  class Documents extends ComponentBase
  {
  public function componentDetails(){
    return [
        'name' => 'Documents List',
        'description' => 'Custom Component to list documents by category'
    ];
}

public function defineProperties(){
    return [
        'results' => [
            'title' => 'Number of Documents',
            'description' => 'How many documents do you want to display?',
            'default' => 24,
            'validationPattern' => '^[0-9]+$',
            'validationMessage' => 'Only numbers allowed'
        ],
        'sortOrder' => [
            'title' => 'Sort Documents',
            'description' => 'Sort documents',
            'type' => 'dropdown',
            'default' => 'name asc',
        ]];
  }

public function getSortOrderOptions(){
    return [
        'name asc' => 'Name (ascending)',
        'name desc' => 'Name (descending)',
    ];
}

public function onRun()
{
    $this->documents = $this->loadDocuments();
}

protected function loadDocuments(){
    $query = Document::all();
    if ($this->property('sortOrder') == 'name asc') {
        $query = $query->sortBy('name');
    }
    if ($this->property('sortOrder') == 'name desc') {
        $query = $query->sortByDesc('name');
    }
    if ($this->property('results') > 0) {
        $query = $query->take($this->property('results'));
    }
    return $query;
}
public $documents;
}

我的页面看起来像这样

 <div class="row">
    <div class="col-md-4">
         <p class="text-black">
              <strong>FINANCIAL</strong>
         </p>
           {% component 'documents' %}  // Only documents from financial category
    </div>

    <div class="col-md-4">
         <p class="text-black">
             <strong>ANALYTICS</strong>
         </p>
         {% component 'documents' %}  // Only documents from analytics category
    </div>

    <div class="col-md-4"> 
         <p class="text-black">
             <strong>INVESTMENT</strong>
         </p>
         {% component 'documents' %}  // Only documents from investment category
    </div>

如何显示文档列表但按类别过滤?像这样的东西?        {%partial“documents-financials”category =“Financials”%}

1 个答案:

答案 0 :(得分:1)

您应该可以使用$category = $this->property('category');

访问“文档”组件中的属性

有关访问OctoberCMS网站上的组件属性的文档:https://octobercms.com/docs/plugin/components#component-properties

然后我可以看到您正在加载所有文档并使用Laravel Collection过滤它们。我建议先改变这个并在数据库上进行。它会更有效率。

$category = $this->property('category');    
$results = $this->property('results');    

$documents = Document::whereHas('category', function ($query) use ($category) {
        return $query->where('name', $category);
    })
    ->orderBy('name', 'ASC')
    ->take($results)
    ->get();

如果要对文档进行分组然后输出,则可以执行以下操作:

$this->documents = Document::with('category')
    ->orderBy('name', 'ASC')
    ->take($results)
    ->get()
    ->groupBy('category.name');

请参阅https://laravel.com/docs/5.3/collections#method-groupby

然后在您的组件模板中:

<div class="row">
    {% for group in documents %}
        <div class="col-md-4">
            <p class="text-black">
                <strong>FINANCIAL</strong>
            </p>

            <ul class="record-list list-unstyled">  
                {% for document in group %}
                    <li class="ul-text-black">{{document.name }}</li>
                {% endfor %}
            </ul>
        </div>
    {% endfor %}
</div>