2017-02-15 61 views
1

我編寫了一個包含幻燈片項目窗體的自定義滑塊模塊。在這種形式中有一個圖像字段來上傳圖像。Magento2:嘗試在管理中用圖像保存數據時出錯

當我創建第一次與一個圖像的所有幻燈片項目工作正常,我可以retriview我所有提交的數據,但是當我編輯並再次保存它,我得到這個錯誤:

1 exception(s): Exception #0 (Exception): Notice: Array to string conversion in /Users/louisserre/Sites/messika/lib/internal/Magento/Framework/Data/Form/Element/Image.php on line 51

我即使圖像字段沒有改變也會得到這個錯誤。

在該文件的LIGNE 51的代碼是:

public function getElementHtml(){ 
    $html = ''; 

    if ((string)$this->getValue()) { 

我登錄$這個 - >的getValue()和我得到:ImagePath的/ image.jpg的,當我創建的第一次滑項目, Array([value] =>http://imagepath/image.jpg)當我編輯幻燈片項目。

這裏是我的表單字段代碼:

$fieldset->addField('image_url', 'image', [ 
     'label' => __('Image'), 
     'title' => __('Image'), 
     'name' => 'image_url', 
     'required' => true 
    ]); 

這裏是我的控制器Save.php文件:

<?php 

namespace Ultranoir\Slider\Controller\Adminhtml\SliderItem; 


use Ultranoir\Slider\Model\Slider; 
use Magento\Backend\App\Action; 
use Magento\TestFramework\ErrorLog\Logger; 
use Magento\Framework\App\Filesystem\DirectoryList; 

class Save extends \Magento\Backend\App\Action 
{ 

/** 
* Store manager 
* 
* @var \Magento\Store\Model\StoreManagerInterface 
*/ 
protected $storeManager; 

/** 
* @var \Magento\Framework\Image\Factory 
*/ 
protected $imageFactory; 

/** 
* @var \Magento\Framework\Image\Factory 
*/ 
protected $mediaDirectory; 

/** 
* @var \Magento\Framework\View\Asset\Repository 
*/ 
protected $assetRepo; 

/** 
* @param \Magento\Store\Model\StoreManagerInterface $storeManager 
* @param \Magento\Framework\Image\Factory $imageFactory 
* @param \Magento\Framework\Filesystem $fileSystem 
* @param \Magento\Framework\View\Asset\Repository $assetRepo 
* @param Action\Context $context 
*/ 
public function __construct(\Magento\Store\Model\StoreManagerInterface $storeManager, 
          \Magento\Framework\Image\Factory $imageFactory, 
          \Magento\Framework\Filesystem $fileSystem, 
          \Magento\Framework\View\Asset\Repository $assetRepo, 
          Action\Context $context) 
{ 
    $this->storeManager = $storeManager; 
    $this->imageFactory = $imageFactory; 
    /** @var \Magento\Framework\Filesystem\Directory\Read $mediaDirectory */ 
    $this->mediaDirectory = $fileSystem->getDirectoryRead(DirectoryList::MEDIA); 
    parent::__construct($context); 
} 

/** 
* {@inheritdoc} 
*/ 
protected function _isAllowed() 
{ 
    return $this->_authorization->isAllowed('Ultranoir_Slider::save_slideritem'); 
} 

/** 
* Save action 
* 
* @return \Magento\Framework\Controller\ResultInterface 
*/ 
public function execute() 
{ 
    $data = $this->getRequest()->getPostValue(); 
    /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ 
    $resultRedirect = $this->resultRedirectFactory->create(); 
    if ($data) { 
     /** @var \Ultranoir\Slider\Model\SliderItem $model */ 
     $model = $this->_objectManager->create('\Ultranoir\Slider\Model\SliderItem'); 

     $id = $this->getRequest()->getParam('slider_item_id'); 
     if ($id) { 
      $model->load($id); 
     } 
     /** @var \Ultranoir\Slider\Model\Slider $slider */ 
     $slider = $this->_objectManager->create('\Ultranoir\Slider\Model\Slider'); 
     $slider->load($model->getSliderId()); 

     try{ 
      $data['image_url'] = $this->saveImage(); 

     } catch (\Exception $e) { 
      $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()]; 
      $this->messageManager->addException($e, __('Something went wrong while uploading the file.')); 
      $this->_getSession()->setFormData($data); 
      return $resultRedirect->setPath('*/*/edit', ['slider_item_id' => $this->getRequest()->getParam 
      ('slider_item_id')]); 
     } 

     $model->setData($data); 

     $this->_eventManager->dispatch(
      'ultraslider_slideritem_prepare_save', 
      ['slideritem' => $model, 'request' => $this->getRequest()] 
     ); 

     try { 
      $model->save(); 
      $this->messageManager->addSuccess(__('You saved this item.')); 
      $this->_objectManager->get('Magento\Backend\Model\Session')->setFormData(false); 
      if ($this->getRequest()->getParam('back')) { 
       return $resultRedirect->setPath('*/*/edit', ['slider_item_id' => $model->getId(), '_current' => 
        true]); 
      } 
      return $resultRedirect->setPath('*/*/'); 
     } catch (\Magento\Framework\Exception\LocalizedException $e) { 
      $this->messageManager->addError($e->getMessage()); 
     } catch (\RuntimeException $e) { 
      $this->messageManager->addError($e->getMessage()); 
     } catch (\Exception $e) { 
      $this->messageManager->addException($e, __('Something went wrong while saving the record.')); 
     } 

     $this->_getSession()->setFormData($data); 
     return $resultRedirect->setPath('*/*/edit', ['slider_item_id' => $this->getRequest()->getParam 
     ('slider_item_id')]); 
    } 
    return $resultRedirect->setPath('*/*/'); 
} 

protected function saveImage(){ 
    $uploader = $this->_objectManager->create(
     'Magento\MediaStorage\Model\File\Uploader', 
     ['fileId' => 'image_url'] 
    ); 
    $uploader->setAllowedExtensions(['jpg', 'jpeg', 'gif', 'png']); 
    /** @var \Magento\Framework\Image\Adapter\AdapterInterface $imageAdapter */ 
    $imageAdapter = $this->_objectManager->get('Magento\Framework\Image\AdapterFactory')->create(); 
    $uploader->addValidateCallback('ultraslider_slideritem_image', $imageAdapter, 'validateUploadFile'); 
    $uploader->setAllowRenameFiles(true); 
    $uploader->setFilesDispersion(true); 


    $result = $uploader->save($this->getBaseMediaPath()); 
    $this->generateThumbnails($result['file'], $this->getBaseMediaPath()); 
    $this->_eventManager->dispatch(
     'ultraslider_slideritem_gallery_upload_image_after', 
     ['result' => $result, 'action' => $this] 
    ); 

    unset($result['tmp_name']); 
    unset($result['path']); 

    $result['url'] = $this->getBaseMediaUrl(). $result['file']; 
    return $result['url']; 

} 

protected function getBaseMediaPath(){ 
    return $this->mediaDirectory->getAbsolutePath('slider/slideritem'); 
} 

protected function getBaseMediaUrl(){ 
    return $this->storeManager->getStore()->getBaseUrl(
     \Magento\Framework\UrlInterface::URL_TYPE_MEDIA 
    ).'slider/slideritem'; 
} 

/** 
* @return string 
*/ 
public function getImageUrl($filePath) 
{ 
    if (!$this->mediaDirectory->isFile($filePath)) { 
     $url = $this->assetRepo->getUrl(
      "Ultranoir_Slider::images/slideritem/placeholder/thumbnail.jpg" 
     ); 
    } else { 
     $url = $this->storeManager->getStore()->getBaseUrl(
       \Magento\Framework\UrlInterface::URL_TYPE_MEDIA 
      ) . $filePath; 
    } 

    return $url; 
} 

public function generateThumbnails($fileName, $destinationBaseDir){ 

    $configs = [ 
     [ 
      'width' => 100, 
      'height' => 100 
     ], 
     [ 
      'width' => 200, 
      'height' => 200 
     ], 
    ]; 
    // build new filename (most important params) 


    foreach($configs as $config){ 
     $processor = $this->imageFactory->create($destinationBaseDir.$fileName); 
     $processor->keepTransparency(true); 
     $processor->keepAspectRatio(true); 
     $processor->resize($config['width'], $config['height']); 
     $path = [ 
      $destinationBaseDir, 
      'cache', 
      $this->storeManager->getStore()->getId(), 
      'thumbnail' 
     ]; 
     $path[] = "{$config['width']}x{$config['height']}"; 
     $newFile = implode('/', $path) . $fileName; 
     $processor->save($newFile); 
    } 
} 

} 

預先感謝您的回答。

回答

0

您需要根據操作更改保存代碼。意味着新的項目首次保存或任何時候編輯任何項目。

你可以做這樣的代碼。

$id = $this->getRequest()->getParam('slider_item_id'); 
if ($id) // When Edit Any Image 
{ 
    $image = Array([value]); 
} 
else // When New Image Add 
{ 
    $image = (string)$this->getValue(); 
} 
+0

感謝您的回答。 我無法在Save.php文件中訪問此值。第51行是Magento/Framework/Data/Form/Element/Image.php,這是核心模塊代碼。 我很抱歉回答這個遲到的順便說一句。 –

+0

您需要更改代碼,以便您可以在代碼中訪問此值。 –

0

您需要在保存數據之前將圖像格式從數組更改爲字符串。要解決此問題,請在'save.php'文件中的'$model->setData($data);'之前插入以下代碼。

代碼是:

if(isset($data['image_url']['value'])) 
{ 
    $data['image_url'] = $data['image_url']['value']; 
} 
相關問題