Prestashop 自定义管理模块可拖动排序/顺序不起作用

fan*_*ana 4 prestashop prestashop-1.6

我正在为 Prestashop 1.6 构建一个非常简单的模块,并添加了一个管理界面,允许列出我的记录,一个用于添加、编辑和删除的表单。

正如您在这里看到的那样,这工作正常: 在此输入图像描述

问题是可拖动的重新排序按钮不可拖动。因此重新排序不起作用......

根据官方文档,如果您在控制器中设置位置选项,您将获得可拖动功能:

['position'] => 'position', // If set to position, the field will display arrows and be drag and droppable, which will update position in db (optional).
Run Code Online (Sandbox Code Playgroud)

这是我的模块控制器的相关部分:

$this->fields_list = array(
        'id_quicklinks' => array(
            'title' => $this->l('ID'),
            'align' => 'center',
            'width' => 25
        ),
        'titulo' => array(
            'title' => $this->l('Titulo'),
            'width' => 'auto'
        )
        , 'lead' => array(
            'title' => $this->l('Subtitulo'),
            'width' => 'auto'
        ), 
        'position' => array(
            'title' => $this->l('Ordem'),
            'filter_key' => 'a!position',
            'position' => 'position',
            'align' => 'center',
            'class' => 'fixed-width-md'
        ),
        'active' => array(
            'title' => $this->l('Publicado'),
            'width' => '25',
            'active' => 'status'
        )
    );
Run Code Online (Sandbox Code Playgroud)

正如您在打印屏幕中看到的,显示了手柄,但拖放不起作用。控制台上没有 javascript 错误,什么也没有...我可以在源代码中看到 jQuery 和 jQueryUI 已加载。其他具有重新排序功能的管理页面工作正常...

有任何想法吗?谢谢。

fan*_*ana 5

好吧,如果有人感兴趣,我设法让它发挥作用。

在我的模块管理控制器中,我添加了(在 __construct 方法之前,在打开类之后):

protected $position_identifier = 'id_quicklinks';
Run Code Online (Sandbox Code Playgroud)
  • id_quicklinks是该模块使用的数据库表的主键。

这启用了我正在寻找的拖放功能,但尽管我现在可以拖放,但订单并未保存在数据库中。

为了实现这一点,我添加了另外两种改编自controllers/admin/AdminCarriersController.php和 的方法classes/Carrier.php

public function ajaxProcessUpdatePositions()
    {
        $way = (int)Tools::getValue('way');
        $id_quicklinks = (int)Tools::getValue('id');
        $positions = Tools::getValue('quicklinks');

        if (is_array($positions))
            foreach ($positions as $position => $value)
            {
                $pos = explode('_', $value);

                if (isset($pos[2]) && (int)$pos[2] === $id_velcroquicklinks)
                {
                        if (isset($position) && $this->updatePosition($way, $position, $id_quicklinks))
                            echo 'ok position '.(int)$position.' for id '.(int)$pos[1].'\r\n';
                        else
                            echo '{"hasError" : true, "errors" : "Can not update id '.(int)$id_quicklinks.' to position '.(int)$position.' "}';

                    break;
                }
            }

    }
Run Code Online (Sandbox Code Playgroud)

和:

public function updatePosition($way, $position, $id)
    {

        if (!$res = Db::getInstance()->executeS('
            SELECT `id_quicklinks`, `position`
            FROM `'._DB_PREFIX_.'quicklinks`
            ORDER BY `position` ASC'
        ))
            return false;

        foreach ($res as $quicklinks)
            if ((int)$quicklinks['id_quicklinks'] == (int)$id)
                $moved_quicklinks = $quicklinks;

        if (!isset($moved_quicklinks) || !isset($position))
            return false;
        var_dump($moved_quicklinks['position']);
        // < and > statements rather than BETWEEN operator
        // since BETWEEN is treated differently according to databases
        return (Db::getInstance()->execute('
            UPDATE `'._DB_PREFIX_.'quicklinks`
            SET `position`= `position` '.($way ? '- 1' : '+ 1').'
            WHERE `position`
            '.($way
                ? '> '.(int)$moved_quicklinks['position'].' AND `position` <= '.(int)$position
                : '< '.(int)$moved_quicklinks['position'].' AND `position` >= '.(int)$position.'
            '))
        && Db::getInstance()->execute('
            UPDATE `'._DB_PREFIX_.'quicklinks`
            SET `position` = '.(int)$position.'
            WHERE `id_quicklinks` = '.(int)$moved_quicklinks['id_quicklinks']));
    }
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助遇到同样问题的人。