この拡張機能はサードパーティの開発者が使用することを目的としているため、作成には追加の労力が必要です。一般的なガイドラインは次のとおりです:
*拡張機能は単独で使用するのが最適です。言い換えれば、その外部依存関係は最小限である必要があります。ユーザーの拡張機能で追加のパッケージ、クラス、またはリソース ファイルのインストールが必要な場合、これは頭痛の種になります。 ※同じ拡張子に属するファイルは同じディレクトリにまとめ、ディレクトリ名は拡張子名を使用します。 *拡張機能内のクラスでは、他の拡張機能との名前の競合を避けるために、いくつかの単語文字の接頭辞を使用する必要があります。 *拡張機能では、詳細なインストールと API ドキュメントが提供される必要があります。これにより、拡張機能を使用する他の開発者が費やす時間と労力が削減されます。 ※拡張機能は適切な権限を付与して使用する必要があります。拡張機能をオープン ソース プロジェクトとクローズド ソース プロジェクトの両方で使用したい場合は、BSD、MIT などのライセンスの使用を検討できますが、そこから派生したコードがオープン ソースである必要があるため、GPL は使用しません。
以下では、概要で説明したカテゴリに従って、新しい拡張機能を作成する方法を説明します。これらの説明は、主に独自のプロジェクトで使用されるコンポーネントを作成する場合にも当てはまります。
アプリケーション コンポーネントは、インターフェイス IApplicationComponent を実装するか、CApplicationComponent を継承する必要があります。実装する必要がある主なメソッドは IApplicationComponent::init で、コンポーネントは初期化作業を実行します。このメソッドは、ウィジェットが作成され、プロパティ値 (アプリケーション構成で指定された) が割り当てられた後に呼び出されます。
デフォルトでは、アプリケーション ウィジェットは作成および初期化され、最初にアクセスされたときにのみ処理されます。アプリケーション インスタンスの作成後にアプリケーション コンポーネントを作成する必要がある場合、ユーザーは CApplication::preload のプロパティに自分の番号をリストする必要があります。
便宜上、Yii はこのインターフェースを実装した基本クラス CBehavior を提供し、主に追加のメソッドを実装する必要がある追加のメソッドを提供します。 CModel と CActiveRecord の動作を開発する場合、これらの基本クラスは、CModel と CActiveRecord 用に特別に作成された追加機能をそれぞれ提供することもできます。 CActiveRecordBehavior クラスは、ActiveRecord オブジェクトで発生したライフ サイクル イベントに応答する一連のメソッドを実装するため、子クラスはこれらのメソッドをオーバーライドして、AR ライフ サイクルに参加するカスタマイズされたコードを挿入できます。
次のコードは、 ActiveRecord の動作の例。この動作が AR オブジェクトにアタッチされ、save()
を呼び出して AR オブジェクトが保存されると、create_time
と create_time
が自動的に設定されます。 update_time
属性と現在のタイムスタンプ。
save()
, it will automatically sets the create_time
and update_time
attributes with the current timestamp.
class TimestampBehavior extends CActiveRecordBehavior { public function beforeSave($event) { if($this->owner->isNewRecord) $this->owner->create_time=time(); else $this->owner->update_time=time(); } }
widget应继承CWidget或其子类。 A widget should extend from CWidget or its child classes.
最简单的方式建立一个新的小工具是继承一个现成的小工具和重载它的方法或改变其默认的属性值。例如,如果您想为CTabView使用更好的CSS样式,您可以配置其CTabView::cssFile属性,当使用的小工具时。您还可以继承CTabView如下,让您在使用小工具时,不再需要配置属性。
class MyTabView extends CTabView { public function init() { if($this->cssFile===null) { $file=dirname(__FILE__).DIRECTORY_SEPARATOR.'tabview.css'; $this->cssFile=Yii::app()->getAssetManager()->publish($file); } parent::init(); } }
在上面的,我们重载CWidget::init方法和指定CTabView::cssFile的URL到我们的新的默认CSS样式如果此属性未设置时。我们把新的CSS样式文件和MyTabView
类文件放在相同的目录下,以便他们能够封装成扩展。由于CSS样式文件不是通过Web访问,我们需要发布作为一项asset资源。
要从零开始创建一个新的小工具,我们主要是需要实现两个方法:CWidget::init 和CWidget::run。第一种方法是当我们在视图中使用 $this->beginWidget
插入一个小工具时被调用,第二种方法在$this->endWidget
class MyWidget extends CWidget { protected function registerClientScript() { // ...publish CSS or JavaScript file here... $cs=Yii::app()->clientScript; $cs->registerCssFile($cssFile); $cs->registerScriptFile($jsFile); } }
class MyFilter extends CFilter { protected function preFilter($filterChain) { // logic being applied before the action is executed return true; // false if the action should not be executed } protected function postFilter($filterChain) { // logic being applied after the action is executed } }
MyTabView
クラス ファイルを同じディレクトリに配置して、拡張機能としてパッケージ化できるようにします。 CSS スタイル ファイルは Web からアクセスできないため、アセット リソースとして公開する必要があります。 🎜🎜 新しいガジェットを最初から作成するには、主に CWidget::init と CWidget::run の 2 つのメソッドを実装する必要があります。最初のメソッドは、$this->beginWidget
を使用してビューにウィジェットを挿入するときに呼び出され、2 番目のメソッドは $this->endWidget
を使用するときに呼び出されます。呼ばれたら呼ばれる。これら 2 つのメソッド呼び出しの間に表示されたコンテンツをキャプチャして処理したい場合は、CWidget::init で出力バッファリングを開始し、バッファリングされた出力を CWidget::run で再利用してさらなる処理を行うことができます。これら 2 つのメソッド呼び出しの間に表示されるコンテンツをキャプチャして処理したい場合は、CWidget::init で出力バッファリングを開始し、さらなる処理のために CWidget::run でバッファリングされた出力を取得できます。🎜在网页中使用的小工具,小工具往往包括CSS,Javascript或其他资源文件。我们叫这些文件assets,因为他们和小工具类在一起,而且通常Web用户无法访问。为了使这些档案通过Web访问,我们需要用CWebApplication::assetManager发布他们,例如上述代码段所示。此外,如果我们想包括CSS或JavaScript文件在当前的网页,我们需要使用CClientScript注册 :
class MyWidget extends CWidget { protected function registerClientScript() { // ...publish CSS or JavaScript file here... $cs=Yii::app()->clientScript; $cs->registerCssFile($cssFile); $cs->registerScriptFile($jsFile); } }
小工具也可能有自己的视图文件。如果是这样,创建一个目录命名views
在包括小工具类文件的目录下,并把所有的视图文件放里面。在小工具类中使用$this->render('ViewName')
来render渲染小工具视图,类似于我们在控制器里做。
action应继承CAction或者其子类。action要实现的主要方法是IAction::run 。
filter应继承CFilter 或者其子类。filter要实现的主要方法是CFilter::preFilter和CFilter::postFilter。前者是在action之前被执行,而后者是在之后。
class MyFilter extends CFilter { protected function preFilter($filterChain) { // logic being applied before the action is executed return true; // false if the action should not be executed } protected function postFilter($filterChain) { // logic being applied after the action is executed } }
参数$filterChain
的类型是CFilterChain,其包含当前被filter的action的相关信息。
controller要作为扩展需继承CExtController,而不是 CController。主要的原因是因为CController 认定控制器视图文件位于application.views.ControllerID
下,而CExtController认定视图文件在views
目录下,也是包含控制器类目录的一个子目录。因此,很容易重新分配控制器,因为它的视图文件和控制类是在一起的。
Validator需继承CValidator和实现CValidator::validateAttribute方法。
class MyValidator extends CValidator { protected function validateAttribute($model,$attribute) { $value=$model->$attribute; if($value has error) $model->addError($attribute,$errorMessage); } }
console command 应继承CConsoleCommand和实现CConsoleCommand::run方法。 或者,我们可以重载CConsoleCommand::getHelp来提供 一些更好的有关帮助命令。
class MyCommand extends CConsoleCommand { public function run($args) { // $args gives an array of the command-line arguments for this command } public function getHelp() { return 'Usage: how to use this command'; } }
请参阅modules一节中关于就如何创建一个模块。
一般准则制订一个模块,它应该是独立的。模块所使用的资源文件(如CSS , JavaScript ,图片),应该和模块一起分发。还有模块应发布它们,以便可以Web访问它们 。
开发一个通用组件扩展类似写一个类。还有,该组件还应该自足,以便它可以很容易地被其他开发者使用。
以上就是Yii框架官方指南系列35——扩展Yii:创建扩展的内容,更多相关内容请关注PHP中文网(www.php.cn)!