我需要创建某种转帐单(就像送货单)转帐号( 例如,转移#TR000008 )将股票从一个仓库转移到另一个仓库(股票>股票管理 - > 行动>转移股票)。
我想在股票运动列中显示转帐号(例如#TR000008 )。
如果可能,我想将 LABEL 从“转移到另一个仓库”更改为“转移到 [这里的仓库名称] “。
任何方式我都可以破解PrestaShop来做上述事情?
非常感谢帮助。
如果 no.1 太难了,也许只是告诉我 Stock Transfer 中添加额外输入字段的方法表格,以便我可以手动输入 转帐号。
注意:
我真的需要帮助才能获得完整的工作代码 方向 @soulseekah 提供。
PS:我正在使用Prestashop 1.5.2.0
答案 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生成可以从AdminPdfController
分叉。您必须包含转移所需的数据。到目前为止,您已经发现了获取输出所需数据的正确方法。构建PDF很简单。
一旦您的生成器获得了滑动ID,您就可以在移动表中查找它,获取它们的对和所有数据。你可以想象,动态的一代ocurrs,以及滑动从未存储在Prestashops中。您的新转帐单也不需要存储。
快速概述模块需要包含的内容:
hookDisplayBackOfficeHeader
功能id_stock_mvt
)中识别出一对并输出一个漂亮的单据供您打印整件事情远非易事(即使解释起来也很困难),并且可能需要花费几天的时间来实现基本功能,但它确实可能带来不同的(成功的)结果。
其中一个主要困难在于两个相关的动作是如何没有明确联系的,而不是一些有约束力的转移ID,你有一个&#34;到#34;运动和一个&#34;来自&#34;运动,它们之间的关闭时间和相同的数量。
顺便说一句,维护一个干净的核心分支也是一种选择,您可以对核心做出最小的更改,可以轻松地与更新合并。就像在方便的地方添加钩子一样,用一个核心类替换你自己的类等等。这样可以减少黑客攻击。
我很乐意聊聊并讨论上述方法的细节。节日快乐,祝你的项目好运!
答案 1 :(得分:3)
另一种方法是分叉Prestashop。这是非常危险的,如果可能应该避免,但有时候别无他法。用我的其他答案写一个带黑客的模块并不容易,但是你可以做一些难以做到的事情。
下面的一些想法可能与我之前的回答有关,也包含一些新的想法。通过结合这两个答案,您实际上可以提出一种非常可靠的非分叉方式来实现这一点,但代价是需要更多的编码时间。我也会认为这个答案对我以前的答案有所改进,因为我在探索时发现了一些更好的方法。
我假设您知道有大量的PHP和MySQL来进行必要的更改,并且您知道在更新主包时如何维护和更新fork(使用差异和合并)。无论如何,你仍然可能需要一些jQuery或JavaScript动作。
您还需要熟悉Prestashop的API - 数据库,安全性和权限,模型,控制器和模块。
同样,对于有经验的程序员来说,编写半工作解决方案可能需要一两天的时间,所以不要指望任何快速的复制和粘贴解决方案 - 不幸的是,没有。
所以,你决定把它全部分开。你应该专注于做出尽可能小的改变。该规则在函数的每个重要部分中不超过2个语句。所有逻辑都应该写在自定义文件中,这些文件位于核心树之外。
由于Prestashop无需维护转移关系,因此您需要创建并维护自己的表来存储转移。该表需要id_warehouse_to
和id_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
函数并修改输出的模板(在here和here内)。
实际PDF的生成将与我的其他答案保持一致,但这次您的ID将来自您的自定义转移表,如transfer_id
(自动递增)。这将允许PDF生成器查看您的表,引用所涉及的内容。
总的来说,我觉得通过结合这个和我以前的答案,你可以得到一个非常体面的解决方案来解决你手头的问题,而不需要任何事情。我个人会在一个新的管理选项卡中找到StockManager
代理,一些jQuery注入和一个自定义表,其中包含所有传输的列表而不需要任何东西。
希望这一切都可以帮助您提出以简洁的方式实现此功能所需的代码。如果你对这一切感到不舒服,可以尝试聘请一位优秀的开发人员,并附上我为你写的两本指南 - 真的没有失败的余地。
祝你好运。
答案 2 :(得分:2)
我已经创建了一些示例代码,但由于它们太长,我已将其设为here。代码演示了一个模块,该模块扩展了默认的StockManager实现,以将相应的Stock Movements与Transfer ID相关联。我还没有达到执行PDF生成的程度。可能是我有一段时间我可以继续下去:)