Magento - Перезаписать основной модуль 'Review', чтобы добавить настраиваемое поле 'Email' - PullRequest
2 голосов
/ 19 января 2012

Мне нужно создать пользовательский модуль, который перезаписывает существующий модуль 'Review', чтобы добавить дополнительное поле 'Email 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 '

Также я не знаю, какой скрипт установки и с какой версией мне следуетinclude для обновления существующей таблицы 'review_detail' с этим дополнительным полем.

Это то, что я сделал до сих пор в отношении кода, и оно не работает.Сейчас я вручную добавил поле 'email' в таблицу 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>

Я скопировал и вставил содержимое оригинальных файлов блоков и моделей с добавлением поля 'email'.Но все еще не могу сохранить какие-либо данные.Однако непосредственное редактирование исходных файлов делает свое дело, но не через мой пользовательский модуль.

Есть ли что-то очевидное, что я упускаю?Подойдут любые указатели на помощь.Спасибо.


Я не получаю сообщение об ошибке, но поле не сохраняется ни в базу данных, ни в его добавление через код сценария установки.Поэтому я прокомментировал раздел ресурсов из своего кода и добавил поле вручную.Это мой код,

config.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>

Это мой отзыв Mailmail / 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;
  } 
}

Есть помощник / Data.php

<?php
 class CM_Reviewmail_Helper_Data extends Mage_Core_Helper_Abstract {}

Это Model / Resource / Mysql4 / Setup.php

<?php
class CM_Reviewmail_Model_Resource_Mysl4_Setup extends Mage_Core_Model_Resource_Setup {}

Можно ли указать, что я сделал не так?или что еще нужно сделать?

Пожалуйста, любая помощь приветствуется.Я бился головой о стену, и мне нужно решить эту проблему как можно скорее.Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Я понял, что я делаю неправильно. Я не объявлял мои файлы ресурсов правильно в моем 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>

А потом я создал вышеупомянутые файлы, убедившись, что расширяю их исходные классы, и просто переписал функции, которые нужно изменить. В итоге мне удалось сохранить поля в базе данных с идентификатором электронной почты зарегистрированного / гостевого клиента.

Однако, когда я попытался извлечь эти значения электронной почты, используя запрос ниже,

 Mage::getModel('review/review')->getCollection()
                ->addFieldToFilter('email', $emailId)
                ->addFieldToFilter('status_id' , '1')
                ->addFieldToSelect('email')->getData();

это ничего мне не вернет. Когда я выполнил его в 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: однако, если я заменю 'main_table.email' просто 'email' в приведенном выше запросе в phpMyAdmin и выполню его, он вернет мне правильное значение. Так есть ли способ написать запрос в коде путем удаления части 'main_table'?

2 голосов
/ 20 января 2012

Ваш метод переписывания класса выглядит в основном правильным, но помните, что вы переписываете 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();

Если это не займет первое время (если, если вы уже не пробовали что-то подобное), перейдите в базу данныхи удалите строку «review_setup» из таблицы «core_resource».Тогда попробуйте еще раз.После добавления столбцов всегда не забывайте очищать кэш magento в System > Cache Management

. Не забывайте, что вам также необходимо создать файл с именем CM_Review.xml в app/etc/modules.Это должно выглядеть так:

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

Надеюсь, это поможет.

0 голосов
/ 15 января 2013

вот ошибка

<product_collection>CM_Reviewmail_Model_Resource_Review_Product_Collection</product_collection>

должно быть

<review_product_collection>CM_Reviewmail_Model_Resource_Review_Product_Collection</review_product_collection>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...