簡體   English   中英

如何以TYPO3 v9.5的形式進行多重上傳?

[英]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 開發人員會更正/添加到我的答案中,那就太棒了。

  1. 為文件上傳創建一個新的表單元素。 在您的擴展中,在 Classes/Domain/Model 下添加 MultipleUpload.php:

 <?php namespace YOUREXTKEY\\Domain\\Model; use TYPO3\\CMS\\Form\\Domain\\Model\\FormElements\\GenericFormElement; class MultipleUpload extends GenericFormElement { }

  1. 在您的表單設置 yaml 文件中,添加一個新的元素定義和一個新的整理器定義。 我的設置看起來像:
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'
  1. 在 Classes/Finishers/MultipleUploadsFinisher.php 下創建一個新的 Finisher。 我使用了標准 Email Finisher 中的代碼,只編輯了文件附件位。

 <?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 } }

  1. 在 Resources/Private/Partials/Forms 下添加 MultipleUpload.html 和以下代碼:

 <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>

  1. 在 Resources/Public/JavaScript/Backend/FormEditor/ 下,使用以下代碼添加 MultipleUploadViewModel.js:
// 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);
    });
  1. 在您的 form.yaml 文件中添加新的完成程序:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM