Yii2 ActiveForm小部件渲染过程

本文解析了Yii2框架中ActiveForm组件的工作原理,包括begin()和end()方法的作用,以及如何通过field()方法生成表单元素。特别介绍了客户端验证的实现方式,即如何在前端实现模型验证规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

(1)ActiveForm::begin()做了什么,ActiveForm::end()做了什么,中间echo的ActiveForm::field()内容是如何渲染的;

(2)我们在ActiveRecord模型类的rules规则里定义的验证方法s是如何在客户端页面同样生效的。

首先看Yii2 ActiveForm小部件渲染过程

 

 

1. yii\widght\ActiveForm::begin($config);

这里实例化了ActiveForm对象,通过 __construct() 调用 init(),在这里生成小部件的唯一id:getId(),打开输出缓冲:ob_start();ob_implicit_flush(false);

2. 小部件实例化后就可以通过它的field()方法生成表单内容控件

echo $form->field($model,$attribute,$options);//生成默认的textInput控件

echo $form->field($model,$attribute,$options)->radio();//生成radio控件

这里有一个关键的地方:ActiveField对象在ActiveForm::field()方法中被创建,而其内容的渲染源自于`echo`的调用会触发ActiveField的__toString()魔术方法,这里调用了ActitveField的render()方法通过ActiveField的begin()与end()方法渲染完整内容。
(1) ActiveField::begin()会通过ActiveField::getClientOptions()方法获得指定属性的详细信息,包括验证规则,并填充到对应$form的$attributes属性中。
(2) 这里关键在于ActiveField::getClientOptions()做了什么:
    1)通过当前$model判断该$attribute是否有效;
    2)如果开启了客户端验证,则通过$model->getActiveValidators($attribute)获得与当前$attribute当前scenario相关的验证规则;
    3)遍历上一步获得的验证规则,通过每个验证器(yii\vaidators\Validator的子类的实例)的clientValidateAttribute()方法获得对应验证规则的客户端验证的js内容;
    4)填充$attribute的id,name等信息后,将上一步获得的所有客户端验证js内容组合到一个完整的js匿名函数中;
    5)返回上述所有步骤获得的信息,交由begin()存入对应$form的$attributes中。

3. 当所有ActiveField都执行完毕,就来到了ActiveForm::end(),

    1)通过ob_get_content()拿到上述所有field的输出;

    2)如果开启了客户端验证,则会注入ActiveFormAsset资源包内容,并注入yii.activeForm.js的yiiActiveForm($attributes, $options);js内容。

4. 页面加载时会执行上面注入的yiiActiveForm.init()方法。

由于传入的$attributes参数包含了所有$attribute的详细描述与客户端验证需执行的js验证方法,在yii.activeForm.js中就可以实现对各个属性的事件监听并触发对应的验证逻辑。

转载于:https://www.cnblogs.com/ling-diary/p/9220111.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值