我正在研究后台模块控制器。我能够在列表视图中显示我的对象,并使用帮助器表单创建一个新对象。但是,我有默认列表视图,不排序或筛选任何东西。列表视图显示了用于排序和过滤的控件,但单击它们不会执行任何操作。这是我的后台控制器:
class AdminCustomController extends AdminController {
public $module;
public function __construct() {
$this->table = 'custom_table';
$this->className = 'CustomTable';
$this->module = 'customtable';
$this->lang = false;
$this->bootstrap = true;
$this->need_instance = 0;
// Building the list of records stored within the "test" table
$this->fields_list = array(
'id_custom_table' => array(
'title' => $this->l('ID'),
'align' => 'center',
'width' => 25,
'type' => 'text'
),
'name' => array(
'title' => $this->l('Name'),
'width' => 'auto',
'type' => 'text',
'orderby' => true,
'search' => true
//the ordering and filtering controls do appear but they don't work
),//...some more fields
);
$this->_select = '....';
$this->_join = '
LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` b ON (b.`id_product` = a.`id_product`)';
$this->_defaultOrderBy = 'a.some_date';
$this->_defaultOrderWay = 'ASC';
$this->context = Context::getContext();
parent::__construct();
}
public function renderForm() {
// Building the Add/Edit form
$this->fields_form = array(
'submit' => array(
'title' => $this->l(' Save '),
'class' => 'button'
)
);
$this->addJqueryUI(array('ui.datepicker', 'ui.autocomplete'));
return parent::renderForm();
}
public function renderList() {
return parent::renderList();
}
}
我查看了其他模块的代码以及默认的PS控制器,所有这些都只返回父列表视图,除非它被修改,默认情况下排序和过滤功能可以正常工作。我没有看到任何排序或过滤特定代码,这就是我的管理员控制器没有任何代码。
如果您能帮我理解并启用后台列表视图中的排序和过滤,我将不胜感激。我觉得我错过了一些东西,但我无法弄清楚是什么?
答案 0 :(得分:2)
在prestashop 1.6中(我认为它必须在PS 1.5中相同):
我发现在自定义ModuleAdminController中进行排序和过滤的最简单方法是初始化postProcess()的父级,如果它被覆盖:
public function postProcess() {
parent::postProcess();
...
}
排序/过滤就像没有任何自定义代码一样。
享受。 =)
答案 1 :(得分:1)
确实,我确实找到了解决方案,但没有时间发布它。它们的关键在于以下两行:
[tablename]Orderby=
因此,除了我在示例中提到的所有内容之外,我们还需要从查询字符串中获取这些字段的值。在我的例子中,查询字符串参数看起来像custom_tableOrderby=
,即在上面的示例中它将是construct
要从查询字符串中获取值,请在$sortBy = Tools::getValue('custom_tableOrderby');
$sortWay = Tools::getValue('custom_tableOrderway', 'ASC'); // default sortWay is Ascending
$this->_defaultOrderWay = $sortWay;
if ($sortBy == 'field_name_in_your_view') {
$this->_defaultOrderBy = 'field_name_in_table';
} else if ($sortBy == 'another_field_name_in_your_view') {
$this->_defaultOrderBy = 'another_field_name_in_table';
函数中执行以下操作:
{{1}}
我希望它能在你很久以前在Prestashop 1.5中实现它。
答案 2 :(得分:0)
您必须包括 parent :: postProcess();在postProcess函数中
public function postProcess()
{
parent::postProcess();
}
答案 3 :(得分:-1)
您是否尝试在$this->list_simple_header=false;
功能中设置__construct
?
排序/过滤/分页是由属性HelperList->simple_header
完成的。
使用控制器,一切正常。在一个模块中,如果我们调用一个HelperList,我们只有简单的头文件(除非你添加缺少的函数来执行完整的头文件)。因此,列表中的排序/过滤/分页仅适用于控制器。 {Prestashop 1.5}