当前位置: 首页 > 知识库问答 >
问题:

在Prestashop 1.7的结帐中添加字段和句柄值

孔睿
2023-03-14

我为Prestashop 1.7创建了自己的模块。对于PS1.6版本,它已经完成。PS 1.7的工作原理稍有不同;)我无法处理这个新字段中的值。只是为了得到这个字段值。

我想在结账过程中添加新的附加输入表单字段-在交付部分或在最后一步-支付部分。不管这两个地方哪一个。

我的模块已准备好通用模块标准件。我可以使用hook DisplayAfterCarrier或DisplayPaymentByBinaries在这两个步骤的前端添加新字段。使用hookHeader和addJS,我使用prependTo javascript函数将这个新的输入(带标签)html代码移动到submit按钮上方。

我有:

a)在两个数据库表(ps_cart和ps_orders)列中添加此新字段的值。

b)我已经用模块类购物车和订单来处理这个新变量。它适用于PS 1.6。这个新变量的公共定义

c) 在模块主php文件代码中显示新字段(简化):

public function hookDisplayAfterCarrier($params){
  $newFieldHtml='
  <div id="newFieldContainerID">
    <input type="text" id="myNewFieldName" name="myNewFieldName" value="1" />
    <label for="myNewFieldName">Test label for new extra form field. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</label>
  </div>';
  return $newFieldHtml;
}

d) 如何在提交按钮上方移动字段。在模块主php文件中:

public function hookHeader($params){
  if(isset($this->context->controller->php_self) && $this->context->controller->php_self=='order'){ //to add JS only at cart site
    $this->context->controller->addJS(($this->_path).'views/js/myModuleName.js');
  }
}

这是JS文件(myModuleName.JS):

jQuery(document).ready(function(){
    $('#newFieldContainerID').prependTo('#delivery');
    });
});

e) 我尝试使用以下钩子获取此值:ActionCarrierProcess;行动拯救;ActionValidateOrder。

没有成功。工具::getValue('myNewFieldName')也不起作用。我在$params的购物车和订单对象中有这个变量,但总是带有“0”值(我将此字段类型设置为bool,并将此字段在PS中的验证设置为self::TYPE_BOOL)。

如何处理这个新值?如何让它做任何事?任何东西-例如,只为调试而写入txt文件。如果我有这个值,我可以将它保存在购物车和订单对象中,然后保存到数据库中。

最后我想保存这个值。但是我不能接受,处理它,只是为了得到它。问题仅在Prestashop 1.7版本中。

共有1个答案

柴寂离
2023-03-14

我没有使用钩子解决了这个问题,而是覆盖了类CheckoutDeliveryStep和CheckoutSession。我的意思是,我使用与您相同的方式执行了hookDisplayAfterCarrier(或HookDisplayBeforeCharrier)和hookHeader,但是不需要任何钩子来接收和保存自定义字段。相反,需要覆盖CheckoutDeliveryStep和CheckoutSession。它在PrestaShop 1.7中运行良好。7.4,我向您展示代码:

签出交付步骤

class CheckoutDeliveryStep extends CheckoutDeliveryStepCore
{
    public function handleRequest(array $requestParams = [])
    {
        if (isset($requestParams['custom_field'])) {
            $this->getCheckoutSession()->setCustomField($requestParams['custom_field']);
        }

        parent::handleRequest($requestParams);
    }

    public function render(array $extraParams = [])
    {
        $extraParams['custom_field'] = $this->getCheckoutSession()->getCustomField();

        return parent::render($extraParams);
    }
}

签出

class CheckoutSession extends CheckoutSessionCore
{
    public function setCustomField($custom_field)
    {
        $this->context->cart->custom_field = $custom_field;

        return $this->context->cart->save();
    }

    public function getCustomField()
    {
        return $this->context->cart->custom_field;
    }
}

别忘了将自定义字段值从购物车传递到订单。您可以在PaymentModule类的createOrderFromCart()方法中执行此操作(重写)。

我想这些信息足以让解决方案发挥作用。问候。

 类似资料:
  • 我使用的是一个自定义的帖子类型和集成的woocommerce,我可以在页面上添加一个AddtoCart按钮,并可以将其添加到cart,所以效果很好 这是我的密码 但现在我需要在产品页面上添加一些自定义字段,一个包含颜色“黑色”和“白色”的下拉列表,这只是一个普通的下拉列表。当我选择一个将在购物车上显示在产品名称下的值时,我该怎么做

  • WordPress-WooCommerce 我想做的是: null 邮件里什么也没印。 请解决。提前谢了。

  • 本文向大家介绍MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结,包括了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法。分享给大家供大家参考,具体如下: 建表: 修改原有字段名称及类型: 添加新字段: 1.创建数据库时设置编码 2.创建表时

  • 本文向大家介绍添加DATE和TIME字段以在MySQL中获取DATETIME字段?,包括了添加DATE和TIME字段以在MySQL中获取DATETIME字段?的使用技巧和注意事项,需要的朋友参考一下 您可以使用函数设置日期和时间字段以获取DATETIME字段。 让我们创建一个演示表 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出

  • 问题内容: 我正在尝试从DATE和TIME字段获取DATETIME字段。MYSQL中的所有功能似乎都没有用。 有人知道该怎么做,或者甚至可以做到吗?:) 问题答案: 它应该像

  • 句柄是什么?在Windows中,句柄的存在就像指针的标识一样,但这样的答案显示不是你们需要的。闲暇之余,笔者摘录以下Windows句柄的解释。用户可以端着咖啡再看Windows结构体里面句柄的作用表述。 这里我列举词条中的关于句柄的叙述不当之处,至于如何不当先不管,继续往下看就会明白: 句柄是什么? Windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的地址需要变