Magento – UIcomponent Dynamic Rows . Image Upload Problem

dynamic rowsfile uploadmagento-2.1.3uicomponent

I Created a form using uicomponent .

In Dynamicrows i have two element fileuploader And Simple textbox.

<dynamicRows ... >
    <field name="path">
        <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">path</item>
            <item name="dataScope" xsi:type="string">path</item>
            <item name="label" xsi:type="string" translate="true">Document</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">MyModule/file-preview</item>
            <item name="prefixName" xsi:type="string">option.order</item>
            <item name="prefixElementName" xsi:type="string">option_</item>
            <!--<item name="required" xsi:type="boolean">false</item>-->
            <item name="uploaderConfig" xsi:type="array">
                <item name="url" xsi:type="url" path="module/controller/action/field/path"/>
            </item>
        </item>
        </argument>
    </field>
    <field name="title">
        <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="dataType" xsi:type="string">text</item>
            <item name="label" xsi:type="string" translate="true">Document Title</item>
            <item name="formElement" xsi:type="string">input</item>
            <item name="source" xsi:type="string">title</item>
            <item name="sortOrder" xsi:type="number">10</item>
            <!--<item name="prefixElementName" xsi:type="string">txt_</item>-->
            <item name="dataScope" xsi:type="string">name</item>
            <item name="notice" xsi:type="string" translate="true">Enter Document Title</item>
            <item name="validation" xsi:type="array">
                <item name="required-entry" xsi:type="boolean">true</item>
            </item>
        </item>
        </argument>
    </field>
</dynamicRows>

Now When DynamicRows Are generating Fileupload Is Not Working .. i dont know what to pass in

<item name="uploaderConfig" xsi:type="array">
        <item name="url" xsi:type="url" path="module/controller/action/field/{HERE}"/>
</item>

File upload is working fine when fileuploader field is not generated using <dynamicrows>

In Working condition of fileuploading resoponse in controller is
post response in this is name="test"

Array
(
    [test] => Array
        (
            [name] => Modules.odt
            [type] => application/vnd.oasis.opendocument.text
            [tmp_name] => /tmp/phpNeTkpQ
            [error] => 0
            [size] => 16705
        )

)

and using dynamicrows response is
post response in this is name="formname[0][test]"

Array
(
    [docattchment] => Array
        (
            [name] => Array
                (
                    [0] => Array
                        (
                            [path] => Modules.odt
                        )

                )

            [type] => Array
                (
                    [0] => Array
                        (
                            [path] => application/vnd.oasis.opendocument.text
                        )

                )

            [tmp_name] => Array
                (
                    [0] => Array
                        (
                            [path] => /tmp/phpX8il5D
                        )

                )

            [error] => Array
                (
                    [0] => Array
                        (
                            [path] => 0
                        )

                )

            [size] => Array
                (
                    [0] => Array
                        (
                            [path] => 16705
                        )

                )

        )

)

Best Answer

Uploader requires array of the values name, type, tmp_name, error, size. So when we are using uploader in dynamic rows, we need to provide array of above values to uploader object. Try below

$docs = array();
$docattchments = isset($_FILES['docattchment']) ? $_FILES['docattchment'] : array();

foreach ($docattchments as $key => $docattchment){
    foreach ($docattchment as $doc){
        if($key == 'name'){
            $docs['name'] = $doc['image'];
        }
        if($key == 'type'){
            $docs['type'] = $doc['image'];
        }
        if($key == 'tmp_name'){
            $docs['tmp_name'] = $doc['image'];
        }
        if($key == 'error'){
            $docs['error'] = $doc['image'];
        }
        if($key == 'size'){
            $docs['size'] = $doc['image'];
        }
    }
}
if(!empty($docs)){
    $result = $this->imageUploader->saveFileToTmpDir($docs);
    $result['cookie'] = [
        'name' => $this->_getSession()->getName(),
        'value' => $this->_getSession()->getSessionId(),
        'lifetime' => $this->_getSession()->getCookieLifetime(),
        'path' => $this->_getSession()->getCookiePath(),
        'domain' => $this->_getSession()->getCookieDomain(),
    ];
}
Related Topic