Drupal,Ubercart - 将自定义字段添加到结帐表单

Posted

技术标签:

【中文标题】Drupal,Ubercart - 将自定义字段添加到结帐表单【英文标题】:Drupal, Ubercart - Add custom field to checkout form 【发布时间】:2013-02-19 02:57:04 【问题描述】:

需要 Drupal 专家的帮助。

我的目的(使用 Drupal 7 和 Ubercart 3)是向结帐页面添加一个自定义字段,该字段应该是动态的(来自 ajax 请求的值),其内容取决于用户的送货城市输入。

通过“额外字段窗格”模块,我成功地创建了具有一些占位符值的字段。然后,我使用 JS 方法将值附加到该字段。当我提交具有该动态添加的选定值的表单时出现了问题 - 我对该字段有“无效选择”错误。当未添加的js值(占位符)选择时 - 一切都按预期工作。

你能提示我解决这个问题吗?

我在https://***.com/a/5159013/837255 找到了一个,这似乎是一种常见的方法,但从这里开始另一个问题。 在挂钩中的 %my module% 中,我无法访问字段以对其进行操作。

我需要如何更改由模块“ajax_field_name”创建的示例:

$form['panes']['delivery']['ajax_field_name']['#ajax'] = ....

但是我的 *cking 窗格没有任何 $form['panes']['delivery']['ajax_field_name']。当我执行var_dump($form['panes']['delivery']) 时,我看到'ajax_field_name' 位于$form['panes']['delivery']['address']['#uc_addresses_address'] OBJECT 中的某个私有财产后面。

function uc_nova_poshta_form_alter(&$form, &$form_state, $form_id)
    if ($form_id == 'uc_cart_checkout_form')
        $obj = $form['panes']['delivery']['address']['#uc_addresses_address'];
        // addressBook is a private property
        $obj->addressBook;
    

事实上,这段代码可以满足我的需要——

$form['panes']['delivery']['address']['ajax_field_name2'] = array(
  '#type' => 'select',
  ...

在正确的位置创建一个自定义字段,可以访问它,但仅在该表单中,此字段不会影响任何进一步的活动(订单审查、管理页面等)。同样在 $form['panes']['delivery'] 中,此字段 ('ajax_field_name2') 与使用模块 'ajax_field_name' 创建的位置分开。

我猜这种行为的原因是某些模块,例如uc_addresses(对吗?),但即使我禁用了最可疑的它们 - 问题仍然存在。

是否有可能了解如何访问“ajax_field_name”创建的字段? 谢谢。

【问题讨论】:

【参考方案1】:

这可能无法完全解决您的问题(如果您仍然有它,因为这似乎是一个相当老的问题......),但一个问题是您使用了错误的钩子。您应该使用hook_uc_checkout_pane_alter 和目标uc_checkout_pane_delivery 来完成此操作。我在尝试将默认国家/地区设置为美国以外的其他国家/地区时学到了这一点;如果你通过hook_form_alter 和它的变体来操纵它们,事情会很糟糕。

我现在正在处理类似的事情。当我发现它时,我会用更多信息更新这个答案。

【讨论】:

以上是关于Drupal,Ubercart - 将自定义字段添加到结帐表单的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 drupal 6 中的自定义字段将自定义版本的节点/添加表单放在视图中?

Drupal/Ubercart ...节点样式?

带有 ubercart 的 drupal 6 或 7

Ubercart 3 (Drupal 7) 的多币种

drupal 7在ubercart 3.x中成功付款的钩子是啥

主题为Drupal 7的Ubercart“/ cart”页面