YiiはCHtmlを拡張してテキストフィールドを操作します

みなさんこんにちは。 私は現在Yiiで別のプロジェクトを書いていますが、いくつかの開発を共有したいと思います。 この記事では、 CHtmlCActiveFormクラスの継承を使用して、フレームワークの機能を拡張する方法を説明します。 ここには複雑で革新的なものは何もありません。これを共有したいと思います。 私のタスクは2つの要素を作成することでした:


以下は、次のコード(habracatの後のコード)の結果の例です。

画像

<?php $form = $this -> beginWidget ( 'MActiveForm' , array ( <br/>
'id' => 'personal-form' , <br/>
'enableAjaxValidation' => false , <br/>
) ) ; <br/>
<br/>
?> <br/>
<?php echo $form -> errorSummary ( $model ) ; ?> <br/>
<br/>
<div class="row"><br/>
<?php echo $form -> labelEx ( $model , 'gender' ) ; ?> <br/>
<?php echo $form -> labelField ( $model , 'gender' ) ; ?> <br/>
<?php echo $form -> error ( $model , 'gender' ) ; ?> <br/>
</div><br/>
<br/>
<div class="row"><br/>
<?php echo $form -> labelEx ( $model , 'firstname' ) ; ?> <br/>
<?php echo $form -> labelField ( $model , 'firstname' ) ; ?> <br/>
<?php echo $form -> error ( $model , 'firstname' ) ; ?> <br/>
</div><br/>
<br/>
<div class="row"><br/>
<?php echo $form -> labelEx ( $model , 'secondname' ) ; ?> <br/>
<?php echo $form -> labelField ( $model , 'secondname' ) ; ?> <br/>
<?php echo $form -> error ( $model , 'secondname' ) ; ?> <br/>
</div><br/>
<br/>
<div class="row"><br/>
<?php echo $form -> labelEx ( $model , 'lastname' ) ; ?> <br/>
<?php echo $form -> labelField ( $model , 'lastname' ) ; ?> <br/>
<?php echo $form -> error ( $model , 'lastname' ) ; ?> <br/>
</div> <br/>
<? $this -> endWidget ( ) ; ?> <br/>


最初のフォームを書いたとき、yiiでは標準のCActiveFormウィジェットを使用しているので、引き続き使用するのがいいと思いました。 最後に、この方法でフォームフィールドを表示できるようになりました(MActiveFormウィジェットのみ)。

<?php echo $form->labelField($model,'secondname'); ?>

実際、CActiveFormはCHtmlクラスのactiveTextField型のメソッドの単なるミラーであるため、 CHtmlクラスを拡張する必要がありました。
そしてそれにactiveLabelField関数を追加します(カスタムlabelFieldコントロールを呼び出しましょう)

<?php <br/>
<br/>
class MHtml extends CHtml<br/>
{ <br/>
static $msPublished = false ; // css js <br/>
<br/>
protected static function registerMHtmlAsset ( ) <br/>
{ <br/>
if ( ! MHtml :: $msPublished ) <br/>
{ <br/>
$path = Yii :: app ( ) -> getAssetManager ( ) -> publish ( Yii :: getPathOfAlias ( 'application.components.assets.mhtml' ) , false , - 1 , true ) ; // false, - asset ( ) <br/>
Yii :: app ( ) -> getClientScript ( ) -> registerScriptFile ( $path . '/mhtml.js' , CClientScript :: POS_END ) ; <br/>
Yii :: app ( ) -> getClientScript ( ) -> registerCssFile ( $path . '/mhtml.css' ) ; <br/>
MHtml :: $msPublished = true ; <br/>
} <br/>
} <br/>
public static function addClass ( $class , $htmlOptions = array ( ) ) <br/>
{ <br/>
if ( isset ( $htmlOptions [ "class" ] ) ) <br/>
$htmlOptions [ "class" ] .= " " . $class ; <br/>
else $htmlOptions [ "class" ] = $class ; <br/>
<br/>
return $htmlOptions ; <br/>
} <br/>
public static function labelField ( $name , $value = '' , $htmlOptions = array ( ) ) <br/>
{ <br/>
MHtml :: registerMHtmlAsset ( ) ; <br/>
return MHtml :: textField ( $name , $value , MHtml :: addClass ( "labelInput" , $htmlOptions ) ) ; <br/>
} <br/>
<br/>
public static function activeLabelField ( $model , $attribute , $htmlOptions = array ( ) ) <br/>
{ <br/>
MHtml :: registerMHtmlAsset ( ) ; <br/>
self :: resolveNameID ( $model , $attribute , $htmlOptions ) ; <br/>
self :: clientChange ( 'change' , $htmlOptions ) ; <br/>
return self :: activeInputField ( 'text' , $model , $attribute , MHtml :: addClass ( "labelInput" , $htmlOptions ) ) ; <br/>
} <br/>
<br/>
public static function textHint ( $text , $htmlOptions = array ( ) ) <br/>
{ <br/>
MHtml :: registerMHtmlAsset ( ) ; <br/>
<br/>
return MHtml :: tag ( 'div' , MHtml :: addClass ( "textHint_mh" , $htmlOptions ) , $text ) ; <br/>
} <br/>
} <br/>
?>
<?php <br/>
<br/>
class MHtml extends CHtml<br/>
{ <br/>
static $msPublished = false ; // css js <br/>
<br/>
protected static function registerMHtmlAsset ( ) <br/>
{ <br/>
if ( ! MHtml :: $msPublished ) <br/>
{ <br/>
$path = Yii :: app ( ) -> getAssetManager ( ) -> publish ( Yii :: getPathOfAlias ( 'application.components.assets.mhtml' ) , false , - 1 , true ) ; // false, - asset ( ) <br/>
Yii :: app ( ) -> getClientScript ( ) -> registerScriptFile ( $path . '/mhtml.js' , CClientScript :: POS_END ) ; <br/>
Yii :: app ( ) -> getClientScript ( ) -> registerCssFile ( $path . '/mhtml.css' ) ; <br/>
MHtml :: $msPublished = true ; <br/>
} <br/>
} <br/>
public static function addClass ( $class , $htmlOptions = array ( ) ) <br/>
{ <br/>
if ( isset ( $htmlOptions [ "class" ] ) ) <br/>
$htmlOptions [ "class" ] .= " " . $class ; <br/>
else $htmlOptions [ "class" ] = $class ; <br/>
<br/>
return $htmlOptions ; <br/>
} <br/>
public static function labelField ( $name , $value = '' , $htmlOptions = array ( ) ) <br/>
{ <br/>
MHtml :: registerMHtmlAsset ( ) ; <br/>
return MHtml :: textField ( $name , $value , MHtml :: addClass ( "labelInput" , $htmlOptions ) ) ; <br/>
} <br/>
<br/>
public static function activeLabelField ( $model , $attribute , $htmlOptions = array ( ) ) <br/>
{ <br/>
MHtml :: registerMHtmlAsset ( ) ; <br/>
self :: resolveNameID ( $model , $attribute , $htmlOptions ) ; <br/>
self :: clientChange ( 'change' , $htmlOptions ) ; <br/>
return self :: activeInputField ( 'text' , $model , $attribute , MHtml :: addClass ( "labelInput" , $htmlOptions ) ) ; <br/>
} <br/>
<br/>
public static function textHint ( $text , $htmlOptions = array ( ) ) <br/>
{ <br/>
MHtml :: registerMHtmlAsset ( ) ; <br/>
<br/>
return MHtml :: tag ( 'div' , MHtml :: addClass ( "textHint_mh" , $htmlOptions ) , $text ) ; <br/>
} <br/>
} <br/>
?>


少し説明します。 ツールチップを使用してテキストを作成するには、textHint_mhクラスを使用してdivを作成するだけです。

クリックするとテキストフィールドに変わるテキストを作成するには、labelInputクラスを使用して入力フィールドを作成します。これは、javascriptコードを読み込んだ後に非表示になり、代わりにtextHint_mhクラスを含むdivが表示されます。

ここにそのような紛らわしいナンセンスがあります。 次に、CActiveFormクラスを拡張する必要があります。

<?php <br/>
<br/>
class MActiveForm extends CActiveForm<br/>
{ <br/>
public function labelField ( $model , $attribute , $htmlOptions = array ( ) ) <br/>
{ <br/>
return MHtml :: activeLabelField ( $model , $attribute , $htmlOptions ) ; <br/>
} <br/>
}
<?php <br/>
<br/>
class MActiveForm extends CActiveForm<br/>
{ <br/>
public function labelField ( $model , $attribute , $htmlOptions = array ( ) ) <br/>
{ <br/>
return MHtml :: activeLabelField ( $model , $attribute , $htmlOptions ) ; <br/>
} <br/>
}


数行。 そして、jsとcssが登場します。 すべてが機能し、すべてがシンプルです。 誰かが役に立つといいな

ソースコードはこちら

Source: https://habr.com/ru/post/J143800/


All Articles