前言
在Magento中上传单个文件很简单,可以直接在继承的Mage_Adminhtml_Block_Widget_Form
类中直接添加如下组件Field:
对于图片:
$fieldset->addField('test_pic', 'image', array(
'label' => "标签",
'name' => 'test_pic',
));
对于文件:
$fieldset->addField('test_file', 'file', array(
'label' => "标签",
'name' => 'test_file',
));
处理时只需在对应后台的控制器action中使用Varien_File_Uploader
工具类来进行获取。
但这个组件只能处理单文件上传,那么对于多文件上传该怎么做呢?通过观察原Magento功能可知,只有在商品的编辑或创建时,有一个上传多图片的功能(见下图),该功能实现的就是多文件上传!
于是我尝试阅读并理解它的原代码,知道了原来在Magento中处理多文件上传使用的是一个叫Flex Uploader的Flash插件实现的,并且对应的Magento系统给了一个封装好的Block类进行处理:Mage_Adminhtml_Block_Media_Uploader
,下面就个人所实现的一个多文件上传插件来谈谈具体实现步骤。
1.首先,实现Block类
在实现多文件上传时,需要先实现前台HTML页面,这里通过自定一个Block类来包含Flex Uploader组件来实现,这个类可以继承普通的后台Block类:Mage_Adminhtml_Block_Widget
,如下在其重置的_prepareLayout
方法中添加Mage_Adminhtml_Block_Media_Uploader
子块Block:
protected function _prepareLayout() {
// 添加Mage_Adminhtml_Block_Media_Uploader子块Block
$this->setChild('uploader', $this->getLayout()->createBlock('adminhtml/media_uploader'));
$this->getChild('uploader')->getConfig()
// 文件上传处理action
->setUrl(Mage::getModel('adminhtml/url')->addSessionParam()->getUrl('*/material/upload'))
->setFileField('material_files')
->setFilters(array(
'all' => array(