I'm currently working on a project which requires an area in the Admin panel which allows the admin to modify order related data (custom data set on order items) that can only be handled through a custom made GUI using Backbone/FabricJS. This GUI operates as a pseudo Product Page to load product related data relevant to the tasks performed within the GUI. This is done through a route defined in my module, which also has an associated layout file with a single layout handle for the frontend route to the GUI. I would like to provide access to this GUI from within the Admin panel (specifically from the order edit page as a link/button), however it is proving difficult to add that layout handle (including it's updates) to the adminhtml layout.
Can anyone suggest a way to load frontend layout handles to the adminhtml layout XML to provide such functionality?
Frontend Layout XML
<?xml version="1.0" encoding="UTF-8"?> <layout> <gui_index_index> <reference name="root"> <action method="setTemplate"><template>page/gui.phtml</template></action> </reference> <remove name="footer"/> <remove name="left"/> <remove name="header"/> <reference name="head"> <!-- don't index the customizer --> <action method="setRobots"><value>NOINDEX,NOFOLLOW</value></action> <!--add productjs for options pricing--> <action method="addJs"><script>varien/product.js</script></action> <!--remove extraneous css --> <action method="removeItem"><type>skin_css</type><name>css/styles.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/widgets.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/cloud-zoom.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/slider.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/local.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/mobile.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/animation.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/settings.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/captions.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/override.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/print.css</name></action> <action method="removeItem"><type>skin_css</type><name>css/responsive.css</name></action> <!--remove extraneous js --> <action method="removeItem"><type>js</type><name>lib/ccard.js</name></action> <action method="removeItem"><type>js</type><name>scriptaculous/builder.js</name></action> <action method="removeItem"><type>js</type><name>scriptaculous/dragdrop.js</name></action> <action method="removeItem"><type>js</type><name>scriptaculous/controls.js</name></action> <action method="removeItem"><type>js</type><name>scriptaculous/slider.js</name></action> <action method="removeItem"><type>js</type><name>lib/ccard.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/cloud-zoom.1.0.2.min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.ui.totop.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.hoverIntent.min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.masonry.min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.anystretch.min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.mousewheel.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.easing.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.flexslider-min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.themepunch.plugins.min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.themepunch.revolution.min.js</name></action> <action method="removeItem"><type>js</type><name>queldorei/jquery.jcarousel.min.js</name></action> <action method="removeItem"><type>skin_js</type><name>js/enterprise/catalogevent.js</name></action> <action method="removeItem"><type>skin_js</type><name>js/enterprise/wishlist.js</name></action> <action method="removeItem"><type>skin_js</type><name>js/script.js</name></action> <!--add customizer css / js --> <action method="addItem"><type>skin_css</type><name>css/customizer.css</name></action> <action method="addItem"><type>skin_css</type><name>js/bootstrap-timepicker/bootstrap-timepicker.css</name></action> <action method="addItem"><type>skin_js</type><name>js/customizer/customizer.js</name></action> <!--add smallipop css from git submodule repo --> <action method="addItem"><type>js_css</type><name>lib/smallipop/css/jquery.smallipop.min.css</name></action> </reference> <reference name="content"> <block type="core/text_list" name="product.json"> <block type="catalog/product_view" name="product.options.json" template="gui/product/view/view.phtml"> <block type="gui/catalog_product_view" name="product.info.options.wrapper" as="product_options_wrapper" template="gui/product/view/options/wrapper.phtml" translate="label"> <label>Info Column Options Wrapper</label> <block type="catalog/product_view_options" name="product.info.options" as="product_options" template="catalog/product/view/options.phtml"> <action method="addOptionRenderer"><type>text</type><block>catalog/product_view_options_type_text</block><template>catalog/product/view/options/type/text.phtml</template></action> <action method="addOptionRenderer"><type>file</type><block>catalog/product_view_options_type_file</block><template>catalog/product/view/options/type/file.phtml</template></action> <action method="addOptionRenderer"><type>select</type><block>catalog/product_view_options_type_select</block><template>catalog/product/view/options/type/select.phtml</template></action> <action method="addOptionRenderer"><type>date</type><block>catalog/product_view_options_type_date</block><template>catalog/product/view/options/type/date.phtml</template></action> </block> <block type="gui/bundle_catalog_product_view_type_bundle" name="product.info.bundle.options" as="type_bundle_options" template="bundle/catalog/product/view/type/bundle/options.phtml"> <action method="addRenderer"><type>select</type><block>bundle/catalog_product_view_type_bundle_option_select</block></action> <action method="addRenderer"><type>multi</type><block>bundle/catalog_product_view_type_bundle_option_multi</block></action> <action method="addRenderer"><type>radio</type><block>bundle/catalog_product_view_type_bundle_option_radio</block></action> <action method="addRenderer"><type>checkbox</type><block>bundle/catalog_product_view_type_bundle_option_checkbox</block></action> </block> </block> </block> <block type="gui/bundle_catalog_product_view_type_bundle" name="bundle.tojson" template="gui/product/view/type/bundle.phtml" /> <block type="gui/catalog_product_view" name="product.sides" template="gui/product/view/sides.phtml" /> </block> <block type="core/template" name="options_js" template="catalog/product/view/options/js.phtml" output="toHtml"/> </reference> <reference name="product.options.json"> <block type="bundle/catalog_product_view_type_bundle" name="product.info.bundle" as="product_type_data" template="bundle/catalog/product/view/type/bundle.phtml"> <action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>gui/product/view/price.phtml</template></action> </block> </reference> <reference name="before_body_end"> <block type="core/text" name="amd.js.loader"> <action method="setText"><text><![CDATA[<script data-main="/js/customizer/main" src="/js/lib/requirejs/require.js"></script>]]></text></action> </block> <block type="core/text" name="font.js.loader"> <action method="setText"><text><![CDATA[<script src="//ajax.googleapis.com/ajax/libs/webfont/1.5.0/webfont.js"></script>]]></text></action> </block> </reference> </gui_index_index> <gui_project_load> <update handle="gui_index_index"/> <remove name="product.json"/> </gui_project_load> </layout> Adminhtml Layout XML:
<?xml version="1.0" encoding="UTF-8"?> <layout> <adminhtml_gui_index> <update handle="gui_index_index" /> </adminhtml_gui_index> </layout> Adminhtml Index Action:
public function indexAction() { $appEmulation = Mage::getSingleton('core/app_emulation'); $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation('default','frontend'); /* Mage::getDesign()->setArea('frontend'); Mage::getDesign()->setTheme((string)Mage::app()->getConfig()->getNode('stores/default/design/theme/template')); Mage::getDesign()->setPackageName((string)Mage::app()->getConfig()->getNode('stores/default/package/name')); */ //$this->getLayout()->getUpdate()->addHandle('gui_index_index'); //$this->loadLayoutUpdates(); //$this->loadLayout('gui_index_index', true, true); $this->loadLayout(); //$this->getLayout()->getUpdate()->load('gui_index_index'); //$this->getLayout()->generateXml(); //var_dump(Mage::app()->getLayout()->getUpdate()->getHandles());die(); $this->renderLayout(); $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo); }