【问题标题】:Change Paginator Sort template CakePHP 3更改分页器排序模板 CakePHP 3
【发布时间】:2015-12-15 19:51:10
【问题描述】:

我正在尝试在 <option> HTML 标记内使用 CakePHP 3 分页器排序,但这会在 value 属性中输出一个链接,如下所示:

<option> 里面有分页符 value 属性:

<select name="products-order" class="form-control products-order inline-pagination-menu" onchange="redirect(this)">
    <option value="<?= $this->Paginator->sort('product_name') ?>">A - Z</option>
    <option value="<?= $this->Paginator->sort('product_name', null, ['direction' => 'desc']) ?>">Z - A</option>
    <option value="<?= $this->Paginator->sort('price') ?>">Menor preço</option>
    <option value="<?= $this->Paginator->sort('price', null, ['direction' => 'desc']) ?>">Maior preço</option>
</select>

输出

<select name="products-order" class="form-control products-order inline-pagination-menu" onchange="redirect(this)">
    <option value="<a href="/posts/index?page=1&amp;sort=user_id&amp;direction=asc">User Id</a>">A - Z</option>
</select>

我尝试更改模板,但没有成功(抛出:在$this-&gt;Paginator-&gt;templates 中调用未定义的方法)我在下面尝试:

将其付诸实施(在 clontroller 中的方法):

public $helpers = [
    'Paginator' => ['templates' => 'paginator-templates']
];

并更改模板:

$this->Paginator->templates([
    'sort' => '{{url}}'
]);

对完整代码进行分页

        $this->paginate = [
            'conditions' => ['product_name LIKE' => '%' . $search . '%'],
            'maxLimit' => 10,
            'contain' => ['Medias' => function($q){
                return $q->select(['path', 'product_id'])
                    ->where(['media_type_id' => 3]);
            }]
        ];

        $this->Paginator->templates([
            'sort' => '{{url}}'
        ]);
        $products = $this->paginate($this->Products);

错误:

2015-12-14 15:31:47 Error: Fatal Error (1): Call to undefined method Cake\Controller\Component\PaginatorComponent::templates() in [C:\xampp\htdocs\PROJETOS\Shopping\src\Controller\ProductsController.php, line 121]
Trace:
Cake\Error\BaseErrorHandler::handleFatalError() - CORE\src\Error\BaseErrorHandler.php, line 192
Cake\Error\BaseErrorHandler::Cake\Error\{closure}() - CORE\src\Error\BaseErrorHandler.php, line 91
[main] - [internal], line ??



2015-12-14 15:31:47 Error: [Cake\Error\FatalErrorException] Call to undefined method Cake\Controller\Component\PaginatorComponent::templates()
Request URL: /products/search?search=a
Stack Trace:
#0 C:\xampp\htdocs\PROJETOS\Shopping\vendor\cakephp\cakephp\src\Error\BaseErrorHandler.php(91): Cake\Error\BaseErrorHandler->handleFatalError(1, 'Call to undefin...', 'C:\\xampp\\htdocs...', 121)
#1 [internal function]: Cake\Error\BaseErrorHandler->Cake\Error\{closure}()
#2 {main}

【问题讨论】:

  • 收到错误时,请始终发布 complete、exact 错误消息,并包含相应的堆栈跟踪(最好来自日志,它在哪里格式正确)!另外你应该提到你在这里如何放置代码的位置,第一个 sn-p 在控制器中,第二个?
  • @ndm 我从日志中输入了分页器代码和错误

标签: cakephp cakephp-3.0


【解决方案1】:

分页器组件 没有templates() 方法,因此出现错误。正是分页器helper提供了这样一个方法,可以用来改变模板。

从控制器上下文中,只有templates 选项可以在$helpers 变量中传递,如您的代码sn-p 中所示。但是,这是用于从外部文件加载模板的方法!

您似乎从文档中复制了该 sn-p,请阅读示例下方的文字内容:

这将加载位于 config/paginator-templates.php 的文件。请参阅下面的示例,了解文件的外观。

[...]

无论您的模板是在主应用程序还是插件中,您的模板文件应该类似于:

return [
    'number' => '<a href="{{url}}">{{text}}</a>',
];

长话短说,要么使用该选项并将模板放入所描述的正确文件中,要么将 templates() 调用 sn-p 放入您的视图模板中。

您还应该知道,还有更多与排序相关的模板:

  • sort
  • sortAsc
  • sortDesc
  • sortAscLocked
  • sortDescLocked

所以请务必覆盖所有必要的内容。

另请参阅Cookbook > Views > Helpers > Paginator > PaginatorHelper Templates

【讨论】:

  • ndm 我在 config 文件夹中创建了包含您答案中的确切内容的文件,将 public $helpers = [ 'Paginator' =&gt; ['templates' =&gt; 'paginator-templates'] ]; 放入我的 ProductsController 中,错误仍然存​​在
  • @Ricardo 确切的内容是错误的,因为您不想更改 number 模板,而是更改 sort* 模板。如果您在控制器中保留错误的templates() 调用,该错误将持续存在。
  • 抱歉ndm,我改了之前要排序的数字,但错误仍然存​​在
  • @Ricardo 因为这与彼此无关,正如我所说,错误源于不正确的templates() 调用,因此将其删除。如果有的话,它必须进入相应的操作视图模板。
  • ndm 我删除,有时工作有时不工作,我会用错误描述更新我的问题
猜你喜欢
  • 2012-08-29
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2012-05-10
  • 1970-01-01
  • 2015-04-04
  • 2016-06-12
相关资源
最近更新 更多