php - Custom URL for magento extension -
i building magento extension need custom url frontend set via admin panel config setting extension.
along lines of "set admin url" setting in system settings (which can set in app/etc/local.xml file well).
basically have in config.xml file
<frontend> <routers> <extensionname> <use>standard</use> <args> <module>my_extensionname</module> <frontname>extensionname</frontname> </args> </extensionname> </routers> </frontend> this creates url site.com/extensionname
but want able set url in system/settings tab in admin panel
i have looked through core code , seen glimpses of code (a predispatch models controllers etc think) default admin url key setting
how go this? set observer catch request url? or observer settings change , programmatically create url rewrite?
what content & root template in 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> would still used though using custom url settings
ok not of above info (links) work end (in regards using custom routers etc) because think extension not using collections database landing page wont have index/index/id values etc.
so went dirty hack job now. see below.
etc/config.xml (observer event when admin field setting saved)
<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 (save url rewrite) (edited)
public function observersave(varien_event_observer $observer) { #remove old urlrewrite $url = mage::getstoreconfig('myextension/general/url'); $uldurlcollection = mage::getmodel('core/url_rewrite')->getresourcecollection(); $uldurlcollection->getselect() ->where('id_path=?', 'myextension');//edit: 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 new setting saved') ->setrequestpath('myextension/url/'.$url.'');//edit: added rewrite url paths rewrite can never conflict if admin setting field set "key default url" "admin" or "checkout" or "contacts" etc $modelurlrewrite->save(); } controllers/indexcontroller.php (redirects if no id...) (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 root } else { $id = $this->getrequest()->getparam('id'); if($id == $url) { $this->loadlayout( array( 'default', 'myextension_index_index' ));//edit: added if statement see if myextension/index/index/id matched admin setting, if not redirect root $this->renderlayout(); }else{ $this->_redirect('/');//edit: changed redirect root } } } so @ point have urls at: (edited)
site.com/myextension/url/myadminfieldvalue
&
site.com/myextension/index/index/id/myadminfieldvalue
(edited) in template/myextension/myextension.phtml
<?php if($current_url == ''.$base_url.'myextension/index/index'){ ?> <p>disabled cause dont want info @ url..</p> <?php }else{ ?> <p>show data because accessing myextension/index/index via rewrite /myextension/url/myadminfieldvalue.</p> <?php } ?> a bit more work needed achieve want works me , hope others may find useful.
Comments
Post a Comment