3
  1. 在将库存从一个仓库转移到另一个仓库时库存 > 库存管理-->操作 > 转移),我需要创建某种具有转移编号的转移单(就像交货单)(例如转移 #TR000008股票)。

  2. 我想在Stock Movement 列中显示转移编号例如#TR000008)。

  3. 并且,如果可能的话,我想将LABEL“转移到另一个仓库”更改为“转移到[NAME OF WAREHOUSE HERE]

有什么办法可以破解 PrestaShop 来完成上述操作?

非常感谢您的帮助。

更新:

如果no.1太难,也许只是告诉我一种在Stock Transfer表单中添加额外输入字段的方法,以便我可以手动输入转移编号

笔记:

我真的需要帮助来获得完整的工作代码,可能基于@soulseekah提供的方向。

PS:我正在使用 Prestashop 1.5.2.0

4

3 回答 3

6

虽然 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。

我很乐意聊天并讨论上述方法的细节。节日快乐,祝你的项目好运!

于 2013-12-24T19:25:18.030 回答
3

另一种方法是分叉 Prestashop。这是非常危险的,应该尽可能避免,但有时别无他法。正如我的其他答案一样,这并不比使用 hack 编写模块更容易,但它可以让你做一些 hack 难以做到的事情。

下面的一些想法可能与我之前的答案有关,并且也包含一些新想法。通过结合这两个答案,您实际上可以想出一种非常可靠的非分叉方式来做到这一点,但代价是需要更多的编码时间。我也会认为这个答案是对我之前答案的改进,因为我在探索时发现了几种更好的方法来做一些事情。

假设

我假设您了解大量 PHP 和 MySQL 以进行必要的更改,并且您知道在更新主包时如何维护和更新分叉(使用差异和合并)。无论哪种方式,您仍然可能需要一些 jQuery 或 JavaScript 操作。

您还需要熟悉 Prestashop 的 API——数据库、安全和权限、模型、控制器和模块。

同样,对于有经验的程序员来说,编写一个半工作的解决方案可能需要一两天的时间,所以不要指望这里有任何快速的复制和粘贴解决方案——不幸的是,不会有任何解决方案。

最小分叉

所以,你决定分叉这一切。您应该集中精力进行尽可能小的更改。规则是在一个函数的每个重要部分中不超过 2 个语句。所有逻辑都应该写在自定义文件中,这些文件位于核心树之外。

数据库

由于 Prestashop 不费心维护传输关系,因此您需要创建和维护自己的表来存储传输。该表需要具有id_warehouse_toid_warehouse_from作为warehouse表中的两个外键。您还可以拥有extra我们稍后将添加的额外输入字段的列。

该表将允许您找到对而无需计算班次,并保持核心数据库的安全。

保存转账

这种方法不需要分叉,可以和之前的方案结合使用。

可以postProcess在控制器的方法中检测到传输,您将看到transferBetweenWarehouses在 StockManager 上调用该方法。

幸运的是,StockManger 是由工厂返回的,它实际上可以使用stockManager钩子钩住。

实现StockManagerInterface,它将所有内容代理为默认值StockMangaer。这将允许您检测transferBetweenWarehouses方法调用并将必要的数据记录到您的自定义表中。

我会完全分叉该方法,而不是存储仓库 ID,而是在每个->add和之后存储两个库存移动 ID ->remove。这将使您能够找到实际价格、数量等。

额外的输入字段

您可以使用 JavaScript 注入并注入一个额外的字段,您可以在自定义StockManagerInterface. 例如,添加一个简单的<input name="custom">然后使用 查找它Tools::getValue('custom', null)。然后将其与其他传输数据一起存储到您的自定义表中。

分叉的方式,需要你改变里面的表单数组AdminStockManagementController,一些值可能会深入到模板本身,所以一定要更深入地使用它们。其余的应该在您StockManager在上一步中编码的代理内部处理。

输出列表

我会选择一个带有自己列表的新标签,例如“股票转让”。这比尝试更改现有选项卡要容易;但如果你愿意,你可以renderList在相关控制器中破坏函数并修改输出的模板(在此处此处)。

PDF格式

实际 PDF 的生成将与我的其他答案中的相同,但这次您的 ID 将来自您的自定义传输表,例如transfer_id(自动递增)。这将允许 PDF 生成器查看您的表格,引用所涉及的内容。

结论

总的来说,我觉得通过结合这个和我之前的答案,你可以在不分叉任何东西的情况下为你手头的问题提供一个非常体面的解决方案。我个人会选择StockManager代理、一些 jQuery 注入和一个新管理选项卡中的自定​​义表,其中包含所有传输的列表,而无需分叉任何东西。

希望这一切都可以帮助您提出以干净的方式实现此功能所需的代码。如果您对这一切感到不满意,请尝试使用我为您编写的两个指南聘请优秀的开发人员 - 真的没有失败的余地。

祝你好运。

于 2013-12-25T14:26:20.733 回答
2

我已经创建了一些示例代码,但是由于它们太长,所以我在此处提供了它们。代码演示了一个扩展默认 StockManager 实现的模块,以将相应的库存移动与转移 ID 相关联。我还没有到执行 PDF 生成的地步。可能是一个我有一些时间我将能够继续它:)

于 2014-01-01T20:55:20.980 回答