【问题标题】:how to insert pre-set filter in renderList in prestashop?如何在prestashop的renderList中插入预设过滤器?
【发布时间】:2017-04-19 09:13:39
【问题描述】:

在@TheDrot 的大量帮助下,我能够选择上一个问题,现在当我重新初始化过滤时,标准过滤器不会返回另一个问题,我需要一些帮助才能知道我必须改变什么在代码中让它工作。 result in image 我发送代码和结果的图像没有成功。 谢谢你的帮助。 谢谢你。 result 2

public function processResetFilters($list_id = null)    
    {
        if ($list_id === null) {
            $list_id = isset($this->list_id) ? $this->list_id : $this->table;
        }

        $prefix = '';//var_dump($list_id, $prefix, $this->context->cookie);
        $filters = $this->context->cookie->getFamily($prefix.$list_id.'Filter_');
        foreach ($filters as $cookie_key => $filter) {
            if (strncmp($cookie_key, $prefix.$list_id.'Filter_', 7 + Tools::strlen($prefix.$list_id)) == 0) {
                $key = substr($cookie_key, 7 + Tools::strlen($prefix.$list_id));
                if (is_array($this->fields_list) && array_key_exists($key, $this->fields_list)) {
                    $this->context->cookie->$cookie_key = null;
                }
                unset($this->context->cookie->$cookie_key);
            }
        }

        if (isset($this->context->cookie->{'submitFilter'.$list_id})) {
            unset($this->context->cookie->{'submitFilter'.$list_id});
        }
        if (isset($this->context->cookie->{$prefix.$list_id.'Orderby'})) {
            unset($this->context->cookie->{$prefix.$list_id.'Orderby'});
        }
        if (isset($this->context->cookie->{$prefix.$list_id.'Orderway'})) {
            unset($this->context->cookie->{$prefix.$list_id.'Orderway'});
        }

        $_POST = array();
        $this->_filter = false;
        unset($this->_filterHaving);
        unset($this->_having);

        //your code
       $table= 'contabilidade_faturacao';
    $startTime = date('Y-m-d', mktime(0, 0, 0, date('m')-1  , 1 , date('Y'))); 
    $endTime = date('Y-m-d', mktime(23, 59, 59, date('m'), date('d')-date('j'), date('Y'))); 
    $table = 'contabilidade_faturacao';
    $date_filter_key = $table.'Filter_cf!data';
    $this->context->cookie->{$date_filter_key} = serialize(array(
        $startTime,
        $endTime
    ));
    $this->context->cookie->write();
    }

【问题讨论】:

  • 到底是什么问题?是列表没有在 SQL 中过滤,还是只是列表没有显示列标题中使用的过滤器?
  • 过滤器工作正常,我的问题是我想在用户看到这个列表的日期插入一个过滤器,这个过滤器已经实现并且可以修改。我在图片中有一个例子,我放了i.stack.imgur.com/lFDZt.png。我希望你已经解释了我的问题是什么。谢谢
  • 那么你需要检查 POST 和 cookie 中是否不存在日期过滤器,然后在生成列表之前将默认日期过滤器写入 cookie。
  • 就理论家而言,我意识到您对我说的话,实际上我不知道该怎么做。你知道我是否可以遵循任何文件吗?然后我做了一个 if 来检查过滤器是否存在于 POST 中?例如: var_dump($_POST) ["submitFiltercontabilidade_faturacao"]=> string(1) "1" ["page"]=>string(1) "1" ["selected_pa​​gination"]=> string(2) "50" [ "local_contabilidade_faturacaoFilter_cf!data"]=> array(2) { [0]=>string(0) "" [1]=> string(0) "" }
  • @TheDrot 需要帮助。我一直在尝试修改(!Tools :: getIsset ...)并重新写入cookie,但即便如此它什么也没做,cookie没有被重新写入。请帮我。我不知道我做错了什么。 (...) $date_filter_key = $table.'Filter_cf!data'; if (!isset($this->context->cookie->{$date_filter_key})) { $this->context->cookie->{$date_filter_key} = serialize(array( $startTime, $endTime )); $this->context->cookie->write(); }

标签: php filter prestashop action-filter


【解决方案1】:

这可以通过覆盖HelperList.php核心文件来实现(路径:/classes/helper/HelperList.php)

有一个名为 displayListHeader() 的函数,它获取列表中的所有过滤器并将它们传递给 TPL 文件(/admin/themes/default/template/helpers/list/list_header.tpl),该文件会呈现所有过滤器.

您可以重写 HelperList.php 类中的 displayListHeader() 函数来更改 HelperList 中过滤器的行为。

【讨论】:

  • 我已经通过实现下面的代码解决了这个问题。我唯一的问题是,当我制作“processResetFilters”时,它会默认消除所有过滤器,但我不希望这种情况发生。你有什么建议可以帮助我吗?谢谢。
  • @SilviaPimenta 所以你需要编辑processResetFilters() 方法并在最后用默认过滤器值重写cookie。
  • @TheDrot,是的,我尝试过这样做,但总是删除我需要的默认 cookie。重写cookie的代码是你给我看的吗?感谢您的帮助,这是必不可少的。谢谢
  • 我编辑了我的问题。请,如果您有任何可以帮助我的解决方案,我将不胜感激。谢谢。
【解决方案2】:
I apologize @TheDrot, but nothing is happening, I send my code to vers and can tell me where I am missing.
I send the image of my result.[result code in image][1]
I'm sorry I'm not figuring out how I can make it work but I'm still new to prestashop.
Thank you for your precious help.

public function processResetFilters($list_id = null)    
    {
        if ($list_id === null) {
            $list_id = isset($this->list_id) ? $this->list_id : $this->table;
        }

        $prefix = '';//var_dump($list_id, $prefix, $this->context->cookie);
        $filters = $this->context->cookie->getFamily($prefix.$list_id.'Filter_');
        foreach ($filters as $cookie_key => $filter) {
            if (strncmp($cookie_key, $prefix.$list_id.'Filter_', 7 + Tools::strlen($prefix.$list_id)) == 0) {
                $key = substr($cookie_key, 7 + Tools::strlen($prefix.$list_id));
                if (is_array($this->fields_list) && array_key_exists($key, $this->fields_list)) {
                    $this->context->cookie->$cookie_key = null;
                }
                unset($this->context->cookie->$cookie_key);
            }
        }

        if (isset($this->context->cookie->{'submitFilter'.$list_id})) {
            unset($this->context->cookie->{'submitFilter'.$list_id});
        }
        if (isset($this->context->cookie->{$prefix.$list_id.'Orderby'})) {
            unset($this->context->cookie->{$prefix.$list_id.'Orderby'});
        }
        if (isset($this->context->cookie->{$prefix.$list_id.'Orderway'})) {
            unset($this->context->cookie->{$prefix.$list_id.'Orderway'});
        }

        $_POST = array();
        $this->_filter = false;
        unset($this->_filterHaving);
        unset($this->_having);

        //your code
        $startTime = date('Y-m-d', mktime(0, 0, 0, date('m')-1  , 1 , date('Y'))); 
        $endTime = date('Y-m-d', mktime(23, 59, 59, date('m'), date('d')-date('j'), date('Y'))); 
        $table = 'contabilidade_faturacao';
        $date_filter_key = $this->table.'Filter_cf!data';
        if (!Tools::getIsset('local_'.$date_filter_key) && !isset($this->context->cookie->{$date_filter_key})) {
            $this->context->cookie->{$date_filter_key} = serialize(array(
                $startTime,
                $endTime
            ));
            $this->context->cookie->write();
        }
    }


  [1]: https://i.stack.imgur.com/2peoP.png

【讨论】:

  • 这不是答案,下次编辑您的问题。而且您显然需要删除 if (!Tools::getIsset... 部分,因为当您重置过滤器时,这些值存在于 POST 中并且 cookie 重写代码永远不会执行。
  • 对不起,我不知道编辑问题会更好。下次我不会了。我没有意识到我必须修改哪里,因为我试图一一修改,并且永远不会消除日期的过滤器,但不是 cosnsigo,总是会重置所有过滤器。你能帮我吗?谢谢
  • @TheDrot,我编辑了我的问题。请,如果您有任何可以帮助我的解决方案,我将不胜感激。谢谢。
【解决方案3】:

在呈现列表之前检查是否未设置日期过滤器,然后将默认日期过滤器写入 cookie。

$date_filter_key = $table.'Filter_cf!data';
if (!Tools::getIsset('local_'.$date_filter_key) && !isset($this->context->cookie->{$date_filter_key}) {
    $this->context->cookie->{$date_filter_key} = serialize(array(
        '2017-02-01',
        '2017-02-28'
    ));
    $this->context->cookie->write();
}

当您重置过滤器时,您必须使用默认过滤器重写 cookie。

public function processResetFilters($list_id = null)
{
    ...
    // your code
    $startTime = date('Y-m-d', mktime(0, 0, 0, date('m')-1  , 1 , date('Y'))); 
    $endTime = date('Y-m-d', mktime(23, 59, 59, date('m'), date('d')-date('j'), date('Y'))); 
    $table = 'contabilidade_faturacao';
    $date_filter_key = $this->table.'Filter_cf!data';
    $this->context->cookie->{$date_filter_key} = serialize(array(
        $startTime,
        $endTime
    ));
    $this->context->cookie->write();
}

【讨论】:

  • 我放了你的代码,但什么也没发生,插入普通过滤器后我必须注入它吗?非常感谢您的帮助,我很抱歉无法理解,但我刚刚开始使用 prestashop,我仍然不太了解如何进行一些操作。谢谢。
  • 插入普通滤镜后即可。可能$date_filter_key 不正确,请检查var_dump(Tools::getAllValues());var_dump($this->context->cookie->getAll()); 的POST 和cookie 数据以查找日期字段的过滤值。
  • 非常感谢您的帮助,但不幸的是,我认为它仍然没有解决我做了 var_dump,这就是它给出的结果:["remote_addr"]=> string(10) "1042070754" ["stats_date_update "]=> string(10) "1492556400" ["submitFilterproduct"]=> string(1) "1" ["productsproductFilter_active"]=> string(1) "1" ["contabilidade_movimentoFilter_cf!data"]=> string( 28) "a:2:{i:0;s:0:"";i:1;s:0:"";}" ["contabilidade_faturacaoFilter_cf!data"]=> 字符串(28) "a:2: {i:0;s:0:"";i:1;s:0:"";}" ["校验和"]=> int(1026487492)
  • 在 cookie 中你没有 local_ 前缀作为日期过滤器,我的答案中的代码也只会在用户第一次过滤列表之前有效。所以你可能想删除你的cookies来测试。还要在插入普通过滤器之前移动代码。我更新了正确处理 local_ 前缀的答案。
  • 我现在对其进行了测试,清理了它拥有的 cookie,它运行良好。我只是想知道当我重新安装我的模块时是否必须清除 cookie?非常感谢,你帮我解决了问题。
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多