我編寫了一個包含幻燈片項目窗體的自定義滑塊模塊。在這種形式中有一個圖像字段來上傳圖像。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);
}
}
}
預先感謝您的回答。
感謝您的回答。 我無法在Save.php文件中訪問此值。第51行是Magento/Framework/Data/Form/Element/Image.php,這是核心模塊代碼。 我很抱歉回答這個遲到的順便說一句。 –
您需要更改代碼,以便您可以在代碼中訪問此值。 –