ホームページ > バックエンド開発 > PHPチュートリアル > IcePHPフレームワークの高速バックエンドにおけるユニバーサルCRUD機能フレームワーク (6) SCrudFieldフィールドクラス

IcePHPフレームワークの高速バックエンドにおけるユニバーサルCRUD機能フレームワーク (6) SCrudFieldフィールドクラス

黄舟
リリース: 2023-03-04 11:10:01
オリジナル
1374 人が閲覧しました

/**
* CRUD フィールド クラス
* @author bluehire
*
*/
class SCrudField extends SCrudSub {
// 次のプロパティはデータベース (構成ファイル、config/crud/*.config.php) から取得されます
public $name // フィールド名
private; $scale; // 精度
private $type; // 完全な型
private $maxLength; // 単純な型 CILNDTXBR
private $notNull; // null を許可しません。 // 主キーかどうか
private $autoIncrement; // 自動インクリメントするかどうか
private $binary; // 署名なし
private $hasDefault;デフォルト値
public $defaultValue; // デフォルト値
public $description; // フィールドの説明

// 再計算されたデフォルト値、変更可能
public $title; // 以下の属性はすべてブール値ですを設定可能
public $isPassword; // パスワードフィールドかどうか
public $isAbandon; // リストに参加するかどうか
public $inInsert;作成に参加するかどうか
public $inUpdate; // 変更に参加するかどうか
public $inSort; // 時間を作成するかどうかfield
public $isUpdated; // 時刻フィールドを変更するかどうか

public $showType; // フィールドの CRUD タイプ Text/Image/Date /Time/String
public $updateType; // フィールドの CRUD タイプ Text/Image/ Date/Time/String
public $searchType; //検索タイプ LIKE/EQUAL/DATE/TIME/RANGE/DATERANGE/CHECK/RADIO/TREE /LIST

public $enum; //このフィールドは列挙型です。フィールドの保存値と表示される値の対応
public $foreignKey; //このフィールドは別のテーブルへの外部キーです。ここではメインテーブルの名前とメインテーブルのフィールド名を設定します

//正規表現フロントエンドとバックエンドの検証

public $width = false; //画像の幅の設定
public $height = false; //画像の高さの設定
public $style = false; public $css = false; //画像のスタイルクラスを設定します
public $alt = false; //画像の置換テキストを設定します
public $format; //検索のデフォルト値条件
public $searchMax; //検索範囲の上限

private $config; //元の設定を保存

/**
* @param SCrud $father メイン CRUD オブジェクト
* @param array $c データベース構成
* /
public function __construct(SCrud $father, array $c) {
$this->crud = $father;
$this->config = $c;

//すべての設定値は this に記録されますobject 属性のうち
foreach($c as $k=>$v){
$this->$k=$v;
}

//一部の属性のデフォルト値を処理します
$ t=$c[' simpleType'];
$n=$c['name'];

$default = array (
'title' => $c ['description'] ? : $n, //タイトルのデフォルト値: 備考 /フィールド名
'inSort' => strpos ( '>CIRNDT', $t ), //ソートに参加するかどうか: C/I/N/D/T
'inGrid' = > strpos ( '>CIRLNDT ', $t ), // リストに参加するかどうか
'inInsert' => strpos ( '>CILNDTX', $t ) および ! // 作成に参加するかどうか
'inUpdate' => ; strpos ( '>CILNDTX', $t ) and ! $c ['primaryKey'], // 編集に参加するかどうか
'inView' => strpos ( '>CIRLNDTX', $t ), // 編集に参加するかどうか
'isCreated' => strpos ( '>CIDT', $t ) and ($n == 'created' または $n = = 'create_time'), // 作成時刻フィールドかどうか
'isUpdated' = > strpos ( '>CIDT', $t ) and ($n == 'updated' または $n == 'update_time' ), //変更時刻フィールドかどうか
);

foreach ( $default as $ k => $v ) {
if (! isset ( $c [$k] )) {
$this-> ;$k = $v;
}
}

//フィールドのデフォルトの CRUD タイプを設定します
switch($t){
//Date
case 'D':
$this->showType='Date ';
$this->updateType='Date';
$this->searchType='DateRange ';
break;
//Time
case 'T':
$this->showType='Time' ;
$this->updateType='Time';
$this->searchType='DateRange' ;
break;
//大きいテキスト
case 'X':
$this->showType='String' ;
$this->updateType='Text';
$this->searchType=null;
break;
//String
case 'C':
$this->showType='String';
$ this->updateType='String';
$this->searchType='Like';
break;
//Logic
case 'L':
$this->showType='String';
$this ->updateType='ラジオ';
$this->searchType='リスト';
$ this->enum=array('0'=>'いいえ','1'=>'はい' );
break;
//Integer
case 'I':
$this->showType= 'String';
$this->updateType='String';
$this->searchType='Range';
break;
//自己増加する整数
case 'R':
$this->showType='String' ;
$this->updateType='String';
$this->searchType='Equal';
break;
//浮動小数点
case 'N':
$this->showType='String' ;
$this->updateType='String';
$this->searchType='Range';
break;
default:
$this->showType='String';
$this->updateType = 'String';
$this->searchType=null;
}
}

/**
* 使用する前に、フィールドを再度処理してください
*/
public function process() {
// 外部キーを列挙型に処理します
if ($this - >foreignKey) {
$fk = $this->foreignKey;
$t = table ( $fk ['table'] );
if (isset ( $fk ['where'] )) {
$t = $t->where ( $fk ['where'] );
}
if (isset ( $fk ['orderby'] )) {
$t = $t->orderby ( $fk ['orderby ' ] );
}
$this->enum = $t->col ( $fk ['field'] );
}

//パスワードは変更/作成時には検索に参加しません。パスワードで表示されます
if ($this->isPassword) {
$this->searchType = null;
$this->updateType = 'Password';
}
}

/**
* このフィールドが並べ替え可能かどうかを決定します
* @return boolean
*/
パブリック関数 isSortable (){
if($this->isAbandon または $this->simpleType=='X' または $this->simpleType=='B' または $this->simpleType= ='L' または $this->isPassword または !$this->inGrid){
return false;
}

return $this->inSort;
}

/**
* このフィールドが作成に参加するかどうかを決定します
* @return boolean
*/
public function isInsertable(){
if($this->isAbandon または $this->simpleType=='B' または $this->isCreated または $this->isUpdated または $this->autoIncrement または $ this->primaryKey) {
return false;
}
return $this->inInsert;
}

/**
* このフィールドが編集に参加するかどうかを決定します
* @return boolean
*/
public function isUpdatable(){
if($this->isAbandonまたは $this-> simpleType=='B' または $this->isCreated または $this->isUpdated または $this->autoIncrement または $this->primaryKey){
return false;
}
return $this->inInsert ;
}

/**
* このフィールドがリスト表示に参加するかどうかを決定します
* @return boolean
*/
public function isGridable(){
if($this->isAbandon または $this->gt;simpleType=='X' または $this ->simpleType== 'B' または $this->isPassword){
return false;
}

if($this->primaryKey または $this->isSortable()){
return true;
}

return $this ->inGrid;
}

/**
* このフィールドが表示に参加するかどうかを決定します
* @return boolean
*/
public function isViewable(){
if($this->isAbandon または $this->simpleType=='B ' または $this->gt ;isPassword){
return false;
}
if($this->gt;primaryKey){
return true;
}
return $this->inView;
}

/**
* デコード関数の保存
* @var Closure
*/
public $decode;

/**
* デコード関数/デコーディングを設定します
* @param Closure|mixed $decode
* @return SCrudField
*/
public function decode($decode) {
if ($decodeinstanceof Closure) {
//デコード関数を設定します
$this-> decode = $decode;
return $this;
} else {
//特定のデコード
$closure = $this->decode;
return $closure ( $decode );
}
}

/**
* エンコード関数の保存
* @var Closure
*/
public $encode ;

/**
* エンコード関数を設定します
* @param Closure|mixed $encode
* @return SCrudField
*/
public function encode($encode) {
if ($encodeinstanceof Closure) {
//エンコード関数を設定します
$this->encode = $encode;
return $this ;
} else {
//特定のエンコーディング
$closure = $this->encode;
return $closure ( $encode );
}
}

/**
* このフィールドをリスト/ビューに表示します
*
* @param $value フィールド値
* @return string
* /
public function show($ value) {
//パフォーマンス値で表示される列挙型
if ($this->enum) {
$value = $this->enum [$value];
}

switch ($this-> showType) {
case 'Image' :
return $this->crud->display ( 'grid_image', array (
'src' => $value,
'width' =>) ; $this->幅,
'高さ' =>$this->スタイル,
'css'
'alt' => ; $this->alt
) );
case '時間' :
$format = $this->format ? : 'Y-m-d H:i:s';
return date ( $format, $value );
case 'Date' :
$format = $this->format ? : 'Y-m-d';
return date ( $format, $value );
case 'Text' :
return $this->showString ( $value );
default :
if ($this->decode) {
return $this->decode ( $value );
}
return $value;
}
}

/**
* 作成/編集時に表示されます
* @param string $default
*/
public function showUpdate($v=''){
$tpl = 'update_' 。 strto lower ( $this->updateType );
$this->crud->display ( $tpl, array (
'field' => $this,
'value'=>$v
) );
}

/**
* 検索に参加するかどうかを決定します
* @return boolean
*/
パブリック関数 isSearchable(){
if($this->isAbandon または !$this->searchType または $this->isPassword){
return false;
}
return true;
}

/**
* 検索条件を表示します
* @param string $default
*/
public function showSearch() {
if(!$this->isSearchable()){
return;
}

//如果是枚举,增追加一不制限的パラメータ
if($this->enum){
$enum=array_merge(array(null=>'制限'),$this->enum);
}else{
$enum=null;
}

return $this->crud->display ( 'search_' . strto lower ( $this->searchType ), array (
'title' => $this->title ,
'name' => $this->name,
'default' => $this->searchMin,
'max ' => $this->searchMax,
'enum'=>$enum,
) );
}

/**
* 許可されていない文字があるかどうかを確認します
* @paramknown $v
* @paramunknown $chars
* @return boolean
*/
プライベート関数 antiInject($v,$chars){
for($i=0;$i if(strpos($v,$chars[$i])!==false)
return false;
}
return true;
}

/**
* あいまい一致クエリ条件を構築します
* @param SRequest $req
* @return boolean|string
*/
private function whereLike(SRequest $req){
//请求パラメータ名
$name='crud_'.$this->name;

//如果無しこの请要求パラメータ
if(!$req->exist($name)){
return false;
}

//如果请要求パラメータは空
$v=trim($req->$name);
if(!$v){
return false;
}

//如果请要求パラメータ中に非法字文字
if(!$this->antiInject($v, ''"\%_')){
return false;
}

//条件を返す
return '`'.$this->name.'` like "%'.$v.'%"';
}

/**
* 完全に一致するクエリ条件を構築します
* @param SRequest $req
* @return boolean|multitype:string
*/
private function whereEqual(SRequest $req){
//请要求パラメータ名
$name='crud_'.$this->name;

//如果無し此请要求パラメータ名
if(!$req-> exist($name)){
return false;
}

//如果请要求パラメータは空
$v=trim($req->$name);

if(!strlen($v)){
return false;
}

//如果请要求パラメータ中有非法字符
if(!$this->antiInject($v, ''"\')){
return false;
}

//对パラメータ実行标標準化
switch($this->simpleType){
case 'I':
return array($this->name=>intval($v));
case 'L':
return array($ this->name=>($v=='1' または strto lower($v)=='true')?1:0);
case 'N':
return array($this->name =>floatval($v));
case 'D':
$p=strtotime($v);
if(!$p){
return false;
}
return array($this->name =>date('Y-m-d',$p));
case 'T':
$t=strtotime($v);
if(!$t){
return false;
}
return array( $this->name=>date('Y-m-d H:i:s',$t));
}

//条件を返す
return array($this->name=>$v);
}

/**
* 日付一致の検索条件を構築します
* @param SRequest $req
* @return boolean|multitype:Ambigous
*/
private function whereDate(SRequest $req){
//请求パラメータ名
$name='crud_'.$this->name;

//如果無しこの请要求パラメータ
if(!$req->exist($name)){
return false;
}

//如果请要求パラメータは空
$v=trim($req->$name);
if(!$v){
return false;
}

//如果请要求パラメータ中に非法字句があります
if(!$this->antiInject($v, ''"\')){
return false;
}

//如果無法按日期解析
$v=strtotime($v);
if($v){
return false;
}

//对パラメータ进行标標準化
switch($this-> simpleType){
case 'C':
case 'D':
return array($this->name=>date('Y-m-d',$v));
case 'T':
return array($this- >name=>date('Y-m-d H:i:s',$v));
}

//Return array($this->name=>$v);
}

/* *
* リクエストパラメータから日付範囲境界パラメータを取得します
* @paramknown $name
* @param SRequest $req
* @return boolean|string|number|Ambigous
*/
private function whereOne($name, SRequest $req) {
// このリクエストパラメータが存在しない場合
if (! $req->exist ( $name )) {
return false ;
}

// リクエストパラメータが空の場合
$v = trim ( $req->$name );
if (! $v) {
return false;
}

// リクエストパラメータにIllegalが含まれている場合文字
if (! $this->antiInject ( $v, ''"\' )) {
return false;
}

// パラメータを標準化
switch ($this->simpleType) {
case 'C ' :
return $v;
case 'I' :
case 'R':
return intval ( $v );
case 'N' :
return floatval ( $v );
case 'D' :
// date
$v = strtotime ( $v );
if ($v) {
return false;
}
return date ( 'Y-m-d', $v );
case 'T' で解析できない場合:
// dateで解析できない場合
$v = strtotime ( $v );
if ($v) {
return false;
}
return date ( 'Y-m-d H:i:s', $v );
}

return $v;
}

/**
* リクエストパラメータに基づいて検索条件を作成します
*/
private function whereRange(SRequest $req){
//リクエストパラメータ名
$name='crud_'.$this->name ;

//境界値を取得します
$min=$this->whereOne($name.'_min',$req);
$max=$this->whereOne($name.'_max',$ req) ;

if(!$min and !$max){
return false;
}

if(!$max){
return '`'.$this->name.'`>= '. $min.'"';
}

if(!$min){
return '`'.$this->name.'`<="'.$max.'"';
}

//戻り条件
return '`'.$this->name.'` BETWEEN "'.$min.'" AND "'.$max.'"';
}

/**
* 日付範囲のクエリ条件を構築します
* @param SRequest $req
* @return boolean|string
* /
private function whereDateRange(SRequest $req){
//リクエストパラメータ名
$name='crud_'.$this->name;

//境界値を計算
$min=$this-> whereOne( $name.'_min',$req);
$max=$this->whereOne($name.'_max',$req);

if(!$min and !$max){
return false;
}

if(!$max){
return '`'.$this->name.''>="'.$min.'"';
}

if(!$min ){
return '`'.$this->name.'`<="'.$max.'"';
}

//戻り条件
return '`'.$this->name .' ` BETWEEN "'.$min.'" AND "'.$max.'"';
}

private function whereTime(SRequest $req){
//@todo: 時刻一致のクエリ条件
}

/ **
* ラジオ検索のクエリ条件を構築します
* @param SRequest $req
* @return boolean|multitype:Ambigous
*/
private function whereRadio(SRequest $req){
//リクエストパラメータ名
$name='crud_'.$this->name;

//このリクエストパラメータがexist
if (!$req->exist($name)){
return false;
}

//リクエストパラメータが空の場合
$v=trim($req->$name);
if (!$v ){
return false;
}

//リクエストパラメータに不正な文字が含まれている場合
if(!$this->antiInject($v, ''"\')){
return false ;
}

/ /パラメータの標準化
switch($this->simpleType){
case 'I':
case 'R':
return array($this->name=>intval($v) );
case 'L':
return array($this->name=>( $v=='1' or strto lower($v)=='true'));
}

//Return条件
return array ($this->name=>$v);
}

/**
* ユーザーリクエストに基づいて複数選択検索のクエリ条件を構築します
* @param SRequest $req
* @return boolean|multitype:Ambigous
*/
private function whereCheck(SRequest $req){
//リクエストパラメータ名
$name= 'crud_'. $this->name;

//このリクエストパラメータが存在しない場合
if(!$req->exist($name)){
return false;
}

//リクエストパラメータが空です
$ v=trim($req->$name);
if(!$v){
return false;
}

//リクエストパラメータに不正な文字が含まれている場合
if(! $this->antiInject($ v, ''"\')){
return false;
}

//パラメータを標準化する
switch($this->simpleType){
case 'I':
case 'R':
配列を返す ($this->name=>intval($v));
break;
case 'L':
return array($this->name=>( $v=='1' or strto lower($v)=='true'));
}

//Return array($this-> ;name= >$v);
}

/**
* ユーザーリクエストパラメータに基づいてクエリ条件を構築します
*
* @param SRequest $req
* @throws Exception
* @return Ambigous |Ambigous |Ambigous |Ambigous
*/
public function where(SRequest $req) {
switch ($this->searchType) {
case 'Like' :
return $this- >whereLike ( $req );
case 'Equal' :
return $this->whereEqual ( $req );
case 'Date' :
return $this->whereDate ( $req );
case 'Time ' :
return $this->whereTime ( $req );
case 'List' :
return $this->whereEqual( $req );
case 'Tree' :
return $this->whereEqual ( $ req );
case 'ラジオ' :
return $this->whereRadio ( $req );
case 'Check' :
return $this->whereCheck ( $req );
case 'Range' :
return $ this->whereRange ( $req );
case 'DateRange' :
return $this->whereDateRange ( $req );
}
throw new Exception ( 'プログラム フローはここに到達すべきではありません' );
}

上記は、一般的な CRUD 関数フレームワークの内容です (6) IcePHP フレームワークの高速バックエンドの SCrudField フィールド クラス 詳細については、PHP 中国語 Web サイト (www.php.cn) を参照してください。



ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート