当前位置: 首页 > 知识库问答 >
问题:

如何在PHP Laravel Twig中按类别过滤记录?

白浩气
2023-03-14

我正在使用OctoberCMS制作一个简单的画廊,基于Laravel和Twig。

如何按类别筛选记录?

我现在是这样做的,但我认为这不是一个好的解决方案:

我过滤了html,但是类别之外的所有项目的完整记录仍然存在,导致额外的分页和空白页。

数据

>

“images”表包含图像名称及其标记的类别。

图像列表

URL参数为/gallery/:category?/:页

访问像/gallery/nature/1这样的url将使用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”→类别“记录在”图像中→“标签”类记录。

分页显示所有图像→名称记录。

{% 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个答案

阎涵忍
2023-03-14

我会这样做:

  • 在图像模型中创建按页面、类别等过滤的范围
  • 在组件而不是视图中处理URL属性和逻辑

假设库组件:

网址:第页。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博客插件

 类似资料:
  • 这是我在这里的第一篇帖子,而且我是一个初学者,所以请耐心听我说。 我想完成的是创建一个AJAX函数,该函数将以复选框的形式列出所有可用类别,用户可以从中选择。选择并点击“应用”后,我想显示分配给所选类别的帖子中所有标签的列表(也以复选框的形式)。然后用户可以从可用的标签中进行选择,然后在点击最后的“应用”按钮后,将显示相应的帖子。 类似于TED. com的“你感兴趣的是什么?”但是在AJAX中。所

  • 问题内容: 我试图在AngularJS中创建一个自定义过滤器,该过滤器将通过特定属性的值过滤对象列表。在这种情况下,我要按“极性”属性(“正”,“中性”,“负”的可能值)进行过滤。 这是我没有过滤器的工作代码: HTML: 这是JSON格式的“ $ scope.tweets”数组: 我可以提出的最佳过滤器如下: 此方法返回一个空数组。从“ console.log(polarity)”语句中不会打印

  • 问题内容: 我正在使用Redis和排序集来创建游戏排行榜,并且已经设法使基本版本正常运行。我想知道是否可以进一步过滤类别?例如,假设我正在全球范围内跟踪用户的分数,并且每个用户都有一个国家/地区字段来指定他们来自何处。 是否可以在我要从特定国家(而不是整个数据库)中抽取前10名用户的地方进行过滤? 问题答案: 是的,这是可能的,但是这样做会增加应用程序层的复杂性和数据级别的存储。由于是键/值存储库

  • 问题内容: 为什么以下查询不起作用?Mysql抱怨z-我不能在WHERE子句中使用别名吗? 我得到的错误是: 问题答案: http://dev.mysql.com/doc/refman/5.0/en/problems-with- alias.html 标准SQL不允许在WHERE子句中引用列别名。之所以施加此限制,是因为在评估WHERE子句时,可能尚未确定列值。例如,以下查询是非法的: 试试这个,

  • 问题内容: 我正在尝试搜索日期范围内的日期范围内的所有项目,但失败(不返回任何结果) 查询: 映射: 结果是: 通过一个带数字值的整数字段(“ cards”)的范围过滤的同一查询工作正常。将日期更改为非常早的开始(1900-01-01 00:00:00)也不会显示任何结果。 我究竟做错了什么? 顺便说一句,我知道我在映射中启用了_timestamp,但这不是我要过滤的字段。 问题答案: 似乎对我来

  • 问题内容: 我想知道,中的类(对于Web应用程序)是否有任何注释?也许@Filter吧? 我想在项目中添加自定义过滤器。 《 Spring Boot参考指南 》提到了关于 ,但是我不确定如何使用它。 问题答案: 如果您要设置第三方过滤器,则可以使用FilterRegistrationBean。例如相当于web.xml 这些将是@Configuration文件中的两个bean 上面已经用spring