Question

J'ai une pause mentale parce que je n'arrive pas à faire fonctionner mon module personnalisé qui devrait réécrire 2 blocs et 1 modèle.Mon module est chargé - j'ai vérifié dans le panneau d'administration System->Configuration->Advanced mais Magento lit toujours les fichiers principaux.De plus, j'essaie de réécrire le formulaire d'avis, donc lorsque je suis dans le panneau d'administration, je regarde les avis et je fais une erreur intentionnelle dans le nom de la classe. Acme_Reviewed_Block_Adminhtml_Review_Edit_Form J'obtiens un écran vide, donc on dirait qu'il lit mes blocs et mes modèles.Peut-être que j'ai fait une erreur quelque part que je ne trouve pas.

config.xml

<config>
  <modules>
    <Acme_Reviewed>
      <version>1.0</version>
    </Acme_Reviewed>
  </modules>
  <global>
    <models>
        <reviewed>
            <class>Acme_Reviewed_Model</class>
        </reviewed>
        <review>
            <rewrite>
                <resource_review>Acme_Reviewed_Model_Resource_Review</resource_review>
            </rewrite>
        </review>
    </models>
    <blocks>
        <reviewed>
            <class>Acme_Reviewed_Block</class>
        </reviewed>
        <ajaxreviews>
            <rewrite>
                <reviews>Acme_Reviewed_Block_Reviews</reviews>
            </rewrite>
        </ajaxreviews>
        <adminhtml>
            <rewrite>
                <review_edit_form>Acme_Reviewed_Block_Adminhtml_Review_Edit_Form</review_edit_form>
            </rewrite>
        </adminhtml>
    </blocks>
  </global>
</config>

Acme_Reviewed.xml

<config>
  <modules>
    <Acme_Reviewed>
        <active>true</active>
        <codePool>local</codePool>
        <depends>
            <Mage_Adminhtml />
            <Mage_Review />
            <Magpleasure_Ajaxreviews />
        </depends>
    </Acme_Reviewed>
  </modules>
</config>

J'essaie de remplacer :

Mage/Review/Model/Resource/Review.php
Magpleasure/Ajaxreviews/Block/Reviews.php
Mage/Adminhtml/Block/Review/Edit/Form.php

Avec mes fichiers :

Acme/Reviewed/Model/Resource/Review.php
Acme/Reviewed/Block/Reviews.php
Acme/Reviewed/Block/Adminhtml/Review/Edit/Form.php

Acme/Reviewed/Model/Resource/Review.php

<?php

class Acme_Reviewed_Model_Resource_Review extends Mage_Review_Model_Resource_Review
{
    protected function _afterSave(Mage_Core_Model_Abstract $object)
    {
        $adapter = $this->_getWriteAdapter();
        /**
         * save detail
         */
        Mage::log(var_export($object->getGemail(), TRUE), null, 'furoris.log');
        $detail = array(
            'title'     => $object->getTitle(),
            'detail'    => $object->getDetail(),
            'nickname'  => $object->getNickname(),
            'gemail' => $object->getGemail(),
        );
        $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);
            Mage::log("a", null, 'furoris.log');
            $adapter->update($this->_reviewDetailTable, $detail, $condition);
            Mage::log("b", null, 'furoris.log');
        } else {
            Mage::log($this->_reviewDetailTable, null, 'furoris.log');
            $detail['store_id']   = $object->getStoreId();
            $detail['customer_id']= $object->getCustomerId();
            $detail['review_id']  = $object->getId();
            $detail['gemail'] = $object->getGemail();
            $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;
    }
}

Acme_Reviewed_Block_Reviews

<?php

class Acme_Reviewed_Block_Reviews extends Magpleasure_Ajaxreviews_Block_Reviews
{
    public function getTemplateHtml()
    {    
        /** @var Magpleasure_Common_Block_Template $block */
        $block = $this->getLayout()->createBlock('magpleasure/template');
        if ($block) {
            return $block->setTemplate('ajaxreviews/product/view/list/template-guest.phtml')->toHtml();
        }
    }
}

Acme/Reviewed/Block/Adminhtml/Review/Edit/Form.php

<?php

class Acme_Reviewed_Block_Adminhtml_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());
        $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->escapeHtml($customer->getFirstname()), $this->escapeHtml($customer->getLastname()), $this->escapeHtml($customer->getEmail()));
        } else {
            if (is_null($review->getCustomerId())) {
                $customerText = Mage::helper('review')->__($review->getGemail());
            } 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')->getReviewStatusesOptionArray(),
        ));

        /**
         * Check is single store mode
         */
        if (!Mage::app()->isSingleStoreMode()) {
            $field = $fieldset->addField('select_stores', 'multiselect', array(
                'label'     => Mage::helper('review')->__('Visible In'),
                'required'  => true,
                'name'      => 'stores[]',
                'values'    => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(),
            ));
            $renderer = $this->getLayout()->createBlock('adminhtml/store_switcher_form_renderer_fieldset_element');
            $field->setRenderer($renderer);
            $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('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();
    }
}
Était-ce utile?

La solution

Finalement, j'ai résolu cette énigme.Mon code est un exemple du nombre de pièges qui attendent un développeur inexpérimenté.J'ai fait 3 erreurs.

  1. Acme/Reviewed/Block/Adminhtml/Review/Edit/Form.php

Le code entier de la fonction étendue est extrait du fichier principal Mage_Adminhtml_Block_Review_Edit_Form que j'étends.Je viens d'ajouter quelques modifications simples.Donc à la fin de la fonction se trouve la ligne :

return parent::_prepareForm();

Mais le problème est Mage_Adminhtml_Block_Review_Edit_Form que j'étends également à d'autres fichiers Mage_Adminhtml_Block_Widget_Form.

Donc, dans mon fichier, « parent » signifie Mage_Adminhtml_Block_Review_Edit_Form mais au fond, cela signifie return Mage_Adminhtml_Block_Widget_Form.

J'ai dû changer cette ligne par celle-ci et cela fonctionne parfaitement :

return Mage_Adminhtml_Block_Widget_Form::_prepareForm();

  1. Acme/Reviewed/Model/Resource/Review.php

J'ai bien écrit la configuration, mais pour étendre le modèle, pas pour étendre les ressources du modèle.Ainsi, lorsque j'ai remplacé config.xml par le code ci-dessous, cela fonctionne également bien.

<review_resource>
    <rewrite>
        <review>Acme_Reviewed_Model_Resource_Review</resource_review>
    </rewrite>
</review_resource>
  1. Acme_Reviewed_Block_Reviews

Donc ici, je voulais étendre la fonction qui se trouvait dans Magpleasure_Ajaxreviews_Block_Reviews, mais je n'ai pas remarqué que ce n'était pas la fin de la « chaîne d'extension ».J'ai trouvé que le dernier fichier qui étend Magpleasure_Ajaxreviews_Block_Reviews est Magpleasure_Ajaxreviews_Block_Placing_Additional, j'ai donc dû étendre cette classe avec ma fonction modifiée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top