Я создаю расширение magento, для которого потребуется настраиваемый URL-адрес для интерфейса, который устанавливается с помощью настройки конфигурации панели администратора для расширения.
В соответствии с настройками "set admin url" в системных настройках (которые также могут быть установлены в файле app/etc/local.xml).
в основном у меня в файле config.xml
<frontend>
<routers>
<extensionname>
<use>standard</use>
<args>
<module>My_Extensionname</module>
<frontName>extensionname</frontName>
</args>
</extensionname>
</routers>
</frontend>
Это создает URL-адрес site.com/extensionname
Но я хочу иметь возможность устанавливать URL-адрес на вкладке system/settings на панели администратора
Я просмотрел основной код и увидел проблески кода, который делает (например, контроллеры модели predispatch и т.д.), Для настройки ключа URL-адреса администратора по умолчанию
Как я могу это сделать? Могу ли я создать наблюдателя, чтобы поймать запрос на URL? или настройки наблюдателя изменяются и программно создают переписывание URL?
Как насчет шаблона content & root, а также в layout/extensionname.xml?
<layout version="0.1.0">
<extensionname_index>
<reference name="root">
<action method="setTemplate"><template>extensionname/page.phtml</template></action>
</reference>
<reference name="content">
<block type="extensionname/extensionname" name="extensionname" template="extensionname/extensionname.phtml" />
</reference>
</extensionname_index>
Будет ли это все еще использоваться, хотя я бы использовал пользовательский URL из настроек
Ок не могла получить какую-либо из вышеперечисленных сведений (ссылок) для работы с моего конца (в отношении использования настраиваемых маршрутизаторов и т.д.), Поскольку я думаю, что мое расширение не использует какие-либо коллекции из базы данных в качестве своей целевой страницы, поэтому не имеет индекса/значения индекса/идентификатора и т.д.
Так что пошел с грязным хаком, чтобы сделать эту работу на данный момент. Смотри ниже.
etc/config.xml (событие наблюдателя при сохранении настроек поля администратора)
<config>
...
<frontend>
<routers>
<myextension>
<use>standard</use>
<args>
<module>Mycompany_Myextension</module>
<frontName>myextension</frontName>
</args>
</myextension>
</routers>
...
</frontend>
<global>
...
<events>
<admin_system_config_changed_section_myextension>
<observers>
<myextension>
<type>singleton</type>
<class>myextension/observer</class>
<method>observersave</method>
</myextension>
</observers>
</admin_system_config_changed_section_myextension>
</events>
...
</global>
</config>
Model/Observer.php (Сохранить URL-адрес перезаписи) (EDITED)
public function observersave(Varien_Event_Observer $observer)
{
#remove the old urlrewrite
$url = Mage::getStoreConfig('myextension/general/url');
$uldURLCollection = Mage::getModel('core/url_rewrite')->getResourceCollection();
$uldURLCollection->getSelect()
->where('id_path=?', 'myextension');//EDIT: so overwrites on each save
$uldURLCollection->setPageSize(1)->load();
if ( $uldURLCollection->count() > 0 ) {
$uldURLCollection->getFirstItem()->delete();
}
#add url rewrite
$modelURLRewrite = Mage::getModel('core/url_rewrite');
$modelURLRewrite->setIdPath('myextension/'.strtolower($url))
->setTargetPath('myextension/index/index/id/'.$url.'')
->setOptions('')
->setDescription('New URL - Created as a new setting was saved')
->setRequestPath('myextension/url/'.$url.'');//EDIT: added extra rewrite url paths so rewrite can never conflict if admin setting field is set to a "key default url" like "admin" or "checkout" or "contacts" etc
$modelURLRewrite->save();
}
контроллеры /IndexController.php (перенаправляет, если нет идентификатора...) (EDITED)
public function preDispatch()
{
//$url = Mage::getStoreConfig('myextension/general/url');
if ( !strstr($this->getRequest()->getRequestUri(), 'myextension/index/index/id') ) {
parent::preDispatch();
}
}
public function indexAction()
{
$url = Mage::getStoreConfig('myextension/general/url');
if ( trim($this->getRequest()->getParam('id')) == '' ) {
$this->_redirect('/');//Edit: changed redirect to root
} else {
$id = $this->getRequest()->getParam('id');
if($id == $url) {
$this->loadLayout( array(
'default',
'myextension_index_index'
));//EDIT: added if statement to see if myextension/index/index/id matched admin setting, if not redirect to root
$this->renderLayout();
}else{
$this->_redirect('/');//Edit: changed redirect to root
}
}
}
поэтому на данный момент у меня есть URL-адреса по адресу: (EDITED)
site.com/myextension/url/myadminfieldvalue
&
site.com/myextension/index/index/id/myadminfieldvalue
(EDITED), но в шаблоне /myextension/myextension.phtml
<?php if($current_url == ''.$base_url.'myextension/index/index'){ ?>
<p>Disabled cause i dont really want info at this url..</p>
<?php }else{ ?>
<p>show data because your accessing myextension/index/index via the rewrite /myextension/url/myadminfieldvalue.</p>
<?php } ?>
Для достижения того, чего я хочу, требуется немного больше работы, но на данный момент это работает для меня и надеюсь, что другие могут найти это полезным.