OctoberCMS Builder插件,上传文件并存储在数据库中

时间:2016-10-21 10:25:19

标签: octobercms

我是 OctoberCMS 的新手,我正在尝试使用构建器插件创建一个插件,其中 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个字段,因为我在上传图像时遇到了这个特定字段的问题,我想存储该文件名。所有其他形式属性对我来说都像text,textarea等一样,所以现在我只想用这个单一字段来实现这个目的。

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

谢谢

2 个答案:

答案 0 :(得分:2)

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

  • MediaFinder小部件允许您将文件存储在OctoberCMS安装的storage/media子目录中的任何位置,在其中选择您想要的确切存储路径,并简单地将存储的文件路径作为字符串返回 - 您然后需要在您的模型的数据库记录中存储一列,就像您似乎已经想到的那样。

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

您的数据库表中已经有一个文件名列,似乎您希望您的文件名以某种方式“#34; nice&#34;并且可读并且可能在用户控制下。 所以我建议你只需改变你的 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等附加信息,如文件上载文件所做的那样。)

答案 1 :(得分:2)

好的,最后我通过以下步骤解决了这个问题。

首先,我们不需要在数据库表中创建任何列来在数据库表的任何字段中存储任何文件上载名称,因为 OctoberCMS 将自动在< strong> system_files 表。所以我只是删除了&#39; social_logo &#39;字段来自构建器插件。

然后我使用管理中的构建器插件从我当前的社交链接插件中删除旧的文件上传控件只需创建一个新的,而不与任何表格的字段建立任何关系。

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

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

另外,请确保您的模式图片类型 可以 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新手的人..非常感谢..

谢谢..