【问题标题】:New module for personal collection/receive with possibility to choose shop (pickup to store)新的个人收集/接收模块,可以选择商店(取货到商店)
【发布时间】:2014-12-07 12:24:09
【问题描述】:

我想增加客户在我们的一家商店亲自接收订单的可能性。我试图找到一些模块,可以选择他们想要在哪个商店接收订单,但我没有找到任何免费的东西。因此,我想为它创建新模块。更重要的是,我是 prestashop 的新手,我不知道从哪里开始或如何创建这个模块。我花了两三天时间阅读如何做到这一点,这些是我的假设:

  1. 可以通过扩展 CarrierModule 类来创建新的载体模块。
  2. 我阅读了一些关于钩子的文章/文档。
  3. 我通过编辑本文所附模块http://www.prestashop.com/blog/en/carrier_modules_functions_creation_and_configuration/创建了我的第一个载体模块。
  4. 我实现的是在选择运营商后安装了模块并使用钩子“BeforeCarrier”为页面添加了一些布局。

我的运营商应该这样工作:

  1. 它应该是运营商列表的一部分,以便客户能够选择它。
  2. 如果未选择运营商,则不会发生任何事情。如果客户选择了承运人,则应显示“选择商店”按钮。
  3. 按下“选择商店”按钮后,新窗口应显示我们商店的地址(而不是新窗口,它可能会放置在当前页面的某个位置)。
  4. 带有商店地址的窗口将包含带有单选按钮和确认选择的按钮的地址列表。
  5. 确认选择窗口后将关闭,地址应显示为carreir的一部分。
  6. 确认电子邮件将包含商店客户可以收集订单的信息。
  7. 假设地址将在 php 代码中进行硬编码。

这些是我的问题:

  1. 我创建了新的运营商模块,因此我认为它可以正常工作(如此处所述http://www.prestashop.com/blog/en/carrier_modules_functions_creation_and_configuration/)。
  2. 如何在所选运营商附近添加新按钮“选择商店”?
  3. 我可以使用挂钩来添加“选择商店”按钮吗?
  4. 我应该在哪里记住选择的商店地址?有“Carrier”类的地方吗?
  5. 如何在邮件中添加店铺地址?我应该编辑布局吗?电子邮件布局是否包含它的位置,还是我需要为其添加新的“占位符”?
  6. 如何在管理员端显示选择的地址?

为了更详细地描述我的问题,我创建了几个场景 (see attachment)。 如有任何帮助,我将不胜感激。

我在prestashop forum 上发布了同样的问题。

【问题讨论】:

    标签: prestashop prestashop-1.6


    【解决方案1】:
    1. 这些示例通常陈旧且写得不好。他们缺乏结构。但出于你的目的,我想他们没问题。
    2. 使用hookDisplayCarrierList($args)。检查$args 以查看选择了哪个运营商,然后返回您选择的<select> 元素 店铺地址。每次用户选择运营商并通过 Ajax 返回时都会触发此挂钩。因此,这里不能使用ajax。

      你应该在一个文件中包含你的 javascript。使用hookDisplayHeader 检测何时将此文件插入到您的页面中:

      public function hookDisplayHeader(){
      
      $propExists = property_exists($this->context->controller, 'php_self');
      
      if($propExists){
      
          $controllerName = $this->context->controller->php_self;
          if(in_array($controllerName, array('order', 'order-opc'))){
      
           // $this->context->controller->addJS($this->_path.'js/customcarrier.js');
      

      此Javascript文件应检查是否已选择有效商店,然后再进行下一步;

      因为你的 Js 代码在一个文件中,而 hookDisplayCarrierList 不能包含任何 JavaScript(因为它返回 Ajax),

      您还应该使用hookDisplayBeforeCarrier。在这里您可以插入您的自定义运营商 ID - 这样您就知道了 何时检查 JS 文件的错误。

    3. 与 #2 相同的问题。

    4. 保存信息的正确方法是添加模型。 CustomCarrierSelectedAddress - 或类似的东西。 它会有这些列:id_cart, id_shop_address;

      实施商店地址的方式取决于您。您可以将它们定义为常量,甚至为它们创建一个新模型。

      模型并不难创建,你只需要声明类属性,静态变量$definition 就可以了。

      您可以添加自己的方法。为方便起见,您还应该添加 createTable()/dropTable() 方法。

    5. 这更复杂。你可以:

      • 发送有关所选商店地址的电子邮件。
      • 搜索发送您希望更改的电子邮件的控制器方法。 然后你应该通过将文件复制到你的模块来覆盖该方法,删除所有其他方法并 重命名里面的类定义 -> class AdminAddressesController extends AdminAddressesControllerCore

      应该有一组电子邮件占位符及其值,由控制器分配。

      例如'{order_id}'。您应该将电子邮件变量添加到数组 {chosen_shop_info} 并分配整个 一段文字给它。然后您可以在实际的电子邮件模板中使用它,您可以在 BO 中进行编辑。

      这或多或少是我知道的编辑现有模板的唯一方法,因为您不能在电子邮件模板中执行条件语句。

    6. 要将所选地址添加到 BO 中的订单页面,您应该使用另一个挂钩 - hookDisplayAdminOrder。 在这里,您可以添加自己的块以显示在订单摘要中。

    要找出可用的钩子,请转到Hook.php 并查找方法exec()。添加此行error_log($hook_name)。 当您执行特定操作时,执行的钩子将被记录下来,您将看到您需要什么样的钩子。

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多