Cleanup after upgrade Magento to 1.4

升级总有这样那样的问题,我不想节外生枝,也就不想在项目中途升级。我把一个正在开发中的 Magento 商店开始开发时版本是 1.3.2.4,但今天一不小心,敲入了 ./pear install magento-core/Mage_All_Latest 就把 Magento 升级到了 1.4。 (要怪 Magento 升级太方便了?其实,今天的不小心是有原因的:我发现 Magento Connect 启动不了。尝试进入 Magento Connect 时通常要求再次输入管理员密码,但今天这个页面只有 Magento Connect logo,看上去页面意外中止。而我急着想试用一下某个 community extension,就用了 pear 命令。在敲键盘的过程中,脑筋没多想,竟然敲入 ./pear install magento-core/Mage_All_Latest,就坏事了。) 升级以后发现后台 System/Configuration 保存时经常出错,错误提示: Error while saving this configuration: Invalid mode for clean() method CMS/Pages 也无法保存页面,错误提示: Error while saving Page. Please try again later Catalog/Products 也无法保存修改…… Continue reading Cleanup after upgrade Magento to 1.4

My third DNS server down for a month

今年初,我退掉了 godaddy vps,把原来 godaddy vps 担当的辅助 DNS 角色转给了 1&1 server,却忘了开 1&1 server firewall port (硬件防火墙那道关)。 今天才发现这台辅助 DNS 在过去的一个月根本无法执行 DNS 解析(因为我设置了三台 DNS,挂了一台没引起警觉)。难怪最近 webceo 给我的评分只有 5 分上下,google 的排名也有下降。 赶紧打开防火墙,希望分数能上去。

Magento 1.4 is released

说来也巧,当我想用 Magento 1.4 时,正好 1.4 stable 也刚发布。Magento 1.4 的测试版一直诱惑着我,就是太忙没去测试它,再说我也不太爱测试版,所以我一直抵制着诱惑等待正式版。 今天在一台机子上搭建了一个全新的服务器环境,同时也有用到 Magento,既然是全新的,我就想装个 Magento 1.4 吧。在 Magento download 页面,找了半天,没发现 Magento 1.4 rc 版。好久才回过神,原来 1.4 在 full release 里,那就是说已经有正式版啦。我喜欢正式版不喜欢测试版,因为我不喜欢和一大堆的 bugs 打交道。既然 Magento 1.4 已经有了正式版,那还犹豫什么,赶紧装一个。 安装碰到一点小问题,不清楚算不算 bug: 这次使用的是 zend server,默认 AllowOverride None,安装时却选择了使用 rewrite,安装完成后才设置 AllowOverride All,重启了 zend server,前台正常,却进不了后台,即使清空了 cache 和 session 仍无济于事。错误提示为: There has been an error processing your request… Continue reading Magento 1.4 is released

How to override a Magento controller

Say I want to override Magento Catalog Product controller, say my namespace is Magex and my module name is Powercat. Firstly, add the following to Powercat/etc/config.xml. What it does is adding another route “prowercat” in addition to “catalog” to frontend. When http://mydomain/catalog/somecontroller/someaction/ is routered, powercat/somecontroller/someaction will be loaded before (see the attribute “before”?) catalog/somecontroller/someaction. If… Continue reading How to override a Magento controller

Magent Events

Magento wiki 上有篇文章列出了所有的 events dispatched by Magento。但 wiki as a CMS 自作主张地转化了某些字符,比如把 ->转化成了→ =>转化成了⇒ 这让我觉得有必要自己来格式化这篇文档。虽然曾想用 OpenOffice 来存储,但它竟然连一张简单的表格都格式得很费劲,最后只好用了 Ms Word。 Download magento-events

Geo Adwords

众所周知,Google Adwords 可以根据访问者的地理位置选择性地投递广告。几番实验后,我发现其中的选择性非常微妙: 我帮朋友的外卖店 Oriental Takeaway 开启了 Google Adwords 账户。非常遗憾地,朋友和我都没有很多时间去 refine adwords settings,仅做了一些非常基本的选择性投递,其中一项就是“仅限 Brighton 地区”。A primary keyword to target is brighton chinese takeaway (btw, we decided to use it as domain), together with other hundreds of keywords. 我选择了三个地点测试,Brighton, Worthing, and some place in Germany。 在 Brighton google,所有在 keyword list 上的广告都能出线,按下不表。 在 Worthing google,搜索 brighton chinese… Continue reading Geo Adwords

Understand how tax is calculated in Magento

彻底理解 Magento tax 是如何计算的不是一件容易的事。我做了无数次组合测试,算是了解 Magento tax 是如何计算的,但我未及去读代码,不敢说彻底摸透它的来龙去脉,写下这段文字权作日后参考。 首先,零税率不用设置,因为如果什么设置都没有的话税率就是零,所以大多数时候只要针对非零税率进行设置。稍后会讲到什么时候需要进行零税率设置。 其次,要分清以下名词: tax rate 税率 tax zone 税区域 tax rule 税规则 customer tax class 顾客税种 product tax class 产品税种 shipping tax class 运费税种 customer group 顾客属组 customer address 顾客地址 它们的关系是: 税计算的起点是税规则。换言之,如果后台设置了若干税率、税区域、顾客税种、产品税种、运费税种,却没有设置税规则,那么没有任何税生效。 只有税规则可以设置优先级,税区域无法设置优先级(除非去改数据库,id 越小的税区域优先)。 税规则是产品税种(或运费税种)、顾客税种、税区域在三维空间决定的。 后台界面设置税率和税区域在一个表单里,似乎税率由税区域直接决定,但并不一定能生效,原因见第3点。 税区域与顾客税种无关。这点曾是我困惑的地方,因为地址是顾客的一个属性,所以我很自然地认为顾客地址就对应税区域。如果尝试着放弃“顾客地址就对应税区域”思维,一切都容易理解了。 税规则的三维空间较难描述,可以这么来简化:先拿产品税种(或运费税种)和顾客税种交叉排列组合出多个税规则,再拿税区域去套,套中的税规则就生效,套不中就不生效。 顾客属组和顾客税种是多对一的关系。 在前台 checkout 时,Magento 会根据顾客地址启用一条或多条税规则,但后台 create order 时,Magento 的税规则却无视顾客地址。这或许是 Magento 的一个… Continue reading Understand how tax is calculated in Magento

Nginx try_files syntax

今天在一台很久不用的服务器上测试 Magento search result page,URL /catalogsearch/result/?q=searchword,发现它不工作,但其他页面正常。这个症状让我联想到以前碰到的类似问题,Magento 无法获得 query_string,所以含问号的 URL 都不能处理,页面重定向到 referring URL。应该是 server rewrite 规则没有写正确,我想。打开 nginx 的配置文件一看,果然,当中一条规则用的是很久以前的写法,后来在不同的服务器上几经改进,production server 都已经用上了新规则。 新规则的写法: location @magento { root $php_script_root; index index.php; if ($uri ~ ^/(media|js|skin)/) { break; } if (!-e $request_filename) { rewrite .* /index.php last; } } 而老规则的写法: location @magento { root $php_script_root; index index.php; if ($uri ~… Continue reading Nginx try_files syntax