【问题标题】:OctoberCMS Builder plugin, uploading file and storing in databaseOctoberCMS Builder插件,上传文件和存储在数据库中
【发布时间】:2017-03-03 14:51:56
【问题描述】:

我是 OctoberCMS 的新手,我正在尝试使用 builder 插件 本身创建一个插件,OctoberCMS 提供 OctoberCMS Builder Plugin 类似“社交链接”,一切正常,但我无法理解将文件上传到任何目录并将该名称存储到我的数据库表的特定字段的逻辑。我的表的字段名称是“social_logo”,我试图在其中存储将要上传的文件名。

我现在可以将文件上传到默认目录,无论哪个OctoberCMS与我上传的文件一起生成。但问题是我无法将该特定文件名存储到我的数据库表的字段中。

有人可以指导我该怎么做才能实现这一目标吗?

这是我到目前为止所做的模型文件。

SocialLinks.php

<?php namespace Technobrave\SocialLinks\Models;

use Model;

/**
 * Model
 */
class Sociallink extends Model
{
    use \October\Rain\Database\Traits\Validation;

    /*
     * Validation
     */
    public $rules = [
    ];

    /*
     * Disable timestamps by default.
     * Remove this line if timestamps are defined in the database table.
     */
    public $timestamps = false;

    /**
     * @var string The database table used by the model.
     */
    public $table = 'technobrave_sociallinks_';


    public $attachOne = [
            'social_logo' => 'System\Models\File'
    ];

}

Fields.yaml

fields:
    social_logo:
        label: 'technobrave.sociallinks::lang.Sociallink.social_logo'
        span: auto
        oc.commentPosition: ''
        mode: file
        useCaption: true
        thumbOptions:
            mode: crop
            extension: auto
        type: fileupload

columns.yaml

columns:
    social_logo:
        label: 'technobrave.sociallinks::lang.Sociallink.social_logo'
        type: text
        searchable: true
        sortable: true

正如您在上面的代码中看到的,现在我只有 1 个字段,因为我仅在上传图像时遇到此特定字段的问题,我想存储该文件名。所有其他对我有用的表单属性,如文本、文本区域等,所以现在我只是想用这个单一的字段来实现这个目标。

有人可以指导我该怎么做才能解决这个问题吗?

谢谢

【问题讨论】:

    标签: octobercms


    【解决方案1】:

    如果您需要将文件名存储在数据库中,最好的方法可能是使用Media Finder Widget 而不是File Upload Widget,并从您的模型中删除 attachOne 关系。

    • MediaFinder 小部件可让您将文件存储在 OctoberCMS 安装的 storage/media 子目录中的任何位置,在其中选择所需的确切存储路径,并将存储的文件路径作为字符串返回 - 然后您需要以列的形式存储在模型的数据库记录中,就像您的想法一样。

    • 文件上传小部件与 attachOne(或 attachMany)关系的工作方式大不相同。 attachOne(或 attachMany)关系与模型的实际数据库列不对应。哪些文件附加到这里或那里的其他模型的信息在其他地方存储和检索 - 我不知道究竟是什么。 (关于通过文件上传小部件上传的文件的信息及其存储路径(这是随机生成的,没有用户控制)存储在system_files 数据库表中 - 如何与附加文件的父模型建立关联,我不知道。)

    您的数据库表中已经有一个文件名列,并且您似乎希望您的文件名以某种方式“好”和可读,并且可能在用户控制之下。 所以我建议你像这样简单地改变你的 fields.yaml

    fields:
        social_logo:
            label: 'technobrave.sociallinks::lang.Sociallink.social_logo'
            span: auto
            oc.commentPosition: ''
            type: mediafinder
            thumbOptions:
                mode: crop
                extension: auto
    

    (不知道thumbOptions的设置在这里能不能用,你可以试试看。至于useCaption这里不能用,因为媒体库中的文件只是简单的被字符串引用,有没有像文件上传文件那样带有titledescription等附加信息的相应的雄辩模型。)

    【讨论】:

    • 如果你坚持原来的attachOnefileupload 解决方案,你有一个文件对象附加到你的模型,它有一个path 属性,返回该文件的全局url 路径。您可以在模板中像这样简单地访问它:(假设您有一些名为 sociallink 的模型类型的变量):&lt;img src="{{sociallink.social_logo.path}}"&gt;
    • 如果您已使用我建议的媒体查找器解决方案实施,那么您的 social_logo 字段只是一个包含相对于 OctoberCMS app/media/ 目录的文件路径的字符串。有一个树枝过滤器“媒体”,它可以从中生成一个完整的网址,就像这样。 &lt;img src="{{sociallink.social_logo | media}}"&gt;
    • 现在我知道你在那里做了什么。您正在使用十月的 builder 插件中的 builderList 组件。 (我以前不知道。)所以你只是简单地添加了这个声明{% set sociallink = builderList.sociallink %},这是没有意义的,因为 sociallink 不是 builderList 组件的属性,而是你试图显示的记录的属性。 (我希望这些记录是您的Sociallink 模型)。试试&lt;img src="{{record.social_logo.path}}"&gt;
    • 我已经添加了我的答案 .. 请看一下 :) 感谢您的努力 .. 非常感谢 ..
    【解决方案2】:

    好的,伙计们,我最终按照这些步骤解决了这个问题。

    首先,我们不需要在数据库表中创建任何列来在数据库表的任何字段中存储任何文件上传名称,因为OctoberCMS会自动在system_files 表。所以我只是通过 builder 插件删除了“social_logo”字段。

    然后,我使用 admin 中的 Builder plugin 从我当前的 Social Links 插件 中删除了旧的 file upload 控件,并且只需创建一个新的,而无需与任何表的字段建立任何关系。

    然后我只是去了 Sociallinks.php 模型,并确保此代码存在

    public $attachOne = [
                'social_logo' => 'System\Models\File'
        ];
    

    还要确保您的 mode 应该是 image 并且您的 type 可以是 fileupload 因为我可以在编辑记录部分看到这样的图像.. 您可以根据需要更新此代码,但这对我来说很好,所以我把这个代码...

    fields.yaml

    fields:
        social_logo:
            label: 'Social Logo'
            mode: image
            span: auto
            type: fileupload
    

    然后我进入管理区域并创建了测试模板,在 代码 选项卡中我把这段代码只是为了检查单个记录,

    use technobrave\sociallinks\Models\Sociallink;
    
    
    function onStart()
    {
        $this['model_data'] = Sociallink::first();
    }
    

    在模板标记中,我只是把这个

    <img src="{{ model_data.social_logo.getPath() }}" />
    

    哇,我可以看到图像.. :)

    另外,如果你想要多个数据,那么你可以把这段代码放在代码标签中,

    use technobrave\sociallinks\Models\Sociallink;
    
    
    function onStart()
    {
        $this['model_data'] = Sociallink::all();
    }
    

    您的 html 标记选项卡将包含以下代码,

    <h2>Image List</h2>
    <ul>
        {% for current_model_data in model_data %}
        <h3>{{ current_model_data.id }}</h3>
        <img src="{{ current_model_data.social_logo.getPath() }}" />
    
    
        {% endfor %}
    </ul>
    

    感谢大家的支持..希望这对可能刚接触OctoberCMS的人有所帮助..非常感谢..

    谢谢你..

    【讨论】:

    • 非常好。感谢您的解决方案。
    • 简而言之:你需要模型中的$attachOne,可以使用fields.yaml中的默认文件上传,并在前端显示为record.image.getPath()image 为文件上传字段名。
    • 有人知道如何通过columns.yaml在列表中显示图片吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2011-10-22
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多