在Magento中保存订单之前删除外来重音字符

时间:2013-02-07 18:22:11

标签: php magento

我遇到一个问题,其中我在Magento的订单有时会有运费和账单地址以及像àòèù这样的外国口音的名称。我想在保存Magento的订单之前将它们转换为英文字母aoeu。

我有它的PHP代码,这是一个函数

public function removeAccents($str)
{
    $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'Ð', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', '?', '?', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', '?', '?', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', '?', 'O', 'o', 'O', 'o', 'O', 'o', 'Œ', 'œ', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'Š', 'š', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Ÿ', 'Z', 'z', 'Z', 'z', 'Ž', 'ž', '?', 'ƒ', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '?', '?', '?', '?', '?', '?');
    $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
    return str_replace($a, $b, $str);
}

我在OnepageController saveShippingAction方法中使用此函数,如

$data['street'][0] = removeAccents($data['street'][0]);
$data['street'][1] = removeAccents($data['street'][1]);
$data['city'] = removeAccents($data['city']);
$data['city'] = "test";
$data['region'] = removeAccents($data['region']);

保存送货地址之前。

我的主题中已经有一个OnepageController,但它有一个不在核心Mage控制器中的功能。由于我在这里修改核心Mage控制器,只是复制函数saveShippingAction似乎不起作用,控件转到核心saveShippingAction函数。

我还尝试通过添加前端属性来修改我的config.xml,但它似乎不起作用。我不知道是否有更简单的方法来实现我想要的东西(比如将etc / config.xml中的UTF-8更改为Latin-1 ISO?)。

我希望这个论坛中有人可以对这个问题有所了解,以及如何解决它!谢谢!

2 个答案:

答案 0 :(得分:1)

保留地址原始字符是有意义的,正如评论海报所示。但如果您真的必须这样做,最好通过创建一个观察者来捕获sales_quote_address_before_save事件来实现。

在观察者功能中,您可以通过调用

来访问地址模型
public function convertAddressChars(Varien_Event_Observer $observer) 
{ 
    $address = $observer->getEvent()->getObject();
    /**
    * Perform necessary manipulations, e.g.
    * $address->setData('city', removeAccents($address->getData('city'));
    */
}

但同样,未能在地址数据中保留重音可能会导致订单无法送达。

答案 1 :(得分:0)

这实际上是一个常见的问题 - 一些运输/配送公司无法应对太多的变音符号等。

您可能想要尝试的另一种方法是整理前端javascript中的客户地址详细信息。我尝试这个时没有代码可以提供,但它很简单。您可以通过两种方式进行操作 - 收听'onblur'事件并在客户填写其详细信息时整理文本,或者您可以在提交每个部分以完成订单时执行此操作。

对不起,这只是一种方法,而不是代码,如果你采取这条路线,我可能会为你挖掘出一些东西......