OctoberCMS Builder 插件,上传文件并存入数据库
OctoberCMS Builder plugin, uploading file and storing in database
我是 OctoberCMS 的新手,我正在尝试使用 builder 插件 本身创建一个插件 OctoberCMS 提供 OctoberCMS Builder Plugin 称为“ 社交链接 ”之类的东西,一切正常,但我无法理解将文件上传到任何目录并将该名称存储到的逻辑我的数据库 table 的特定字段。我的 table 的字段名称是“social_logo”,我试图在其中存储将要上传的文件名。
我现在可以将文件上传到默认目录,无论哪个 OctoberCMS 与我上传的文件一起生成。但问题是我无法将该特定文件名存储到我的数据库 table 的字段中。
有人可以指导我应该怎么做才能实现这一目标吗?
这是我到目前为止所做的模型文件。
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 个字段,因为我仅在上传图像时遇到此特定字段的问题,我想存储该文件名。所有其他对我有用的表单属性,如文本、文本区域等,所以现在我只想用这个单一字段来实现这一点。
有人可以指导我如何解决这个问题吗?
谢谢
如果您需要将文件名存储在数据库中,最好的方法可能是使用 Media Finder Widget instead of the File Upload Widget,并从您的模型中删除 attachOne 关系。
MediaFinder 小部件允许您将文件存储在 OctoberCMS 安装的 storage/media
子目录中的任何位置,选择您想要的确切存储路径,然后简单地 returns 存储作为字符串的文件路径 - 然后您需要将其作为列存储在模型的数据库记录中,就像您所想的那样。
文件上传小部件与 attachOne(或 attachMany)关系的工作方式大不相同。 attachOne(或 attachMany)关系不对应于模型的实际数据库列。哪些文件附加到此处或此处的其他模型的信息在其他地方存储和检索 - 具体如何,我不知道。 (有关通过文件上传小部件上传的文件的信息及其存储路径(在没有用户控制的情况下随机生成)存储在 system_files
数据库 table - 如何与父模型建立关联文件附件在哪里,我不知道。)
您的数据库中已经有一个文件名列 table,您似乎希望您的文件名以某种方式 "nice" 和可读,并且可能在用户控制之下。
所以我建议您只需像这样更改 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
这里不能用,因为媒体库里的文件是仅由字符串引用,没有对应的 eloquent 模型以及 title
和 description
等附加信息,就像文件上传文件一样。)
好的伙计们,最终我按照这些步骤解决了这个问题。
首先,我们不需要在数据库table中创建任何列来在数据库table的任何字段中存储任何文件上传名称因为 OctoberCMS 将自动在 system_files table 中。所以我只是通过 builder 插件删除了 'social_logo' 字段。
然后我使用 Builder 插件[=58=从当前的 社交链接插件 中删除了旧的 文件上传 控件] 来自 admin 并简单地创建了一个新的,而没有与任何 table 的字段建立任何关系。
然后简单地我去了 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() }}" />
哇哦,我能看到图片了.. :)
Additionaly, if you want multiple data then you can put this code in Code Tab,
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 的新手有所帮助..非常感谢..
谢谢..
我是 OctoberCMS 的新手,我正在尝试使用 builder 插件 本身创建一个插件 OctoberCMS 提供 OctoberCMS Builder Plugin 称为“ 社交链接 ”之类的东西,一切正常,但我无法理解将文件上传到任何目录并将该名称存储到的逻辑我的数据库 table 的特定字段。我的 table 的字段名称是“social_logo”,我试图在其中存储将要上传的文件名。
我现在可以将文件上传到默认目录,无论哪个 OctoberCMS 与我上传的文件一起生成。但问题是我无法将该特定文件名存储到我的数据库 table 的字段中。
有人可以指导我应该怎么做才能实现这一目标吗?
这是我到目前为止所做的模型文件。
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 个字段,因为我仅在上传图像时遇到此特定字段的问题,我想存储该文件名。所有其他对我有用的表单属性,如文本、文本区域等,所以现在我只想用这个单一字段来实现这一点。
有人可以指导我如何解决这个问题吗?
谢谢
如果您需要将文件名存储在数据库中,最好的方法可能是使用 Media Finder Widget instead of the File Upload Widget,并从您的模型中删除 attachOne 关系。
MediaFinder 小部件允许您将文件存储在 OctoberCMS 安装的
storage/media
子目录中的任何位置,选择您想要的确切存储路径,然后简单地 returns 存储作为字符串的文件路径 - 然后您需要将其作为列存储在模型的数据库记录中,就像您所想的那样。文件上传小部件与 attachOne(或 attachMany)关系的工作方式大不相同。 attachOne(或 attachMany)关系不对应于模型的实际数据库列。哪些文件附加到此处或此处的其他模型的信息在其他地方存储和检索 - 具体如何,我不知道。 (有关通过文件上传小部件上传的文件的信息及其存储路径(在没有用户控制的情况下随机生成)存储在
system_files
数据库 table - 如何与父模型建立关联文件附件在哪里,我不知道。)
您的数据库中已经有一个文件名列 table,您似乎希望您的文件名以某种方式 "nice" 和可读,并且可能在用户控制之下。 所以我建议您只需像这样更改 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
这里不能用,因为媒体库里的文件是仅由字符串引用,没有对应的 eloquent 模型以及 title
和 description
等附加信息,就像文件上传文件一样。)
好的伙计们,最终我按照这些步骤解决了这个问题。
首先,我们不需要在数据库table中创建任何列来在数据库table的任何字段中存储任何文件上传名称因为 OctoberCMS 将自动在 system_files table 中。所以我只是通过 builder 插件删除了 'social_logo' 字段。
然后我使用 Builder 插件[=58=从当前的 社交链接插件 中删除了旧的 文件上传 控件] 来自 admin 并简单地创建了一个新的,而没有与任何 table 的字段建立任何关系。
然后简单地我去了 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() }}" />
哇哦,我能看到图片了.. :)
Additionaly, if you want multiple data then you can put this code in Code Tab,
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 的新手有所帮助..非常感谢..
谢谢..