«Правильный» способ выполнения задач администратора? - PullRequest
1 голос
/ 23 августа 2011

Я пытаюсь собрать модуль администратора, который может выполнять некоторые пользовательские задачи сортировки, и я столкнулся с вопросом, на который, похоже, не могу найти ответ. По сути, я добавил в конфигурацию администратора раздел с несколькими кнопками, которые сканируют последние заказы и устанавливают некоторые пользовательские значения для элементов заказов, которые я могу использовать позже. Для этого я добавил в system.xml кнопку, которая перенаправляет на контроллер. Контроллер выполняет необходимую задачу (или создает модель для этого), а затем должен перенаправить обратно на страницу администратора, с которой он пришел. Это та часть, которая меня смутила. Кажется, я не могу найти лучший способ передать текущий URL из раздела администратора в контроллер, чтобы контроллер знал, куда перенаправить обратно. Конечно, я мог бы жестко закодировать это, но я бы действительно не хотел. Кроме того, это даже правильный способ сделать это? Если для контроллера нет макета, и его единственная цель - делать что-то по нажатию кнопки, есть ли лучший способ сделать это?

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

System.Xml

Вот раздел system.xml , который объявляет кнопку. Обратите внимание, что я использую пользовательский класс frontend_model, потому что это был единственный способ заставить это работать (есть ли лучший способ?)

<fields>
    <calcmargin translate="label">
        <label>Calculate Margins</label>
        <comment>
            <![CDATA[Calculates the order margins]]>
        </comment>
        <frontend_type>button</frontend_type>
        <frontend_model>sorting/source_buttons_calcmargin</frontend_model>
        <sort_order>10</sort_order>
        <show_in_default>1</show_in_default>
        <show_in_website>1</show_in_website>
        <show_in_store>1</show_in_store>
    </calcmargin>
</fields>

config.xml

В config.xml я объявляю свой роутер администратора (между прочим)

<admin>
    <routers>
        <sorting>
            <use>admin</use>
            <args>
                <module>VPS_Sorting</module>
                <frontName>sorting</frontName>
            </args>
        </sorting>
    </routers>
</admin>

Кнопка источника

Вот функция _ getElementHtml из моего класса кнопок источника

public function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
{
    //save the current URL in the sorting/data singleton for future use
    Mage::getSingleton('sorting/data')->setSortingReturnUrl(Mage::helper('core/url')->getCurrentUrl());

    $this->setElement($element);

    $html = $this->getLayout()->createBlock('adminhtml/widget_button')
    ->setType('button')
    ->setClass('scalable')
    ->setLabel($this->buttonLabel)
    ->setOnClick("setLocation('$this->buttonUrl')")
    ->toHtml();

    return $html;
}

ПРИМЕЧАНИЕ: $ this-> buttonUrl устанавливается ранее с использованием $this->getUrl('sorting/index/calcmargin')

В этом случае у меня есть модель с именем Data.php , которую я создаю с помощью getSingleton и задаю URL возврата.

IndexController

public function calcmarginAction()
{
    $orderCollection = Mage::getModel('sales/order')->getCollection();

    foreach($orderCollection as $order)
    {
        //Do Stuff
        //...
    }

    echo "DONE...now return to " . Mage::getSingleton('sorting/data')->getSortingReturnUrl();
    //outputs: 'DONE...now return to '...so clearly the value wasn't saved
}

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

Я также пытался сохранить значение в core / session singleton, но это тоже не сработало.

Итак, если вы все еще со мной, есть какие-нибудь мысли о том, что мне следует делать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

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

$this->_redirectReferer();

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

0 голосов
/ 23 августа 2011

Вы делаете реальное перенаправление, как в перенаправлении HTTP? Или вы делаете пересылку на другой контроллер?

Если вы делаете реальный редирект, это отвратительно. Не делай этого. Стоп. Редизайн целиком.

Вы должны создать помощника действий, который содержит ваш код маржи calc.

Чтобы ответить на ваш другой вопрос, если для контроллера нет макета или сценария просмотра (из-за характера действия контроллера), то он не должен вызываться пользователем. Скорее всего, это будет что-то вроде задания cron, в котором макеты отключены.

Лучший способ сделать то, что вы хотите, это использовать Action Helpers. Контроллеры отображаются из отдельных запросов, поэтому один маршрут (или несколько маршрутов) будет сопоставлен с одним контроллером. Однако, если некоторый код используется многими контроллерами, то он должен быть помощником действий.

...