Prestashop自定义管理模块可拖动排序/订单不工作

Prestashop自定义管理模块可拖动排序/订单不工作,prestashop,prestashop-1.6,Prestashop,Prestashop 1.6,我正在为Prestashop 1.6构建一个非常简单的模块,我添加了一个管理界面,允许列出我的记录,一个可以添加、编辑和删除的表单 正如您在此处所看到的,这工作正常: 问题是“可拖动的重新排序”按钮不可拖动。因此,重新排序不起作用 根据,如果在控制器中设置位置选项,则可以获得可拖动功能: ['position'] => 'position', // If set to position, the field will display arrows and be drag and drop

我正在为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).
这是模块控制器的相关部分:

$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'
        )
    );
正如您在打印屏幕中看到的,is显示了控制柄,但拖放不起作用。控制台上没有javascript错误,没有任何错误。。。我可以在源代码中看到jQuery和jQueryUI已加载。其他具有重新排序功能的管理页面工作正常

有什么想法吗?
谢谢。

好吧,如果有人感兴趣的话,我设法让它起作用了

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

  • id\u 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;
                }
            }

    }
以及:

公共函数更新位置($way,$position,$id)
{
如果(!$res=Db::getInstance()->执行(!$res
选择'id\u快速链接','position`
来自“`.\u DB\u前缀\u快速链接”`
按“位置”ASC排序
))
返回false;
foreach($res作为$quicklinks)
如果((int)$quicklinks['id\u quicklinks']==(int)$id)
$moved_quicklinks=$quicklinks;
如果(!isset($moved|u quicklinks)| |!isset($position))
返回false;
变量转储($moved_quicklinks['position']);
//语句,而不是运算符之间的
//因为根据数据库的不同,两者的处理方式不同
返回(Db::getInstance()->execute()
更新''.'数据库'.'前缀'.'快速链接`
设置'position`='position`.($way?'-1':'+1')。'
WHERE`位置`
“.($way
“>”(int)$moved_快速链接['position']”和“position`=”(int)$position
'))
&&Db::getInstance()->执行('
更新''.'数据库'.'前缀'.'快速链接`
设置'position`='(int)$position'
其中'id\u quicklinks`='(int)$moved\u quicklinks['id\u quicklinks']);
}

我希望这能帮助有同样问题的人。

谢谢您的解决方案

我花了很长时间才意识到,
ajaxProcessUpdatePositions()
本身就是一个调用。对于那些努力实现该方法的人,请注意在移动表中的元素时调用该方法时,
echo
var_dump()
不会打印任何内容

此外,我还找到了一些方法来稍微优化您的代码

您可以替换:

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;
作者:

数据库返回的行(和字段)越少越好。此外,它消除了PHP代码中循环的需要

您还可以在同一数据库调用中合并两个更新查询:

return (Db::getInstance()->execute('
            UPDATE `'._DB_PREFIX_.'quicklinks`
            SET `position`= `position` '.($way ? '- 1' : '+ 1').'
            WHERE `position`
            '.($way
                ? '> '.(int)$moved_quicklinks[0]['position'].' AND `position` <= '.(int)$position
                : '< '.(int)$moved_quicklinks[0]['position'].' AND `position` >= '.(int)$position.'
            ') . '; UPDATE `'._DB_PREFIX_.'quicklinks`
            SET `position` = '.(int)$position.'
            WHERE `id_quicklinks` = '.(int)$moved_quicklinks[0]['id_quicklinks']);
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 (!$moved_quicklinks  = Db::getInstance()->executeS('
       SELECT `id_quicklinks`, `position`
       FROM `'._DB_PREFIX_.'quicklinks`
       WHERE `id_quicklinks` = ' . (int) $id . '
       LIMIT 1;'
))
    return false;
return (Db::getInstance()->execute('
            UPDATE `'._DB_PREFIX_.'quicklinks`
            SET `position`= `position` '.($way ? '- 1' : '+ 1').'
            WHERE `position`
            '.($way
                ? '> '.(int)$moved_quicklinks[0]['position'].' AND `position` <= '.(int)$position
                : '< '.(int)$moved_quicklinks[0]['position'].' AND `position` >= '.(int)$position.'
            ') . '; UPDATE `'._DB_PREFIX_.'quicklinks`
            SET `position` = '.(int)$position.'
            WHERE `id_quicklinks` = '.(int)$moved_quicklinks[0]['id_quicklinks']);
public function ajaxProcessUpdatePositions()
{
    $id = (int) Tools::getValue('id');
    $positions = Tools::getValue("priority_level");
    $way = (boolean) Tools::getValue('way');

    //"and $id" because an ID of 0 is invalid (at least if you are using an auto-increment PK)
    if (is_array($positions) and $id)  
    {
        foreach ($positions as $position => $value)
        {
            $pos = explode('_', $value);

            if (isset($pos[2]) && (int) $pos[2] === $id)
            {
                $position = (int) $position;

                if ($priorityLevel = Db::getInstance()->executeS(
                        'SELECT `id_priority_level`, 
                            `priority_level`
                        FROM `pc_job_priority`
                        WHERE `id_priority_level` = ' . $id . '
                        LIMIT 1'
                )) {
                    Db::getInstance()->execute(
                        'UPDATE `pc_job_priority`
                        SET `priority_level` = `priority_level` '. 
                            ($way ? '- 1' : '+ 1') . '
                        WHERE `priority_level`' . (
                            $way ? 
                            ' > '. (int) $priorityLevel[0]['priority_level'] . 
                                ' AND `priority_level` <= '. $position :
                            ' < '. (int) $priorityLevel[0]['priority_level'] . 
                                ' AND `priority_level` >= '. $position 
                        ) . '; 
                        UPDATE `pc_job_priority`
                        SET `priority_level` = ' . $position . '
                        WHERE `id_priority_level` = ' . $id
                    );
                }

                break;
            }
        }
    }
}