Переопределение метода доставки - что мне не хватает

Раньше я писал много модулей, но по какой-то причине мой модуль доставки не переопределяет существующий метод доставки Magneto. Это разрешено? Что мне здесь не хватает? Имя модуля отображается на вкладке «Дополнительно» в области конфигурации, поэтому оно загружается, но ничего не происходит. Любые подсказки?

Код

и т.д./модули/Ssi_Shipping.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Ssi_Shipping>
            <active>true</active>
            <codepool>local</codepool>
        </Ssi_Shipping>
    </modules>
</config>

местный/Ssi/доставка/etc.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Ssi_Shipping>
            <version>0.1.0</version>
        </Ssi_Shipping>
    </modules>
    <global>
        <models>
            <shipping>
                <rewrite>
                    <carrier_tablerate>Ssi_Shipping_Model_Carrier_Tablerate</carrier_tablerate>
                </rewrite>

            </shipping>
        </models>
    </global>
</config>

местный/SSI/Доставка/Модель/Перевозчик/Tablerate.php

<?php
class Ssi_Shipping_Model_Carrier_Tablerate 
    extends Mage_Shipping_Model_Carrier_Tablerate {

        public function isActive()
        {
            Mage::log("here! Ssi_Shipping_Model_Carrier_Tablerate");

            // check to see if it's disabled
            if (parent::isActive() == false)
                return false;

            // check in the shopping cart
            foreach( Mage::getSingleton('checkout/session')->getQuote()->getItemsCollection() as $item ){
                if ($item->getDeliveryFlag() == "test")
                    return true;
            }

            // if nothing is found then disable this option.
            return false;

        }


    }

person Chris    schedule 17.12.2010    source источник


Ответы (5)


Есть способ, но он не очевиден и требует от меня просмотреть исходный код модуля доставки:

Если вы посмотрите на Mage_Shipping_Model_Config, вы обнаружите, что код, используемый в качестве параметра для Mage::getModel(), взят из конфигурации магазина. Этот код НЕ является стандартным кодом, таким как «shipping/carrier_tablerate», поэтому он не помогает переопределять, как обычно.

Теперь вам нужно сначала выяснить, что это за код. Например, я хотел переопределить несущую матрицу, поэтому я протестировал ее следующим образом:

$carrierConfig = Mage::getStoreConfig('carriers/matrixrate')
var_dump($carrierConfig['model']);

Да, вы можете разместить этот код где угодно на странице временно, но полезно иметь отдельный файл для таких вещей, которые можно запускать из командной строки (начиная с Mage::app() для инициализации Magento)

В моем случае код был matrixrate_shipping/carrier_matrixrate, поэтому мне пришлось изменить свой config.xml следующим образом:

<global>
    <models>
        <matrixrate_shipping>
            <rewrite>
                <carrier_matrixrate>my_class_name</carrier_matrixrate>
            </rewrite>
        </matrixrate_shipping>
    </models>

вместо

<global>
    <models>
        <matrixrate>
            <rewrite>
                <carrier_matrixrate>my_class_name</carrier_matrixrate>
            </rewrite>
        </matrixrate>
    </models>

Удачи!

person Fabian Schmengler    schedule 16.05.2011
comment
приятель, спасибо за это, у меня это вызывает головную боль в течение некоторого времени - person Relja; 21.11.2014

Сначала убедитесь, что модель вообще переопределяется. Попробуй это:

var_dump(get_class(Mage::getModel("shipping/carrier_tablerate")));
person Joseph Mastey    schedule 17.12.2010
comment
Куда бы я это положил? Где-нибудь на странице? - person Chris; 18.12.2010
comment
У меня есть файл, который инициализирует фреймворк, но дает мне черновую доску (почти клонированная версия файла index.php). Чтобы быть быстрым, вы должны иметь возможность поместить его, например, в шаблон, и все будет в порядке. Только не забудьте удалить его позже. - person Joseph Mastey; 18.12.2010

Немного поработав над этим, я обнаружил, что единственный способ переопределить контроллер доставки — это создать дубликат файла (и структуры каталогов) в локальной папке кода. Тогда я мог бы в основном настроить код.

Не уверен, почему Magento, похоже, не позволяет стандартное переопределение этих функций доставки, но, по крайней мере, есть обходной путь.

person Chris    schedule 10.01.2011
comment
Я настоятельно не рекомендую это делать. Есть простой способ переопределить оператора, см. мой ответ. - person Fabian Schmengler; 16.05.2011

это было какое-то время, но у меня была та же проблема в последние дни. Я хотел переопределить методы бесплатной доставки и фиксированной доставки, и в дополнение к ответу fab мне пришлось добавить следующий код в etc/config.xml. В моем случае исходные значения находятся в app/code/core/Mage/Shipping/etc/config.xml.

<?xml version="1.0"?>
<config>
    ...
    <default>
        <carriers>
            <flatrate>
                <model>your_module/shipping_carrier_flatrate</model>
            </flatrate>
            <freeshipping>
                <model>your_module/shipping_carrier_freeshipping</model>
            </freeshipping>
        </carriers>
    </default>
</config>

Значения модели являются примерами. Вы должны заменить их своими правильными путями.

person Robert    schedule 10.04.2013
comment
Не могли бы вы поделиться тем, что внутри класса shipping_carrier_flatrate? - person Tahir Yasin; 20.12.2013

Если кто-то еще столкнулся с этой проблемой и пришел сюда за решением, похоже, что OP использовал codepool в файле модуля, где должно быть codePool (обратите внимание на заглавную букву P).

person MagExt    schedule 11.06.2015