현장에 수업을 첨부하지 않고도 할 수있는 방법을 찾았습니다. 폼 요소에는 클래스가 있지만 렌더러는 아닙니다.
열은 다음과 같이 정의해야합니다.
<field name="image">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">string</item>
<item name="source" xsi:type="string">[entity]</item>
<item name="label" xsi:type="string" translate="true">Image</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="formElement" xsi:type="string">fileUploader</item>
<item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
<item name="previewTmpl" xsi:type="string">[Namespace]_[Module]/image-preview</item>
<item name="required" xsi:type="boolean">false</item>
<item name="uploaderConfig" xsi:type="array">
<item name="url" xsi:type="url" path="[namespace_module]/[entity]_image/upload"/>
</item>
</item>
</argument>
</field>
또한에서 참조하는 미리보기 템플릿 파일을 만들어야했습니다 [Namespace]_[Module]/image-preview
.
그것은 app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
다음과 같습니다
<div class="file-uploader-summary">
<div class="file-uploader-preview">
<a attr="href: $parent.getFilePreview($file)" target="_blank">
<img
class="preview-image"
tabindex="0"
event="load: $parent.onPreviewLoad.bind($parent)"
attr="
src: $parent.getFilePreview($file),
alt: $file.name">
</a>
<div class="actions">
<button
type="button"
class="action-remove"
data-role="delete-button"
attr="title: $t('Delete image')"
click="$parent.removeFile.bind($parent, $file)">
<span translate="'Delete image'"/>
</button>
</div>
</div>
<div class="file-uploader-filename" text="$file.name"/>
<div class="file-uploader-meta">
<text args="$file.previewWidth"/>x<text args="$file.previewHeight"/>
</div>
</div>
이 코드는 다음과 같은 필드를 생성합니다.
이미지를 실시간으로 업로드하면 다음과 같습니다.
url
내부 의 항목 uploaderConfig
은 업로드시 이미지가 게시되는 URL입니다. 그래서 나는 이것을 만들어야했다.
namespace [Namespace]\[Module]\Controller\Adminhtml\[Entity]\Image;
use Magento\Framework\Controller\ResultFactory;
/**
* Class Upload
*/
class Upload extends \Magento\Backend\App\Action
{
/**
* Image uploader
*
* @var \[Namespace]\[Module]\Model\ImageUploader
*/
protected $imageUploader;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \[Namespace]\[Module]\Model\ImageUploader $imageUploader
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\[Namespace]\[Module]\Model\ImageUploader $imageUploader
) {
parent::__construct($context);
$this->imageUploader = $imageUploader;
}
/**
* Check admin permissions for this controller
*
* @return boolean
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('[Namespace]_[Module]::[entity]');
}
/**
* Upload file controller action
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
try {
$result = $this->imageUploader->saveFileToTmpDir('image');
$result['cookie'] = [
'name' => $this->_getSession()->getName(),
'value' => $this->_getSession()->getSessionId(),
'lifetime' => $this->_getSession()->getCookieLifetime(),
'path' => $this->_getSession()->getCookiePath(),
'domain' => $this->_getSession()->getCookieDomain(),
];
} catch (\Exception $e) {
$result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
}
return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result);
}
}
이 클래스는와 [Namespace]\[Module]\Model\ImageUploader
비슷한 인스턴스를 사용합니다 \Magento\Catalog\Model\ImageUploader
.
이 솔기가 작동합니다. 여전히 이미지를 DB에 저장하는 데 문제가 있지만 완전히 다른 문제입니다. 카테고리 엔티티
의 image
필드를 영감으로 사용했습니다.