To add a second templating directory to the adminhtml, for example:
app/design/adminhtml/default/custom/
you'll have to modify the following file app/code/core/Mage/Adminhtml/Block/Template.php
add the following __construct
method
public function __construct()
{
Mage::getDesign()->setTheme('custom');
}
This will set the custom
directory as primary templating directory and default
as fallback
Of course it's better to overwrite it from your own extension. Create a class that extends the Mage_Adminhtml_Block_Template
class with just that constructor and add the following to your config.xml
[...]
<global>
<blocks>
<customextension>
<class>Your_Customextension_Block</class>
</customextension>
<adminhtml>
<rewrite>
<!-- allow for extra layer of adminhtml templating -->
<template>Your_Customextension_Block_Mage_Adminhtml_Template</template>
</rewrite>
</adminhtml>
</blocks>
</global>
[...]
Here is an example of how I use admin sessions on my forms.
I use a protected function to get the adminhtml session
/**
* Retrieve adminhtml session model object
*
* @return Mage_Adminhtml_Model_Session
*/
protected function _getSession()
{
return Mage::getSingleton('adminhtml/session');
}
Then, when I need it, for error messages I call it this way, from inside a controller
$order = $this->_getOrder();
if(!(int)$order->getId())
{
$this->_getSession()->addError('Unable to load test order');
$this->_redirect('*/*/index');
return false;
}
That should produce a message like this on the redirect
Here is my process on creating forms in Magento for the admin.
this example is to send emails from our site to test them rather than having to do the action like place an order, or add a comment to a shipment for example.
Step 1, create the module declaration in app/etc/modules
This should be named something like Russell_Emaillog.xml
<?xml version="1.0"?>
<config>
<modules>
<Russell_Emaillog>
<active>true</active>
<codePool>local</codePool>
</Russell_Emaillog>
</modules>
</config>
Step 2: Create the Namespace folder to contain our code in app/code/local
Russell so it should look like app/code/local/Russell
Step 3: create all the folders needed for this module in app/code/local/Russell
Emaillog
Then inside Emaillog create several folders here is the structure
app/code/local/Russell/Emaillog/Block
app/code/local/Russell/Emaillog/Block/Adminhtml
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract
app/code/local/Russell/Emaillog/Block/Adminhtml/Entry
app/code/local/Russell/Emaillog/Block/Adminhtml/Entry/Edit
app/code/local/Russell/Emaillog/Block/Adminhtml/Entry/Edit/Tab
app/code/local/Russell/Emaillog/Controller
app/code/local/Russell/Emaillog/Controller/Entry
app/code/local/Russell/Emaillog/controllers
app/code/local/Russell/Emaillog/controllers/Adminhtml
app/code/local/Russell/Emaillog/controllers/Adminhtml/Emaillog
app/code/local/Russell/Emaillog/etc
app/code/local/Russell/Emaillog/Helper
app/code/local/Russell/Emaillog/Model
app/code/local/Russell/Emaillog/Model/Email
app/code/local/Russell/Emaillog/Model/Resource
app/code/local/Russell/Emaillog/Model/Entry
app/code/local/Russell/Emaillog/sql
*** These next two are in app/design/adminhtml/default/default/ ***
app/design/adminhtml/default/default/template/russell/
app/design/adminhtml/default/default/layout/russell/
Step 4: Now that you have all the folders in place you need to put the PHP files in each, I will just put the names of the files for this step so you can create empty php and xml files for now
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract/Entry/Edit/Tab/General.php
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract/Entry/Edit/Form.php
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract/Entry/Edit/Tabs.php
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract/Entry/Edit.php
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract/Entry/Grid.php
app/code/local/Russell/Emaillog/Block/Adminhtml/Abstract/Entry.php
app/code/local/Russell/Emaillog/Block/Emailtemplate.php
app/code/local/Russell/Emaillog/Controller/Entry/Abstract.php
app/code/local/Russell/Emaillog/controllers/Adminhtml/Emaillog/EntryController.php
app/code/local/Russell/Emaillog/controllers/Adminhtml/Emaillog/TestemailController.php
app/code/local/Russell/Emaillog/etc/adminhtml.xml
app/code/local/Russell/Emaillog/etc/config.xml
app/code/local/Russell/Emaillog/etc/system.xml
app/code/local/Russell/Emaillog/Helper/Data.php
app/code/local/Russell/Emaillog/Model/Email/Template.php
app/code/local/Russell/Emaillog/Model/Resource/Entry/Collection.php
app/code/local/Russell/Emaillog/Model/Resource/Entry.php
app/code/local/Russell/Emaillog/Model/Entry.php
app/code/local/Russell/Emaillog/sql/russell_emaillog_setup/install-0.0.1.php
app/design/adminhtml/default/default/template/russell/emaillog/view.phtml
app/design/adminhtml/default/default/layout/russell/emaillog.xml
My response was too large to have this all in one Answer, this is part 1
Best Answer
This is somehow a feature. Here is how
addError
,addSuccess
,addNotice
,addWarning
work.The message you give as a parameter for those methods are added to the session.
when a page is viewed, Magento checks in the session for any messages.
If there are any, they are displayed and removed from the session.
So when you do an action (like refreshing cache types for example) and the action is finished, but the redirect is not complete, it means you will have the messages in the session already and refreshing any other page will display them and remove them from session.
I don't think there is a way to "fix" this. This also happens on frontend if you move fast enough.