Magento: Как использовать административные конфигурации в веб-интерфейсе?

У меня есть расширение, которое должно дать пользователям (вошедшим в систему как администратор в бэкенде magento) возможность изменять некоторые конфиги в области внешнего интерфейса. Я хочу иметь ссылку во внешнем интерфейсе, которая загружает область конфигурации через ajax и дает пользователю возможность редактировать и сохранять эту конфигурацию в загруженном div. Я хочу использовать для этого бэкенд-формы magento, поэтому мне не нужно самому кодировать формы.

Мой текущий подход имеет ссылку на страницы и загружает через ajax правильную страницу бэкэнда (например, Система> Конфигурация> Дизайн). Для этого подхода я создал Controller, который расширяет Mage_Adminhtml_Controller_Action. Этот Контроллер получает параметры из запроса ajax и использует действие (например, editAction класса Mage_Adminhtml_System_ConfigController), чтобы получить правильную страницу конфигурации в бэкэнде.

Мои проблемы: - отображение только правильной области (я просто хочу, чтобы пользователь редактировал только раздел "темы" в разделе "Система"> "Конфигурация"> "Дизайн"), все остальное должно быть недоступно... так как удалить всю информацию из этой конфигурации раздел?

  • Форма нуждается в JS-переменной Form_Key. Как получить текущий Form_Key (во внешнем интерфейсе)?

  • После того, как ajax загрузил содержимое, форма не будет правильно инициализирована. Поэтому, если я пытаюсь отправить форму, мой firebug говорит: "JS-Error: configForm не определен". Как решить эту форму инициализации? Есть идеи?

Я действительно надеюсь, что кто-нибудь здесь может дать мне подсказку, как решить эту проблему, чтобы заставить конфигурацию бэкэнда работать во внешнем интерфейсе.

1 ответ

Это не проверено, но этого должно быть достаточно, чтобы вы пошли по правильному пути:

Вывести только определенный блок

Во внешнем интерфейсе большинство блоков создаются с помощью макета XML. в adminhtml В этой области все по-другому, поэтому вам нужно гораздо больше работать с реализацией PHP.

В вашем действии AJAX я предполагаю, что вы сейчас звоните loadLayout() а также renderLayout(),
Чтобы вывести только определенный раздел, используйте вместо этого:

public function yourAjaxAction()
{
    // assuming the required config section is set in the AJAX request
    $sectionCode = $this->getRequest()->getParam('section');
    $sections = Mage::getSingleton('adminhtml/config')->getSections();
    $blockName = (string)$sections->frontend_model;
    if (empty($blockName)) {
        $blockName = Mage_Adminhtml_Block_System_Config_Edit::DEFAULT_SECTION_BLOCK;
    }
    $block = $this->getLayout()->createBlock($blockName)->initForm();

    // Set the AJAX response content
    $this->getResponse()->setBody($block->toHtml());
}

Ключ формы

Ключ формы можно получить через

Mage::getSingleton('core/session')->getFormKey()

Он должен присутствовать в форме, отправленной обратно на сервер. Вы можете использовать следующий код для создания скрытого HTML-поля с помощью formkey:

// If loadLayout() was called:
$formkeyHtml = Mage::app()->getLayout()->getBlock('formkey')->toHtml();

// If working without layout XML:
$formkeyHtml = Mage::app()->getLayout()->createBlock('core/template', 'formkey')
    ->setTemplate('formkey.phtml') // adminhtml theme formkey
    //->setTemplate('core/formkey.phtml') // frontend theme formkey
    ->toHtml();

Добавить configForm JavaScript

configForm переменная является JS varienForm объект элемента DOM, содержащий поля конфигурации.
Он создается с использованием:

// config_edit_form is the CSS id
configForm = new varienForm('config_edit_form');

varienForm объявление находится в файле js / varien / form.js.
Также есть некоторый дополнительный javascript, используемый конфигурацией системы. Magento всегда добавляет эти блоки для настройки среды JS конфигурации системы:

Mage::app()->getLayout()->getBlock('js')->append(
    $this->getLayout()->createBlock('adminhtml/template')
        ->setTemplate('system/shipping/ups.phtml')
);
Mage::app()->getLayout()->getBlock('js')->append(
    $this->getLayout()->createBlock('adminhtml/template')
        ->setTemplate('system/config/js.phtml')
);
Mage::app()->getLayout()->getBlock('js')->append(
    $this->getLayout()->createBlock('adminhtml/template')
        ->setTemplate('system/config/applicable_country.phtml')
);

Я надеюсь, что вы начали.

Другие вопросы по тегам