【发布时间】:2012-03-27 09:40:15
【问题描述】:
我有一个使用 joomla 分页系统的第三方组件。如何仅更改前端的每页默认项目的值和限制框值,而不更改后端的任何内容?
【问题讨论】:
标签: php joomla pagination
我有一个使用 joomla 分页系统的第三方组件。如何仅更改前端的每页默认项目的值和限制框值,而不更改后端的任何内容?
【问题讨论】:
标签: php joomla pagination
对于 J2.5:
你可以直接更改配置.php的值:
public $list_limit = '20'; 以 public $list_limit = '4'; 为例。
-> 但问题是,当您将任何参数保存在后端时,您将丢失配置,因此您需要一次又一次地更改它。 (所以这不是最好的解决方案)
最好的解决办法是去:
/administrator/components/com_config/models/forms/application.xml
搜索字段名称="list_limit"
你会发现joomla的默认配置!在第 661 行:
<field
name="list_limit"
type="list"
default="20"
label="COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_LABEL"
description="COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_DESC"
filter="integer">
<option
value="5">J5</option>
<option
value="10">J10</option>
<option
value="15">J15</option>
<option
value="20">J20</option>
<option
value="25">J25</option>
<option
value="30">J30</option>
<option
value="50">J50</option>
<option
value="100">J100</option>
</field>
添加一个选项,如:
<option value="3">J3</option>
变成了:
<field
name="list_limit"
type="list"
default="20"
label="COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_LABEL"
description="COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_DESC"
filter="integer">
<option
value="3">J3</option>
<option
value="5">J5</option>
<option
value="10">J10</option>
<option
value="15">J15</option>
<option
value="20">J20</option>
<option
value="25">J25</option>
<option
value="30">J30</option>
<option
value="50">J50</option>
<option
value="100">J100</option>
</field>
【讨论】:
查看 Joomla 分页的文档:
http://docs.joomla.org/Using_JPagination_in_your_component
你需要找到一个看起来像这样的变量:
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
它可以称为 $lim、$limit 或开发人员认为合适的任何其他名称。它通常在模型中找到,但也可以在视图中。您需要将此变量更改为:
$limit = 20;
其中 20 是您要设置的限制值。
【讨论】:
这补充了 seavers 的答案,我认为这是正确的答案。
我将编写一个示例,说明我如何限制希望在搜索结果页面中显示的页面数量:
来自模板文件 root/templates/mytemplate/html/com_search/search/default.php
// number of max pages you want in pagination
$mylimit = 3;
// to prevent showing pages with no resutls
$limit = min($mylimit, $this->pagination->pagesTotal);
// set the limit
$this->pagination->pagesStop = $limit;
渲染:
【讨论】:
在我们的几个组件中,我们创建了一个分页扩展来覆盖默认选项,这些选项是硬编码的,否则无法被覆盖。
class myCompPagination extends JPagination {
public function getLimitBox() {
.. Your Custom Renderer ..
}
}
在 Joomla 2.5 及更高版本中,基类位于 /libraries/cms/pagination 下。
包括您的自定义类并像其他方式一样使用它。 $pagination = new wbCompPagination( ... );
【讨论】:
此解决方案不需要更改核心或模板文件。如果您可以控制组件代码,请直接在模型中使用以下代码:
protected function populateState($ordering = null, $direction = null)
{
// Initialise variables.
$app = JFactory::getApplication();
// List state information
$limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->get('list_limit'));
换行:
$limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->get('list_limit'));
到这里
$limit = 50;
或任何你想要的数字。
如果您尝试将视图中JPagination 对象的分页属性设置为其他内容,正如@IberoMedia 的回答中所建议的那样,那么JPagination 的属性将被更改,可以通过@ 验证987654326@,但在从数据库中提取记录之前不会更改限制。因此,数据库仍然会提供有限的列表。这就是为什么您必须在查询数据库之前破解模型本身并短路对模型中应用程序的全局列表限制的调用。
可能有一种更周到的方法来做到这一点。有谁知道在呈现页面时和查询数据库表之前动态更改全局值的方法?我应该认为这样的东西会更安全、可重复使用、更通用。
【讨论】:
注意,joomla更新后的文件权限可能会发生变化,修改后无法应用到版本!
【讨论】: