Как перепрограммировать стандартное поведение?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

22.03.2010 16:07

Как посредством самописного модуля изменить поведение системных объектов Magento?

Для начала прочтите вводную статью о модульности архитектуры Magento.
Во вводной статье была теория, теперь пора перейти к практике.
Статья предназначена для программистов.

Для примера рассмотрим конкретную задачу: изменение алгоритма формирования URL key при создании нового товарного раздела (категории) в административном интерфейсе Magento.

Что такое URL key?
Magento использует URL key для формирования адресов страниц товарных разделов (и собственно товаров, но это вне рамок темы).

В чём проблема с URL key в Magento?
Системный класс Mage_Catalog_Model_Category неправильно производит транслитерацию русских букв.
Если ваш товарный раздел называется "Суши", то Magento добавит в адрес страницы: "d-n-n-d".
Изображение

Несмертельный баг, но в качестве учебного примера пойдёт.

Как бы вы поступили, будь у вас другой движок?
Вы бы поиском по системным файлам нашли бы участок кода, который формирует URL key, и внесли бы в него правки.
Чем это плохо, я писал во введении.

В чём отличие подхода Magento?
В Magento можно написать свой модуль, подключить его к Magento и тем самым переопрелить поведение движка (в данном случае: исправить дефект).

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

Теперь пошаговая инструкция, как патчить системный класс Mage_Catalog_Model_Category:

1) Создаю папку app/code/local/Fediuk/CorePatches
Этот модуль у меня для заплаток к ядру.

2) Создаю app/etc/modules/Fediuk_CorePatches.xml
Туда помещаю стандартный код:
<?xml version="1.0"?>
<config>
	<modules>
		<Fediuk_CorePatches>
			<active>true</active>
			<codePool>local</codePool>
		</Fediuk_CorePatches>
	</modules>
</config>


2) Создаю свой класс app/code/local/Fediuk/CorePatches/Model/Category.php: наследник от системного класса. Перекрываю нужный метод:


class Fediuk_CorePatches_Model_Category extends Mage_Catalog_Model_Category {
    public function formatUrlKey($str) {
        $urlKey = preg_replace('#[^0-9a-z]+#i', '-', Mage::helper('catalog/product_url')->format($str));
        $urlKey = strtolower($urlKey);
        $urlKey = trim($urlKey, '-');
        return $urlKey;
    }
}



3) Теперь говорю Magento, что вместо Mage_Catalog_Model_Category надо загружать Fediuk_CorePatches_Model_Category:
Для этого пишу такой конфиг для своего модуля:
app/code/local/Fediuk/CorePatches/etc/config.xml


<?xml version="1.0" encoding="utf-8"?>
<config>
	<modules>
		<Fediuk_CorePatches>
			<version>0.1.0</version>
		</Fediuk_CorePatches>
	</modules>
	<global>
		<models>
			<catalog>
				<rewrite>
					<category>Fediuk_CorePatches_Model_Category</category>
				</rewrite>
			</catalog>
		</models>
	</global>
</config>



Теперь очищаем кеш и любуемся результатом: слово "суши" будет транслитерироваться в ссылке как "sushi", а не как "d-n-n-d".

#2 Роман Мустафин
  • Группа: Пользователь
  • Сообщений: 79
  • Регистрация: 03.05.2010

07.05.2010 22:12

Вечер добрый!

Всё сделал по вашей инструкции, на все файлы выставил даже права доступа 777

Но выдало ошибку при нажатии в админки на пункт меню категории

class Fediuk_CorePatches_Model_Category extends Mage_Catalog_Model_Category { public function formatUrlKey($str) { $urlKey = preg_replace('#[^0-9a-z]+#i', '-', Mage::helper('catalog/product_url')->format($str)); $urlKey = strtolower($urlKey); $urlKey = trim($urlKey, '-'); return $urlKey; } }
Fatal error: Call to a member function setStoreId() on a non-object in /home/karliin/public_html/shop/app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php on line 52

Даже не менял Вашу фамилию, в знак уважения =)

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

08.05.2010 10:47

1) Кеш Magento обновили?
2) Виден ли модуль активным в административной части Magento?
3) Действительно ли системный класс перекрылся? Добавите Mage::log (__FILE__); в новый метод formatUrlKey и проверьте, что он вызывается.

#4 Роман Мустафин
  • Группа: Пользователь
  • Сообщений: 79
  • Регистрация: 03.05.2010

08.05.2010 12:26

Просмотр сообщенияДмитрий Федюк (08.05.2010 10:47) писал:

1) Кеш Magento обновили?
2) Виден ли модуль активным в административной части Magento?
3) Действительно ли системный класс перекрылся? Добавите Mage::log (__FILE__); в новый метод formatUrlKey и проверьте, что он вызывается.


Кеш обновлял несколько раз.

Fediuk_CorePatches модуль включен и стоит в списке первым.

Может мне скинуть файлы, которые я делал по Вашей инструкции.

Или Вы скиньте правильный вариант, мне кажется в моих файлах есть ошибка.

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

Жду ответ

#5 GG
  • Группа: Гости

08.05.2010 13:03

Перед
class Fediuk_CorePatches_Model_Category extends Mage_Catalog_Model_Category {
....

в файле app/code/local/Fediuk/CorePatches/Model/Category.php добавьте <?php, вот так
<?php
class Fediuk_CorePatches_Model_Category extends Mage_Catalog_Model_Category {
.....


#6 Роман Мустафин
  • Группа: Пользователь
  • Сообщений: 79
  • Регистрация: 03.05.2010

08.05.2010 13:20

В списке модулей поностью пропал модуль Fediuk'a

Соответственно названия категорий тоже нормальными не становятся.

Кеш обновлял, пробовал вносить новую категорию - результат отрицательный d-d-d

Может скинете файлы уже готовые, чтобы просто их закинуть на сервер - буду очень признателен :)

Мой код в файле Category.php
<?php
class Fediuk_CorePatches_Model_Category extends Mage_Catalog_Model_Category {


    public function formatUrlKey($str) {

        $urlKey = preg_replace('#[^0-9a-z]+#i', '-', Mage::helper('catalog/product_url')->format($str));

        $urlKey = strtolower($urlKey);

        $urlKey = trim($urlKey, '-');

        return $urlKey;

    }

}
?>


#7 _GG_
  • Группа: Пользователь
  • Сообщений: 1
  • Регистрация: 08.05.2010

08.05.2010 13:34

Нужно добавить только <?php без ?> в конце файла

#8 Роман Мустафин
  • Группа: Пользователь
  • Сообщений: 79
  • Регистрация: 03.05.2010

08.05.2010 13:51

Убрал - ничего не поменялось.

Он почему то в списке модулей отсутсвует.

Скиньте пожалуйста в rar архиве собственные файлы - я закину к себе на сервер.

Также посмотрю код и сделаю анализ своих ошибок.

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

08.05.2010 15:15

Magento: исправляем транслитерацию названий товарных категорий (готовый модуль)

#10 holyfreak
  • Группа: Пользователь
  • Сообщений: 41
  • Регистрация: 21.07.2010

17.08.2010 09:39

при добавлении <?php все стало нормально работать урлу переводит отлично!

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