执行顺序:
_显示:_editBefore(控制器,保存时也会执行) → createEditFetchDataBefore(控制器) → setEditShowDo(字段) → beforeAddShow/beforeEditShow(控制器)
_保存:_setPostDataBefore(控制器) →editBefore(控制器,显示时也会执行) → setSaveBeforeDo(字段) → doSaveDataBefore(模型) → doSaveDataAfter(模型) → setSaveBeforeCheckedDo(字段) → setSaveAfterDo(字段) → onAddAfter/onEditAfter(模型) → addAfter/editAfter(控制器))
方式1:控制器事件
<?php
namespace app\controller;
use app\BaseController;
use tpScriptVueCurd\base\model\BaseModel;
use tpScriptVueCurd\FieldCollection;
class User extends BaseController
{
use \tpScriptVueCurd\base\controller\Controller;
public function init(): void
{
$this->title='人员信息';
$this->md=\app\model\User::make($this);
}
/*******************事件执行顺序按照以下方法排列顺序执行********************/
/**
* 数据添加或修改时,《显示》与《提交》都会执行此方法
* @param FieldCollection $fields
* @param BaseModel $old 修改前数据信息
* @param BaseModel|null $parentInfo 父表数据
* @param array|null $data 提交上来的数据
* @return void
*/
protected function editBefore(FieldCollection &$fields,BaseModel $old,?BaseModel $parentInfo,?array &$data=null): void
{
if(empty($old->id)){
//新增
}else{
//修改
}
}
/**
* (添加/编辑页面)生成解析数据前(页面打开时),处理数据(控制字段显示与否),empty($data->id)代表是新增
* @param FieldCollection $fields
* @param BaseModel $data
* @param BaseModel|null $baseModel 父表数据
* @return void
*/
protected function createEditFetchDataBefore(FieldCollection $fields, BaseModel &$data,?BaseModel $baseModel):void
{
// throw new \think\Exception('此处使用throw抛出异常表示阻止页面打开');
//这里也可更字段的显示,也可更改数据显示的值
$fields->findByName('name')->title('更改了姓名的标题');
$data['name']='展示时将姓名改变了,或设置了默认值';
}
/**
* 添加页面展示时
* @param array $fetchData 返回前台需要的数据,可在此处改变
* @return array
*/
protected function beforeAddShow(array $fetchData):array{
return $fetchData;
}
/**
* 修改页面展示时
* @param array $fetchData 返回前台需要的数据,可在此处改变
* @return array
*/
protected function beforeEditShow(array $fetchData):array{
//数据修改页面 解析前
return $fetchData;
}
protected function setPostDataBefore(array &$post):void{
//用户提交的数据处理
}
/**
* 数据添加成功后
* @param BaseModel $info 添加成功后的数据对象
* @return void
*/
protected function addAfter(BaseModel $info): void
{
}
/**
* 数据修改成功后
* @param BaseModel $info 修改成功后的数据对象
* @return void
*/
protected function editAfter(BaseModel $info): void
{
}
}
方式2:模型事件
<?php
namespace app\model;
use tpScriptVueCurd\base\model\BaseModel;
use tpScriptVueCurd\field\RadioField;
use tpScriptVueCurd\field\StringField;
use tpScriptVueCurd\FieldCollection;
class User extends BaseModel
{
/**
* 表字段配置
* @return FieldCollection
*/
public function fields(): FieldCollection
{
return new FieldCollection([
StringField::init('name','姓名'),
RadioField::init('sex', '性别'),
]);
}
/*******************事件执行顺序按照以下方法排列顺序执行********************/
/**
* 提交的数据被验证之前执行
* @param FieldCollection $fields
* @param array $postData
* @param bool $isExcelDo
* @param int $id id为0代表添加,否则为修改
* @param BaseModel|null $parentInfo
* @param BaseModel $beforeInfo
* @return void
*/
protected function doSaveDataBefore(FieldCollection $fields, array &$postData, bool $isExcelDo, int $id, ?BaseModel $parentInfo, BaseModel $beforeInfo): void
{
parent::doSaveDataBefore($fields, $postData, $isExcelDo, $id, $parentInfo, $beforeInfo);
}
/**
* 提交的数据被验证之后执行
* @param array $saveData
* @param int $id id为0代表添加,否则为修改
* @param BaseModel|null $parentInfo
* @param BaseModel $beforeInfo
* @return void
*/
protected function doSaveDataAfter(array &$saveData, int $id, ?BaseModel $parentInfo, BaseModel $beforeInfo): void
{
parent::doSaveDataAfter($saveData, $id, $parentInfo, $beforeInfo);
}
/**
* 添加成功后执行
* @param BaseModel $info
* @param array $postData
* @param BaseModel|null $parentInfo
* @return void
*/
protected function onAddAfter(BaseModel $info, array $postData, ?BaseModel $parentInfo): void
{
parent::onAddAfter($info, $postData, $parentInfo);
}
/**
* 修改成后执行
* @param BaseModel $info
* @param array $postData
* @param BaseModel|null $parentInfo
* @param BaseModel $beforeInfo
* @return void
*/
protected function onEditAfter(BaseModel $info, array $postData, ?BaseModel $parentInfo, BaseModel $beforeInfo): void
{
parent::onEditAfter($info, $postData, $parentInfo, $beforeInfo);
}
}
方式3:字段事件
<?php
namespace app\model;
use tpScriptVueCurd\base\model\BaseModel;
use tpScriptVueCurd\field\RadioField;
use tpScriptVueCurd\field\StringField;
use tpScriptVueCurd\FieldCollection;
use tpScriptVueCurd\ModelField;
class User extends BaseModel
{
/**
* 表字段配置
* @return FieldCollection
*/
public function fields(): FieldCollection
{
$sexField=RadioField::init('sex', '性别');
/*******************事件执行顺序按照以下方法排列顺序执行********************/
$sexField->pushFieldDo()
->setEditShowDo(function (BaseModel &$info,?BaseModel $base,ModelField $field,bool $isStepNext){
//empty($before->id)表示新增,否则是修改
//页面显示时,此字段将会执行
})
->setSaveBeforeDo(function (array &$postData,BaseModel $before,?BaseModel $base,ModelField $field){
//empty($before->id)表示新增,否则是修改
//数据保存前,此字段将会执行
})
->setSaveBeforeCheckedDo(function (array &$saveData,BaseModel $before,?BaseModel $base,ModelField $field){
//empty($before->id)表示新增,否则是修改
//数据保存前,且字段验证前,此字段将会执行
})->setSaveAfterDo(function (array $saveData,BaseModel $before,BaseModel $after,?BaseModel $base,ModelField $field){
//empty($before->id)表示新增,否则是修改
//数据保存后,此字段将会执行
});
return new FieldCollection([
StringField::init('name','姓名'),
$sexField,
]);
}
}