虽然 Prestashop 在灵活性和扩展其功能方面非常严格,但您所要求的几乎可以通过在这里和那里撒上一点 JavaScript 魔法(阅读:hacks)来实现。
注意:我为此使用 Prestashop 1.5.6.1,因此可能存在一些细微差别。
假设
我假设你知道如何编写基本的Prestashop 模块,使用 Prestashop 钩子,设置模块安装和卸载操作,以及使用数据库,使用 jQuery。
准备好?
股票转让
Prestashop 中没有严格的库存转移概念。但是您确实获得了股票变动的完整历史记录,该历史记录存储在stock_mvt
表中并由StockMvt
类提供支持。
这是非常幸运的,并且您不必创建和管理转移表。但是,它可能不太可靠。
列操作
由 渲染的 Stock Movement 屏幕AdminStockMvtController
没有任何用于更改列的挂钩。所以这需要一些 JavaScript 动作。
注入 JavaScript 的标准方法是挂钩到displayBackOfficeHeader
. 一旦你加入这个动作,注入一个 JavaScript 文件。
public function hookDisplayBackOfficeHeader() {
return '<script type="text/javascript" src="'.$this->_path.'transfers.js'.'"></script>';
}
额外的列
以上将包括您的脚本,该脚本与您的模块一起提供。此脚本可以使用 jQuery 更改列的外观和内容。
jQuery( '.table.stock_mvt thead tr:nth(0)' ).append( '<th>Transfer</th>' );
jQuery( '.table.stock_mvt thead tr:nth(1)' ).append( '<td></td>' );
按新列排序、搜索、过滤的奖励积分。
标签
更改名称“转移到/从另一个仓库”很简单,不需要任何数据库调用。只需查看每一行,如果该列包含“来自”,请查看前一行并从 Warehouse 列中获取名称。如果它包含“to”,请查看下一行。
这显然不适用于这样的排序和过滤器。在这种情况下,您可以调用数据库以获取每个移动的仓库名称 - 请参阅下一节。
用户界面非常简单。但是您如何将转帐单数据输入那里?困难的部分来了。
转移单据数据
就像我说的,运动数据是可用的,并且可以以几乎相同的方式轻松检索AdminStockMvtController
。
该表将需要数据库中的一些数据。您需要获取仓库之间移动的 ID,这将是您的单据 ID 和所涉及的两个仓库的名称。
基本上,您需要通过查看stock_mvt_reason_lang
表格并找到连续的“to”和“from”原因对来确定转移对,这些是id_stock_mvt_reason
您感兴趣的。查看内部stock_mvt
,排序stock_mvt_id
并在 PHP 或 MySQL 中将它们配对。
将id_stock
指向一个仓库,您可以在其中获取名称。基本上得到你需要的任何东西,并将连续的“到”->“从”动作配对作为转移。
单据 ID 应该是id_stock_mvt
“to”运动或“from”运动的(选择一个并坚持下去)。通过这种方式,您将能够生成具有一个特定 ID 的单据并找到转移中涉及的两个动作。
把它们放在一起
因此,您要做的就是在您的模块上进行 AJAX 调用并返回所需的数据 - 传输单据 ID、传输到/从名称等。一旦此调用完成,您只需根据需要将数据注入表中。转账将是生成您的单据的链接(请参阅下一节)。
由于该表没有 ID 数据,因此您必须确保以正确的顺序返回结果,因此不要忘记考虑排序、限制和分页以输出正确排序的有效负载以注入表中。您应该能够摆脱只发送传输数据对。
或者,您可以创建一个名为“Stock Transfers”的新管理选项卡,您可以在其中以干净的方式输出表格,仅包含转移。
PDF 单据
PDF 生成可以从AdminPdfController
. 您必须包括来自传输的必要数据。至此,您已经发现了获取所有输出所需数据的正确方法。构建 PDF 很简单。
一旦您的生成器获得单据 ID,您就可以在移动表中查找它,获取它的对及其所有数据。正如你可以想象的那样,生成是即时发生的,而单据永远不会存储在 Prestashops 中。您的新转账单也不需要保存。
概述
快速概览您的模块需要包含的内容:
- 基本模块代码(安装、卸载、钩子注册)
- 注册
hookDisplayBackOfficeHeader
函数
- 对表数据执行 AJAX 请求的 script.js 文件
- 给定一些参数的 AJAX 请求响应器将返回单据 ID、仓库名称
- 一个 PDF 控制器,可以从其中一个 ID ( ) 中识别一对
id_stock_mvt
并输出一个漂亮的单据供您打印
- 一些常规的安全措施,你不希望陌生人在你的转账周围戳戳
结论
整个事情远非易事(即使解释起来也很困难),可能需要几天时间来实现基本功能,但肯定有可能获得不同的(大部分成功的)结果。
主要困难之一在于两个相关运动如何没有明确连接,而不是一些绑定传输 ID,您有一个“to”运动和一个“from”运动,它们之间的时间很短,并且数量相同。
顺便说一句,维护一个干净的核心分支也是一种选择,您可以对核心进行最小的更改,这些更改可以很容易地与更新合并。就像在方便的地方添加钩子,用一个核心类代替你自己的类等等。这会让你有更少的hack。
我很乐意聊天并讨论上述方法的细节。节日快乐,祝你的项目好运!