หลายๆ เว็บไซต์ จะเห็น URL ที่มีข้อความ เช่น www.example.com/post/view/1/ทดสอบ เป็นต้น ซึ่งเราจะเห็นว่ามีคำว่า ทดสอบ อยู่ใน URL ด้วย ส่วนใหญ่แล้ว คำว่า ทดสอบ นั้นจะเป็นคำที่อยู่ใน หัวเรื่อง (Title) นั่นเอง
ทั้งนี้การทำ Slug นั้นมีจุดประสงค์ด้านการตอบสนองต่อ Search Engine เนื่องจาก Search Engine สามารถอ่าน URL ได้ด้วยเช่นกัน ซึ่งหากไม่กำหนด Slug ก็จะได้ URL แบบไม่มีข้อความ เช่น www.example.com/post/view/1 ซึ่งเมื่อเราดูแล้วก็อาจไม่รู้ได้ว่าเนื้อหาจะมีอะไร Search Engine ก็เช่นเดียวกัน
ในบทเรียนรู้นี้จะนำเสนอการทำ Slug อย่างง่าย โดยจะไม่เก็บข้อมูลในฐานข้อมูล (บางระบบอย่าง Wordpress จะเก็บในฐานข้อมูล) ซึ่งจริงๆ แล้วก็ควรเก็บเพราะเป็น URL ที่ถาวร แต่ในที่นี้เราจะไม่ทำให้เป็น URL ถาวร โดยหากมีการเปลียน Title URL ก็จะเปลี่ยนด้วย นั่นเอง
สร้าง Component ใน Yii Framework
สร้าง Class Main และสร้าง method simpleSlug จากนั้นแทนทีอักขระพิเศษต่างๆ ด้วย -
ไฟล์ common\components\Main.php
<?php
namespace common\components;
use Yii;
class Main
{
public function simpleSlug($str)
{
$slug = preg_replace('@[\s!:;_\?=\\\+\*/%&#]+@', '-', $str);
$slug = mb_strtolower($slug, Yii::$app->charset);
$slug = trim($slug, '-');
return $slug;
}
}
?>
กำหนด Component ในระบบ
ทำการกำหนด component ในระบบเพื่อให้สามารถเรียกใช้งานได้ทุกๆ ที่
ไฟล์ frontend/config/main.php
//...
'components' => [
//...
'main' => ['class' => 'common\components\Main'],
//...
],
//...
การเรียกใช้งาน
การเรียกใช้งานใน Link ทีต้องการ เช่น post ของกระทู้ การเปิดดู Blog เป็นต้น โดยการสร้าง Link ดังนี้
<?=Html::a($model->title, ['view', 'id' => $model->id, 'slug' => Yii::$app->main->simpleSlug($model->title)])?>
ใน Controller ก็จะต้องรับค่าเช่นเดียวกัน
<?php
//...
public function actionView($id, $slug = null)
{
$model = $this->loadModel($id);
//...
}
//...
เป็นการสร้าง Slug แบบง่าย แต่หากใครที่ต้องการเก็บข้อมูล Slug ลงในฐานข้อมูลก็ทำได้เช่นเดียวกัน โดยการแก้ไข actionCreate()
//...
public function actionCreate()
{
//...
if($model->load(Yii::$app->request->post())){
$model->slug = Yii::$app->main->simpleSlug($model->title);
//...
}
//...
เปลี่ยนจาก id มาเป็น Slug
<?=Html::a($model->title, ['view', 'slug' => $model->slug])?>
<?php
//...
public function actionView($slug)
{
$model = Post::findOne(['slug' => $slug]);
//...
}
//...
ลองนำไปประยุกต์ใช้ดูนะครับ หรือมีแนวทางอื่นๆ ที่ดีกว่านี้ก็แนะนำมาได้นะครับ
ความคิดเห็น