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が登場します。 すべてが機能し、すべてがシンプルです。 誰かが役に立つといいな



ソースコードはこちら



All Articles