フィールドにアタッチされたクラスを必要とせずにそれを行う方法を見つけました。つまり、フォーム要素にはクラスがアタッチされていますが、レンダラーとしてはアタッチされていません。
列は次のように定義する必要があります。
<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
。
これでうまくいく。私はまだデータベースに画像を保存するのに苦労していますが、それは全く異なる問題です。カテゴリエンティティのフィールドを
インスピレーションとして使用しimage
ました