【问题标题】:Filter items by category in Laravel October在 Laravel 十月按类别过滤项目
【发布时间】:2017-10-24 12:41:25
【问题描述】:

我有一个具有 $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="财务" %}

【问题讨论】:

    标签: laravel twig octobercms


    【解决方案1】:

    您应该能够使用 $category = $this-&gt;property('category'); 访问 Documents 组件中的属性

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

    然后我可以看到您正在加载所有文档并使用 Laravel 集合过滤它们。我建议更改此设置并首先在数据库上执行此操作。效率会高很多。

    $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>
    

    【讨论】:

    • 如何过滤文档以按类别分组显示?
    • 从您的问题来看,您似乎为每个类别使用了单独的组件实例?还是不是这样?
    • 我有一个类别组件。这是第一次使用 OctoberCMS 和 MVC 的组件/页面方法,所以我很迷茫
    • @PaulGwamanda - 更新后的答案有望为您指明正确的方向。
    • 非常感谢冠军
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2021-06-12
    • 2021-05-18
    • 1970-01-01
    • 2021-07-12
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多