Maison  >  Article  >  développement back-end  >  Utilisation de base du framework Yii en PHP

Utilisation de base du framework Yii en PHP

墨辰丷
墨辰丷original
2018-06-07 14:34:113863parcourir

Cet article présente principalement l'utilisation de base du framework Yii en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Dans le code généré automatiquement par Yii, on peut toujours voir CGridView dans l'interface d'administration. Il s'agit d'un contrôle de table très utile pour afficher les données, s'il est bien utilisé, il peut accélérer considérablement la progression du développement. Explorons l'utilisation de base de 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='日志表';

Deux tables, l'une stockant les informations sur l'auteur et l'autre stockant les journaux, où les journaux ont une clé étrangère associée à l'utilisateur. Le champ is_delete dans les deux tables indique si l'enregistrement a été supprimé, 0 signifie non supprimé et 1 signifie supprimé. Jetons un coup d'œil à la méthode de relation de la classe Post générée avec gii :

/** 
 * @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'), 
  ); 
}

La clé étrangère auteur existe sous la forme d'une relation BELONGS_TO, ce qui est conforme à nos attentes.
Cela dit, jetez un œil au code de CGridView dans admin.php dans le message généré automatiquement :

<?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;, 
    ), 
  ), 
)); ?>

Regardez ! Bien que nous n’ayons rien écrit, il s’agit de l’utilisation la plus basique de ce contrôle. dataProvider sont les données fournies par la fonction de recherche dans le modèle, filtre... Je ne vois pas le rôle ici pour le moment. Columns contrôle chaque colonne affichée. Le dernier élément de CButtonColumn nous montre trois boutons, à savoir View Update et. supprimer.
Ensuite, nous allons le transformer petit à petit.

Utilisez CGridView pour afficher le formulaire de données que nous voulons vraiment : Souvent, les éléments de la base de données ne conviennent pas pour être affichés directement. à l'utilisateur. Nous en avons besoin. Il n'est adapté à la lecture qu'après un certain traitement. Mais sans modification ici, CGridView ne présentera que la valeur de la base de données inchangée, nous devons donc la modifier dans le champ correspondant. Par exemple, dans le champ is_delete, 0 et 1 sont stockés dans la base de données, mais ce n'est pas très bon à lire ici. Nous devrions le changer en 1 pour afficher « oui » et 0 pour afficher « non ». Jetez un œil au code ci-dessous. Nous utilisons un tableau. Les deux clés sont name et value. Le nom correspond aux champs appartenant au modèle, et la valeur correspond aux données que vous souhaitez afficher. code exécuté. En voyant cela, pensez-vous que nous pouvons faire beaucoup avec cette valeur ? Certains étudiants peuvent se demander : si le code que je veux exécuter est très long, est-il entièrement écrit en valeur ? . . . J'ai dit camarade de classe, n'écrirais-tu pas une fonction ailleurs et ne l'appellerais-tu pas ici ? ?

<?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;, 
    ), 
  ), 
)); ?>

De plus, certaines options couramment utilisées peuvent être renseignées dans le tableau. Voici l'utilisation la plus courante (d'autres parties du code sont omises) :

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 的类 
),

Si nous utilisons le nom ci-dessus, il s'agit d'un champ existant dans le modèle. Si nous souhaitons afficher un nouveau contenu défini par nous-mêmes, utilisez header :

array( 
  &#39;header&#39;=>&#39;备注&#39;, 
  &#39;value&#39;=> &#39;display your data&#39; 
),

pour ajouter CCheckBoxColumn : Parfois peut-être Nous aurons besoin d'une case à cocher pour sélectionner chaque ligne. A ce moment, nous pouvons ajouter une colonne et utiliser la classe CCheckBoxColumn :

<?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;, 
    ), 
  ), 
));

pour modifier la ButtonColumn : Notez que. chaque colonne de la liste Les trois dernières petites icônes de l'élément ? Bien sûr, si vous n’en avez pas besoin, supprimez-les directement. Mais que se passe-t-il si vous n’en voulez que quelques-uns ? Vous pouvez ajouter un paramètre de modèle :

array( 
     &#39;class&#39;=>&#39;ButtonColumn&#39;, 
     &#39;template&#39;=>"{view} {update}", 
   ),
Vous pouvez également personnaliser le bouton :

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"), 
        ), 
      ), 
    ),

Déclencher Javascript lors du rafraîchissement : Si vous souhaitez déclencher après chaque search Certains Javascript et Yii proposent également cette option. Il vous suffit de l'écrire sous forme de fonction et de la définir aprèsAjaxUpdate. N'oubliez pas que ceci n'est appelé qu'une fois la requête ajax terminée. Si vous souhaitez l'appeler dès que la page est chargée, vous devez l'ajouter à la page. Javascript

  $js = <<<_JS_ 
function(){ 
  alert(&#39;The ajax finish&#39;); 
 
} 
_JS_; 
 
$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;afterAjaxUpdate&#39;=>$js, //看这里,ajax 之后调用的 javascript 在这里.... 
  &#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;), 
      &#39;checkBoxHtmlOptions&#39; => array(&#39;name&#39; => &#39;myname&#39;,&#39;class&#39;=>&#39;myclass&#39;), 
    ), 
    ....

Ajouter la recherche des champs associés dans le tableau associé : Tout d'abord, nous parlons uniquement de "un-à-plusieurs". " recherche associée ici. Tout d'abord, n'oubliez pas notre base de données, les étudiants qui ont oublié veuillez cliquer ici : Ici, vous pouvez voir qu'il y a une clé étrangère dans tbl_post associée à la table tbl_user pour trouver des informations pertinentes sur l'auteur. Après avoir construit la base de données, jetez un œil au modèle POST du code Yii que nous avons généré. La réalité à l'intérieur est la suivante (ignorez le commentaire) :

/** 
 * @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( 
    &#39;comments&#39; => array(self::HAS_MANY, &#39;Comment&#39;, &#39;post_id&#39;), 
    &#39;author&#39; => array(self::BELONGS_TO, &#39;User&#39;, &#39;author_id&#39;), 
  ); 
}
Vous pouvez voir que les tables POST et USER peuvent. accessible via la clé d'auteur. Par exemple : $model->author->nickname, et voici la relation BELONGS_TO.

Cela dit, quels sont exactement nos besoins ? ....

Le chef de produit a remonté ses lunettes : "Nous souhaitons ajouter une fonction à l'interface de gestion backend du log, qui permet de rechercher les articles correspondants par nom d'auteur. C'est urgent et sera terminé ce soir "

    淡定淡定,不就是改需求吗。忽略进度要求,我们研究一下究竟要做什么。
    其实很简单的,不就是在 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异常处理定义与使用方法详解

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn