Magento中最好的部分是其管理界面。支持各种输入类型(文本字段、单选按钮、下拉菜单、多重选择等等),这些类型可以以各种方式存储(普通、加密、序列化),并以多种方式显示(网格、表单、简单字段、图像)。

Magento的优点在于可以扩展此默认界面(尤其是商店配置部分),并轻松添加我们自己的字段。让我们用自定义文件上传字段扩展它。

Store> Configuration下,我们会找到很多菜单。让我们在Sales部分下添加我们的自定义。system.xml你的模块(etc/adminhtml/system.xml),我们必须创建一个新的部分称为“custom_section”,领域的一个新的组名为“custom_group”和文件上传场“custom_file_upload”

这是代码:

<section id="custom_section" translate="label" type="text" sortOrder="301" showInDefault="1" showInWebsite="1" showInStore="0">
    <label>Custom</label>
    <tab>sales</tab>
    <resource>Magento_Sales::config_sales</resource>
    <group id="custom_group" translate="label" type="text" sortOrder="6" showInDefault="1" showInWebsite="1" >
        <label>Custom group</label>
        <field id="custom_file_upload" translate="label" type="Magento\Config\Block\System\Config\Form\Field\File" sortOrder="6" showInDefault="1" showInWebsite="1" >
            <label>Upload custom file</label>
        </field>
    </group>
</section>

与Magento 1相比,存在相当多的差异:排序顺序类型范围现在是节(或组或字段)的属性,而不是子节点。部分字段不言自明。“tab”指向我们想要的部分。“sales”选项卡在Magento_Sales::etc/adminhtml/system.xml文件中创建,因此我们可以在此处引用它。“resource”用于ACL。只有具有Magento_Sales :: config_sales权限的管理员才能访问此部分。

组与Magento 1中相同。在我们组中,我们放置一个字段,允许我们上传文件。它应该包含哪些细节?“id”是我们自己选择的,但它需要在每个组中是唯一的。最重要的是类型。我们看到它被设置为Magento\Config\ Config Block\System\Config\Form\Field\File

这是Magento文件上传的默认类型。记住,图像上传有一个单独的类型:Magento\Config\Config Block\System\Config\Form\Field\image。它们几乎相同,但不完全一相同。

如果我们刷新页面,我们会得到一个上传文件字段。我们可以与它进行交互,甚至上传文件,但它还没有工作。我们需要添加一些东西。

首先是backend_model它用于处理上传文件的过程:设置上传目录,检查允许的扩展名,验证文件大小以及保存文件路径到数据库。文件上传的默认后端模型是Magento\Config\Model\Config\Backend\File

我们还需要添加一个工作文件上传:<upload_dir> - 上传目录

添加这两个条目为我们提供了一个工作文件上传字段:

<backend_model>Magento\Config\Model\Config\Backend\File</backend_model>
<upload_dir>upload</upload_dir>

上载目录从应用程序根开始。如果我们现在上传文件,它将被放入magento_root/upload/上传目录也有一些有趣的属性。例如,向其添加scope_info =“1”将根据范围存储文件。如果我们在默认范围内上传文件,其路径将是magento_root/upload/default网站1会给我们magento_root/upload/websites/1/

这是最终配置:

<section id="custom_section" translate="label" type="text" sortOrder="301" showInDefault="1" showInWebsite="1" showInStore="0">
    <label>Custom</label>
    <tab>sales</tab>
    <resource>Magento_Sales::config_sales</resource>
    <group id="custom_group" translate="label" type="text" sortOrder="6" showInDefault="1" showInWebsite="1" >
        <label>Security</label>
        <field id="custom_file_upload" translate="label" type="Magento\Config\Block\System\Config\Form\Field\File" sortOrder="6" showInDefault="1" showInWebsite="1" >
            <label>Upload custom file</label>
            <backend_model>Magento\Config\Model\Config\Backend\File</backend_model>
            <upload_dir config="system" scope_info="1">test</upload_dir>
        </field>
    </group>
</section>

我们还可以添加一些其他选项:frontend_model(例如,用于自定义“拖放”文件上传),评论,工具提示,提示,验证等(您可以查看更多内容Magento_Config::etc/system_file.xsd)。

为了限制允许的文件类型,需要进行一些更改。首先,我们需要创建自己的后端模型。在模块中创建一个类并扩展原始后端模型。以下是此类的示例:

<?php
 
namespace Magease\Custom\Model\Config\Backend;
 
class CustomFileType extends \Magento\Config\Model\Config\Backend\File
{
    /**
     * @return string[]
     */
    public function getAllowedExtensions() {
        return ['csv', 'xls'];
    }
}

将system.xml文件中的后端模型更改为\Magease\Custom\Model\Config\Backend\CustomFileType(或您的类)。通过扩展该getAllowedExtensions()方法,我们只允许上载.csv和.xls文件。

就是这样。只需几行配置,我们就可以创建一个完全正常工作的文件上传按钮,具有自定义上传目录和范围支持。