Prestashop - 将库存转移到其他仓库时创建交货单

时间:2013-12-18 17:36:25

标签: prestashop stock prestashop-1.5

  1. 我需要创建某种转帐单(就像送货单转帐号例如,转移#TR000008 将股票从一个仓库转移到另一个仓库股票>股票管理 - > 行动>转移股票)。

  2. 我想在股票运动列显示转帐号例如#TR000008 )。

  3. 如果可能,我想将 LABEL “转移到另一个仓库”更改为“转移到 [这里的仓库名称]

  4. 任何方式我都可以破解PrestaShop来做上述事情?

    非常感谢帮助。

    UPDATE:

    如果 no.1 太难了,也许只是告诉我 Stock Transfer 添加额外输入字段的方法表格,以便我可以手动输入 转帐号

      

    注意:

         

    我真的需要帮助才能获得完整的工作代码   方向 @soulseekah 提供。

    PS:我正在使用Prestashop 1.5.2.0

3 个答案:

答案 0 :(得分:6)

虽然Prestashop在灵活性方面非常严格并且扩展了它的功能,但你可以通过在这里和那里洒上一些JavaScript魔法(阅读:黑客)来实现你所要求的。

注意:我为此使用了Prestashop 1.5.6.1,因此可能存在一些细微差别。

假设

我假设您知道如何编写基本Prestashop modules,使用Prestashop挂钩,设置模块安装和卸载操作,以及使用数据库,使用jQuery。

就绪

股票转让

Prestashop没有严格的库存转移概念。但是您确实获得了库存移动的完整历史记录,该历史记录存储在stock_mvt表中并由StockMvt类支持。

这非常幸运,可以节省您创建和管理转移表的麻烦。但是,它可能不太可靠。

列操作

AdminStockMvtController呈现的Stock Move屏幕没有任何挂钩来改变列。所以这需要一些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>' );

按新列排序,搜索,过滤的加分点。

标签

更改名称&#34;转移到另一个仓库或从另一个仓库转移#34;很简单,不需要任何数据库调用。如果列包含&#34;来自&#34;只需查看每一行。查看上一行并从Warehouse列中获取名称。如果它包含&#34; to&#34;看下一行。

这显然不适用于那样的排序和过滤器。在这种情况下,您可以为数据库调用每个运动的仓库名称 - 请参阅下一节。

用户界面非常简单。但是如何获得转移单数据呢?这是困难的部分。

转移单数据

就像我说的那样,移动数据是可用的,并且可以很容易地以AdminStockMvtController的方式检索。

该表将需要数据库中的一些数据。您需要获取仓库之间的移动ID,这将是您的滑动ID和所涉及的两个仓库的名称。

基本上,你需要通过查看stock_mvt_reason_lang表并找到连续的&#34;到&#34;来找出转移对。 &#34;来自&#34;理由对,这些对id_stock_mvt_reason感兴趣。查看stock_mvt内部,按stock_mvt_id排序并在PHP或MySQL中配对。

id_stock将指向仓库,您可以在其中获取名称。基本上得到你需要的东西,并连续配对&#34;到#34; - &GT; &#34;从&#34;运动作为转移。

单据ID应该是&#34;到&#34;的id_stock_mvt。运动,或者来自&#34;来自&#34;运动(选一个并坚持下去)。通过这种方式,您可以生成具有一个特定ID的单据,并找到转移中涉及的两个动作。

全部放在一起

所以你需要做的就是在你的模块上抛出一个AJAX调用并返回所需的数据 - 传输传票ID,转移到/从名称转移等。一旦完成这个调用,你只需根据需要将数据注入表中。转移将是生成您的单据的链接(参见下一节)。

由于该表没有ID数据,因此您必须确保以正确的顺序返回结果,因此不要忘记考虑排序,限制和分页以输出正确的有序负载被注入表中。您应该能够仅发送传输数据对。

或者,您可以创建一个名为&#34; Stock Transfers&#34;在那里以干净的方式输出表格,只有传输。

PDF单

PDF生成可以从AdminPdfController分叉。您必须包含转移所需的数据。到目前为止,您已经发现了获取输出所需数据的正确方法。构建PDF很简单。

一旦您的生成器获得了滑动ID,您就可以在移动表中查找它,获取它们的对和所有数据。你可以想象,动态的一代ocurrs,以及滑动从未存储在Prestashops中。您的新转帐单也不需要存储。

概述

快速概述模块需要包含的内容:

  • 基本模块代码(安装,卸载,挂钩注册)
  • 已注册的hookDisplayBackOfficeHeader功能
  • 执行表数据的AJAX请求的script.js文件
  • 给出一些参数的AJAX请求响应者将返回单据ID,仓库名称
  • 一个PDF控制器,可以从其中一个ID(id_stock_mvt)中识别出一对并输出一个漂亮的单据供您打印
  • 一些传统的安全措施,你不希望陌生人在你的转移中徘徊

结论

整件事情远非易事(即使解释起来也很困难),并且可能需要花费几天的时间来实现基本功能,但它确实可能带来不同的(成功的)结果。

其中一个主要困难在于两个相关的动作是如何没有明确联系的,而不是一些有约束力的转移ID,你有一个&#34;到#34;运动和一个&#34;来自&#34;运动,它们之间的关闭时间和相同的数量。

顺便说一句,维护一个干净的核心分支也是一种选择,您可以对核心做出最小的更改,可以轻松地与更新合并。就像在方便的地方添加钩子一样,用一个核心类替换你自己的类等等。这样可以减少黑客攻击。

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

答案 1 :(得分:3)

另一种方法是分叉Prestashop。这是非常危险的,如果可能应该避免,但有时候别无他法。用我的其他答案写一个带黑客的模块并不容易,但是你可以做一些难以做到的事情。

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

假设

我假设您知道有大量的PHP和MySQL来进行必要的更改,并且您知道在更新主包时如何维护和更新fork(使用差异和合并)。无论如何,你仍然可能需要一些jQuery或JavaScript动作。

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

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

最小分叉

所以,你决定把它全部分开。你应该专注于做出尽可能小的改变。该规则在函数的每个重要部分中不超过2个语句。所有逻辑都应该写在自定义文件中,这些文件位于核心树之外。

数据库

由于Prestashop无需维护转移关系,因此您需要创建并维护自己的表来存储转移。该表需要id_warehouse_toid_warehouse_from作为warehouse表中的两个外键。您还可以在我们稍后添加的额外输入字段中添加extra列。

此表允许您在不必计算班次的情况下查找对,并保持核心数据库的安全。

保存转移

此方法不需要分叉,可以与之前的解决方案结合使用。

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

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

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

我会尽可能完整地分配该方法而不是存储仓库ID实际上存储了每个->add->remove之后的两个库存移动ID。这将使您能够找到实际价格,数量等。

额外输入字段

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

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

输出列表

我会选择一个新的标签,其中包含自己的列表,例如“Stock Transfers”。这比尝试更改现有选项卡更容易;但是如果你愿意,可以在相关控制器中修改renderList函数并修改输出的模板(在herehere内)。

PDF

实际PDF的生成将与我的其他答案保持一致,但这次您的ID将来自您的自定义转移表,如transfer_id(自动递增)。这将允许PDF生成器查看您的表,引用所涉及的内容。

结论

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

希望这一切都可以帮助您提出以简洁的方式实现此功能所需的代码。如果你对这一切感到不舒服,可以尝试聘请一位优秀的开发人员,并附上我为你写的两本指南 - 真的没有失败的余地。

祝你好运。

答案 2 :(得分:2)

我已经创建了一些示例代码,但由于它们太长,我已将其设为here。代码演示了一个模块,该模块扩展了默认的StockManager实现,以将相应的Stock Movements与Transfer ID相关联。我还没有达到执行PDF生成的程度。可能是我有一段时间我可以继续下去:)