Как правильно внести правки в административный контроллер

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

23.02.2011 03:58

Создайте в своём модуле класс-наследник от контроллера, нуждающегося в правке.
Непосредственно перед определением класса включите файл переопределяемого класса посредством require_once
Далее надо сообщить системе в файле config.xml о переопределении контроллера.

Я знаю 2 рабочих способа.
Объясню их на примере перекрытия контроллера Mage_Adminhtml_System_Convert_ProfileController

способ 1:

<config>
	<global>
		<rewrite>
		    <df_adminhtml_system_convert_profile>
		        <from><![CDATA[#^/[^/]+/system_convert_profile/#]]></from>
		        <to>/df_adminhtml/system_convert_profile/</to>
		    </df_adminhtml_system_convert_profile>
		</rewrite>	
	</global>
	
    <admin>
        <routers>
            <df_adminhtml>
                <use>admin</use>
                <args>
                    <module>Df_Adminhtml</module>
                    <frontName>df_adminhtml</frontName>
                </args>
            </df_adminhtml>
        </routers>
    </admin>	
</config> 



способ 2 (Более короткий. Работает с Magento 1.3 и более свежими версиями):
<config>
	<admin>
		<routers>
			<adminhtml>
				<args>
					<modules>
						<Df_Adminhtml before="Mage_Adminhtml">Df_Adminhtml</Df_Adminhtml>
					</modules>
				</args>
			</adminhtml>
		</routers>
	</admin>	
</config> 



Оба способа дают равноценный эффект.

#2 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 17:17

пытаюсь перегрузить Mage_Adminhtml_Catalog_ProductController. делаю по вашему примеру. следующий код не работает
cktle.ob
/app/code/local/Lindenvalley/Density/etc/config.xml
<?xml version="1.0"?>
<config>
    <modules>
        <Lindenvalley_Density>
            <version>0.1.0</version>
        </Lindenvalley_Density>
    </modules>

    <global>
        <models>
            <density>
                <class>Lindenvalley_Density_Model</class>
            </density>
        </models>

		<resources>
            <density_setup>
                <setup>
                    <module>Lindenvalley_Density</module>
					<class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </density_setup>
			
            <density_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </density_write>
			
            <density_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </density_read>
        </resources>
		
		<helpers>
             <density>
                <class>Lindenvalley_Density_Helper</class>
             </density>
        </helpers>
		
       <blocks>
             <density>
                <class>Lindenvalley_Density_Block</class>
             <density>
	</blocks>
    </global>	
	<admin>
        <routers>
            <density>
                <args>
                    <modules>
                        <Lindenvalley_Density before="Mage_Adminhtml">Lindenvalley_Density</Lindenvalley_Density>
                    </modules>
                </args>
            </density>
        </routers>
    </admin>     
</config>

/app/code/local/Lindenvalley/Density/controllers/Catalog/ProductController.php
<?php 
require_once 'Mage/Adminhtml/controllers/Catalog/ProductController.php';

class Lindenvalley_Density_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController
{
	public function _construct()
	{
		parent::_construct();
	}
	
	public function saveAction()
        {
        
		parent::saveAction();
	
		echo "Hello";
        }
}


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

14.07.2011 17:22

Попробуйте вызвать Mage::log перед вызовом перекрытого родительского метода.

#4 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 17:25

простите, а где он вызывается?

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

14.07.2011 17:28

parent::saveAction();

#6 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 17:36

спасибо. дописал Mage::log('well done!', null, 'density.txt');
появился файл лога, но содержимое его отличалось от well done! там находился какой-то массив. я файл потер теперь он не создается

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

14.07.2011 17:43

Присутствует ли ваш модуль в разделе System -> Configuration -> Advanced?

#8 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 17:48

да есть и включен

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

14.07.2011 17:50

Отключен ли кеш системы?
Вызывается ли конструктор контроллера?

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

14.07.2011 17:58

кэш отключен, а конструктор, видимо, не вызывается. перед
parent::_construct();

поставил строку
die("hello");

никакой реакции

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

14.07.2011 18:03

А конструктор родительского класса вызывается?

#12 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 18:07

родительского вызывается

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

14.07.2011 18:13

У вас ошибка в синтаксисе: непосредственно внутри тега <routers> должен следовать тег перекрываемого модуля (смотрите способ 2 первого сообщения темы), а не тег вашего модуля.

#14 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 18:24

поправил
<admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <Lindenvalley_Density before="Mage_Adminhtml">Lindenvalley_Density_Catalog</Lindenvalley_Density>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin> 

результат прежний

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

14.07.2011 18:27

У вас ещё вторая синтаксическая ошибка: внутри тега с именем вашего модуля надо писать имя вашего модуля, без суффикса catalog.

#16 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 18:34

подкорректировал. на результат никак не повлияло

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

14.07.2011 18:39

В этих 11 строчках больше ошибок нет. Видимо, они где-то ещё. Проверьте в отладчике, на каком основании система отбраковывает ваш контроллер при обработке запроса.

#18 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

14.07.2011 18:50

хорошо, спасибо. буду ковырять дальше

Sorry, your PCRE extension does not support UTF8 which is needed for the I18N core

#19 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

15.07.2011 15:56

так а чем вообще может быть вызвана ошибка 404?

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

15.07.2011 15:58

Например, невнимательностью.
Я вчера нашёл в вашем коде 2 синтаксические ошибки.
Возможно, они и в других местах присутствуют.
Воспользуйтесь отладчиком.

#21 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

15.07.2011 16:18

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

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

15.07.2011 16:21

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

#23 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

15.07.2011 16:35

да я в курсе, но начальство предпочитает следить за процессом

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

15.07.2011 16:38

Для отчёта перед заказчиком вы должны публиковать результаты на хостинге.
Разработку же прямо на хостинге профессиональные разработчики, как правило, не ведут.
Публиковать и разрабатывать - эти 2 глагола имеют разный смысл.

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