ホームページ >バックエンド開発 >PHPチュートリアル >YiiFrameworkの入門知識のまとめ

YiiFrameworkの入門知識のまとめ

不言
不言オリジナル
2018-06-15 11:57:031412ブラウズ

この記事では、YiiFrameworkを始めるための知識を中心に、YiiFrameworkの具体的な作成手順や使用上の注意点などを画像と文章でまとめて解説していますので、困っている方は参考にしてください

この記事では、YiiFramework の導入に関するナレッジポイントをまとめています。参照用にみんなと共有します。詳細は次のとおりです:

Yii アプリケーション スケルトンの作成

web は Web サイトのルート ディレクトリです
yiic webapp / web/demo

GII

1 でモデルと CURD を作成する場合は注意が必要です。

テーブルがある場合でも。プレフィックスの場合、テーブルにはテーブル名を入力する必要があります。テーブルのプレフィックスを含む完全な名前。以下に示すように:

#2. Crud Generator の操作

このインターフェイスで、モデル クラスにモデル名を入力します。最初の文字を大文字にします。モデルを生成するときに、proctected/models ディレクトリ内のモデル ジェネレーターによって生成されたファイル名を参照することもできます。以下に示すように:

news、newstype、statustype の 3 つのテーブルの CURD コントローラーを生成する場合、モデル ジェネレーターで「News、newsType、StatusType」と入力します。大文字と小文字は作成されたファイル名と同じです。 NEWSやニュースと書かれている場合はNGです。

モジュール作成に関する注意事項

GII を通じてモジュールを作成する場合、モジュール ID は通常小文字です。いずれの場合も、ここに入力された ID によって main.php 構成ファイル内の構成が決まります。次のように:

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

routing

system は、yii フレームワークのフレームワーク ディレクトリを表します。
application は、作成されたアプリケーションの下の保護されたディレクトリ (d:\ など) を表します。 wwwroot\blog) 。
application.modules.Admin.AdminModule
は、アプリケーション ディレクトリの下の modules ディレクトリの下の Admin ディレクトリにある AdminModules.php ファイルを表します (例: d:\wwwroot\blog\protected) (実際にはクラスを指します)ファイルの名前)
system.db.*
は、YII フレームワークのフレームワーク ディレクトリ内の db ディレクトリ内のすべてのファイルを表します。

コントローラーの accessRules の説明

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

上記のコード コメントを参照してください。

user: ユーザー セッション情報を表します。詳細については、「API: CWebUser」を参照してください。
CWebUser は、Web アプリケーションの永続的な状態を表します。
CWebUser は、ID user を持つアプリケーション コンポーネントとして使用されます。したがって、ユーザー ステータスには、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;
  }
}

getter メソッドまたは/および 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;
  }
}

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;
  }
}

その他の関連:

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

モデルのルール メソッド

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

説明:

1. 検証フィールドはユーザーが入力した属性である必要があります。ユーザーが入力していないコンテンツは検証する必要がありません。

2. データベース内の操作フィールド (作成時間、更新時間、その他のフィールドなど、システムによって生成されたものであっても、boyLee が提供する yii_computer ソース コードでは、システムによって生成されたこれらの属性は配置されません)安全です。以下のコードを参照してください。
フォームで提供されていないデータについては、ルール メソッドで検証されていない限り、セーフに追加する必要があります。追加しないとデータベースに書き込むことができません。

yii_computer のルール メソッドに関する News.php モデル

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

ビューに動的コンテンツを表示する 3 つの方法

1. ビュー ファイルに直接表示します。 PHPコードの実装を使用します。たとえば、ビューに現在時刻を表示するには:

<?php echo date("Y-m-d H:i:s");?>

2. コントローラーに表示コンテンツを実装し、これを render の 2 番目のパラメーターを通じてビューに渡します。

コントローラー メソッドには次のものが含まれます。 :

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

ファイルの表示:

<?php echo $time;?>

呼び出される render() メソッドの 2 番目のパラメータは配列 (配列型) です。render() メソッドは配列内の値を抽出して提供します。配列内のキーは、ビュー スクリプトに提供される変数名になります。この例では、配列のキーは time で、値は $theTime で、抽出された変数名 $time がビュー スクリプトで使用されます。これは、コントローラーからビューにデータを渡す方法です。

3. ビューとコントローラーは非常に近い兄弟であるため、ビュー ファイル内の $this は、このビューをレンダリングするコントローラーを指します。前の例を変更し、値が現在の日付と時刻であるローカル変数の代わりに、コントローラー内のクラスのパブリック プロパティを定義します。次に、ビュー内の $this を通じてこのクラスのプロパティにアクセスします。

ビューの命名規則

ビューのファイル名は、ActionID と同じである必要があります。ただし、これは推奨される命名規則にすぎないことに注意してください。実際、ビュー ファイル名は ActionID と同じである必要はありません。ファイル名を最初のパラメータとして render() に渡すだけです。

DB 関連

$Prerfp = Prerfp::model()->findAll(
  array(
    &#39;limit&#39;=>&#39;5&#39;,
    &#39;order&#39;=>&#39;releasetime desc&#39;
  )
);
$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."中标。";
}
$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;
}
$user=User::model()->find(&#39;LOWER(username)=?&#39;,array($username));
$noticetype = Dictionary::model()->find(array(
 &#39;condition&#39; => &#39;`type` = "noticetype"&#39;)
);
// 查找postID=10 的那一行
$post=Post::model()->find(&#39;postID=:postID&#39;, array(&#39;:postID&#39;=>10));

$condition を使用して、より複雑なクエリ条件を指定することもできます。文字列を使用する代わりに、$condition を CDbCriteria のインスタンスにすることができます。これにより、WHERE に限定されない条件を指定できます。例:

$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 不需要了

CDbCriteria をクエリ条件として使用する場合、$params パラメーターは上記と同様に CDbCriteria で指定できるため、必要なくなります。

一种替代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),
));

其它

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>

具体查找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>

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

以上两个连接效果等同

组件包含

一个示例:

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

<?php $this->widget ( &#39;Notice&#39; ); ?>

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

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

渲染的视图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;

关于在发布新闻时添加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/",
 );

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框架获取分类下面的所有子类的方法

以上がYiiFrameworkの入門知識のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。