如何在 TYPO3 10 的自定义 extbase 扩展的 flexform 中创建文件上传字段?
How to create a file upload field in flexform of a custom extbase extension in TYPO3 10?
我尝试在 TYPO3 10 中以 extbase 扩展的 flexform 创建文件上传字段。由于 TYPO3 10 不支持 internal_type "file",我尝试了下面给出的代码。
<settings.bgImage>
<TCEforms>
<label>Background Image</label>
<config>
<type>inline</type>
<maxitems>1</maxitems>
<foreign_table>sys_file_reference</foreign_table>
<!--<foreign_field>uid_foreign</foreign_field>-->
<foreign_table_field>tablenames</foreign_table_field>
<foreign_label>uid_local</foreign_label>
<foreign_sortby>sorting_foreign</foreign_sortby>
<foreign_selector>uid_local</foreign_selector>
<foreign_selector_fieldTcaOverride type="array">
<config>
<appearance>
<elementBrowserType>file</elementBrowserType>
<elementBrowserAllowed>jpg,jpeg,png,svg</elementBrowserAllowed>
</appearance>
</config>
</foreign_selector_fieldTcaOverride>
<foreign_match_fields type="array">
<fieldname>image</fieldname>
</foreign_match_fields>
<appearance type="array">
<newRecordLinkAddTitle>1</newRecordLinkAddTitle>
<createNewRelationLinkTitle>Add Image</createNewRelationLinkTitle>
<headerThumbnail>
<field>uid_local</field>
<height>64</height>
<width>64</width>
</headerThumbnail>
</appearance>
</config>
</TCEforms>
</settings.bgImage>
但这也无法正常工作。请帮我解决这个问题。
谢谢
这是一个当前可用的完整 FlexForm,只有一个 FAL-Image 字段。
配置再次更改... :-(
FlexForm 示例
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Example 1</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<!-- example of a working fal image -->
<images>
<label>FAL-Images</label>
<config>
<type>inline</type>
<foreign_table>sys_file_reference</foreign_table>
<foreign_field>uid_foreign</foreign_field>
<foreign_sortby>sorting_foreign</foreign_sortby>
<foreign_table_field>tablenames</foreign_table_field>
<foreign_match_fields>
<!-- this will be stored in sys_file_reference.fieldname -->
<fieldname>image</fieldname>
</foreign_match_fields>
<foreign_label>uid_local</foreign_label>
<foreign_selector>uid_local</foreign_selector>
<overrideChildTca>
<columns>
<uid_local>
<config>
<appearance>
<elementBrowserType>file</elementBrowserType>
<elementBrowserAllowed></elementBrowserAllowed>
</appearance>
</config>
</uid_local>
</columns>
</overrideChildTca>
<filter>
<userFunc>TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter->filterInlineChildren</userFunc>
<parameters>
<allowedFileExtensions></allowedFileExtensions>
<disallowedFileExtensions></disallowedFileExtensions>
</parameters>
</filter>
<appearance>
<useSortable>1</useSortable>
<headerThumbnail>
<field>uid_local</field>
<width>45</width>
<height>45c</height>
</headerThumbnail>
<enabledControls>
<info>1</info>
<new>0</new>
<dragdrop>1</dragdrop>
<sort>0</sort>
<hide>1</hide>
<delete>1</delete>
</enabledControls>
</appearance>
</config>
</images>
<!-- end -->
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
更新:我将在这里展示一个 ViewHelper 以及如何使用它...
模板示例
{namespace t=Your\Extension\ViewHelpers}
<f:for each="{t:FAL(uid=entry.uid, field='image', table='tt_content')}" as="preview">
<div class="preview">
<f:image src="{f:uri.image(image=preview)}" title="{preview.title}" />
<figcaption>{preview.title} {preview.description}</figcaption>
</div>
</f:for>
ViewHelper 示例
<?php
namespace Your\Extension\ViewHelpers;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
use TYPO3\CMS\Core\Resource\ResourceFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class FALViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
public function initializeArguments()
{
$this->registerArgument('table', 'string', '', false);
$this->registerArgument('field', 'string', '', true);
$this->registerArgument('uid', 'integer', '', true);
}
public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
{
$resFactory = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance();
$table = $arguments['table'] != NULL ? $arguments['table'] : 'tt_content';
$field = $arguments['field'];
$uid = intval($arguments['uid']);
$fileRepository = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Resource\FileRepository::class);
$fileObjects = $fileRepository->findByRelation($table, $field, $uid);
return $fileObjects;
}
}
说明
图像通过 table sys_file_reference.
解析
当您查看它时,您会发现,这些字段将填充您的扩展数据:
- table名字,
- 字段名和
- uid_foreign
一个 flexform 字段可能会有 tt_content
作为 tablenames
,image
作为 fieldname
,你的扩展的 uid tt_content 记录为 uid_foreign
.
flexform 定义了 <fieldname>image</fieldname>
...这将成为 fieldname
。
模板必须告诉 ViewHelper 要查找的内容:{t:FAL(uid=entry.uid, field='image', table='tt_content')}
- entry.uid 必须与内容元素的 uid 匹配。
- 字段='image' 必须与 FlexForm 字段名匹配。
- table 必须与存储数据的 table 匹配。(此处:tt_content)
如果您在扩展中使用它,您需要将 table 名称更改为您的 tx_yourextension_whatever
。
您可能还会更改字段名...
备注
这段代码似乎仍然会产生一些弃用警告...我还没有想出如何克服这些:-/
感谢您提供代码。我一直在这里寻找解决方案。
不幸的是,我的模板中显示了错误的图像。
我的流体模板中的输出是这样的:
{f:uri.image(src:'{data.flexform_images}', treatIdAsReference:'1')}
怎么了?
我尝试在 TYPO3 10 中以 extbase 扩展的 flexform 创建文件上传字段。由于 TYPO3 10 不支持 internal_type "file",我尝试了下面给出的代码。
<settings.bgImage>
<TCEforms>
<label>Background Image</label>
<config>
<type>inline</type>
<maxitems>1</maxitems>
<foreign_table>sys_file_reference</foreign_table>
<!--<foreign_field>uid_foreign</foreign_field>-->
<foreign_table_field>tablenames</foreign_table_field>
<foreign_label>uid_local</foreign_label>
<foreign_sortby>sorting_foreign</foreign_sortby>
<foreign_selector>uid_local</foreign_selector>
<foreign_selector_fieldTcaOverride type="array">
<config>
<appearance>
<elementBrowserType>file</elementBrowserType>
<elementBrowserAllowed>jpg,jpeg,png,svg</elementBrowserAllowed>
</appearance>
</config>
</foreign_selector_fieldTcaOverride>
<foreign_match_fields type="array">
<fieldname>image</fieldname>
</foreign_match_fields>
<appearance type="array">
<newRecordLinkAddTitle>1</newRecordLinkAddTitle>
<createNewRelationLinkTitle>Add Image</createNewRelationLinkTitle>
<headerThumbnail>
<field>uid_local</field>
<height>64</height>
<width>64</width>
</headerThumbnail>
</appearance>
</config>
</TCEforms>
</settings.bgImage>
但这也无法正常工作。请帮我解决这个问题。 谢谢
这是一个当前可用的完整 FlexForm,只有一个 FAL-Image 字段。 配置再次更改... :-(
FlexForm 示例
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Example 1</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<!-- example of a working fal image -->
<images>
<label>FAL-Images</label>
<config>
<type>inline</type>
<foreign_table>sys_file_reference</foreign_table>
<foreign_field>uid_foreign</foreign_field>
<foreign_sortby>sorting_foreign</foreign_sortby>
<foreign_table_field>tablenames</foreign_table_field>
<foreign_match_fields>
<!-- this will be stored in sys_file_reference.fieldname -->
<fieldname>image</fieldname>
</foreign_match_fields>
<foreign_label>uid_local</foreign_label>
<foreign_selector>uid_local</foreign_selector>
<overrideChildTca>
<columns>
<uid_local>
<config>
<appearance>
<elementBrowserType>file</elementBrowserType>
<elementBrowserAllowed></elementBrowserAllowed>
</appearance>
</config>
</uid_local>
</columns>
</overrideChildTca>
<filter>
<userFunc>TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter->filterInlineChildren</userFunc>
<parameters>
<allowedFileExtensions></allowedFileExtensions>
<disallowedFileExtensions></disallowedFileExtensions>
</parameters>
</filter>
<appearance>
<useSortable>1</useSortable>
<headerThumbnail>
<field>uid_local</field>
<width>45</width>
<height>45c</height>
</headerThumbnail>
<enabledControls>
<info>1</info>
<new>0</new>
<dragdrop>1</dragdrop>
<sort>0</sort>
<hide>1</hide>
<delete>1</delete>
</enabledControls>
</appearance>
</config>
</images>
<!-- end -->
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
更新:我将在这里展示一个 ViewHelper 以及如何使用它...
模板示例
{namespace t=Your\Extension\ViewHelpers}
<f:for each="{t:FAL(uid=entry.uid, field='image', table='tt_content')}" as="preview">
<div class="preview">
<f:image src="{f:uri.image(image=preview)}" title="{preview.title}" />
<figcaption>{preview.title} {preview.description}</figcaption>
</div>
</f:for>
ViewHelper 示例
<?php
namespace Your\Extension\ViewHelpers;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
use TYPO3\CMS\Core\Resource\ResourceFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class FALViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
public function initializeArguments()
{
$this->registerArgument('table', 'string', '', false);
$this->registerArgument('field', 'string', '', true);
$this->registerArgument('uid', 'integer', '', true);
}
public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
{
$resFactory = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance();
$table = $arguments['table'] != NULL ? $arguments['table'] : 'tt_content';
$field = $arguments['field'];
$uid = intval($arguments['uid']);
$fileRepository = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Resource\FileRepository::class);
$fileObjects = $fileRepository->findByRelation($table, $field, $uid);
return $fileObjects;
}
}
说明
图像通过 table sys_file_reference.
解析当您查看它时,您会发现,这些字段将填充您的扩展数据: - table名字, - 字段名和 - uid_foreign
一个 flexform 字段可能会有 tt_content
作为 tablenames
,image
作为 fieldname
,你的扩展的 uid tt_content 记录为 uid_foreign
.
flexform 定义了 <fieldname>image</fieldname>
...这将成为 fieldname
。
模板必须告诉 ViewHelper 要查找的内容:{t:FAL(uid=entry.uid, field='image', table='tt_content')}
- entry.uid 必须与内容元素的 uid 匹配。
- 字段='image' 必须与 FlexForm 字段名匹配。
- table 必须与存储数据的 table 匹配。(此处:tt_content)
如果您在扩展中使用它,您需要将 table 名称更改为您的 tx_yourextension_whatever
。
您可能还会更改字段名...
备注
这段代码似乎仍然会产生一些弃用警告...我还没有想出如何克服这些:-/
感谢您提供代码。我一直在这里寻找解决方案。
不幸的是,我的模板中显示了错误的图像。 我的流体模板中的输出是这样的:
{f:uri.image(src:'{data.flexform_images}', treatIdAsReference:'1')}
怎么了?