ติดตั้ง Extension
$ composer require 2amigos/yii2-taggable-behavior:~1.0
$ composer require 2amigos/yii2-selectize-widget:~1.0
สร้างตารางในฐานข้อมูล
-ตาราง tag
-id (auto increment)
-name (varchar[255])
-frequency (int)
-ตาราง content_tag
-content_id (ขึ้นอยู่กับ id ของ content)
-tag_id (int)
ใน model "Content"
common/models/Content.php
class Content extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'content';
}
public $tag_list;
public $old_tag;
public function rules()
{
return [
[['id', 'title'], 'required'],
[['details','tag_list'], 'string'],
[['id'], 'unique'],
];
}
public function getTags()
{
return $this->hasMany(Tag::className(), ['id' => 'tag_id'])->viaTable('content_tag', ['content_id' => 'id']);
}
public function loadTagList($old_tag){
$tag_list = "";
if($old_tag!=null){
$count=count($old_tag);
$i=0;
foreach($old_tag as $t){
$i++;
if($i==$count){
$tag_list .= $t->name;
}else{
$tag_list.= $t->name.",";
}
}
return $tag_list;
}else{
return null;
}
}
public function loadTag(){
$model=$this;
if($model->old_tag!=null){
$count=count($model->old_tag);
$i=0;
foreach($model->old_tag as $t){
$i++;
if($i==$count){
$model->tag_list .= $t->name;
}else{
$model->tag_list.= $t->name.",";
}
}
}
}
public function saveTag(){
$model=$this;
$name = $model->tag_list;
$items = [];
if($model->old_tag!=null){
foreach ($model->old_tag as $old) {
array_push($items,$old->name);
}
}
$tags = explode(",", $name);
$diff_items = array_diff($items,$tags);
foreach($diff_items as $d_item){
$tag_model = Tag::find()->where(['name' => $d_item])->one();
ContentTag::find()->where(['tag_id' => $tag_model->id,'content_id'=>$model->id])->one()->delete();
if( $tag_model->frequency==1)
{ $tag_model->delete();
}
else{
$tag_model->frequency -=1;
$tag_model->save();
}
}
$add_items = array_diff($tags,$items);
foreach ($add_items as $a_item) {
$tag_model = Tag::find()->where(['name' => $a_item])->one();
if (!is_null($tag_model)) {
$tag_model->frequency+=1;
$tag_model->save();
$contentHasTag = new ContentTag();
$contentHasTag->tag_id = $tag_model->id;
$contentHasTag->content_id = $model->id;
$contentHasTag->save();
} else {
$tag = new Tag();
$tag->name = $a_item;
$tag->frequency = 1;
$check = $tag->save();
$contentHasTag = new ContentTag();
$contentHasTag->tag_id = $tag->id;
$contentHasTag->content_id = $model->id;
$contentHasTag->save();
}
}
}
}
common/models/ContentController.php
public function actionTagList($query)
{ $models = Tag::find()->where(['name'=>$query])->all();
$items = [];
foreach($models as $model){
$items[] = ['name' => $model->name];
}
Yii::$app->response->format = Response::FORMAT_JSON;
return $items;
}
public function actionCreate()
{
$model = new Content();
if ($model->load(Yii::$app->request->post())) {
if(!$model->save()){
var_dump($model->errors);
}else{
$model->saveTag();
return $this->redirect(['view', 'id' => $model->id]);
}
}else{
return $this->render('/content/create_ck', [
'model' => $model
]);
}
}
public function actionUpdate($id)
{
$model = $this->findModel($id);
$model->old_tag = $model->ctags;
$model->tag_list =$model->loadTagList($model->old_tag);
if ($model->load(Yii::$app->request->post())) {
$model->saveTag();
$model->save();
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('/content/update_ck', [
'model' => $model,"category"=>$category
]);
}
frontend/views/view.php
<?foreach($model->tags as $tag){
print "<a href='/nanadhamma/tag/category?id='".$tag->id."&category_id=".$model->contentCategory->id.">".$tag->name."</a> ";
}
?>
frontend/views/content/_form.php
<?php
use dosamigos\selectize\SelectizeTextInput;
<?= $form->field($model, 'tags')->widget(SelectizeTextInput::className(), [
'loadUrl' => ['/content/tag-list'],//load ข้อมูล
'options' => ['class' => 'form-control'],
'clientOptions' => [
'plugins' => ['remove_button'],
'valueField' => 'name',
'labelField' => 'name',
'searchField' => ['name'],
'create' => true,
]
])->hint('ใช้ comma เพื่อแยก tag เช่น yii,android,meteor,รับสมัครงาน') ?>
?>