最新指南,从结帐中删除电话必填字段


9

请有人根据magento布局版本1.8.0.0发布关于在结帐中删除“必填”电话字段的指南,当前大多数Google资源已过期且不再可用。这似乎是保持最新操作指南的最佳位置。

如果有人可以通过下载Magento 1.8.0.0并提供已删除的证明来确认有效的解决方案,这将很有帮助,这些代码段有时会很有帮助,但我们尚未找到一种易于阅读/记录的有效解决方案。


Answers:


8

1.8.1我不知道有什么方法可以完成这项工作之前,您必须覆盖本地代码池中的抽象核心类,或者重写每个子类(我知道这很丑)。

从此1.8.1,他们介绍了该活动customer_address_validation_after。即使我不太自豪,我也没有使用反射进行验证。可能无法解决您的问题,但我想还是应该发布它。

/**
 * Validate address ignoring phone-related errors
 *
 * Internally uses reflexion. Maybe not the most
 * efficient or clean implementation, but allows
 * this functionality to be implemented without
 * the need to rewrite 3 core classes.
 *
 * Listens to:
 * - customer_address_validation_after
 *
 * @param Varien_Event_Observer $observer Event observer
 */
public function validateAddress(Varien_Event_Observer $observer)
{
    /* @var $address Mage_Customer_Model_Address_Abstract */
    $address = $observer->getAddress();
    if (!$address) {
        return;
    }

    $prop = new ReflectionProperty('Mage_Customer_Model_Address_Abstract', '_errors');
    if (!$prop) {
        return;
    }
    $prop->setAccessible(true);
    $errors = $prop->getValue($address);
    $prop->setValue($address, array());

    $errorMessage = $this->getErrorMessage();
    foreach ($errors as $error) {
        if ($error !== $errorMessage) {
            $address->addError($error);
        }
    }
}

/**
 * Get standard error message
 *
 * @return string
 */
protected function getErrorMessage()
{
    return Mage::helper('customer')->__('Please enter the telephone number.');
}

我还编写了一个更新脚本来定义不需要的文件,并编辑了所有表单以删除前端验证。就像我说的那样,这可能不是最好的解决方案,但是它比重写3-4类恕我直言更好。

UPDATE 核心团队包裹事件customer_address_validation_after在从条件启动1.9.0通过1.9.1.1(我真的不知道为什么,是没有意义的我...),所以我的解决方案会为这些版本没有工作,很遗憾。幸运的是,有条件删除了1.9.2


谢谢!只需将其放入模块中即可:github.com/sreichel/magento-StackExchange_RequiredTelephone
sv3n

6

您将需要Mage_Customer_Model_Address_Abstract在第375-377行中修改类别*,注释电话号码的Zend验证。

//if (!Zend_Validate::is($this->getTelephone(), 'NotEmpty')) {
//   $errors[] = Mage::helper('customer')->__('Please enter the telephone number.');
//}

以及数据库中的电话属性本身删除了所需的类。可以通过以下查询完成

UPDATE `eav_attribute` SET `is_required` = 0 WHERE `attribute_code` = 'telephone';

这将处理电话字段的前端(Javascript)验证。

**确保将类文件复制到local代码目录中*


请注意,您无法从自定义扩展扩展(重写)抽象类。您只能将整个文件复制到app / code / local并在那里进行自定义。另请注意,此答案也适用于低于1.8的Magento版本。
马克范德桑登,2013年

你是绝对正确的。我将修改的时候了
桑德甜菜

如建议的答案所示,我已将Abstract.php从/ public_html / app / code / core / Mage / Customer / Model / Address复制到public_html / app / code / local / Mage / Customer / Model / Address注释了有关电话号码并运行UPDATE eav_attribute SET is_required设置为= 0,WHERE attribute_code ='电话'限制1;1行受影响。(查询花费了0.0506秒)清除了所有缓存(我的magento编译始终处于关闭状态)但是,仍然需要客户提供数字才能结帐。可以请一个人确认此解决方案在1.8.0.0上有效,因为它不适用于我的。
阿利斯泰尔

2
Sander的查询中有一个小错误:在查询中省略LIMIT 1。在默认的CE 1.8安装中,有4个条目eav_attribute带有代码“电话”,因此您无法确定哪个已更新。然后代码应该工作(刚刚测试过)。对于可视部分,您仍然需要以<em>*</em>所有形式删除字段标签(签出/地址编辑)。当然,如果您安装了某种“一步式结帐”功能,则它可能会覆盖某些默认的Magento功能,并且此答案可能无效。
Mark van der Sanden

1
嗨,马克:谢谢您的评论,我确实检查了我的商店是否是这种情况,但是我只有一个带有代码'telephone'的eav_atribute“ SELECT * FROM eav_attribute WHERE attribute_code ='telephone'”显示第0-0行(总共1次,查询花费了0.0005秒),所以我的商店中只有一个(与您的商店不同。),并且当前设置为“ is_required = 0”
Alistair


2

您不能简单地使用自定义扩展名和配置重写来重写使用抽象的类。

  • Mage_Sales_Model_Quote_Address
  • Mage_Customer_Model_Address
  • Mage_Sales_Model_Order_Address

然后,您可以创建自己的validate功能,该功能将排除电话检查,或者更好地检查所有必需的属性并验证它们是否已设置。


1
没错,但不幸的是,每隔第二个付款或运输模块都在尝试重写这些类(我可以举几个例子)。通常这不是一个选择,否则最终会很混乱。
fmrng

但是您已经解决了多个重写问题?原因然后您可以使用该解决方案并在其中注入您的验证。
David Manners,2015年

当然可以这样做,但是必须对每个项目都这样做,因为您不知道还有谁会重写这些类。不幸的是,客户总是要求删除电话验证。我想到的唯一标准且“干净”的解决方案是我在答案中描述的解决方案,它甚至不适用于所有Magento版本。如果无法应用,最简单的方法是将抽象类复制到本地代码池中,并注释掉验证……虽然不是最好的方法,但是如果您不滥用它,也可以。
fmrng 2015年

2

我刚刚遇到了Tobi的一个不错的小扩展“ Webguys_Telefonkeinpflicht”,它基本上遵循了David的方法。它重写了各自的子类。我非常喜欢的事实是,它仅在重写的类中调度事件,然后所有进一步的自定义都在事件观察器中完成。它还观察core_block_abstract_to_html_after事件,以便使用一些正则表达式黑魔法从输入字段中删除星星和所需的类。当然,它还带有设置脚本,该脚本使eav_attribute表中不需要电话属性。您可以在GitHub上检查扩展名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.