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')
);
Я надеюсь, что вы начали.