Heim  >  Artikel  >  Backend-Entwicklung  >  Grundlegende Verwendung des Yii-Frameworks in PHP

Grundlegende Verwendung des Yii-Frameworks in PHP

墨辰丷
墨辰丷Original
2018-06-07 14:34:113861Durchsuche

Dieser Artikel stellt hauptsächlich die grundlegende Verwendung des Yii-Frameworks in PHP vor. Ich hoffe, dass er für alle hilfreich ist.

Im von Yii automatisch generierten Code können wir CGridView immer in der Admin-Oberfläche sehen. Dies ist ein sehr nützliches Tabellensteuerelement zur Anzeige von Daten. Bei richtiger Verwendung kann es den Entwicklungsfortschritt erheblich beschleunigen. Lassen Sie uns die grundlegende Verwendung von CGridView untersuchen:

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='日志表';

Zwei Tabellen, eine zum Speichern von Autoreninformationen und die andere zum Speichern von Protokollen, wobei den Protokollen ein mit dem Benutzer verknüpfter Fremdschlüssel zugeordnet ist. Das Feld is_delete in den beiden Tabellen markiert, ob der Datensatz gelöscht wurde. 0 bedeutet nicht gelöscht und 1 bedeutet gelöscht. Werfen wir einen Blick auf die Beziehungsmethode der mit gii generierten Post-Klasse:

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

Der Autor-Fremdschlüssel existiert als BELONGS_TO-Beziehung, was unseren Erwartungen entspricht.
Werfen Sie dennoch einen Blick auf den Code von CGridView in admin.php im automatisch generierten Beitrag:

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

Schauen Sie! Obwohl wir noch nichts geschrieben haben, ist dies die grundlegendste Verwendung dieses Steuerelements. dataProvider sind die von der Suchfunktion im Modell bereitgestellten Daten, Filter... Ich kann die Rolle hier derzeit nicht sehen. Columns steuert jede angezeigte Spalte. Das letzte Element von CButtonColumn zeigt uns drei Schaltflächen, nämlich View Update und löschen.
Als nächstes werden wir es Stück für Stück umwandeln

Verwenden Sie CGridView, um die Datenform anzuzeigen, die wir wirklich wollen: Oft sind die Dinge in der Datenbank nicht für die direkte Anzeige geeignet Für den Benutzer ist es erst nach einer bestimmten Verarbeitung zum Lesen geeignet. Aber ohne hier Änderungen vorzunehmen, stellt CGridView den Datenbankwert nur unverändert dar, daher sollten wir ihn im entsprechenden Feld ändern. Im Feld is_delete sind beispielsweise 0 und 1 in der Datenbank gespeichert, aber es ist nicht sehr gut zu lesen. Wir sollten es auf 1 ändern, um „Ja“ anzuzeigen, und auf 0, um „Nein“ anzuzeigen. Schauen Sie sich den Code unten an. Die beiden Schlüssel Name und Wert entsprechen den Daten, die Sie anzeigen möchten Code ausgeführt. Glauben Sie angesichts dessen, dass wir mit diesem Wert viel anfangen können? Einige Schüler fragen sich vielleicht: Wenn der Code, den ich ausführen möchte, sehr lang ist, ist alles in Wert geschrieben? . . . Ich sagte, Klassenkamerad, würdest du nicht woanders eine Funktion schreiben und sie dann hier aufrufen? ?

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

Darüber hinaus gibt es einige häufig verwendete Optionen, die in das Array eingefügt werden können. Das Folgende ist die häufigere Verwendung (andere Teile des Codes werden weggelassen):

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

Oben Wir verwenden den Namen, es handelt sich um ein Originalfeld im Modell. Wenn wir neuen, von uns definierten Inhalt anzeigen möchten, verwenden Sie den Header:

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

, um CCheckBoxColumn: hinzuzufügen. Manchmal benötigen wir Ein Kontrollkästchen zum Auswählen jeder Zeile. Zu diesem Zeitpunkt können wir eine Spalte hinzufügen und die Klasse CCheckBoxColumn verwenden:

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

, um die ButtonColumn zu ändern: Beachten Sie die letzten drei kleinen Symbole von jeder Zeile Element in der Liste? Wenn Sie sie nicht benötigen, löschen Sie sie natürlich direkt. Aber was ist, wenn Sie nur einige davon möchten? Sie können einen Vorlagenparameter hinzufügen:

array( 
     &#39;class&#39;=>&#39;ButtonColumn&#39;, 
     &#39;template&#39;=>"{view} {update}", 
   ),

Sie können auch die Schaltfläche anpassen:

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

Javascript beim Aktualisieren auslösen: Wenn Sie nach jeder Suche etwas Javascript auslösen möchten, Yii Diese Option ist ebenfalls vorhanden. Sie müssen sie nur als Funktion schreiben und nach AjaxUpdate festlegen. Denken Sie daran, dass dies erst nach Abschluss der Ajax-Anfrage aufgerufen werden muss Fügen Sie der Seite zusätzliches Javascript hinzu

  $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;), 
    ), 
    ....

Suche nach verwandten Feldern in der zugehörigen Tabelle hinzufügen: Zunächst einmal sprechen wir hier nur von der „Eins-zu-viele“-bezogenen Suche Alle, vergessen Sie nicht unsere Datenbank. Wenn Sie es vergessen, fragen Sie bitte hier: Hier können Sie sehen, dass in tbl_post ein Fremdschlüssel mit der Tabelle tbl_user verknüpft ist, um autorenbezogene Informationen zu finden. Schauen Sie sich nach dem Erstellen der Datenbank das POST-Modell des von uns generierten Yii-Codes an. Die darin enthaltene Beziehung ist wie folgt (ignorieren Sie den Kommentar):

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

Sie können sehen, dass auf die POST- und USER-Tabellen zugegriffen werden kann über den Autorenschlüssel, zum Beispiel: $model->Autor->Spitzname, und hier ist die BELONGS_TO-Beziehung.
Was genau sind unsere Bedürfnisse? ....

Der Produktmanager schob seine Brille hoch: „Wir möchten der Backend-Verwaltungsoberfläche des Protokolls eine Funktion hinzufügen, die es ermöglicht, nach Autorennamen nach entsprechenden Artikeln zu suchen. Dies ist dringend und.“ wird heute Abend abgeschlossen sein

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

Das obige ist der detaillierte Inhalt vonGrundlegende Verwendung des Yii-Frameworks in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn