magento 输出缓存

开发magento 手机模版的时候,将购物车的前端样式写在了

template/catalog/navigation/top.phtml 中

获得购物车中的产品数量的函数是:

Mage::getSingleton('checkout/cart')->getSummaryQty();

由于起初开发的时候是将 后台的缓存管理是禁用掉的,所以添加购物车等操作,购物车数量不会出错。

但是当打开后台缓存管理的时候发现

添加修改购物车中的产品 数量是不变的,这就是magento的html 输出缓存造成的。

了解magento的html输出缓存可以参考文章 如何使用magento的HTML输出缓存

对于购物车 数量不更新的问题,我们可以找到 上面phtml的Block

可以看到 _construct函数

protected function _construct()
    {
        $this->addData(array(
            'cache_lifetime'    => false,
            'cache_tags'        => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Core_Model_Store_Group::CACHE_TAG),
        ));
    }

即首先明确此页面是会被缓存的,且cache_lifetime 是false 意味着永久缓存。

cache_tags 意味着保存任意 category和store group 此缓存会被删除。

那么解决办法:

1.禁用后台缓存管理 里面的html output cache 。 (肯定不合理)

2.删除 construct函数里的 addData 也可以在合适的位置添加 函数

Mage::app()->cleanCache('catalog_category'); 

显然可行,但我们其实也想缓存这个页面。

3. 在合适位置 使用jquery 更新购物车中产品的数量显示。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento 输出缓存

magento 后台模块开发之设定时间 显示小时和分钟

当我们在后台 Form.php
设定某个 输入框的时候有时候 我们需要设定一个可以选择时间的输入框
代码:
 $fieldset->addField('date', 'date', array(
          'label'               =>  Mage::helper('web')->__('Date'),
          'after_element_html'  =>  '<small>Comments</small>',
          'tabindex'            =>  1,
          'image'               =>  $this->getSkinUrl('images/grid-cal.gif'),
          'format'             =>Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)

      ));
这个时候我们就可以选择日期啦,但是我们通常还需要精确到 小时或者分钟 或者秒
(例如 限时抢购功能)
那么我们需要修改代码:
$fieldset->addField('date', 'date', array(
          'label'               =>  Mage::helper('web')->__('Date'),
          'after_element_html'  =>  '<small>Comments</small>',
          'tabindex'            =>  1,
          'time'                => true,
          'image'               =>  $this->getSkinUrl('images/grid-cal.gif'),
          'format'             =>Mage::app()->getLocale()->getDateTimeFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)

      ));
添加 time 为true 会发现选择时间的 那个插件出现了 hours 和 minutes 选项
format 使用了getDateTimeFormat 函数就可以同时显示出 hour 和 minute
可以找到 getDateTimeFormat的定义
public function getDateTimeFormat($type)
    {
        return $this->getDateFormat($type) . ' ' . $this->getTimeFormat($type);
    }
我们也可以直接设定 format 为:
'format'    =>   'yyyy-MM-dd HH:mm:ss'
不需要秒
'format'    =>   'yyyy-MM-dd HH:mm:00',
或者
'format'    =>   'yyyy-MM-dd HH:mm',
接下来就是 save函数等修改,防止 其中一些 格式过滤函数把我们现在的时间格式认为是不合法的。
还有一些grid 显示的地方:
在 Grid.php 中修改 addColumn 函数 中的 type
'type' => 'datetime', 即可
如果 显示的格式还是不合你意 那么你可以直接修改文件
appcodecoreMageAdminhtmlBlockWidgetGridColumnRendererDatetime.php
修改 其中的render函数即可。
(如果时间显示不正确 例如始终 差了几个小时 可能是时区设置问题 ,修改时区即可)
addField 还有 time 这个type
$fieldset->addField('time', 'time', array(
        'label'               =>  Mage::helper('form')->__('Time'),
        'class'               =>  'required-entry',
        'required'            =>  true,
        'name'                =>  'title',
        'onclick'             =>  "",
        'onchange'            =>  "",
        'disabled'            =>  false,
        'readonly'            =>  false,
));
显示的样子类似

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento 后台模块开发之设定时间 显示小时和分钟

部分支付宝插件开发bug

感觉有点标题党,但是有些插件确实开发的不规范。

之前开发的支付宝支付模块直接下载的网上提供的支付宝插件,只是做了一些简单的修改。所以没有仔细阅读也就没有发现bug。

我开发的网站使用的是magento 框架。但是不论什么框架插件不规范的道理应该是一样的。

说了这么多其实就是 支付宝异步通知传回的通知状态中

TRADE_FINISHED 和 TRADE_SUCCESS 的区别(已经知道的大牛请不要嘲笑我这个刚过来开发支付模块的菜鸟了 大笑

其实 支付宝即时到帐接口的文档中也有总结状态的说明,但是我自己认为不明确啊(应该是我理解能力太差了吧 - -!)

BUG描述:开发完毕,支付等流程都正常。但是三个月后又会收到支付宝发来的异步通知。如果没有去明确判断TRADE_FINISHED还是

TRADE_SUCCESS 都统一做业务处理那么就会发生bug。

买家付款后,商家能够收到支付宝的 TRADE_SUCCESS 状态的说明你开通的是即时到帐高级接口。普通的是只能收到 TRADE_FINISHED 状态的,即不能进行退款等操作。

其实普通即时到帐接口在某些插件中应该都不会出现bug。因为他们就一个 TRADE_FINISHED 状态。

实际上这里面最重要的区别就是开通 高级即时到帐接口的商家,在买家付钱后会收到一个 TRADE_SUCCESS 的通知,这表示买家成功付钱,同时商家可以进行退款等操做,

之后会在三个月后支付宝再次发来通知 ,即发来TRADE_FINISHED 的通知。以为者交易结束,商家不能再做退款等操作了。

说说我下载的那个支付宝插件 处理异步通知的函数吧。

它在notify 那个函数中判断订单成功使用了 “或” 运算符

if ($postData['trade_status'] == 'TRADE_FINISHED' || $postData['trade_status'] == 'TRADE_SUCCESS'){
   // 业务处理逻辑
   // 例如修改订单状态 发送邮件通知等
}

那么 付款后没什么问题,但是三个月后买家又会收到邮件通知,以及订单状态又改为付完钱的状态。

因为我们有邮件抄送给管理员的操作才发现了这个问题。

其实问题描述起来就是这么简单。明白了怎么回事,解决办法不用说应该也都知道。

但是其实还有许多人不知道或者说没有明确意识到这里面的差别。 出问题后去网上搜索,就连支付宝论坛里面还有

开发者说这两个没什么区别。 重要的是当问道这两个状态的区别是应当具体描述出来三个月继续发送 TRADE_FINISHED 的通知这么一个点。

顺便提一下,支付宝文档里面明确的在商户业务处理注意事项中提出:

但是为什么不点出来 三个月后会发来 TRADE_FINISHED 的通知呢? (当然demo中有明确提出)

我只是觉得文档中有必要明确解释一下。(个人建议而已)

--------------------------------------------------------------------------------------------------------------------------------

这个同样适用于现在版本的 支付宝无线支付接口, 你可以将买家付款 发来的异步通知信息打印,主要是观察 trade_status 如果是 TRADE_FINISHED

说明你没有开通高级即时到帐接口,可以通过支付宝人工客服去修改。但要5个工作日才能改好。

--------------------------------------------------------------------------------------------------------------------------------

提一个问题:

用户下单,跳转到支付宝,登录支付宝账户但是不结账。此时去个人支付宝页面会看到在交易明细中有一个待付款的交易。

这里如果用户或者商家 将订单取消,但是用户从这个地方付款还是可以的。、

这种问题是怎么解决的呢?有没有什么接口通知支付宝这笔交易已取消呢?

此文章通过 python 爬虫创建,原文是自己的csdn 地址: 部分支付宝插件开发bug