【问题标题】:Custom URL for magento extensionmagento 扩展的自定义 URL
【发布时间】:2015-09-24 13:43:55
【问题描述】:

我正在构建一个 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 键设置

我会怎么做呢?我会设置一个观察者来捕获对 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,这仍然可以使用吗

【问题讨论】:

    标签: php xml magento admin


    【解决方案1】:

    好的,我无法从我的一端获取上述任何信息(链接)(关于使用自定义路由器等),因为我认为我的扩展程序没有使用数据库中的任何集合,因为它只是一个登录页面,所以不会有 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
            }
        }
    
    }
    

    所以此时我的网址位于:(EDITED)

    site.com/myextension/url/myadminfieldvalue

    &

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

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

    需要做更多的工作才能实现我想要的,但现在它对我有用,希望其他人会觉得这很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多