Résumé des points de connaissance d'introduction de YiiFramework

不言
Libérer: 2023-04-01 09:52:01
original
1363 Les gens l'ont consulté

Cet article présente principalement les points de connaissances pour démarrer avec YiiFramework. Il résume et analyse les étapes spécifiques de création de YiiFramework et les précautions associées à son utilisation sous forme d'images et de textes.

Cet article résume les premiers pas avec YiiFramework. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Créer le squelette de l'application Yii

web est le répertoire racine du site Web
yiic webapp / web/demo

Vous devez faire attention lors de la création de modèles et de CURD via GII

Opération du générateur de modèle

Même s'il y a une table. préfixe, le tableau doit être renseigné dans le champ Nom de la table. Le nom complet, y compris le préfixe de la table. Comme indiqué ci-dessous :

2. Fonctionnement du générateur de crud

Dans cette interface, remplissez le nom du modèle dans la classe de modèle. Mettez la première lettre en majuscule. Vous pouvez également faire référence au nom de fichier généré par le générateur de modèle dans le répertoire proctected/models lors de la génération du modèle. Comme indiqué ci-dessous :

Si vous générez un contrôleur CURD pour les trois tables news, newstype et statustype, dans le générateur de modèle, entrez : News, newsType, StatusType. La casse est la même que celle du nom de fichier créé. Ce n'est pas acceptable s'il est écrit sous la forme NEWS ou News.

Remarques sur la création de modules

Lors de la création de modules via GII, l'ID du module est généralement en minuscules. Dans tous les cas, l'ID renseigné ici détermine la configuration dans le fichier de configuration main.php. Comme suit :

'modules'=>array(
  'admin'=>array(//这行的admin为Module ID。与创建Module时填写的Module ID大写写一致
    'class'=>'application.modules.admin.AdminModule',//这里的admin在windows os中大小写无所谓,但最好与实际目录一致。
  ),
),
Copier après la connexion

Route

system représente le répertoire framework du framework yii
application représente le répertoire protégé sous l'application créée (comme d :wwwrootblog).
application.modules.Admin.AdminModule
représente le fichier AdminModules.php dans le répertoire Admin sous le répertoire modules sous le répertoire de l'application (par exemple : d:wwwrootblogprotected) (pointant en fait vers la classe du nom du fichier)
system.db.*
représente tous les fichiers du répertoire db dans le répertoire framework sous le framework YII.

Description des accessRules dans le contrôleur

/**
 * Specifies the access control rules.
 * This method is used by the 'accessControl' filter.
 * @return array access control rules
 */
public function accessRules()
{
  return array(
    array('allow', // allow all users to perform 'index' and 'view' actions
      'actions'=>array('index','view'),//表示任意用户可访问index、view方法
      'users'=>array('*'),//表示任意用户
    ),
    array('allow', // allow authenticated user to perform 'create' and 'update' actions
      'actions'=>array('create','update'),//表示只有认证用户才可操作create、update方法
      'users'=>array('@'),//表示认证用户
    ),
    array('allow', // allow admin user to perform 'admin' and 'delete' actions
      'actions'=>array('admin','delete'),//表示只有用户admin才能访问admin、delete方法
      'users'=>array('admin'),//表示指定用户,这里指用户:admin
    ),
    array('deny', // deny all users
      'users'=>array('*'),
    ),
  );
}
Copier après la connexion

Voir les commentaires de code ci-dessus.

user : représente les informations de session utilisateur. Pour plus de détails, veuillez vous référer à l'API : CWebUser
CWebUser représente l'état persistant d'une application Web.
CWebUser sert de composant d'application avec l'ID utilisateur. Par conséquent, le statut de l'utilisateur est accessible n'importe où via Yii::app()->user

public function beforeSave()
{
  if(parent::beforeSave())
  {
    if($this->isNewRecord)
    {
      $this->password=md5($this->password);
      $this->create_user_id=Yii::app()->user->id;//一开始这样写,User::model()->user->id;(错误)
      //$this->user->id;(错误)
      $this->create_time=date('Y-m-d H:i:s');
    }
    else
    {
      $this->update_user_id=Yii::app()->user->id;
      $this->update_time=date('Y-m-d H:i:s');
    }
    return true;
  }
  else
  {
    return false;
  }
}
Copier après la connexion

méthodes getter ou/et méthode setter

<?php
/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity
{
  /**
   * Authenticates a user.
   * The example implementation makes sure if the username and password
   * are both &#39;demo&#39;.
   * In practical applications, this should be changed to authenticate
   * against some persistent user identity storage (e.g. database).
   * @return boolean whether authentication succeeds.
   */
  private $_id;
  public function authenticate()
  {
    $username=strtolower($this->username);
    $user=User::model()->find(&#39;LOWER(username)=?&#39;,array($username));
    if($user===null)
    {
      $this->errorCode=self::ERROR_USERNAME_INVALID;
    }
    else
    {
      //if(!User::model()->validatePassword($this->password))
      if(!$user->validatePassword($this->password))
      {
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
      }
      else
      {
        $this->_id=$user->id;
        $this->username=$user->username;
        $this->errorCode=self::ERROR_NONE;
      }
    }
    return $this->errorCode===self::ERROR_NONE;
  }
  public function getId()
  {
    return $this->_id;
  }
}
Copier après la connexion

model/User.php

public function beforeSave()
{
  if(parent::beforeSave())
  {
    if($this->isNewRecord)
    {
      $this->password=md5($this->password);
      $this->create_user_id=Yii::app()->user->id;//====主要为此句。得到登陆帐号的ID
      $this->create_time=date(&#39;Y-m-d H:i:s&#39;);
    }
    else
    {
      $this->update_user_id=Yii::app()->user->id;
      $this->update_time=date(&#39;Y-m-d H:i:s&#39;);
    }
    return true;
  }
  else
  {
    return false;
  }
}
Copier après la connexion

Plus connexe :

/*
由于CComponent是post最顶级父类,所以添加getUrl方法。。。。如下说明:
CComponent 是所有组件类的基类。
CComponent 实现了定义、使用属性和事件的协议。
属性是通过getter方法或/和setter方法定义。访问属性就像访问普通的对象变量。读取或写入属性将调用应相的getter或setter方法
例如:
$a=$component->text;   // equivalent to $a=$component->getText();
$component->text=&#39;abc&#39;; // equivalent to $component->setText(&#39;abc&#39;);
getter和setter方法的格式如下
// getter, defines a readable property &#39;text&#39;
public function getText() { ... }
// setter, defines a writable property &#39;text&#39; with $value to be set to the property
public function setText($value) { ... }
*/
public function getUrl()
{
  return Yii::app()->createUrl(&#39;post/view&#39;,array(
    &#39;id&#39;=>$this->id,
    &#39;title&#39;=>$this->title,
  ));
}
Copier après la connexion

méthode des règles dans le modèle

/*
 * rules方法:指定对模型属性的验证规则
 * 模型实例调用validate或save方法时逐一执行
 * 验证的必须是用户输入的属性。像id,作者id等通过代码或数据库设定的不用出现在rules中。
 */
/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
  // NOTE: you should only define rules for those attributes that
  // will receive user inputs.
  return array(
  array(&#39;news_title, news_content&#39;, &#39;required&#39;),
  array(&#39;news_title&#39;, &#39;length&#39;, &#39;max&#39;=>128),
  array(&#39;news_content&#39;, &#39;length&#39;, &#39;max&#39;=>8000),
  array(&#39;author_name, type_id, status_id,create_time, update_time, create_user_id, update_user_id&#39;, &#39;safe&#39;),
  // The following rule is used by search().
  // Please remove those attributes that should not be searched.
  array(&#39;id, news_title, news_content, author_name, type_id, status_id, create_time, update_time, create_user_id, update_user_id&#39;, &#39;safe&#39;, &#39;on&#39;=>&#39;search&#39;),
  );
}
Copier après la connexion

Remarque :

1. Le champ de vérification doit être un attribut saisi par l'utilisateur. Le contenu non saisi par l'utilisateur ne nécessite pas de validation.
2. Champs d'opération dans la base de données (même s'ils sont générés par le système, comme l'heure de création, l'heure de mise à jour et d'autres champs - dans le code source yii_computer fourni par boyLee, ces attributs générés par le système ne sont pas placés dans coffre-fort. Voir le code ci-dessous). Pour les données qui ne sont pas fournies par le formulaire, tant qu'elles ne sont pas vérifiées dans la méthode des règles, elles doivent être ajoutées au coffre-fort, sinon elles ne peuvent pas être écrites dans la base de données .

Modèle News.php de Yii_computer sur la méthode des règles

/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
  // NOTE: you should only define rules for those attributes that
  // will receive user inputs.
  return array(
    array(&#39;news_title, news_content&#39;, &#39;required&#39;),
    array(&#39;news_title&#39;, &#39;length&#39;, &#39;max&#39;=>128, &#39;encoding&#39;=>&#39;utf-8&#39;),
    array(&#39;news_content&#39;, &#39;length&#39;, &#39;max&#39;=>8000, &#39;encoding&#39;=>&#39;utf-8&#39;),
    array(&#39;author_name&#39;, &#39;length&#39;, &#39;max&#39;=>10, &#39;encoding&#39;=>&#39;utf-8&#39;),
    array(&#39;status_id, type_id&#39;, &#39;safe&#39;),
    // The following rule is used by search().
    // Please remove those attributes that should not be searched.
    array(&#39;id, news_title, news_content, author_name, type_id, status_id&#39;, &#39;safe&#39;, &#39;on&#39;=>&#39;search&#39;),
  );
}
Copier après la connexion

Trois façons d'afficher du contenu dynamique dans la vue

1. fichier Implémenté dans le code PHP. Par exemple, pour afficher l'heure actuelle dans la vue :

<?php echo date("Y-m-d H:i:s");?>
Copier après la connexion

2. Affichez le contenu dans le contrôleur et transmettez-le à la vue via le deuxième paramètre de rendu

Le contrôleur. La méthode contient :

$theTime=date("Y-m-d H:i:s");
$this->render(&#39;helloWorld&#39;,array(&#39;time&#39;=>$theTime));
Copier après la connexion

Afficher le fichier :

<?php echo $time;?>
Copier après la connexion

Le deuxième paramètre de la méthode render() appelée est un tableau (type tableau), et la méthode render() extraira les données dans le tableau La valeur est fournie au script de vue et la clé (valeur de clé) dans le tableau sera le nom de variable fourni au script de vue. Dans cet exemple, la clé du tableau est time et la valeur est $theTime. Le nom de la variable extraite $time est utilisé par le script de vue. C'est un moyen de transmettre des données du contrôleur à la vue.

3. Les vues et les contrôleurs sont des frères très proches, donc $this dans le fichier de vue fait référence au contrôleur qui restitue cette vue. Modifiez l'exemple précédent et définissez une propriété publique de la classe dans le contrôleur au lieu d'une variable locale dont la valeur est la date et l'heure actuelles. Accédez ensuite aux propriétés de cette classe via $this dans la vue.

Convention de dénomination des vues

Le nom des fichiers d'affichage doit être le même que celui d'ActionID. Mais rappelez-vous qu'il ne s'agit que d'une convention de dénomination recommandée. En fait, le nom du fichier de vue ne doit pas nécessairement être le même que l'ActionID. Il vous suffit de transmettre le nom du fichier comme premier paramètre à render().

Lié à la base de données

$Prerfp = Prerfp::model()->findAll(
  array(
    &#39;limit&#39;=>&#39;5&#39;,
    &#39;order&#39;=>&#39;releasetime desc&#39;
  )
);
Copier après la connexion
$model = Finishrfp::model()->findAll(
  array(
    &#39;select&#39; => &#39;companyname,title,releasetime&#39;,
    &#39;order&#39;=>&#39;releasetime desc&#39;,
    &#39;limit&#39; => 10
  )
);
foreach($model as $val){
  $noticeArr[] = "  在".$val->title."竞标中,".$val->companyname."中标。";
}
Copier après la connexion
$model = Cgnotice::model()->findAll (
  array(
    &#39;select&#39; => &#39;status,content,updatetime&#39;,
    &#39;condition&#39;=> &#39;status = :status &#39;,
    &#39;params&#39; => array(&#39;:status&#39;=>0),
    &#39;order&#39;=>&#39;updatetime desc&#39;,
    &#39;limit&#39; => 10
  )
);
foreach($model as $val){
  $noticeArr[] = $val->content;
}
Copier après la connexion
$user=User::model()->find(&#39;LOWER(username)=?&#39;,array($username));
Copier après la connexion
$noticetype = Dictionary::model()->find(array(
 &#39;condition&#39; => &#39;`type` = "noticetype"&#39;)
);
Copier après la connexion
// 查找postID=10 的那一行
$post=Post::model()->find(&#39;postID=:postID&#39;, array(&#39;:postID&#39;=>10));
Copier après la connexion

Vous pouvez également utiliser $condition pour spécifier des conditions de requête plus complexes . Au lieu d'utiliser une chaîne, nous pouvons faire de $condition une instance de CDbCriteria, ce qui nous permet de spécifier des conditions qui ne se limitent pas à WHERE. Par exemple :

$criteria=new CDbCriteria;
$criteria->select=&#39;title&#39;; // 只选择&#39;title&#39; 列
$criteria->condition=&#39;postID=:postID&#39;;
$criteria->params=array(&#39;:postID&#39;=>10);
$post=Post::model()->find($criteria); // $params 不需要了
Copier après la connexion

Notez que lorsque vous utilisez CDbCriteria comme critère de requête, le paramètre $params n'est plus nécessaire car il peut être spécifié dans CDbCriteria, comme ci-dessus.

一种替代CDbCriteria 的方法是给find 方法传递一个数组。数组的键和值各自对应标准(criterion)的属性名和值,上面的例子可以重写为如下:

$post=Post::model()->find(array(
 &#39;select&#39;=>&#39;title&#39;,
 &#39;condition&#39;=>&#39;postID=:postID&#39;,
 &#39;params&#39;=>array(&#39;:postID&#39;=>10),
));
Copier après la connexion

其它

1、链接

<span class="tt"><?php echo CHtml::link(Controller::utf8_substr($val->title,0,26),array(&#39;prerfp/details&#39;,&#39;id&#39;=>$val->rfpid),array(&#39;target&#39;=>&#39;_blank&#39;));?></a> </span>
Copier après la connexion

具体查找API文档:CHtml的link()方法

<span class="tt"><a target="_blank"  title="<?php echo $val->title;?>" href="<?php echo $this->createUrl(&#39;prerfp/details&#39;,array(&#39;id&#39;=>$val->rfpid)) ;?>" ><?php echo Controller::utf8_substr($val->title,0,26); ?></a> </span>
Copier après la connexion

具体请查找API文档:CController的createUrl()方法

以上两个连接效果等同

组件包含

一个示例:

在视图中底部有如下代码:

<?php $this->widget ( &#39;Notice&#39; ); ?>
Copier après la connexion

打开protected/components下的Notice.php文件,内容如下:

<?php
Yii::import(&#39;zii.widgets.CPortlet&#39;);
class Banner extends CPortlet
{
  protected function renderContent()
  {
    $this->render(&#39;banner&#39;);
  }
}
Copier après la connexion

渲染的视图banner,是在protected/components/views目录下。

具体查看API,关键字:CPortlet

获取当前host

Yii::app()->request->getServerName();
//and
$_SERVER[&#39;HTTP_HOST&#39;];
$url = &#39;http://&#39;.Yii::app()->request->getServerName(); $url .= CController::createUrl(&#39;user/activateEmail&#39;, array(&#39;emailActivationKey&#39;=>$activationKey));
echo $url;
Copier après la connexion

关于在发布新闻时添加ckeditor扩展中遇到的情况

$this->widget(&#39;application.extensions.editor.CKkceditor&#39;,array(
  "model"=>$model,        # Data-Model
  "attribute"=>&#39;news_content&#39;,     # Attribute in the Data-Model
  "height"=>&#39;300px&#39;,
  "width"=>&#39;80%&#39;,
"filespath"=>Yii::app()->basePath."/../up/",
"filesurl"=>Yii::app()->baseUrl."/up/",
 );
Copier après la connexion

echo Yii::app()->basePath

如果项目目录在:d:\wwwroot\blog目录下。则上面的值为d:\wwwroot\blog\protected。注意路径最后没有返斜杠

echo Yii::app()->baseUrl;

如果项目目录在:d:\wwwroot\blog目录下。则上面的值为/blog。注意路径最后没有返斜杠

(d:\wwwroot为网站根目录),注意上面两个区别。一个是basePath,一个是baseUrl

其它(不一定正确)

在一个控制器A对应的A视图中,调用B模型中的方法,采用:B::model()->B模型中的方法名();

前期需要掌握的一些API
CHtml

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Yii Framework框架获取分类下面的所有子类的方法

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal