Php Magento-覆盖核心';审查';添加自定义';电子邮件';领域

Php Magento-覆盖核心';审查';添加自定义';电子邮件';领域,php,zend-framework,magento,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”和块文件“app/code/core/Mage/Adminhtml/Block/Review/Edit/Form.php” 另外

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

我认为我需要重写核心模型文件“app/code/core/Mage/Review/Model/Resource/Review.php”、“app/code/core/Mage/Review/Model/Resource/Review/Product/Collection.php”和块文件“app/code/core/Mage/Adminhtml/Block/Review/Edit/Form.php

另外,我不知道应该包含什么安装脚本和版本来升级带有此额外字段的现有“review_detail”表

这就是我到目前为止在代码方面所做的,但它不起作用。目前,我已经在review_detail表中手动添加了“email”字段,并在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>

0.0.1
标准
'
));
如果($customer->getId()){
$customerText=Mage::helper('review')->,
$this->getUrl('*/customer/edit',array('id'=>$customer->getId(),'active_tab'=>review'),
$this->htmlEscape($customer->getFirstname()),
$this->htmlEscape($customer->getLastname()),
$this->htmlEscape($customer->getEmail());
}否则{
如果(为空($review->getCustomerId()){
$customerText=Mage::helper('review')->;
}elseif($review->getCustomerId()==0){
$customerText=Mage::helper('review')->\uuuuu('Administrator');
}
}
$fieldset->addField('customer','note',数组(
'label'=>Mage::helper('review')->\uuuuu('postedby'),
“文本”=>$customerText,
));
$fieldset->addField('summary_rating','note',数组(
'label'=>Mage::helper('review')->,
'text'=>this->getLayout()->createBlock('adminhtml/review\u rating\u summary')->toHtml(),
));
$fieldset->addField('detaild_rating','note',数组(
'label'=>Mage::helper('review')->,
“必需”=>true,
“text'=>”.$this->getLayout()->createBlock('adminhtml/review_rating_detailed')->toHtml()。”,
));
$fieldset->addField('status\u id','select',数组(
'label'=>Mage::helper('review')->,
“必需”=>true,
'name'=>'status\u id',
'values'=>Mage::helper('review')->translateArray($status),
));
/**
*检查是单一存储模式
*/
如果(!Mage::app()->isSingleStoreMode()){
$fieldset->addField('select_stores','multiselect',array(
'label'=>Mage::helper('review')->,
“必需”=>true,
“名称”=>“存储[]”,
'values'=>Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm()
));
$review->setSelectStores($review->getStores());
}
否则{
$fieldset->addField('select_stores','hidden',array(
“名称”=>“存储[]”,
'value'=>Mage::app()->getStore(true)->getId()
));
$review->setSelectStores(Mage::app()->getStore(true)->getId());
}
$fieldset->addField('email','text',数组(//自定义字段)
'label'=>Mage::helper('review')->(Email'),
“必需”=>true,
“名称”=>“电子邮件”
));
$fieldset->addField('昵称','text',数组(
'label'=>Mage::helper('review')->,
“必需”=>true,
“名称”=>“昵称”
));
$fieldset->addField('title','text',数组(
'label'=>Mage::helper('review')->,
“必需”=>true,
“名称”=>“标题”,
));
$fieldset->addField('detail','textarea',数组(
'label'=>Mage::helper('review')->,
“必需”=>true,
“名称”=>“详细信息”,
'样式'=>'高度:24em;',
));
$form->setUseContainer(true);
$form->setValues($review->getData());
$this->setForm($form);
返回父项::_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;
  } 
}

您重写类的方法看起来基本正确,但请记住,您正在重写
adminhtml/review\u edit\u表单
以指向CM\u review\u Block\u review\u edit\u表单,因此在
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/sql/Review\u 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();

希望这有帮助。

您重写类的方法看起来基本正确,但请记住您正在重写
adminhtml/review\u edit\u form
以指向CM\u review\u Block\u review\u edit\u 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/sql/Review\u 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();

希望这能有所帮助。

我发现自己做错了什么。我没有在config.xml中正确声明我的资源文件。我现在就是这样做的

<models>
<review_resource>
     <rewrite>
       <review>CM_Reviewmail_Model_Resource_Review</review>
       <collection>CM_Reviewmail_Model_Resource_Review_Collection</collection>
       <product_collection>CM_Reviewmail_Model_Resource_Review_Product_Collection</product_collection>
    </rewrite>
 </review_resource>
</models>
它不能给我任何回报。当我在phpMyAdmin中执行它时,我得到了这个查询

 SELECT `main_table`.`email`, `detail`.`detail_id`, `detail`.`title`, `detail`.`detail`, `detail`.`nickname`, `detail`.`customer_id` FROM `review` AS `main_table` INNER JOIN `review_detail` AS `detail` ON main_table.review_id = detail.review_id WHERE (email = 'test@test.com') AND (status_id = '1')
出现了一个错误,显示“列表中的未知
main_table.email
字段”

现在有谁能帮我指出问题所在,为什么它只保存数据而不让我获取数据?为什么它在保存数据时不识别我的字段?我的问题错了吗


PS:但是,如果我在phpMyAdmin的上述查询中将“main_table.email”替换为“email”,并执行它,它会返回正确的值。那么,有没有一种方法可以通过取消“main_table”部分在代码中编写查询

我知道我做错了什么。我没有在config.xml中正确声明我的资源文件。我就是这样做的
<?php
    $installer = $this;
    $installer->startSetup();
    $installer->run("ALTER TABLE review_detail ADD COLUMN email_id INT NULL");
    $installer->endSetup();
<config>
    <modules>
        <CM_Review>
            <active>true</active>
            <codePool>local</codePool>
        </CM_Review>
    </modules>
</config>
<models>
<review_resource>
     <rewrite>
       <review>CM_Reviewmail_Model_Resource_Review</review>
       <collection>CM_Reviewmail_Model_Resource_Review_Collection</collection>
       <product_collection>CM_Reviewmail_Model_Resource_Review_Product_Collection</product_collection>
    </rewrite>
 </review_resource>
</models>
 Mage::getModel('review/review')->getCollection()
                ->addFieldToFilter('email', $emailId)
                ->addFieldToFilter('status_id' , '1')
                ->addFieldToSelect('email')->getData();
 SELECT `main_table`.`email`, `detail`.`detail_id`, `detail`.`title`, `detail`.`detail`, `detail`.`nickname`, `detail`.`customer_id` FROM `review` AS `main_table` INNER JOIN `review_detail` AS `detail` ON main_table.review_id = detail.review_id WHERE (email = 'test@test.com') AND (status_id = '1')
<product_collection>CM_Reviewmail_Model_Resource_Review_Product_Collection</product_collection>
<review_product_collection>CM_Reviewmail_Model_Resource_Review_Product_Collection</review_product_collection>