[英]Magento2: error when trying to save data with image in admin
我寫了一個自定義的滑塊模塊,其中包括幻燈片項目表單。 在此表單中,有一個圖像字段可上傳圖像。
當我第一次創建帶有圖像的幻燈片項目時,一切工作正常,我可以檢索所有數據,但是當我對其進行編輯並再次保存時,出現此錯誤:
1個異常:異常#0(異常):注意:第51行的/Users/louisserre/Sites/messika/lib/internal/Magento/Framework/Data/Form/Element/Image.php中的數組到字符串的轉換
即使圖像字段未更改,我也收到此錯誤。
在此文件的ligne 51中,代碼為:
public function getElementHtml(){
$html = '';
if ((string)$this->getValue()) {
我登錄了$ this-> 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);
}
}
}
預先感謝您的回答。
您需要根據操作更改保存代碼。 意味着新項目將首次保存,或者任何項目都可隨時進行編輯。
您可以執行這樣的代碼。
$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();
}
保存數據之前,需要將圖像格式從數組更改為字符串。 要解決此問題,只需在' $model->setData($data);
之前插入以下代碼即可$model->setData($data);
在您的“ save.php
”文件中。
代碼是:
if(isset($data['image_url']['value']))
{
$data['image_url'] = $data['image_url']['value'];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.