Php Magento-Can';t在自定义模块中上载文件

Php Magento-Can';t在自定义模块中上载文件,php,image,file,magento,upload,Php,Image,File,Magento,Upload,我正在magento中编辑一个自定义插件,其中我需要添加一个字段来上传图像,并将其路径与其他数据一起保存在数据库中。表单可以很好地处理附加数据以及数据库记录。但是,$\u FILES变量似乎总是返回空的。更奇怪的是,每当我尝试在模块中上载图像时,媒体目录中总是会生成一个名为“cache2ca019d1e2db75b611e5f3aa5c932970”的文件 我在这里发现过有类似问题的人,但所提出的解决方案都不适合我。我迷路了=/ 这是我的表格文件: <?php class Smashin

我正在magento中编辑一个自定义插件,其中我需要添加一个字段来上传图像,并将其路径与其他数据一起保存在数据库中。表单可以很好地处理附加数据以及数据库记录。但是,$\u FILES变量似乎总是返回空的。更奇怪的是,每当我尝试在模块中上载图像时,媒体目录中总是会生成一个名为“cache2ca019d1e2db75b611e5f3aa5c932970”的文件

我在这里发现过有类似问题的人,但所提出的解决方案都不适合我。我迷路了=/

这是我的表格文件

<?php 
class SmashingMagazine_BrandDirectory_Block_Adminhtml_Brand_Edit_Form
extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
    // instantiate a new form to display our brand for editing
    $form = new Varien_Data_Form(array(
        'id' => 'edit_form',
        'action' => $this->getUrl(
            'smashingmagazine_branddirectory_admin/brand/edit', 
            array(
                '_current' => true,
                'continue' => 0,
            )
        ),
        'method' => 'post',
        'enctype' => 'multipart/form-data'
    ));
    $form->setUseContainer(true);
    $this->setForm($form);

    // define a new fieldset, we only need one for our simple entity
    $fieldset = $form->addFieldset(
        'general',
        array(
            'legend' => $this->__('Brand Details')
        )
    );

    $brandSingleton = Mage::getSingleton(
        'smashingmagazine_branddirectory/brand'
    );

    // add the fields we want to be editable
    $this->_addFieldsToFieldset($fieldset, array(
        'name' => array(
            'label' => $this->__('Name'),
            'input' => 'text',
            'required' => true,
        ),
        'url_key' => array(
            'label' => $this->__('URL Key'),
            'input' => 'text',
            'required' => true,
        ),
        'image' => array(
            'label' => $this->__('Image'),
            'input' => 'image',
            'required' => true,
            'disabled' => false,
            'readonly' => true, 
        ),
        'visibility' => array(
            'label' => $this->__('Visibility'),
            'input' => 'select',
            'required' => true,
            'options' => $brandSingleton->getAvailableVisibilies(),
        ),


        /**
         * Note: we have not included created_at or updated_at,
         * we will handle those fields ourself in the Model before save.
         */
    ));

    return $this;
}

/**
 * This method makes life a little easier for us by pre-populating 
 * fields with $_POST data where applicable and wraps our post data in 
 * 'brandData' so we can easily separate all relevant information in
 * the controller. You can of course omit this method entirely and call
 * the $fieldset->addField() method directly.
 */
protected function _addFieldsToFieldset(
    Varien_Data_Form_Element_Fieldset $fieldset, $fields)
{
    $requestData = new Varien_Object($this->getRequest()
        ->getPost('brandData'));

    foreach ($fields as $name => $_data) {
        if ($requestValue = $requestData->getData($name)) {
            $_data['value'] = $requestValue;
        }

        // wrap all fields with brandData group
        $_data['name'] = "brandData[$name]";

        // generally label and title always the same
        $_data['title'] = $_data['label'];

        // if no new value exists, use existing brand data
        if (!array_key_exists('value', $_data)) {
            $_data['value'] = $this->_getBrand()->getData($name);
        }

        // finally call vanilla functionality to add field
        $fieldset->addField($name, $_data['input'], $_data);
    }

    return $this;
}

/**
 * Retrieve the existing brand for pre-populating the form fields.
 * For a new brand entry this will return an empty Brand object.
 */
protected function _getBrand() 
{
    if (!$this->hasData('brand')) {
        // this will have been set in the controller
        $brand = Mage::registry('current_brand');

        // just in case the controller does not register the brand
        if (!$brand instanceof 
                SmashingMagazine_BrandDirectory_Model_Brand) {
            $brand = Mage::getModel(
                'smashingmagazine_branddirectory/brand'
            );
        }

        $this->setData('brand', $brand);
    }

    return $this->getData('brand');
}
}
<?php
class SmashingMagazine_BrandDirectory_Adminhtml_BrandController
extends Mage_Adminhtml_Controller_Action
{
/**
 * Instantiate our grid container block and add to the page content.
 * When accessing this admin index page we will see a grid of all
 * brands currently available in our Magento instance, along with
 * a button to add a new one if we wish.
 */
public function indexAction()
{
    // instantiate the grid container
    $brandBlock = $this->getLayout()
        ->createBlock('smashingmagazine_branddirectory_adminhtml/brand');

    // add the grid container as the only item on this page
    $this->loadLayout()
        ->_addContent($brandBlock)
        ->renderLayout();
}

/**
 * This action handles both viewing and editing of existing brands.
 */
public function editAction()
{
    /**
     * retrieving existing brand data if an ID was specified,
     * if not we will have an empty Brand entity ready to be populated.
     */
    $brand = Mage::getModel('smashingmagazine_branddirectory/brand');
    if ($brandId = $this->getRequest()->getParam('id', false)) {
        $brand->load($brandId);

        if ($brand->getId() < 1) {
            $this->_getSession()->addError(
                $this->__('This brand no longer exists.')
            );
            return $this->_redirect(
                'smashingmagazine_branddirectory_admin/brand/index'
            );
        }
    }

    // process $_POST data if the form was submitted
    if ($postData = $this->getRequest()->getPost('brandData')) {
        try {
            // image upload
             if(isset($_FILES['image']['name']) and (file_exists($_FILES['image']['tmp_name']))) 
                {                             
                    try 
                    {
                        $path = Mage::getBaseDir('media') . DS . 'banner' . DS;
                        $uploader = new Varien_File_Uploader('image');

                        $uploader
                   ->setAllowedExtensions(array('jpg','png','gif','jpeg'));
                        $uploader->setAllowRenameFiles(false);
                        $uploader->setFilesDispersion(false);
                        $destFile = $path.$_FILES[$image]['name'];
                        $filename = $uploader->getNewFileName($destFile);
                                    $uploader->save($path, $filename);

                        $data['img'] = $_FILES['image']['name'];
                    }
                    catch(Exception $e) 
                    {

                    }
                }
                else 
                {                                                     
                    if(isset($data['image']['delete']) && $postData['image']['delete'] == 1)
                         $data['image'] = '';
                    else
                         unset($data['image']);
                }



            // continue
            $brand->addData($postData);
            $brand->save();

            $this->_getSession()->addSuccess(
                $this->__($_FILES['image']['name'])
            );

            // redirect to remove $_POST data from the request
            return $this->_redirect(
                'smashingmagazine_branddirectory_admin/brand/edit', 
                array('id' => $brand->getId())
            );
        } catch (Exception $e) {
            Mage::logException($e);
            $this->_getSession()->addError($e->getMessage());
        }

        /**
         * if we get to here then something went wrong. Continue to
         * render the page as before, the difference being this time 
         * the submitted $_POST data is available.
         */
    }

    // make the current brand object available to blocks
    Mage::register('current_brand', $brand);

    // instantiate the form container
    $brandEditBlock = $this->getLayout()->createBlock(
        'smashingmagazine_branddirectory_adminhtml/brand_edit'
    );

    // add the form container as the only item on this page
    $this->loadLayout()
        ->_addContent($brandEditBlock)
        ->renderLayout();
}

public function deleteAction()
{
    $brand = Mage::getModel('smashingmagazine_branddirectory/brand');

    if ($brandId = $this->getRequest()->getParam('id', false)) {
        $brand->load($brandId);
    }

    if ($brand->getId() < 1) {
        $this->_getSession()->addError(
            $this->__('This brand no longer exists.')
        );
        return $this->_redirect(
            'smashingmagazine_branddirectory_admin/brand/index'
        );
    }

    try {
        $brand->delete();

        $this->_getSession()->addSuccess(
            $this->__('The brand has been deleted.')
        );
    } catch (Exception $e) {
        Mage::logException($e);
        $this->_getSession()->addError($e->getMessage());
    }

    return $this->_redirect(
        'smashingmagazine_branddirectory_admin/brand/index'
    );
}

/**
 * Thanks to Ben for pointing out this method was missing. Without 
 * this method the ACL rules configured in adminhtml.xml are ignored.
 */
protected function _isAllowed()
{
    /**
     * we include this switch to demonstrate that you can add action 
     * level restrictions in your ACL rules. The isAllowed() method will
     * use the ACL rule we have configured in our adminhtml.xml file:
     * - acl 
     * - - resources
     * - - - admin
     * - - - - children
     * - - - - - smashingmagazine_branddirectory
     * - - - - - - children
     * - - - - - - - brand
     * 
     * eg. you could add more rules inside brand for edit and delete.
     */
    $actionName = $this->getRequest()->getActionName();
    switch ($actionName) {
        case 'index':
        case 'edit':
        case 'delete':
            // intentionally no break
        default:
            $adminSession = Mage::getSingleton('admin/session');
            $isAllowed = $adminSession
                ->isAllowed('smashingmagazine_branddirectory/brand');
            break;
    }

    return $isAllowed;
}
}
getRequest()->getActionName();
开关($actionName){
案例“索引”:
案例“编辑”:
案例“删除”:
//故意不休息
违约:
$adminSession=Mage::getSingleton('admin/session');
$isAllowed=$adminSession
->是允许的('smashingmagazine_branddirectory/brand');
打破
}
返回$I是允许的;
}
}
提前谢谢

// add the fields we want to be editable
    $this->_addFieldsToFieldset($fieldset, array(
        'name' => array(
            'label' => $this->__('Name'),
            'input' => 'text',
            'required' => true,
        ),
        'url_key' => array(
            'label' => $this->__('URL Key'),
            'input' => 'text',
            'required' => true,
        ),
        'image' => array(
            'label' => $this->__('Image'),
            'input' => 'image',
            'name' => 'image',
            'required' => true,
            'disabled' => false, 
        ),
        'visibility' => array(
            'label' => $this->__('Visibility'),
            'input' => 'select',
            'required' => true,
            'options' => $brandSingleton->getAvailableVisibilies(),
        ),


        /**
         * Note: we have not included created_at or updated_at,
         * we will handle those fields ourself in the Model before save.
         */
    ));

尝试在图像上添加name属性。

您解决过问题吗?我遇到了同样的问题,在任何地方都找不到答案,我找到的所有结果都告诉我要确保我发送了多部分数据,这就是我在这个问题上所能找到的全部。这里有相同的问题:@IqbalKhan您是否也检查了此列表,也许这是您联系了插件devoloper?'image'=>array('label'=>$this->.'image'),'input'=>'image','name'=>'image''required'=>true,)