2017-02-15 4 views
1

Ich schrieb ein benutzerdefiniertes Slider-Modul, die Folie Elemente Formular enthalten. In diesem Formular gibt es ein Bildfeld zum Hochladen von Bildern.Magento2: Fehler beim Versuch, Daten mit Bild in Admin zu speichern

Als ich zum ersten Mal erstellen wird ein Schieber Artikel mit einem Bild alles gut funktioniert und ich kann alle meine Daten retriview aber wenn ich es bearbeiten und speichern Sie es wieder habe ich diesen Fehler:

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

I habe diesen Fehler, auch wenn das Bildfeld nicht geändert wurde.

bei ligne 51 dieser Datei ist der Code:

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

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

Ich loggte $ this-> getValue() und ich erhielt: imagepath/image.jpg, wenn ich den Schieber Artikel zum ersten Mal erstellen und Array ([Wert] =>http://imagepath/image.jpg), wenn ich die Folie bearbeiten.

Hier ist meine Form Feldcode:

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

Hier ist meine Controller Save.php Datei:

<?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); 
    } 
} 

} 

Vielen Dank im Voraus für Ihre Antworten.

Antwort

0

Sie müssen den Code des Speicherns basierend auf Aktion ändern. Bedeutet, dass entweder ein neuer Gegenstand zum ersten Mal gespeichert wird oder jeder Gegenstand jederzeit bearbeitet werden kann.

Sie können Code wie folgt tun.

+0

Danke für deine Antwort. Ich habe keinen Zugriff auf diesen Wert in Save.php-Datei. Ein Fehler tritt in Magento/Framework/Data/Form/Element/Image.php in Zeile 51 auf, was der Kernmodulcode ist. Entschuldigung, dass ich später btw. –

+0

müssen Sie Ihren Code ändern, damit Sie auf diesen Wert im Code zugreifen können. –

0

Sie müssen das Bildformat von Array zu String ändern, bevor Sie Daten speichern Um dieses Problem zu lösen, fügen Sie einfach den folgenden Code vor '$model->setData($data);' in Ihre 'save.php' Datei ein.

-Code ist:

if(isset($data['image_url']['value'])) 
{ 
    $data['image_url'] = $data['image_url']['value']; 
} 
Verwandte Themen