PHP での Yii フレームワークの基本的な使用法

墨辰丷
リリース: 2023-03-30 13:16:01
オリジナル
3884 人が閲覧しました

この記事では主に PHP における Yii フレームワークの基本的な使い方を紹介します。興味のある方はぜひ参考にしてください。

Yii によって自動的に生成されたコードでは、管理インターフェースに常に CGridView が表示されます。これは、データを表示するための非常に便利なテーブル コントロールです。うまく使用すると、開発の進行を大幅にスピードアップできます。 CGridView の基本的な使用法を見てみましょう。

drop table if exists `tbl_user`; 
CREATE TABLE tbl_user 
( 
  `user_id` INTEGER NOT NULL AUTO_INCREMENT comment '主键', 
  `username` VARCHAR(128) NOT NULL comment '用户名', 
  `nickname` VARCHAR(128) NOT NULL comment '昵称', 
  `password` VARCHAR(128) NOT NULL comment '密码', 
  `email` VARCHAR(128) NOT NULL comment '邮箱', 
  `is_delete` tinyint not null default 0 comment '删除标志', 
  unique key(`username`), 
  primary key (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='用户表'; 
 
drop table if exists `tbl_post`; 
CREATE TABLE tbl_post 
( 
  `post_id` INTEGER NOT NULL AUTO_INCREMENT comment '主键', 
  `title` VARCHAR(128) NOT NULL comment '标题', 
  `content` TEXT NOT NULL comment '文章内容', 
  `tags` TEXT comment '标签', 
  `status` INTEGER NOT NULL comment '状态,0 = 草稿,1 = 审核通过,-1 = 审核不通过,2 = 发布', 
  `create_time` INTEGER comment '创建时间', 
  `update_time` INTEGER comment '更新时间', 
  `author_id` INTEGER NOT NULL comment '作者', 
  `is_delete` tinyint not null default 0 comment '删除标志', 
  CONSTRAINT `post_ibfk_1` FOREIGN KEY (author_id) 
    REFERENCES tbl_user (`user_id`) ON DELETE CASCADE ON UPDATE RESTRICT, 
  primary key (`post_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='日志表';
ログイン後にコピー

2 つのテーブル。1 つは作成者情報を保存し、もう 1 つはログを保存します。ログにはユーザーに関連付けられた外部キーがあります。 2 つのテーブルの is_delete フィールドは、レコードが削除されたかどうかをマークします。0 は削除されていないことを意味し、1 は削除されたことを意味します。 gii で生成された Post クラスのリレーション メソッドを見てみましょう。

/** 
 * @return array relational rules. 
 */ 
public function relations() 
{ 
  // NOTE: you may need to adjust the relation name and the related 
  // class name for the relations automatically generated below. 
  return array( 
    'comments' => array(self::HAS_MANY, 'Comment', 'post_id'), 
    'author' => array(self::BELONGS_TO, 'User', 'author_id'), 
  ); 
}
ログイン後にコピー

author 外部キーは BELONGS_TO リレーションシップとして存在しており、これは期待どおりです。
ここまで述べたので、自動生成された Post 内の admin.php の CGridView のコードを見てみましょう。

<?php $this->widget(&#39;zii.widgets.grid.CGridView&#39;, array( 
  &#39;id&#39;=>&#39;post-grid&#39;, 
  &#39;dataProvider&#39;=>$model->search(), 
  &#39;filter&#39;=>$model, 
  &#39;columns&#39;=>array( 
    &#39;post_id&#39;, 
    &#39;title&#39;, 
    &#39;content&#39;, 
    &#39;tags&#39;, 
    &#39;status&#39;, 
    &#39;create_time&#39;, 
    &#39;update_time&#39;, 
    &#39;author_id&#39;, 
    &#39;is_delete&#39;, 
    array( 
      &#39;class&#39;=>&#39;CButtonColumn&#39;, 
    ), 
  ), 
)); ?>
ログイン後にコピー

見てください。何も書いていませんが、これがこのコントロールの最も基本的な使い方です。 dataProvider はモデル内の検索関数によって提供されるデータです。Filter... 現時点ではここでの役割はわかりません。CButtonColumn の最後の項目には、View Update と 3 つのボタンが表示されます。消去。
次に、それを少しずつ変換していきます。

CGridView を使用して、実際に必要なデータ形式を表示します。 多くの場合、データベース内の内容は直接表示するには適していません。一定の処理を行った後のみ読み取りに適しています。ただし、ここで変更を行わないと、CGridView はデータベース値を変更せずに表示するだけなので、対応するフィールドで値を変更する必要があります。たとえば、is_delete フィールドには 0 と 1 がデータベースに格納されていますが、ここを読み取るのはあまり良くありません。「はい」を表示するには 1 に、「いいえ」を表示するには 0 に変更する必要があります。以下のコードを見てください。2 つのキーはモデルが所有するフィールドに対応し、値は php ステートメントとして記述できます。コードが実行されました。これを見て、この値を使用して多くのことができると思いますか?学生の中には、実行したいコードが非常に長い場合、そのコードはすべて値で記述されているのではないかと尋ねる場合があります。 。 。 。私は、クラスメイト、どこか別の場所に関数を書いて、それをここで呼び出してみませんか、と言いました。 ?

<?php $this->widget(&#39;zii.widgets.grid.CGridView&#39;, array( 
  &#39;id&#39;=>&#39;post-grid&#39;, 
  &#39;dataProvider&#39;=>$model->search(), 
  &#39;filter&#39;=>$model, 
  &#39;columns&#39;=>array( 
    &#39;post_id&#39;, 
    &#39;title&#39;, 
    &#39;content&#39;, 
    &#39;tags&#39;, 
    &#39;status&#39;, 
    &#39;create_time&#39;, 
    &#39;update_time&#39;, 
    &#39;author_id&#39;, 
    &#39;is_delete&#39;, 
    array( 
      &#39;name&#39;=>&#39;is_delete&#39;, 
      &#39;value&#39;=>&#39;is_delete?"是":"否"&#39; //value 是可以执行 php 语句的哦 
    ) 
    array( 
      &#39;class&#39;=>&#39;CButtonColumn&#39;, 
    ), 
  ), 
)); ?>
ログイン後にコピー

さらに、配列に入力できる一般的に使用されるオプションがいくつかあります。より一般的な使用法は次のとおりです (コードの他の部分は省略されています)。名前については、モデル内のオリジナルのフィールドを使用します。自分で定義した新しいコンテンツを表示したい場合は、header:

array( 
  &#39;name&#39;=>&#39;is_delete&#39;, 
  &#39;value&#39;=>&#39;is_delete?"是":"否"&#39; //value 是可以执行 php 语句的哦 
  &#39;filter&#39; => array(0=>&#39;否&#39;,1=>&#39;是&#39;), //自己定义搜索过滤的方式,这里为 是 和 否 的下拉菜单 
  &#39;htmlOptions&#39;=>array(&#39;class&#39;=>&#39;delete&#39;), //可以定义 html 选项,这里是定义了带一个 delete 的类 
),
ログイン後にコピー

を使用して CCheckBoxColumn:

を追加することがあります。各行を選択するにはチェック ボックス ボックスが必要です。この時点で、列を追加し、CCheckBoxColumn クラスを使用して ButtonColumn を変更できます。 最後の 3 つの小さいことに気づきましたか。リスト内の各項目のアイコン?もちろん、それらが必要ない場合は、直接削除してください。しかし、それらのうちのいくつかだけが必要な場合はどうすればよいでしょうか。テンプレート パラメータを追加できます:

array( 
  &#39;header&#39;=>&#39;备注&#39;, 
  &#39;value&#39;=> &#39;display your data&#39; 
),
ログイン後にコピー

ボタンをカスタマイズすることもできます:

<?php $this->widget(&#39;zii.widgets.grid.CGridView&#39;, array( 
  &#39;id&#39;=>&#39;post-grid&#39;, 
  &#39;dataProvider&#39;=>$model->search(), 
  &#39;filter&#39;=>$model, 
  &#39;columns&#39;=>array( 
    array( 
      &#39;selectableRows&#39; => 2, //允许多选,改为 0 时代表不允许修改,1 的话为单选 
      &#39;class&#39; => &#39;CCheckBoxColumn&#39;,//复选框 
      &#39;headerHtmlOptions&#39; => array(&#39;width&#39;=>&#39;18px&#39;),//头部的 html 选项 
      &#39;checkBoxHtmlOptions&#39; => array(&#39;name&#39; => &#39;myname&#39;,&#39;class&#39;=>&#39;myclass&#39;), //复选框的 html 选项 
    ), 
    &#39;post_id&#39;, 
    &#39;title&#39;, 
    &#39;content&#39;, 
    &#39;tags&#39;, 
    &#39;status&#39;, 
    &#39;create_time&#39;, 
    &#39;update_time&#39;, 
    &#39;author_id&#39;, 
    &#39;is_delete&#39;, 
    array( 
      &#39;name&#39;=>&#39;is_delete&#39;, 
      &#39;value&#39;=>&#39;is_delete?"是":"否"&#39;, //value 是可以执行 php 语句的哦 
      &#39;filter&#39; => array(0=>&#39;否&#39;,1=>&#39;是&#39;), //自己定义搜索过滤的方式,这里为 是 和 否 的下拉菜单 
      &#39;htmlOptions&#39;=>array(&#39;class&#39;=>&#39;delete&#39;), //可以定义 html 选项,这里是定义了带一个 delete 的类 
    ), 
    array( 
      &#39;class&#39;=>&#39;CButtonColumn&#39;, 
    ), 
  ), 
));
ログイン後にコピー
更新時に Javascript をトリガーする:

各検索後に Javascript をトリガーしたい場合は、 Yii このオプションも提供されています。これを関数として記述し、afterAjaxUpdate を設定するだけです。ページがロードされた直後に呼び出す必要があることに注意してください。ページに Javascript## を追加します。 #
array( 
     &#39;class&#39;=>&#39;ButtonColumn&#39;, 
     &#39;template&#39;=>"{view} {update}", 
   ),
ログイン後にコピー

関連テーブルの関連フィールドの検索を追加します。

まず、ここでは「1 対多」の関連検索についてのみ説明します。まず第一に、データベースを忘れないでください。忘れた場合は、ここをクリックしてください。ここでは、作成者関連の情報を検索するための tbl_user テーブルに関連付けられた外部キーが tbl_post にあることがわかります。データベースを構築した後、生成した Yii コードの POST モデルを見てください。内部の関係は次のとおりです (コメントは無視してください):

array( 
  &#39;class&#39;=>&#39;ButtonColumn&#39;, 
  &#39;template&#39;=>"{view} {update} {print}", 
  &#39;buttons&#39;=>array( 
      &#39;print&#39;=>array( 
          &#39;label&#39;=>&#39;打印&#39;, 
          &#39;url&#39;=>&#39;Yii::app()->controller->createUrl("print", array("id"=>$data->post_id))&#39;, 
          &#39;options&#39;=>array("target"=>"_blank"), 
        ), 
      ), 
    ),
ログイン後にコピー
POST テーブルと USER テーブルにアクセスできることがわかります。たとえば、$model->author->nickname のように、作成者キーを使用します。ここでは、BELONGS_TO 関係を示します。

ここまで述べてきましたが、私たちのニーズとは一体何でしょうか? ....

プロダクト マネージャーは眼鏡を上げました。「ログのバックエンド管理インターフェイスに、著者名で該当する記事を検索できる機能を追加したいと考えています。これは緊急であり、今夜には完了します。" "

淡定淡定,不就是改需求吗。忽略进度要求,我们研究一下究竟要做什么。
其实很简单的,不就是在 POST 的 admin 界面中增加一列作者名称,然后可以通过作者名的 模糊搜索 去找到对应日志吗?看看代码,要是通过 作者 id 去搜索不就简单了吗?不过这样确实不太友好...如果是展示作者名字而已不也是很简单吗?加一个 header 然后 value 是 $data->author->username, 问题是这样只能展示,不能进行搜索...哎,好苦恼。
淡定淡定,不就是多个搜索吗?来,让我告诉你怎么做。

首先,我们进入 POST 的 model,在一开始的地方添加一个属性:

class Post extends CActiveRecord 
{ 
  public $name; //添加一个 public 属性,代表作者名 
  然后改一下 Model 里面 search 的代码,改动部分都已经加了注释:
public function search() 
{ 
  // @todo Please modify the following code to remove attributes that should not be searched. 
 
  $criteria=new CDbCriteria; 
 
  $criteria->with = array(&#39;author&#39;); //添加了和 author 的渴求式加载 
 
  $criteria->compare(&#39;post_id&#39;,$this->post_id); 
  $criteria->compare(&#39;title&#39;,$this->title,true); 
  $criteria->compare(&#39;content&#39;,$this->content,true); 
  $criteria->compare(&#39;tags&#39;,$this->tags,true); 
  $criteria->compare(&#39;status&#39;,$this->status); 
  $criteria->compare(&#39;create_time&#39;,$this->create_time); 
  $criteria->compare(&#39;update_time&#39;,$this->update_time); 
  $criteria->compare(&#39;author_id&#39;,$this->author_id); 
 
  //这里添加了一个 compare, username 是 User 表的字段,$this->name 是我们添加的属性,true 为模糊搜索 
  $criteria->compare(&#39;username&#39;,$this->name,true); 
 
  return new CActiveDataProvider($this, array( 
    &#39;criteria&#39;=>$criteria, 
  )); 
}
ログイン後にコピー


然后在 view 里面,就是 post 文件夹的 admin.php ,CGridView 改为下面代码:

<?php $this->widget(&#39;zii.widgets.grid.CGridView&#39;, array( 
  &#39;id&#39;=>&#39;post-grid&#39;, 
  &#39;dataProvider&#39;=>$model->search(), 
  &#39;filter&#39;=>$model, 
  &#39;columns&#39;=>array( 
    &#39;post_id&#39;, 
    &#39;title&#39;, 
    &#39;content&#39;, 
    &#39;tags&#39;, 
    &#39;status&#39;, 
    &#39;create_time&#39;, 
    &#39;update_time&#39;, 
    &#39;author_id&#39;, 
    /*下面就是添加的代码啊*/ 
    array( 
      &#39;name&#39;=>&#39;作者名称&#39;, 
      &#39;value&#39;=>&#39;$data->author->username&#39;, //定义展示的 value 值 
      &#39;filter&#39;=>CHtml::activeTextField($model,&#39;name&#39;), //添加搜索 filter 
    ), 
    array( 
      &#39;class&#39;=>&#39;CButtonColumn&#39;, 
    ), 
  ), 
)); ?>
ログイン後にコピー

你是不是发现现在有了搜索框但是不起作用呢?哈哈,所以我们说文章要坚持看到最后。我们要做的最后一步,就是在 rule 里面,把 name 属性加入到安全搜索字段中,要不然会被 Yii 认为是不安全字段而过滤掉的。看,就在下面函数的最后一行,safe 前面多了个 name ....

public function rules() 
{ 
  // NOTE: you should only define rules for those attributes that 
  // will receive user inputs. 
  return array( 
    array(&#39;title, content, status, author_id&#39;, &#39;required&#39;), 
    array(&#39;status, create_time, update_time, author_id&#39;, &#39;numerical&#39;, &#39;integerOnly&#39;=>true), 
    array(&#39;title&#39;, &#39;length&#39;, &#39;max&#39;=>128), 
    array(&#39;tags&#39;, &#39;safe&#39;), 
    // The following rule is used by search(). 
    // @todo Please remove those attributes that should not be searched. 
    array(&#39;post_id, title, content, tags, status, create_time, update_time, author_id, name&#39;, &#39;safe&#39;, &#39;on&#39;=>&#39;search&#39;), 
  ); 
}
ログイン後にコピー

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP实现防盗链的方法实例详解

php判断str字符串是否是xml格式数据的方法(详解)

PHP异常处理定义与使用方法详解

以上がPHP での Yii フレームワークの基本的な使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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