Расширить тот же класс с 2 модулями? Конфликт модуля Magento? - PullRequest
2 голосов
/ 13 марта 2012

Я пытаюсь создать модуль, который меняет заголовок страницы, мой модуль работает нормально, пока я не включу другой модуль с именем

Yoast_CanonicalUrl.

Модуль Yoast не касается ни одного из методов title, но расширяет тот же класс, что и мой модуль: Mage_Page_Block_Html_Head {}

Я попытался расширить класс yoast, если он существует, но мой модуль перестает функционировать после включения модуля yoast.

Я посмотрел код yoasts, чтобы увидеть, конфликтуют ли его методы с моими, и нет.

Похоже, что как только Yoast загружен, мой код больше не загружается: (

Вот мой Head.php:

<?php

if (!(string)Mage::getConfig()->getModuleConfig('Yoast_CanonicalUrl')->active == 'true')
{
  class Yoast_CanonicalUrl_Block_Head extends Mage_Page_Block_Html_Head{}
}
class Company_MetaKeyManager_Block_Head extends Yoast_CanonicalUrl_Block_Head
{
    public function setTitle($title)
    {
        $this->_data['title'] = Mage::getStoreConfig('design/head/title_prefix') . ' ' . $title
            . ' ' . Mage::getStoreConfig('design/head/title_suffix');
        return $this;
    }
    public function getTitle()
    {
        if (empty($this->_data['title'])) {
            $this->_data['title'] = $this->getDefaultTitle();
        }
        return htmlspecialchars(html_entity_decode(trim($this->_data['title']), ENT_QUOTES, 'UTF-8'));
    }
    public function getDefaultTitle()
    {
        return 'Hello World';
    }
} 

Вот мой Config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Company_MetaKeyManager>
            <version>0.1.0</version>
        </Company_MetaKeyManager>
    </modules>
    <global>
        <blocks>
            <MetaKeyManager>
                <class>Company_MetaKeyManager_Block</class>
            </MetaKeyManager>
            <page>
                <rewrite>
                    <html_head>Company_MetaKeyManager_Block_Head</html_head>
                </rewrite>
            </page>
        </blocks>
        <helpers>
            <MetaKeyManager>
                <class>Company_MetaKeyManager_Helper</class>
            </MetaKeyManager>
        </helpers>
    </global>
</config>

У кого-нибудь есть предложения относительно того, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Eeek - не пытаться и условно объявить имя / расширение класса.

При работе с потенциальной загрузкой классов и конфликтами приоритетов, сначала запомните приоритет автозагрузчика PHP (include_path)

Он пытаетсяв следующем порядке:

./app/code/local
./app/code/community
./app/code/core

Таким образом, все, что определено в локальной системе, будет иметь приоритет над сообществом, независимо от любых внутренних перезаписей Magento.

С вашим расширением либо измените расширение Yoast, чтобы расширить свое.Или удалите перезапись из расширения Yoast config.xml, и пусть ваше расширение расширяет Yoast.

И если вам захочется переопределить ту же функцию, обязательно просто

return parent::myfunction()

В конце вашей функции, а затем она выполнит функцию расширенного класса.

Simples.

1 голос
/ 13 марта 2012

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

...