Slug trong yii2 .Yếu tố quan trọng trong seo url yii2

0
542

Slug là gì .Nó đơn giản là 1 behavios nhằm xử lý dữ liệu chuyển url từ có dấu ,dấu cách vvv… thành url không dấu có gạch ngang y xì giống wordpress

Các bước thực hiện demo để cho các bạn hiểu rõ slug trong seo url yii2

Tạo 1 cơ sở dữ liệu về ví dụ slug có 4 trường là id,title,content,slug như sau

-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Dec 12, 2016 at 04:11 PM
-- Server version: 10.1.16-MariaDB
-- PHP Version: 5.6.24

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `demoyii2`
--

-- --------------------------------------------------------

--
-- Table structure for table `slug`
--

CREATE TABLE `slug` (
  `id` int(11) NOT NULL,
  `title` varchar(500) NOT NULL,
  `content` varchar(5000) NOT NULL,
  `slug` varchar(500) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `slug`
--
ALTER TABLE `slug`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `slug`
--
ALTER TABLE `slug`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Ok giờ đến phần model tạo active record

<?php

namespace common\models;

use Yii;
use yii\behaviors\SluggableBehavior;

/**
 * This is the model class for table "slug".
 *
 * @property integer $id
 * @property string $title
 * @property string $content
 * @property string $slug
 */
class Slug extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'slug';
    }
	public function behaviors()
	{
		return [
    			[
    					'class' => SluggableBehavior::className(),
    					'attribute' => 'title',
    					 'slugAttribute' => 'slug',
    			],
    	];
	}
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['title', 'content', 'slug'], 'required'],
            [['title', 'slug'], 'string', 'max' => 500],
            [['content'], 'string', 'max' => 5000],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'title' => Yii::t('app', 'Title'),
            'content' => Yii::t('app', 'Content'),
            'slug' => Yii::t('app', 'Slug'),
        ];
    }
}

Ở đây lưu ý mình thêm behavios() vào sau table có nhiệm vụ chuyển chuỗi string ở phần title sang dạng kí tự không dấu

Tiếp theo chúng ta sẽ làm file view để nhập dữ liệu vào .Dữ liệu chỉ cần nhập 2 trường là title và content như hình sau

slug-demo

File view create.php có code như sau :

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model common\models\Slug */

$this->title = Yii::t('app', 'Create Slug');
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Slugs'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="slug-create">

    <h1><?= Html::encode($this->title) ?></h1>

    <div class="slug-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'content')->textInput(['maxlength' => true]) ?>

    <?php //= $form->field($model, 'slug')->textInput(['maxlength' => true]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

</div>

Controller đơn giản chỉ cần

/**
     * Creates a new Slug model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Slug();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

Giờ chúng ta sẽ đi dùng slug tạo 1 url thân thiên như thế nào .Đầu tiên bạn cần config file main.php trong folder config ở frontend thêm 1 rules như sau :

'slug/<id:\d+>/<slug>'=>'slug/viewslug',

 

config_slug_frontend

Tiếp theo chúng ta sẽ tạo 2 action trong SlugController như sau

/**
	 * View demo slug
	 * @return mixed
	 */
    public function actionViewslug()
    {
    	$request = \Yii::$app->request;
    	$slug = $request->get('slug','');
    	$id = $request->get('id','');
		$data = Slug::find()->where(['slug' => $slug])
		->andWhere(['id'=>$id])
		->one();
		if (!$data) {
			echo 'không có dữ liệu';
		}
		else {
			
			return $this->render('viewslug',['data'=>$data]);
		}
		
    }
    /**
     * View list slug 
     * @return mixed
     */
    public function actionListslug()
    {
    	$data = Slug::find()->orderBy(['id' => SORT_DESC])->all();
    	return $this->render('listslug',['data'=>$data]);
    }

Giờ đến phần views .Mình tạo 1 file listslug.php và viewslug.php trong folder frontend/views/slug .Cấu trúc mỗi file như sau

File listslug.php

<?php
use yii\widgets\LinkPager;
use yii\helpers\Html;

foreach ($data as $key => $value) {
	echo Html::a($value->title,['slug/viewslug','id'=>$value->id,'slug'=>$value->slug]);
}
?>

Và file viewslug.php

<?php
use yii\helpers\Html;

?>
<div class="title">
	<h1><?= Html::encode($data->title)?></h1>
</div>
<div class="body">
	<h2><?= Html::encode($data->content)?></h2>
</div>

Giờ là đến lúc test kết quả bạn vào url :http://localhost/demoyii2/frontend/web/slug/listslug/

test_list_slug

Và kết quả khi vào xem view :http://localhost/demoyii2/frontend/web/slug/3/day-la-slug-3/

view_slug_yii2

Giờ bạn để ý sẽ thấy rằng url của chúng ta rất đẹp phù hợp với seo rất nhiều .Tóm lại ở phần này mình vận dụng những kiến thức về :

Có gì khúc mắc cần giải đáp hay góp ý với mình bạn hãy để lại comment dưới bài này .Mình sẽ cùng bạn giải quyết những vấn đề đó .