Magento无法设置自定义评论时间

很多magento网站都会人为的伪造很多产品评论,就会有导入产品review的需求。导入magento产品评论的代码没有难度,只是开发过程中多会碰到无法设置magento的评论自定义时间的问题,结果就是所有的评论时间几乎是一样的,这除非网站用户是智障了。。

问题产生原因

查看文件:Mage_Review_Model_Resource_Review

    /**
     * Perform actions before object save
     *
     * @param Varien_Object $object
     * @return Mage_Review_Model_Resource_Review
     */
    protected function _beforeSave(Mage_Core_Model_Abstract $object)
    {
        if (!$object->getId()) {
            $object->setCreatedAt(Mage::getSingleton('core/date')->gmtDate());
        }
        if ($object->hasData('stores') && is_array($object->getStores())) {
            $stores = $object->getStores();
            $stores[] = 0;
            $object->setStores($stores);
        } elseif ($object->hasData('stores')) {
            $object->setStores(array($object->getStores(), 0));
        }
        return $this;
    }

上面的代码可以看出,magento的review在新建的时候强制设置了CreateAt的值,所以我们用下面的代码插入评论是没法设置自定义时间的。

$reviewModel->setData(……)->setCreateAt(时间)-save()

解决办法

简单暴力的处理方法,先save一次,再save。

$reviewModel->setData(……)-save()->setCreateAt(时间)-save()

保存2次,是不考虑性能什么的了。
修改代码,设置一个是否设置自定义时间的值IsCustomCreatedAt来控制。

    protected function _beforeSave(Mage_Core_Model_Abstract $object)
    {
        if (!$object->getId() and !$object->getIsCustomCreatedAt()) {
            $object->setCreatedAt(Mage::getSingleton('core/date')->gmtDate());
        }
        if ($object->hasData('stores') && is_array($object->getStores())) {
            $stores = $object->getStores();
            $stores[] = 0;
            $object->setStores($stores);
        } elseif ($object->hasData('stores')) {
            $object->setStores(array($object->getStores(), 0));
        }
        return $this;
    }

然后我们插入评论代码如下

$reviewModel->setData(……)->setIsCustomCreatedAt(true)->setCreateAt(时间)-save()

评论

您的电子邮箱地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>