php - Magento - 覆盖核心 'Review' 模块以添加自定义 'Email' 字段

标签 php zend-framework magento

我需要创建一个自定义模块,覆盖现有的“审核”模块以添加额外的字段“电子邮件 ID”

我相信我需要重写核心模型文件 'app/code/core/Mage/Review/Model/Resource/Review.php' 、'app/code/core/Mage/Review/Model/Resource/Review/Product/Collection.php' 和 block 文件 'app/code/core/Mage/Adminhtml/Block/Review/Edit/Form.php '

此外,我不知道应该包含什么设置脚本以及什么版本来升级带有此额外字段的现有“review_detail”表。

这是我到目前为止所做的代码,但它不起作用。目前,我已在 review_detail 表中手动添加“电子邮件”字段,并在 base/default/template/review/form.phtml 中添加电子邮件输入字段

CM
 Review
   Block
     Review
       Edit
        Form.php
   etc
     config.xml
   Helper
     Data.php
   Model
     Resource
       Review.php
       Review
          Product
             Collection.php

这是我的 config.xml 文件

<?xml version="1.0"?>
 <config>
  <modules>
    <CM_Review>
     <version>0.0.1</version>
    </CM_Review>
 </modules>
 <frontend>
  <routers>
    <review>
        <use>standard</use>
        <args>
            <module>CM_Review</module>
            <frontName>Review</frontName>
        </args>
     </review>
   </routers>
 </frontend>    
 <global>
<blocks>
    <adminhtml>
        <rewrite>
        <review_edit_form>CM_Review_Block_Review_Edit_Form</review_edit_form>
        </rewrite>
    </adminhtml>
</blocks>
<helpers>
    <review>
       <rewrite>
            <class>CM_Review_Helper</class>
       </rewrite>
    </review>
     </helpers>  
      <models>
       <review>
         <rewrite>
           <resource_review>CM_Review_Model_Resource_Review</resource_review>
            <resource_review_product_collection>
                CM_Review_Model_Resource_Review_Product_Collection
              </resource_review_product_collection>
         </rewrite>
      </review>
     </models>
    </global>
   </config>

我已复制粘贴原始 block 和模型文件的内容,并添加了“电子邮件”字段。但仍然无法保存任何数据。然而,直接编辑原始文件就可以解决问题,但不能通过我的自定义模块。

有什么明显的事情是我错过的吗?任何寻求帮助的指示都可以。谢谢。


我没有收到错误,但该字段既没有保存到数据库中,也没有通过安装脚本代码添加。因此,我对代码中的资源部分进行了注释,并手动添加了该字段。这是我的代码,

配置.xml

<?xml version="1.0"?>
<config>
<modules>
  <CM_Reviewmail>
    <version>0.0.1</version>
  </CM_Reviewmail>
</modules>

<frontend>
  <routers>
    <reviewmail>
       <use>standard</use>
       <args>
          <module>CM_Reviewmail</module>
          <frontName>cmreviewmail</frontName>
       </args>
    </reviewmail>
  </routers>
</frontend>     
<global>

 <blocks>
   <adminhtml>
      <rewrite>
        <review_edit_form>CM_Reviewmail_Block_Review_Edit_Form</review_edit_form>
      </rewrite>
  </adminhtml>
</blocks>

<helpers>
  <reviewmail>
     <class>CM_Reviewmail_Helper</class>
   </reviewmail>
</helpers> 

<models>
  <reviewmail>
     <rewrite>
        <resource_review>CM_Reviewmail_Model_Resource_Review</resource_review>
     </rewrite>
  </reviewmail>
</models>

<!-- <resources>
    <reviewmail_setup>
        <setup>
            <module>CM_Reviewmail</module>
            <class>Mage_Sales_Model_Mysql4_Setup</class>
        </setup>
        <connection>
            <use>core_setup</use>
        </connection>
    </reviewmail_setup>
    <reviewmail_setup_write>
        <connection>
            <use>core_write</use>
        </connection>
    </reviewmail_setup_write>
    <reviewmail_setup_read>
        <connection>
            <use>core_read</use>
        </connection>
    </reviewmail_setup_read>
</resources>-->

</global>
</config>

这是我的 Reviewmail/Block/Review/Edit/Form.php 代码

 <?php
class CM_Reviewmail_Block_Review_Edit_Form extends Mage_Adminhtml_Block_Review_Edit_Form
{
 protected function _prepareForm()
 {
    $review = Mage::registry('review_data');
    $product = Mage::getModel('catalog/product')->load($review->getEntityPkValue());
    $customer = Mage::getModel('customer/customer')->load($review->getCustomerId());
    $statuses = Mage::getModel('review/review')
        ->getStatusCollection()
        ->load()
        ->toOptionArray();

    $form = new Varien_Data_Form(array(
        'id'        => 'edit_form',
        'action'    => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'), 'ret' => Mage::registry('ret'))),
        'method'    => 'post'
    ));

    $fieldset = $form->addFieldset('review_details', array('legend' => Mage::helper('review')->__('Review Details'), 'class' => 'fieldset-wide'));

    $fieldset->addField('product_name', 'note', array(
        'label'     => Mage::helper('review')->__('Product'),
        'text'      => '<a href="' . $this->getUrl('*/catalog_product/edit', array('id' => $product->getId())) . '" onclick="this.target=\'blank\'">' . $product->getName() . '</a>'
    ));

    if ($customer->getId()) {
        $customerText = Mage::helper('review')->__('<a href="%1$s" onclick="this.target=\'blank\'">%2$s %3$s</a> <a href="mailto:%4$s">(%4$s)</a>',
            $this->getUrl('*/customer/edit', array('id' => $customer->getId(), 'active_tab'=>'review')),
            $this->htmlEscape($customer->getFirstname()),
            $this->htmlEscape($customer->getLastname()),
            $this->htmlEscape($customer->getEmail()));
    } else {
        if (is_null($review->getCustomerId())) {
            $customerText = Mage::helper('review')->__('Guest');
        } elseif ($review->getCustomerId() == 0) {
            $customerText = Mage::helper('review')->__('Administrator');
        }
    }

    $fieldset->addField('customer', 'note', array(
        'label'     => Mage::helper('review')->__('Posted By'),
        'text'      => $customerText,
    ));

    $fieldset->addField('summary_rating', 'note', array(
        'label'     => Mage::helper('review')->__('Summary Rating'),
        'text'      => $this->getLayout()->createBlock('adminhtml/review_rating_summary')->toHtml(),
    ));

    $fieldset->addField('detailed_rating', 'note', array(
        'label'     => Mage::helper('review')->__('Detailed Rating'),
        'required'  => true,
        'text'      => '<div id="rating_detail">' . $this->getLayout()->createBlock('adminhtml/review_rating_detailed')->toHtml() . '</div>',
    ));

    $fieldset->addField('status_id', 'select', array(
        'label'     => Mage::helper('review')->__('Status'),
        'required'  => true,
        'name'      => 'status_id',
        'values'    => Mage::helper('review')->translateArray($statuses),
    ));

    /**
     * Check is single store mode
     */
    if (!Mage::app()->isSingleStoreMode()) {
        $fieldset->addField('select_stores', 'multiselect', array(
            'label'     => Mage::helper('review')->__('Visible In'),
            'required'  => true,
            'name'      => 'stores[]',
            'values'    => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm()
        ));
        $review->setSelectStores($review->getStores());
    }
    else {
        $fieldset->addField('select_stores', 'hidden', array(
            'name'      => 'stores[]',
            'value'     => Mage::app()->getStore(true)->getId()
        ));
        $review->setSelectStores(Mage::app()->getStore(true)->getId());
    }

    $fieldset->addField('email', 'text', array( //CUSTOM field
    'label' => Mage::helper('review')->__('Email'),
    'required' => true,
    'name' => 'email'
    ));

    $fieldset->addField('nickname', 'text', array(
        'label'     => Mage::helper('review')->__('Nickname'),
        'required'  => true,
        'name'      => 'nickname'
    ));

    $fieldset->addField('title', 'text', array(
        'label'     => Mage::helper('review')->__('Summary of Review'),
        'required'  => true,
        'name'      => 'title',
    ));

    $fieldset->addField('detail', 'textarea', array(
        'label'     => Mage::helper('review')->__('Review'),
        'required'  => true,
        'name'      => 'detail',
        'style'     => 'height:24em;',
    ));

    $form->setUseContainer(true);
    $form->setValues($review->getData());
    $this->setForm($form);
    return parent::_prepareForm();
   }    
 }

这是我的 Reviewmail/Model/Resources/Review.php 代码

   <?php 
   class CM_Reviewmail_Model_Resource_Review extends Mage_Review_Model_Resource_Review
   {
protected function _afterSave(Mage_Core_Model_Abstract $object)
    {
     $adapter = $this->_getWriteAdapter();
     /**
     * save detail
     */
     $detail = array(
        'title'     => $object->getTitle(),
        'detail'    => $object->getDetail(),
        'nickname'  => $object->getNickname(),
        'email'     => $object->getEmail(),
    );
    $select = $adapter->select()
        ->from($this->_reviewDetailTable, 'detail_id')
        ->where('review_id = :review_id');
    $detailId = $adapter->fetchOne($select, array(':review_id' => $object->getId()));

    if ($detailId) {
        $condition = array("detail_id = ?" => $detailId);
        $adapter->update($this->_reviewDetailTable, $detail, $condition);
    } else {
        $detail['store_id']   = $object->getStoreId();
        $detail['customer_id']= $object->getCustomerId();
        $detail['review_id']  = $object->getId();
        $adapter->insert($this->_reviewDetailTable, $detail);
    }


    /**
     * save stores
     */
    $stores = $object->getStores();
    if (!empty($stores)) {
        $condition = array('review_id = ?' => $object->getId());
        $adapter->delete($this->_reviewStoreTable, $condition);

        $insertedStoreIds = array();
        foreach ($stores as $storeId) {
            if (in_array($storeId, $insertedStoreIds)) {
                continue;
            }

            $insertedStoreIds[] = $storeId;
            $storeInsert = array(
                'store_id' => $storeId,
                'review_id'=> $object->getId()
            );
            $adapter->insert($this->_reviewStoreTable, $storeInsert);
        }
    }

    // reaggregate ratings, that depend on this review
    $this->_aggregateRatings(
        $this->_loadVotedRatingIds($object->getId()),
        $object->getEntityPkValue()
    );

    return $this;
  } 
}

有一个Helper/Data.php

<?php
 class CM_Reviewmail_Helper_Data extends Mage_Core_Helper_Abstract {}

这是模型/资源/Mysql4/Setup.php

<?php
class CM_Reviewmail_Model_Resource_Mysl4_Setup extends Mage_Core_Model_Resource_Setup {}

有人可以指出我做错了什么吗?或者还需要做什么?

请提供任何帮助,我们将不胜感激。我一直在用头撞墙,需要尽快解决这个问题。提前致谢。

最佳答案

您重写类的方法看起来基本正确,但请记住您正在重写 adminhtml/review_edit_form 以指向 CM_Review_Block_Review_Edit_Form,因此在 app/code/local/CM/Review/Block 中/Review/Edit/Form.php 您需要这样声明该类:

<?php
    class CM_Review_Block_Review_Edit_Form extends Mage_Adminhtml_Block_Review_Edit_Form
    {

然后只重写您需要的函数。

不知道您是否已经这样做了。相同的过程适用于您重写的任何模型。您实际上也不需要为此重写集合,但这取决于您需要用它做什么。

至于安装内容:

app/code/local/CM/Review/etc/config.xml

<config>
    ...
    <resources>
        <review_setup>
            <setup>
                <module>CM_Review</module>
                <class>Mage_Sales_Model_Mysql4_Setup</class>
            </setup>
            <connection>
                <use>core_setup</use>
            </connection>
        </review_setup>
    </resources>
    ...
</config>

app/code/local/CM/Review/sql/review_setup/mysql4-install-0.0.1.php

<?php
    $installer = $this;
    $installer->startSetup();
    $installer->run("ALTER TABLE review_detail ADD COLUMN email_id INT NULL");
    $installer->endSetup();

如果这不是第一次(应该是这样,除非您已经尝试过类似的操作),请进入数据库,然后从表“core_resource”。然后再试一次。添加列后,请始终记住在系统>缓存管理中刷新magento缓存

不要忘记,您还需要在 app/etc/modules 中创建一个名为 CM_Review.xml 的文件。它应该看起来像这样:

<config>
    <modules>
        <CM_Review>
            <active>true</active>
            <codePool>local</codePool>
        </CM_Review>
    </modules>
</config>

希望这有帮助。

关于php - Magento - 覆盖核心 'Review' 模块以添加自定义 'Email' 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928181/

相关文章:

zend-framework - Zend 框架 - 如何允许表单元素为空字段

php - ZendFramework和开放ID登录,ZF是最新的吗?

Javascript 加载但在 Magento 1.9 中不起作用

php mysql order by 无法正常工作

PHP 未排序数组总和中的最大整数

zend-framework - 奇怪的 Zend_Form_Element_File 行为

magento - 如何配置 magento 显示包含税费的价格?

linux - Apache和linux文件权限无法浏览文件或目录

javascript - Clickfunnels : After form is submitted, 如何将电子邮件字段值作为参数添加到 URL 中?

php - 将表单中的数据插入数据库PHP MYSQL