Php 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” 另外,我不知道应该包含什么安装脚本和版本来升级带有此额外字段的现有“review_detail”表 这就是我到目前为止在代码方面所做的,但它不起作用。目前,我已经在review_detail表中手动添加了“email”字段,并在base/default/template/review/form.phtml中添加了电子邮件输入字段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” 另外
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>