Павел Новицкий

Magento для мобильных админов

10 сентября 2013, 0:39

Мировые тренды говорят, что интеренет-магазины должны быть адаптированы для мобильных пользователей. Споры так это или нет оставим без внимания. Точно так же обойдём стороной методы реализации: мобильные и адаптивные темы, приложения, отдельные сайты. Просто договоримся на сегодня: покупателю с мобильным устройством должно быть так же удобно пользоваться магазином, как и его коллеге перед десктопом.

Итак, договорились — мобильные темы нужны. Теперь давайте выясним кто же проводит в интеренет-магазине больше всего времени. Привередливый покупатель? Конкурент? Налоговые органы? Вы совершенно правы — больше всего времени на сайте проводит администратор! Однако, как сильно мы заботимся об удобстве покупателей, так же бездумно мы оставляем на произвол судьбы наших менеджеров. Я не хочу сказать что разработчики не думают об удобстве админки. Большинство разделов достаточно логично расположены и спланированы. Просто люди, работающие на десктопах и ноутбуках, проектируют админку для себя. Всё, кажется, справедливо. Только админу, попытавшемуся во время поездки проверить как идут дела в магазине, от такой справедливости не легче.



Пример админки в телефоне

Вообще, изменения темы админки описано слабо. Готовых решений ещё меньше. По сути, Magento, при всей её гибкости в настройке фронтенда, не предоставляет никаких инструментов для измененния админки. А раз нам чего-то не хватает — добавим это. Благо, принципы рендеренга админки те же самые, что и для фронтенда.

Итак, наша цель —указать отдельную тему для администраторов зашедших с мобильных устройств. Как водится, содаём модуль.

config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Belvg_AdminTheme>
            <version>1.0.0</version>
        </Belvg_AdminTheme>
    </modules>
    <global>
        <models>
            <admintheme>
                <class>Belvg_AdminTheme_Model</class>
            </admintheme>
        </models>
    </global>
    <adminhtml>
        <events>
            <adminhtml_controller_action_predispatch_start>
                <observers>
                    <themeoverride_observer>
                        <type>singleton</type>
                        <class>Belvg_AdminTheme_Model_Observer</class>
                        <method>getAdminTheme</method>
                    </themeoverride_observer>
                </observers>
            </adminhtml_controller_action_predispatch_start>
        </events>
    </adminhtml>
    <default>
        <design>
            <admin>
                <theme>default</theme>
            </admin>
        </design>
    </default>
</config>

Главная часть модуля — событие adminhtml_controller_action_predispatch_start, в котором мы должны сравнить User Agent клиента, подобрать соответствующую тему и заменить тему default на нашу.

Belvg_AdminTheme_Model_Observer:

<?php
class Belvg_AdminTheme_Model_Observer
{
	const DEFAULT_THEME = 'design/admin/theme';
	const REGEX_PATH = 'design/admin/ua_regexp';
	const AREA = 'adminhtml';

	public function getAdminTheme()
	{
		$configValueSerialized = Mage::getStoreConfig(self::REGEX_PATH);

		if (!$configValueSerialized) {
			return $this;
		}

		$regexps = @unserialize($configValueSerialized);

		if (empty($regexps)) {
			return $this;
		}

		$_theme = Mage_Core_Model_Design_Package::getPackageByUserAgent($regexps, self::REGEX_PATH);
		$_theme = $_theme ? $_theme : Mage::getStoreConfig(self::DEFAULT_THEME);

		Mage::getDesign()->setArea(self::AREA)->setTheme($_theme);
		return $this;
	}
}

Метод getAdminTheme() напоминает поведение класса Mage_Core_Model_Design_Package, отвечающего за выбор пакета и темы для фронтенда.

N.B. для педентов: подавление ошибок @unserialize($configValueSerialized) не моё, смотреть в Mage_Core_Model_Design_Package::_checkUserAgentAgainstRegexps() :)

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

system.xml:

<?xml version="1.0"?>
<config>
	<sections>
		<design>
			<groups>
				<admin translate="label">
					<label>Admin Theme</label>
					<frontend_type>text</frontend_type>
					<sort_order>1</sort_order>
					<show_in_default>1</show_in_default>
					<expanded>1</expanded>
					<fields>
						<theme translate="label comment">
							<label>Default Admin Theme</label>
							<frontend_type>text</frontend_type>
							<sort_order>1</sort_order>
							<show_in_default>1</show_in_default>
						</theme>
						<ua_regexp translate="comment">
							<label>Add expression</label>
							<frontend_model>adminhtml/system_config_form_field_regexceptions</frontend_model>
							<backend_model>adminhtml/system_config_backend_design_exception</backend_model>
							<sort_order>2</sort_order>
							<show_in_default>1</show_in_default>
							<comment>Match expressions in the same order as displayed in the configuration.</comment>
						</ua_regexp>
					</fields>
				</admin>
			</groups>
		</design>
	</sections>
</config>

В Magento админка представляет из себя отдельный стор (store_id=0). Все остальные сторы представляют собой фронтенд. Благодаря событию adminhtml_controller_action_predispatch_start мы вызываем наш обсервер только при загрузке админки. Так что все параметры в нашем конфиге я сделал глобальными, независящими от выбранного для конфигурации стора.

И вот что же у нас получилось в итоге:

Осталось только добавить в исключения правила для мобильных браузеров (например, iPhone|iPod|BlackBerry|Palm|Googlebot-Mobile|mobile|mobi|Windows Mobile|Safari Mobile|Android|Opera Mini|Fennec) и, собственно, создать ту самую мобильну тему для админки.

P.S. в качестве примера конечного решения приведу наш «Tablet Dashboard» — достаточно удобный инструмент для работы с заказами для мобильных администраторов.

0 комментариев


Ваш комментарий
(обязательно)
(не показывается)
(HTML не работает)
© 2013-2017