Как устранить конфликт между Df_Core_Model_Url и Mana_Seo_Rewrite_Url

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
  • Тема закрыта
#1 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

27.10.2014 22:35

http://test.dewatch.ru


После установки модуля SEO Layered Navigation Plus вышло два конфликта, один - устранён по инструкции, второй:

 Системный класс «core/url» типа «model» перекрывают конфликтующие между собой классы:
        Mana_Seo_Rewrite_Url [используется]	
        Df_Core_Model_Url


Устранение по инструкции вызывает сбой в работе модуля SEO Layered Navigation Plus (перестаёт фильтровать).

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

27.10.2014 22:58

Что именно Вы сделали "по инструкции"?

#3 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

27.10.2014 23:43

Здесь два взаимосвязанных перекрытия Mana_Seo и Df_Core.

Системный класс «core/url» типа «model» перекрывают конфликтующие между собой классы:
Mana_Seo_Rewrite_Url [используется]
Df_Core_Model_Url


Был исправлен так:
1. Нашел конфликтующие файлы.
2. Узнал классы-родители.
3. Класс-родитель одинаков.
4. Есть общая функция getUrl, но попробовал сделать всё до конца.
5.6. Новый родитель - Mana_...Сделал соответствующие исправления в файле Df/Core/Model/Url.php
7. Добавил в блок <depends> <Mana_Seo /> в файле Df_Basic.xml в раздел <Df_Core>.

и

Системный класс «core/url» типа «model» перекрывают конфликтующие между собой классы:
Mana_Seo_Rewrite_Store [используется]
Df_Core_Model_StoreM


1-3. Те же.
4. Общей функции нет.
5. Новый родитель - Mana_...Сделал соответствующие исправления в файле Df/Core/Model/Url.
6. Сделал соответствующие исправления в файле Df/Core/Model/StoreM.php
7. <depends> уже добавлен.

В таком варианте всё работает, пока не включить кэширование "Экранные блоки". Если его включить, сайт перестаёт работать с ошибкой:
Serialization of 'Mage_Core_Model_Layout_Element' is not allowed

#0 /var/www/test.dewatch.ru/app/code/core/Mage/Page/Block/Template/Links.php(191): serialize(Array)
#1 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(1298): Mage_Page_Block_Template_Links->getCacheKeyInfo()
#2 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(1380): Mage_Core_Block_Abstract->getCacheKey()
#3 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(910): Mage_Core_Block_Abstract->_loadCache()
#4 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(637): Mage_Core_Block_Abstract->toHtml()
#5 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(581): Mage_Core_Block_Abstract->_getChildHtml('topLinks', true)
#6 /var/www/test.dewatch.ru/app/design/frontend/fortis/default/template/page/html/header.phtml(141): Mage_Core_Block_Abstract->getChildHtml('topLinks')
#7 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/test.d...')
#8 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/fortis...')
#9 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#10 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(919): Mage_Core_Block_Template->_toHtml()
#11 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(637): Mage_Core_Block_Abstract->toHtml()
#12 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(581): Mage_Core_Block_Abstract->_getChildHtml('header', true)
#13 /var/www/test.dewatch.ru/app/design/frontend/fortis/default/template/page/2columns-left.phtml(44): Mage_Core_Block_Abstract->getChildHtml('header')
#14 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/test.d...')
#15 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/fortis...')
#16 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#17 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Block/Abstract.php(919): Mage_Core_Block_Template->_toHtml()
#18 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#19 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#20 /var/www/test.dewatch.ru/app/code/core/Mage/Catalog/controllers/CategoryController.php(161): Mage_Core_Controller_Varien_Action->renderLayout()
#21 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Catalog_CategoryController->viewAction()
#22 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('view')
#23 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#24 /var/www/test.dewatch.ru/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#25 /var/www/test.dewatch.ru/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#26 /var/www/test.dewatch.ru/index.php(87): Mage::run('', 'store')
#27 {main}


#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

27.10.2014 23:44

"Есть общая функция getUrl, но попробовал сделать всё до конца." - это как? проигноровали наличие одноимённого метода или что?

#5 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:06

Пробовал проигнорировать, не заработало.
Вернул данные файлы в исходное состояние, ошибка в админке вернулась:


 Системный класс «core/url» типа «model» перекрывают конфликтующие между собой классы:
        Df_Core_Model_Url [используется]	
        Mana_Seo_Rewrite_Url


Пр этом отключились красивые URL при фильтрации от модуля SEO Layered Navigation Plus.
И осталась проблема с кэшированием. Например, выбрав 4 параметра фильтра, увидим ту же ошибку "Serialization of 'Mage_Core_Model_Layout_Element' is not allowed".
Как увидеть: на странице
http://test.dewatch.ru/naruchnie-chasy.html?manufacturer=86&watch_band_color=27&watch_band_material=19
выбрать любой новый фильтр.

#6 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:08

Так надо писать не «Устранение по инструкции вызывает сбой в работе модуля SEO Layered Navigation Plus», а «я проигнорировал инструкцию и вызывел сбой в работе модуля SEO Layered Navigation Plus».
В инструкции же не было сказано, что её пункты надо игнорировать.

#7 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:11

Была моя ошибка, но даже по инструкции ничего не работает.

#8 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:12

Что конкретно "по инструкции ничего не работает"?

#9 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:16

1. Отключились красивые URL от модуля SEO Layered Navigation Plus.
2. При включенном кэшировании Экранных блоков, выбрав 4 параметра фильтра, увидим ошибку "Serialization of 'Mage_Core_Model_Layout_Element' is not allowed".
Как увидеть: на странице
http://test.dewatch.ru/naruchnie-chasy.html?manufacturer=86&watch_band_color=27&watch_band_material=19

выбрать любой новый фильтр.

#10 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:17

А какова связь этих признаков с инструкцией, я не понял?

#11 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:25

Инструкция позволила устранить один конфликт, второй сохраняется)
Обращаюсь здесь за помощью, чтобы устранить данный конфликт и нормализовать работу модуля с Российской сборкой.

#12 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:28

Так надо писать не «даже по инструкции ничего не работает», а «я не выполнял инструкцию, и поэтому у меня ничего не работает».
Вы же конкретно не решали задачу одноимённых методов класса, следовательно, и инструкцию не выполняли.

#13 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:33

Цитата

Как устранить конфликты программных классов?
1.Самый простой способ устранить конфликт двух программных классов — отключение (удаление) модуля, которому принадлежит один из конфликтующих классов.
Недостаток этого способа: Вы лишаетесь функциональности отключенного модуля.
2. Второй способ сложнее. Он применим не всегда, но если применим, то, в отличие от первого способа, позволяет сохранить функциональность конфликтующих модулей.
Этот способ описан в статье «Как устранить конфликт одновременного перекрывания одного и того же системного класса изменением иерархии наследования?».
3.Когда один из конфликтующих классов принадлежит Российской сборке Magento, а другой — стороннему модулю, Вы можете сообщить об этом в разделе «Вопросы пользователей о модуле «Рекомендации администратору»».


1. Функциональности модуля лишаться не хочу, поэтому обращаюсь за помощью.
2. Не применимо, т.к. имеются одноименные классы.
3. Сообщил.

Если есть ещё какие-либо инструкции, прошу хотя бы дать ссылку на них.

#14 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:36

Подводя итог:
  • Сначала Вы сочли нужным, что какие-то пункты инструкции можно пропускать, тогда тему можно озаглавливать не «Устранение по инструкции вызывает сбой в работе модуля SEO Layered Navigation Plus», а «я проигнорировал инструкцию и вызывел сбой в работе модуля SEO Layered Navigation Plus».
  • Далее, Вы, ничего не сделав, вернули всё в исходный вид, и тогда тему можно озаглавнивать не «даже по инструкции ничего не работает», а «я не выполнял инструкцию, и поэтому у меня ничего не работает».

Вот так будет чётко и конкретно отражена суть произошедшего.

#15 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:42

Мне нужна помощь по устранению конфликта при наличии одноимённых методов. Как это сделать?

#16 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:45

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

#17 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:49

Конфликтующий файл прикреплён.

Прикрепленные файлы

  • Прикрепленный файл  Url.php (30.59К)
    Количество загрузок:: 128


#18 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 00:50

Опубликуйте здесь программный код обоих одноимёненных методов.

#19 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 00:53

Mana:
 public function getUrl($routePath = null, $routeParams = null) {
//        $this->_escape = isset($routeParams['_escape']) ? $routeParams['_escape'] :
//            (isset($routeParams['_m_escape']) ? $routeParams['_m_escape'] : $this->_escape);
        Mana_Core_Profiler2::start(__METHOD__, true);

        $this->_routeParams = $routeParams;
        if ($this->_isValidPageType($routePath) &&
            (isset($routeParams['_use_rewrite']) || $routePath == 'catalogsearch/result'))
        {
            /* @var $seo Mana_Seo_Helper_Data */
            $seo = Mage::helper('mana_seo');

            if ($this->_schema = $seo->getActiveSchema($this->getStore()->getId())) {
                $this->_routePath = $this->_populateCurrentRouteFromRequest($routePath);

                $query = null;
                if (isset($this->_routeParams['_query'])) {
                    $this->purgeQueryParams();
                    $query = $this->_routeParams['_query'];
                    unset($this->_routeParams['_query']);
                }
                $this->_query = $query;

                if ($this->_pageType = $this->_getPageType($this->_routePath)) {
                    $this->_suffix = $this->_pageType->getCurrentSuffix();
                    $this->_pageUrlKey = $this->_pageType->getUrlKey($this);
                    if (Mage::getStoreConfig('web/default/front') == 'cms' &&
                        $this->_pageUrlKey == Mage::getStoreConfig('web/default/cms_home_page'))
                    {
                        $this->_routePath = 'cms/index/index';
                        unset($this->_routeParams['page_id']);
                        $this->_pageType = $this->_getPageType($this->_routePath);
                        $this->_suffix = $this->_pageType->getCurrentSuffix();
                        $this->_pageUrlKey = $this->_pageType->getUrlKey($this);
                    }
                }
            }
        }

        $result = parent::getUrl($routePath, $this->_routeParams);
        Mana_Core_Profiler2::stop(__METHOD__);

        return $result;
    }


Российская сборка:

public function getUrl($routePath = null, $routeParams = null) {
		/**
		 * Обратите внимание,
		 * что ядро Magento обычно использует индивидуальные экземпляры класса @see Mage_Core_Model_Url
		 * при каждом процессе построения веб-адреса.
		 * По этой причине кэширование вынесли в класс-одиночку @see Df_Core_Model_Cache_Url
		 * (чтобы кэш загружался и сохранялся единократно для объекта-одиночки).
		 */
		return Df_Core_Model_Cache_Url::s()->getUrl($this, $routePath, $routeParams);
	}


#20 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 01:00

В Российской сборке Magento метод лаконичен и отвечает только за кэширование: ускоряет формирование адресов страниц интернет-магазина на Российской сборке Magento по сравнению с интернет-магазином Magento Community Edition и Magento Enteprise Edition.
В проблемном стороннем модуле метод длинный и делает чёрти что.
В такой ситуации родителем надо делать именно класс Российской сборки Magento, потому что в утрате лакончиной функционалности данного метода Российской сборки Magento нет ничего страшного: просто интернет-магазин будет работать медленнее (формировать адреса страниц медленнее, на уровне Magento Community Edition и Magento Enteprise Edition).
Класс Mana_Seo_Rewrite_Url надо сделать потомком: наследовать от класса Df_Core_Model_Url.

Вы же выше сделали наоборот, наугад и неправильно: родителем назначили Mana_Seo_Rewrite_Url.
В таких областях проблемы наугад не решаются, думать надо.

#21 Константин Цепелев
  • Группа: Клиент
  • Сообщений: 24
  • Регистрация: 14.07.2014

28.10.2014 01:21

Сделал так:
Mana_Seo_Rewrite_Url extends Df_Core_Model_Url
Mana_Seo_Rewrite_Store extends Df_Core_Model_StoreM
и а Mana_Seo.xml поместил <depends><Df_Core/></depends>.

Теперь каждая ссылка в фильтре копирует первую невыбранную и пагинация копирует ссылку сортировки: http://test.dewatch....nie-chasy.html.
Похоже, что-то с кэшированием ссылок..

#22 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

28.10.2014 01:23

Второй класс к заголовку темы отношения не имеет, втискивать его теперь сюда не нужно. На вопрос из заголовка темы я ответил. Тема закрыта.

#23 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

17.11.2014 07:27

Заплатка для устранения дефекта оформительской темы ThemeForest Infortis Fortis: «Serialization of 'Mage_Core_Model_Layout_Element' is not allowed», который не имеет отношение к данной теме, но сообщение о котором зачем-то отмусорено вперемешку с прочими проблемами в данной теме, включена в версию 2.41.1 Российской сборки Magento.

Поделиться темой: