一、使用场景
像会员等级、商品品牌等一些情况均需要上传图片、Logo等,这时就需要用到图片上传,产品中封装了图片上传的控件,分为Ajax上传和普通的Form表单上传,这篇文章介绍如何进行普通的Form表单上传。
二、使用方式
0.页面引入图片预览的JS控件
{script src='@static/js/pic/imgPreview.js'}
1.Form表单中添加上传控件:
{input type='file-image' model=$model field='brand_logo' data-image="{imageurl}/{$model->brand_logo}" data-file="brandmodel-brand_logo"}
参数说明:
type:file-image 表示上传图片
model:表单的模型对象
field:模型中的属性
data-image:图片的url地址,如果图片已经存在,则鼠标悬浮上后会有预览图片的效果,点击图片可以查看大图,{imageurl}代表图片服务器的地址,通过{$model->brand_logo}获取图片的相对地址,拼接后即是完整的图片地址,如果图片地址仅仅是{imageurl}或者{imageurl}/ 那么程序将认为图片地址为空,鼠标悬浮上会看到默认的图片。
data-file:此属性指向用户点击上传图片的file控件的id,一般为当前控件的id,如果id为model+field自动生成的,则id符合YII的getInputId()格式
2.指定model类中添加attributeFiles函数,指定哪些属性为文件类型
/** * @inheritdoc */ public function attributeFiles () { return [ 'brand_logo' ]; }
这样,common\base\Model在model->load()的时候会自动识别出文件属性,并试图通过UploadFile::getInstance()函数获取文件,Model中加载文件的代码如下(仅对Post提交有效):
/**
* 如果data为空则加载request中的post数据
*
* @param unknown $data
* @param unknown $formName
*/
public function loadPost ($data = null, $formName = null)
{
if($data == null)
{
$data = Yii::$app->request->post();
$scope = $formName === null ? $this->formName() : $formName;
// 如果有属性为文件类型则自动加载
foreach($this->attributeFiles() as $key => $attribute)
{
// 如果$key为$this的一个属性,则表示将$attribute复制给$key
$this->$attribute = UploadedFile::getInstance($this, $attribute);
// 从提交的数据中清除,以免后面的load时被覆盖掉
if($scope === '' && ! empty($data))
{
unset($data[$attribute]);
}
elseif(isset($data[$scope]))
{
unset($data[$scope][$attribute]);
}
}
}
return parent::load($data, $formName);
}
3.为文件设置前后台的验证规则,并设置场景,一般情况下建议图片“添加”的时候为必填项,更新的时候为非必填项,如果为空则跳过,不为空则更新。
// imagerules()可以获取图片尺寸配置,需要在common/config/params-imagerules.php中进行配置 $rules[] = Model::addRule('brand_logo', 'image', array_merge(imagerules('brand_logo'), [ // 更新下 'on' => self::SCENARIO_UPDATE, // 为空时不校验 'skipOnEmpty' => true ])); // imagerules()可以获取图片尺寸配置,需要在common/config/params-imagerules.php中进行配置 $rules[] = Model::addRule('brand_logo', 'image', array_merge(imagerules('brand_logo'), [ // 更新下 'on' => self::SCENARIO_CREATE ]));
imagerules()函数的主要目的是为了统一维护图片的尺寸和验证规则,便于将来前台模板修改时,在不 修改代码的前提下仅仅通过修改配置文件即可达到修改验证规则的目的,如果有特殊情况可以自定义。
4.在控制器中编写上传图片的代码:
例如更新的时候:
if($this->request->isPost) { // 保留原来的数据 $brand_logo = $model->brand_logo; // 判断是否POST数据据,验证数据是否合法 if($model->load() && $model->validate()) { if($model->brand_logo != null) { $dir = format('/brandlogos/{0,date,yyyy/MM/dd/}', [ time() ]); $model->brand_logo->saveAs('@imagepath' . $dir); $model->brand_logo = $dir . $model->brand_logo->filename; } else { $model->brand_logo = $brand_logo; } try { $result = $model->update();
5.完成。
图片没有时,鼠标悬浮上后显示的默认图片
图片存在时或者用户选择图片后显示的选择图片(Html5预览图片)
用户点击图片显示大图
相关推荐
1. **form**: 这个文件夹可能包含了对Yii的表单类进行扩展的代码,使得表单元素可以自动应用Bootstrap的样式。例如,可能会有自定义的ActiveForm类,用于生成带有Bootstrap样式的表单元素。 2. **gii**: Gii是Yii的...
使用基于插件的jQuery for Yii2的拖放表单生成器。 安装 安装此扩展的首选方法是通过 。 无论运行 composer.phar require meysampg/yii2-formbuilder "*" 或添加 "meysampg/yii2-formbuilder": "*" 到composer....
在Yii2中,表单(Form)是用户界面(UI)设计的关键部分,用于收集用户输入的数据并进行处理。在本文中,我们将深入探讨Yii2框架中关于表单的创建、验证和处理的基本概念。 一、Yii2表单类的创建 在Yii2中,我们...
在视图文件中,我们可以使用`yii\widgets\ActiveForm`来创建表单,并使用`dropDownList()`或`dropdownList()`方法创建下拉框。这两个方法都需要一个数据源,可以是数组或ActiveQuery实例。例如: ```php use yii\...
在Yii框架中,form表单的使用是构建交互式Web应用不可或缺的一部分。下面将详细介绍Yii框架中form表单的用法,以及如何通过实例来分析实现方法和相关技巧。 首先,Yii框架中的表单用法通常包括以下几个步骤: 1. ...
composer require elisdn/yii2-composite-form 用法样本 创建用于SEO信息的任何简单表单模型: class MetaForm extends Model { public $ title ; public $ description ; public $ keywords ; public ...
在本文提供的代码示例中,我们利用`form->field`方法为模型中的`companies_company_id`字段创建了一个表单字段,并使用Select2小部件来增强其功能。在实际的应用中,开发者可以根据项目需求来调整数据映射逻辑和配置...
一个Yii2插件,用于使用yii\widgets\ActiveForm和\yii\db\ActiveRecord创建步进式表单或表单向导,它使用来创建使用3个内置和3个其他主题的表单界面,此外,您还可以创建自己的表单也有自己的定制主题。 注意:它...
Yii2的FormBuilder模块 产品特点 生成表格,调查,民意调查,问卷(FormBuilder类) 拖放-排序,编辑和删除项目 AJAX的CRUD操作 内置RBAC组件 表单渲染小部件(Form类) 验证表格(动态模型) 从数据库中的表单...
在Yii框架中,开发流程涉及使用表单、创建模型和动作、收集表格输入,以及可能使用FORMBUILDER工具。此外,应用开发涉及数据库的访问和操作,包括使用数据访问对象(DAO)和Active Record。 ### 使用表单 Yii提供了...
yii2用表单上传文件经常用到的,该怎样上传呢? 1、单个文件上传 首先建立一个模型models/UploadForm.php,内容如下 namespace app\models; use yii\base\Model; use yii\web\UploadedFile; /** * UploadForm is ...
形式\kartik\builder\Form 表单构建器小部件允许您通过配置数组构建表单。 可用的主要功能: 从扩展yii\base\model或yii\db\ActiveRecord的模型中配置表单字段。 能够支持各种Bootstrap 3.x表单布局。 使用高级 。 ...
Yii框架在处理表单时提供了一种高效且灵活的方法,使得开发者可以轻松地创建和管理用户输入。在Yii中,表单的处理涉及到模型、控制器和视图的交互。接下来,我们将深入探讨Yii中表单的使用方法。 首先,创建模型是...
`_form.php` 文件很可能是视图文件,它定义了表单的 HTML 结构。在 AJAX 场景下,表单提交通常不会导致页面刷新,而是通过 JavaScript 发送 AJAX 请求到服务器。`_form.php` 可能包含了一些 AJAX 相关的 JavaScript ...
值得注意的是,表单标签中指定了'enctype'为'multipart/form-data',这是因为默认的'application/x-www-form-urlencoded'编码类型不支持文件上传。 最后是控制器部分,这部分负责处理用户上传的Excel文件并将其导入...
安装完毕后,开发者可以在视图文件中使用yii2-date-picker插件。通常有两种方式来集成日期选择器,一种是使用widget方式,另一种是结合Yii2框架的ActiveForm组件使用。 使用widget方式的代码示例如下: ```php ...
- 使用JS/jQuery验证配合Yii提交:在`<form>`标签上设置`onSubmit`事件,调用自定义的验证函数,验证成功后通过Yii的提交机制进行处理。 2. **Yii自带的Widget**: - CActiveForm是Yii提供的表单组件,它支持...