[英]How to multiupload in Form of TYPO3 v9.5?
由於我使用的是 TYPO3 v9.5.3 並想使用 sysext“表單”,但無法管理它以通過郵件接受和發送多重上傳。
到目前為止我做了什么:
覆蓋標准 .yaml 文件
plugin.tx_form {
settings {
yamlConfigurations {
100 = fileadmin/Form/CustomFormSetup.yaml
}
}
}
為“ImageUpload.html”創建了一個新的模板文件並添加:
multiple="multiple"
所以現在看起來像這樣:
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<formvh:form.uploadedResource
property="{element.identifier}"
as="image"
multiple="multiple"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.properties.elementErrorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
accept="{element.properties.allowedMimeTypes}"
>
<f:if condition="{image}">
<div id="{element.uniqueIdentifier}-preview">
<a href="{f:uri.image(image: image, maxWidth: element.properties.imageLinkMaxWidth)}" class="{element.properties.elementClassAttribute}">
<f:image image="{image}" maxWidth="{element.properties.imageMaxWidth}" maxHeight="{element.properties.imageMaxHeight}" alt="{formvh:translateElementProperty(element: element, property: 'altText')}" />
</a>
</div>
</f:if>
</formvh:form.uploadedResource>
</f:render>
</formvh:renderRenderable>
</html>
從現在開始,我還看到按鈕更改為復數版本,現在我可以在前端選擇多個文件。
還存在什么問題:
當我選擇多個文件並發送表單(然后通過郵件發送結果)時,郵件包含除上傳之外的所有內容。 當切換回單一上傳版本時,一切正常,但只有一張圖片。
有人可以幫助我嗎? 當我有多個圖像/上傳時,我必須做什么才能使表單處理圖像/上傳?
我也閱讀了這個LINK但它沒有解決我的問題,因為我想在標准的 Form 擴展中解決這個問題。
這個帖子有點舊,但我在 2020 年仍然面臨同樣的問題,並決定發布一個解決方案。 如果任何有經驗的 Typo3 開發人員會更正/添加到我的答案中,那就太棒了。
<?php namespace YOUREXTKEY\\Domain\\Model; use TYPO3\\CMS\\Form\\Domain\\Model\\FormElements\\GenericFormElement; class MultipleUpload extends GenericFormElement { }
TYPO3: CMS: Form: prototypes: standard: formEditor: formEditorPartials: FormElement-MultipleUpload: 'Stage/SimpleTemplate' dynamicRequireJsModules: additionalViewModelModules: - 'TYPO3/CMS/YOUREXTKEY/Backend/FormEditor/MultipleUploadViewModel' formElementsDefinition: MultipleUpload: formEditor: label: 'MultipleUpload' group: custom groupSorting: 1000 iconIdentifier: 'form-text' implementationClassName: 'YOUREXTKEY\Domain\Model\MultipleUpload' Form: renderingOptions: properties: elementClassAttribute: form templateRootPaths: 100: 'EXT:YOUREXTKEY/Resources/Private/Templates/Forms/' partialRootPaths: 100: 'EXT:YOUREXTKEY/Resources/Private/Partials/Forms/' layoutRootPaths: 100: 'EXT:YOUREXTKEY/Resources/Private/Layouts/Forms/' finishersDefinition: MultipleUploadsFinisher: implementationClassName: 'YOUREXTKEY\Finishers\MultipleUploadsFinisher'
<?php namespace YOUREXTKEY\\Finishers; use TYPO3\\CMS\\Form\\Domain\\Model\\FormElements\\FileUpload; use TYPO3\\CMS\\Form\\Domain\\Finishers\\EmailFinisher; use YOUREXTKEY\\Domain\\Model\\MultipleUpload; use TYPO3\\CMS\\Form\\Service\\TranslationService; use TYPO3\\CMS\\Core\\Mail\\MailMessage; /** * Class MultipleUploadsFinisher */ class MultipleUploadsFinisher extends EmailFinisher { /** * Executes this finisher * @see AbstractFinisher::execute() */ protected function executeInternal() { ... copied code from EmailFinisher if ($attachUploads) { foreach ($elements as $element) { if (!$element instanceof MultipleUpload) { continue; } $files = $formRuntime[$element->getIdentifier()]; foreach ($files as $file) { if ($file) { $target_path = \\TYPO3\\CMS\\Core\\Utility\\GeneralUtility::getFileAbsFileName('fileadmin/user_upload/') . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $target_path) ) { $mail->attach(\\Swift_Attachment::fromPath($target_path)); } // unlink($target_path); (if you wish to delete uploads, uncomment this line) } } } } ... copied code from EmailFinisher } }
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true"> <formvh:renderRenderable renderable="{element}"> <f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent"> <div class="form-file-wrapper "> <f:form.upload property="{element.identifier}" multiple="multiple" id="{element.uniqueIdentifier}" additionalAttributes="{multiple : '', accept : 'YOURMIMETYPES'}"/> <label for="{element.uniqueIdentifier}"> YOUR LABEL TEXT HERE </label> </div> </f:render> </formvh:renderRenderable> </html>
// Resources/Public/JavaScript/Backend/FormEditor/MultipleUploadViewModel.js define([ 'jquery', 'TYPO3/CMS/Form/Backend/FormEditor/Helper' ], function ($, Helper) { 'use strict'; return (function ($, Helper) { /** * @private * * @var object */ var _formEditorApp = null; /** * @private * * @return object */ function getFormEditorApp() { return _formEditorApp; }; /** * @private * * @return object */ function getPublisherSubscriber() { return getFormEditorApp().getPublisherSubscriber(); }; /** * @private * * @return object */ function getUtility() { return getFormEditorApp().getUtility(); }; /** * @private * * @param object * @return object */ function getHelper() { return Helper; }; /** * @private * * @return object */ function getCurrentlySelectedFormElement() { return getFormEditorApp().getCurrentlySelectedFormElement(); }; /** * @private * * @param mixed test * @param string message * @param int messageCode * @return void */ function assert(test, message, messageCode) { return getFormEditorApp().assert(test, message, messageCode); }; /** * @private * * @return void * @throws 1491643380 */ function _helperSetup() { assert('function' === $.type(Helper.bootstrap), 'The view model helper does not implement the method "bootstrap"', 1491643380 ); Helper.bootstrap(getFormEditorApp()); }; /** * @private * * @return void */ function _subscribeEvents() { /** * @private * * @param string * @param array * args[0] = formElement * args[1] = template * @return void */ getPublisherSubscriber().subscribe('view/stage/abstract/render/template/perform', function (topic, args) { if (args[0].get('type') === 'MultipleUpload') { getFormEditorApp().getViewModel().getStage().renderSimpleTemplateWithValidators(args[0], args[1]); } }); }; /** * @public * * @param object formEditorApp * @return void */ function bootstrap(formEditorApp) { _formEditorApp = formEditorApp; _helperSetup(); _subscribeEvents(); }; /** * Publish the public methods. * Implements the "Revealing Module Pattern". */ return { bootstrap: bootstrap }; })($, Helper); });
finishers: - options: subject: 'YOUR EMAIL SUBJECT' recipientAddress: YOUR EMAIL RECIPIENT recipientName: '' senderAddress: YOUR EMAIL SENDER senderName: YOUR EMAIL SENDER NAME replyToAddress: '' carbonCopyAddress: '' blindCarbonCopyAddress: '' format: html attachUploads: true translation: language: '' templatePathAndFilename: 'EXT:YOUREXTKEY/Resources/Private/Templates/Forms/Email/Html.html' identifier: MultipleUploadsFinisher
還有你的元素:
- properties: elementClassAttribute: 'col col-12 mt-3' allowedMimeTypes: - application/vnd.openxmlformats-officedocument.wordprocessingml.document - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - application/pdf - image/jpeg - image/png - text/plain elementDescription: '' type: MultipleUpload identifier: fileupload-1 label: Files
添加 'multiple' 屬性將使文件選擇器能夠選擇多個文件。 但是您需要擴展視圖助手“formvh:form.uploadedResource”來處理這些多個文件。
甚至您可以添加自己的視圖助手來實現您想要對上傳的文件執行的操作。
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.