yii1.1からブログを移植する* yii2に

もちろん、yiiを勉強したとき、標準のブログチュートリアルは新しいフレームワークの開発に役立ちました。 少し習得したので、私はより新しいバージョン-Yii2に切り替え始めました。この場合、このような素晴らしいツールは見つかりませんでした。 基本を理解したので、まったく同じブログを持っているがyii2ツールを使用して実装するのは、初心者やyiiの最初のバージョンから移行するのにどれほど良いかと思いました。 もちろん、ネットワークはすでにyii2に多数のブログを実装しています。タグ、コメントなどのサポートを作成するための既製の拡張機能があります。しかし、これからyii2への参入は容易になりません。 これに関連して、私はyiiからyii2(ベータ版:https://github.com/tilhom/myblog_yii2)へのブログポートを実装することにしました。

実際の例はこちらにあります。



実装のハイライト:



ネットワーク上にすでに多く存在する標準レシピに従って、ネットワークからアクセス可能なフォルダーにAdvancedテンプレートをインストールします。 その結果、フロントエンド部分とバックエンド部分を持つ完成したWebアプリケーションのフレームワークができます。 さらに、yii1.1。*チュートリアルを使用してブログを作成し、yiiの最初のバージョンのブロックに似たアプリケーションをデプロイできます。



完成したyii 1.1からブロックのテーブルを作成します*モデル(ここにあります:yii / demos / blog / protected / data)。 SQLを開始する前に、修正を行う必要があります。

-簡単にtbl_プレフィックスを削除するには、

-Advancedテンプレートにはすぐにユーザーモデルが既に含まれているため、tbl_userテーブルを除外します。

-投稿とコメントの表で外部キーの作成を適切に修正します。



SQLテーブル
CREATE TABLEルックアップ



id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT、

name VARCHAR(128)NOT NULL、

INTEGER NOT NULLコード、

タイプVARCHAR(128)NOT NULL、

位置INTEGER NOT NULL

)エンジン= InnoDBデフォルトCHARSET = utf8 COLLATE = utf8_unicode_ci;



CREATE TABLE投稿



id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT、

title VARCHAR(128)NOT NULL、

コンテンツTEXT NOT NULL、

タグTEXT、

ステータスIN​​TEGER NOT NULL、

create_time INTEGER、

update_time INTEGER、

author_id INTEGER NOT NULL、

CONSTRAINT FK_post_author FOREIGN KEY(author_id)

更新制限時のカスケード削除時のユーザー(id)の参照

)エンジン= InnoDBデフォルトCHARSET = utf8 COLLATE = utf8_unicode_ci;



CREATE TABLEコメント



id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT、

コンテンツTEXT NOT NULL、

ステータスIN​​TEGER NOT NULL、

create_time INTEGER、

author VARCHAR(128)NOT NULL、

メールVARCHAR(128)NOT NULL、

url VARCHAR(128)、

post_id INTEGER NOT NULL、

CONSTRAINT FK_comment_post FOREIGN KEY(post_id)

更新制限時のカスケード削除時の参照投稿(ID)

)エンジン= InnoDBデフォルトCHARSET = utf8 COLLATE = utf8_unicode_ci;



CREATE TABLEタグ



id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT、

name VARCHAR(128)NOT NULL、

頻度整数デフォルト1

)エンジン= InnoDBデフォルトCHARSET = utf8 COLLATE = utf8_unicode_ci;



テーブルのモデルを作成し、CRUD操作コードを生成します。 これを行うには、バックエンド-eでgiiジェネレーターを実行します。 localhost/blog/backend/web/index.php?r=gii









したがって、フィールドに入力します。



テーブル名:*

名前空間:一般的な\モデル



[プレビュー]をクリックし、Migration.phpモデルの作成のチェックを外します。必要ありません。User.phpモデルの上書き項目がチェックされていないことを確認し、次の[生成]をクリックします。



その結果、common \ modelsフォルダーに次のモデルを取得します。



共通/モデル/ Comment.php

共通/モデル/ Lookup.php

共通/モデル/ Post.php

共通/モデル/ Tag.php



モデルが作成されたら、Crud Generatorを使用してそれらのCRUD操作コードを生成できます。 CRUDは管理パネルの操作であるため、バックエンドで行いましょう。 投稿とコメントのCRUDモデルを作成します。



投稿用:

モデルクラス:common \ models \ Post

検索モデルクラス:共通\モデル\ PostSearch

コントローラークラス:バックエンド\コントローラー\ PostController



コメント用:

モデルクラス:common \ models \ Comment

検索モデルクラス:common \ models \ CommentSearch

コントローラークラス:バックエンド\コントローラー\ CommentController



さらに、最初のバージョンのチュートリアルでは、認証が構成されています。ここでは、高度なアプリケーションフレームワークがデータベースのユーザーテーブルとユーザーモデルを介して認証を既に実装していることに気付いたかもしれません。



Postモデルの改良。



ルールの変更()メソッド:



 return [ [['title', 'content', 'status'], 'required'], ['title','string','max'=>128], ['status','in', 'range'=>[1,2,3]], ['tags', 'match', 'pattern'=>'/^[\w\s,]+$/', 'message'=>'     .'], ['tags', function($attribute,$params){ $this->tags=Tag::array2string(array_unique(Tag::string2array($this->tags))); }], ];
      
      







関係の変更()メソッド:



  public function getComments() { return $this->hasMany(Comment::className(), ['post_id' => 'id']) ->where('status = '. Comment::STATUS_APPROVED) ->orderBy('create_time DESC'); } public function getCommentCount() { return $this->hasMany(Comment::className(), ['post_id' => 'id'])->where(['status'=>Comment::STATUS_APPROVED])->count(); } public function getAllCommentCount() { return $this->hasMany(Comment::className(), ['post_id' => 'id'])->where(['status'=>Comment::STATUS_APPROVED])->count(); }
      
      







モデルにヘルパーを追加します。



-urlプロパティ:



  public function getUrl() { return Yii::$app->urlManager->createUrl([ 'post/view', 'id'=>$this->id, 'title'=>$this->title]); }
      
      







-ステータスのテキスト表現:



  public static function items($type) { if(!isset(self::$_items[$type])) self::loadItems($type); return self::$_items[$type]; } public static function item($type,$code) { if(!isset(self::$_items[$type])) self::loadItems($type); return isset(self::$_items[$type][$code]) ? self::$_items[$type][$code] : false; } private static function loadItems($type) { self::$_items[$type]=[]; $models=self::find()->where(['type'=>$type])->orderBy('position')->all(); foreach ($models as $model) self::$_items[$type][$model->code]=$model->name; }
      
      







エントリの作成と編集はバックエンドアプリケーションで行われるため、承認されたユーザーのみがインターフェイスを使用できるように、コントローラーのアクセスルールを変更します。



アクセスルールの設定



  'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'allow' => true, 'roles' => ['@'], ], ], ],
      
      







作成および更新アクションの編集

私たちは、教科書の指示に従って修正を行います:ステータス-すべての可能な記録状態のドロップダウンリスト:



  <?= $form->field($model, 'status')->dropDownList(Lookup::items('PostStatus'),['prompt'=>'Select...']) ?>
      
      







上記のコードでは、Lookup :: items( 'PostStatus')の呼び出しを使用して、ステータスのリストを取得しています。



次に、Postクラスを変更して、レコードをデータベースに保存する直前にいくつかの属性(create_timeやauthor_idなど)を自動的に公開します。



  'timestamp' => [ 'class' => TimestampBehavior::className(), 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'], ActiveRecord::EVENT_BEFORE_UPDATE => ['update_time'], ], ], [ 'class' => BlameableBehavior::className(), 'createdByAttribute' => 'author_id', 'updatedByAttribute' => 'author_id', ],
      
      





レコードを保存するときに、タグテーブル内のタグの頻度も更新します。 レコードをデータベースに正常に保存した後に自動的に呼び出されるafterSave()メソッドでこれを実装できます。



  public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); Tag::updateFrequency($this->_oldTags, $this->tags); } public function afterFind() { parent::afterFind(); $this->_oldTags=$this->tags; }
      
      







レコードの表示は、フロントエンド部分で行われます。 これを行うには、アプリケーションのこの部分でgiiを使用して、PostモデルのCRUDを作成し、不要な作成、更新、削除アクションを削除します。 インデックスおよびビューアクションへの変更の紹介。 投稿を表示する場合、ページレイアウトは2列に分割されます。 このために、2つのレイアウトcolumn1.phpおよびcolumn2.phpが作成されます。これらは、アプリケーションで切り替えられます(たとえば、index-column2、view-column1)。



コメント管理

Commentモデルを完成させています。 rules()メソッドに適切な変更を加えます。



 public function rules() { return [ [['content', 'author', 'email'], 'required'], [['author', 'email', 'url'], 'string', 'max' => 128], ['email','email'], [['content'], 'string'], ['url','url'], [['status', 'create_time', 'post_id'], 'integer'], ]; }
      
      







コメントが作成された日付を自動的に登録するには、モデルに動作を作成します。



 public function behaviors(){ return [ 'timestamp' => [ 'class' => TimestampBehavior::className(), 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'], ], ] ]; }
      
      







チュートリアルに従ってattributeLabels()メソッドを修正します

そして、チュートリアルに従って、コントローラーとアプリケーションパーツのビューフロントエンドにコメントの作成と表示を実装します。



 namespace frontend\controllers; /* * */ class PostController extends Controller { /* * */ public function actionView($id) { $this->layout='column1'; $model = $this->findModel($id); //$comment=$this->newComment($model); $comment=new Comment(); if($comment->load($_POST) && $model->addComment($comment)) { if($comment->status==Comment::STATUS_PENDING){ Yii::$app->getSession()->setFlash('warning','Thank you for your comment. Your comment will be posted once it is approved.'); } return $this->refresh(); } return $this->render('view',array( 'model'=>$model, 'comment'=>$comment, )); }
      
      







提出コード:



 <?php use yii\helpers\Html; use yii\widgets\DetailView; /* @var $this yii\web\View */ /* @var $model common\models\Post */ $this->title = $model->title; $this->params['breadcrumbs'][] = ['label' => 'Posts', 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; ?> <div class="post-view"> <?php echo $this->context->renderPartial('_item', array( 'model'=>$model ));?> <div id="comments" class="row-fluid"> <?php if($model->commentCount>=1): ?> <h4> <?php echo $model->commentCount>1 ? $model->commentCount . ' comments' : 'One comment'; ?> </h4> <?php echo $this->context->renderPartial('_comments',array( 'post'=>$model, 'comments'=>$model->comments, )); ?> <?php endif; ?> <?php echo $this->context->renderPartial('/comment/_form',array( 'model'=>$comment, )); ?> </div><!-- comments --> </div>
      
      







コード_item.php:



 <?php use \yii\helpers\Html; ?> <div> <h1><?php echo Html::a(Html::encode($model->title), $model->url); ?></h1> <p class="meta">Posted by <?php echo $model->author->username . ' on ' . date('F j, Y',$model->create_time); ?></p> <p class='lead'> <?php echo $model->content; ?> <p> <div> <p> <strong>Tags:</strong> <?php echo $model->tags; ?> </p> <?php echo Html::a('Permalink', $model->url); ?> | <?php echo Html::a("Comments ({$model->commentCount})",$model->url.'#comments'); ?> | Last updated on <?php echo date('F j, Y',$model->update_time); ?> </div> </div>
      
      







コード_comments.php:



 <?php use \yii\helpers\Html; foreach($comments as $comment): ?> <div class="well" id="c<?php echo $comment->id; ?>"> <div class="row"> <div class="col-md-8"> <h4><?php echo $comment->authorLink; ?> says:</h4> </div> <div class="col-md-4 text-right"> <?php echo Html::a("#{$comment->id}", $comment->getUrl(),[ 'class'=>'cid', 'title'=>'Permalink to this comment!', ]); ?> </div> </div> <hr style="margin:2px 0px;"> <p class='lead'> <?php echo nl2br(Html::encode($comment->content)); ?> </p> <h5> <?php echo date('F j, Y \a\th:i a',$comment->create_time); ?> </h5> </div><!-- comment --> <?php endforeach; ?>
      
      







そして、新しいコメントを作成するためのフォーム:



 <?php use \yii\helpers\Html; use \yii\widgets\ActiveForm; ?> <div class="panel panel-success"> <div class="panel-heading"> <h3 class="panel-title">Leave a Comment</h3> </div> <div class="panel-body"> <?php $form = ActiveForm::begin(); ?> <?php echo $form->field($model,'author')->textInput(); ?> <?php echo $form->field($model,'email')->textInput(); ?> <?php echo $form->field($model,'url')->textInput(); ?> <?php echo $form->field($model,'content')->textArea(array('rows'=>6, 'cols'=>50)); ?> <div class="form-actions text-center"> <?php echo Html::submitButton('Save',['class' => 'btn btn-success btn-block']); ?> </div> <?php ActiveForm::end(); ?> </div> </div>
      
      







管理パネルからコメントを管理するには、以前に作成したコメントモデルのCRUDを変更します。 インデックスアクションはGridViewウィジェットを使用して作成され、その列のコメントの承認はapprove()メソッドを使用して実装されます。



 <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], [ 'attribute'=>'id', 'contentOptions'=>['style'=>'width:64px;'], ], 'content:ntext', [ 'attribute'=>'status', 'format'=>'raw', 'value'=>function ($model){ $text=\common\models\Lookup::item('CommentStatus',$model->status); $url=Url::to(["comment/approve","id"=>$model->id]); Url::remember(); return $text=='Pending Approval'?Html::a($text,$url):$text; }, 'contentOptions'=>['style'=>'width:136px;'], ], 'create_time:datetime', 'author', [ 'class' => 'yii\grid\ActionColumn', 'header' => 'Actions', 'contentOptions'=>['style'=>'width:96px;'], ], ], ]); ?>
      
      







最後に、現在のところ、最近のコメントのリスト用のウィジェットが実装されました。これは、投稿を表示するときにフロントエンドアプリケーションに表示されます。

コメントモデルに静的メソッドを追加します。



 public static function findRecentComments($limit=10) { return static::find()->where('status='.self::STATUS_APPROVED) ->orderBy('create_time DESC') ->limit($limit) ->with('post')->all(); }
      
      







そして、ウィジェットを実装します:



 class RecentComments extends Widget { public $comments; public function init() { parent::init(); $this->comments = Comment::findRecentComments(); } public function run() { return $this->render('recent-comments'); } }
      
      







ビュー付き:



 <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">Recent Comments</h3> </div> <div class="panel-body"> <ul class="list-unstyled"> <?php foreach($this->context->comments as $comment): ?> <li><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> <?php echo $comment->authorLink; ?> on <?php echo Html::a(Html::encode($comment->post->title), $comment->getUrl()); ?> </li> <?php endforeach; ?> </ul> </div> </div>
      
      







もちろん、これは詳細なガイドではありません。特に、yiiの最初のバージョンの神を作成するための既製のチュートリアルがあるため、Yii2のコーディングの主なポイントは次のとおりです。 これが初心者が教育目的でYii2にブログを実装するのに役立つことを願っています。



All Articles