自定义 URL 用于 magento 扩展

Custom URL for magento extension

我正在构建一个 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 站点。com/extensionname

但我希望能够在管理面板的 system/settings 选项卡中设置 url

我查看了核心代码并看到了一些代码(我认为是预调度模型控制器等)这是默认管理员 url 键设置

我该怎么做?我会设置一个观察者来捕获对 url 的请求吗?或观察者设置更改并以编程方式创建 url 重写?

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,它仍然会被使用吗

好的,我无法获得上述任何信息(链接)(关于使用自定义路由器等),因为我认为我的扩展没有使用数据库中的任何集合作为它的登陆页面所以不会有 index/index/id 值等

所以现在用一个肮脏的黑客来完成这项工作。见下文。

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 重写)(已编辑)

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();
}

controllers/IndexController.php(如果没有 ID 则重定向...)(已编辑)

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
        }
    }

}

所以此时我有 URLs:(已编辑)

网站.com/myextension/url/myadminfieldvalue

&

site.com/myextension/index/index/id/myadminfieldvalue

(已编辑) 但在 template/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 } ?>

需要做更多的工作才能实现我想要的,但目前它对我有用,希望其他人会发现它有用。