4 ไฟล์หลักที่ต้องปรับแต่ง เพื่อการค้นหาคำภาษาไทย1. prestashop/init.php ให้หาบรรทัดตามนี้ครับ จะมีอยู่ 2 ที่ แก้ทั้งสองที่เลยครับ
'come_from' => 'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').htmlentities($_SERVER['REQUEST_URI']),
แก้เป็น
'come_from' => 'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').htmlentities($_SERVER['REQUEST_URI'], ENT_NOQUOTES, 'utf-8'),
ตรงฟังค์ชั่น htmlentities บางทีมักจะมีปัญหาทำให้ข้อมูล Charactor หรือภายใน View Source ไม่ใช่ UTF-8 ครับ ทำให้ค้นหาข้อมูลไม่เจอ
2. prestashop/classes/Link.php ส่วนนี้จะเป็นการปรับแต่งในส่วนของลิงค์ ลิสจำนวนรายการสินค้าต่อหน้า 10/20/50 และลิงค์ในส่วนของ Sort By(จัดเรียงสินค้า)
ดูที่ public function getPaginationLink
if ($ifNb AND $ifSort AND $ifPagination AND !is_array($value))
!$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '?' : '&').urlencode($k).'='.urlencode($value)) : ($vars[urlencode($k)] = urlencode($value));
แก้เป็น
if ($ifNb AND $ifSort AND $ifPagination AND !is_array($value))
!$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '?' : '&').($k).'='.($value)) : ($vars[($k)] = ($value));
จะเป็นการปรับแต่งคำในลิงค์ที่เป็นภาษาไทย เป็นคำที่อ่านรู้เรื่อง เวลา SE มาเก็บข้อมูลไป
3. prestashop/classes/Tools.php ไปที่ static public function link_rewrite($str, $utf8_decode = false)
if (Tools::strlen(htmlentities($char)) > 1)
แก้เป็น
if (Tools::strlen(htmlentities($char, ENT_COMPAT, 'UTF-8')) > 1)
elseif (preg_match('|[[:alpha:]]{1}|u', $char))
แก้เป็น
elseif (preg_match('|[a-zA-Zก-๙]{1}|u', $char))
ส่วนนี้ช่วยในการใส่ชื่อภาษาไทยให้กับ Manufacture, Supplier จากปกติจะใส่ไม่ได้
4. prestashop/classes/Search.phpdefine('PREG_CLASS_SEARCH_EXCLUDE',
'\x{0}\x{3a}-\x{40}\x{5b}-\x{60}\x{7b}-\x{bf}\x{d7}\x{f7}\x{2b0}-'.
'\x{385}\x{387}\x{3f6}\x{482}-\x{489}\x{559}-\x{55f}\x{589}-\x{5c7}\x{5f3}-'.
'\x{61f}\x{640}\x{64b}-\x{65e}\x{66a}-\x{66d}\x{670}\x{6d4}\x{6d6}-\x{6ed}'.
'\x{6fd}\x{6fe}\x{700}-\x{70f}\x{711}\x{730}-\x{74a}\x{7a6}-\x{7b0}\x{901}-'.
'\x{903}\x{93c}\x{93e}-\x{94d}\x{951}-\x{954}\x{962}-\x{965}\x{970}\x{981}-'.
'\x{983}\x{9bc}\x{9be}-\x{9cd}\x{9d7}\x{9e2}\x{9e3}\x{9f2}-\x{a03}\x{a3c}-'.
'\x{a4d}\x{a70}\x{a71}\x{a81}-\x{a83}\x{abc}\x{abe}-\x{acd}\x{ae2}\x{ae3}'.
'\x{af1}-\x{b03}\x{b3c}\x{b3e}-\x{b57}\x{b70}\x{b82}\x{bbe}-\x{bd7}\x{bf0}-'.
'\x{c03}\x{c3e}-\x{c56}\x{c82}\x{c83}\x{cbc}\x{cbe}-\x{cd6}\x{d02}\x{d03}'.
'\x{d3e}-\x{d57}\x{d82}\x{d83}\x{dca}-\x{df4}\x{e31}\x{e34}-\x{e3f}\x{e46}-'.
'\x{e4f}\x{e5a}\x{e5b}\x{eb1}\x{eb4}-\x{ebc}\x{ec6}-\x{ecd}\x{f01}-\x{f1f}'.
'\x{f2a}-\x{f3f}\x{f71}-\x{f87}\x{f90}-\x{fd1}\x{102c}-\x{1039}\x{104a}-'.
'\x{104f}\x{1056}-\x{1059}\x{10fb}\x{10fc}\x{135f}-\x{137c}\x{1390}-\x{1399}'.
'\x{166d}\x{166e}\x{1680}\x{169b}\x{169c}\x{16eb}-\x{16f0}\x{1712}-\x{1714}'.
'\x{1732}-\x{1736}\x{1752}\x{1753}\x{1772}\x{1773}\x{17b4}-\x{17db}\x{17dd}'.
'\x{17f0}-\x{180e}\x{1843}\x{18a9}\x{1920}-\x{1945}\x{19b0}-\x{19c0}\x{19c8}'.
'\x{19c9}\x{19de}-\x{19ff}\x{1a17}-\x{1a1f}\x{1d2c}-\x{1d61}\x{1d78}\x{1d9b}-'.
'\x{1dc3}\x{1fbd}\x{1fbf}-\x{1fc1}\x{1fcd}-\x{1fcf}\x{1fdd}-\x{1fdf}\x{1fed}-'.
'\x{1fef}\x{1ffd}-\x{2070}\x{2074}-\x{207e}\x{2080}-\x{2101}\x{2103}-\x{2106}'.
'\x{2108}\x{2109}\x{2114}\x{2116}-\x{2118}\x{211e}-\x{2123}\x{2125}\x{2127}'.
'\x{2129}\x{212e}\x{2132}\x{213a}\x{213b}\x{2140}-\x{2144}\x{214a}-\x{2b13}'.
'\x{2ce5}-\x{2cff}\x{2d6f}\x{2e00}-\x{3005}\x{3007}-\x{303b}\x{303d}-\x{303f}'.
'\x{3099}-\x{309e}\x{30a0}\x{30fb}-\x{30fe}\x{3190}-\x{319f}\x{31c0}-\x{31cf}'.
'\x{3200}-\x{33ff}\x{4dc0}-\x{4dff}\x{a015}\x{a490}-\x{a716}\x{a802}\x{a806}'.
'\x{a80b}\x{a823}-\x{a82b}\x{d800}-\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}\x{fd3f}'.
'\x{fdfc}-\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}\x{ff5b}-'.
'\x{ff65}\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}');
แก้เป็น
define('PREG_CLASS_SEARCH_EXCLUDE',
'\x{0}\x{3a}-\x{40}\x{5b}-\x{60}\x{7b}-\x{bf}\x{d7}\x{f7}\x{2b0}-'.
'\x{385}\x{387}\x{3f6}\x{482}-\x{489}\x{559}-\x{55f}\x{589}-\x{5c7}\x{5f3}-'.
'\x{61f}\x{640}\x{64b}-\x{65e}\x{66a}-\x{66d}\x{670}\x{6d4}\x{6d6}-\x{6ed}'.
'\x{6fd}\x{6fe}\x{700}-\x{70f}\x{711}\x{730}-\x{74a}\x{7a6}-\x{7b0}\x{901}-'.
'\x{903}\x{93c}\x{93e}-\x{94d}\x{951}-\x{954}\x{962}-\x{965}\x{970}\x{981}-'.
'\x{983}\x{9bc}\x{9be}-\x{9cd}\x{9d7}\x{9e2}\x{9e3}\x{9f2}-\x{a03}\x{a3c}-'.
'\x{a4d}\x{a70}\x{a71}\x{a81}-\x{a83}\x{abc}\x{abe}-\x{acd}\x{ae2}\x{ae3}'.
'\x{af1}-\x{b03}\x{b3c}\x{b3e}-\x{b57}\x{b70}\x{b82}\x{bbe}-\x{bd7}\x{bf0}-'.
'\x{c03}\x{c3e}-\x{c56}\x{c82}\x{c83}\x{cbc}\x{cbe}-\x{cd6}\x{d02}\x{d03}'.
'\x{d3e}-\x{d57}\x{d82}\x{d83}\x{dca}-\x{df4}\x{e3f}\x{e46}\x{e4f}' .
'\x{e5a}\x{e5b}\x{eb1}\x{eb4}-\x{ebc}\x{ec6}-\x{ecd}\x{f01}-\x{f1f}' .
'\x{f2a}-\x{f3f}\x{f71}-\x{f87}\x{f90}-\x{fd1}\x{102c}-\x{1039}\x{104a}-' .
'\x{104f}\x{1056}-\x{1059}\x{10fb}\x{10fc}\x{135f}-\x{137c}\x{1390}-\x{1399}' .
'\x{166d}\x{166e}\x{1680}\x{169b}\x{169c}\x{16eb}-\x{16f0}\x{1712}-\x{1714}' .
'\x{2108}\x{2109}\x{2114}\x{2116}-\x{2118}\x{211e}-\x{2123}\x{2125}\x{2127}'.
'\x{2129}\x{212e}\x{2132}\x{213a}\x{213b}\x{2140}-\x{2144}\x{214a}-\x{2b13}'.
'\x{2ce5}-\x{2cff}\x{2d6f}\x{2e00}-\x{3005}\x{3007}-\x{303b}\x{303d}-\x{303f}'.
'\x{3099}-\x{309e}\x{30a0}\x{30fb}-\x{30fe}\x{3190}-\x{319f}\x{31c0}-\x{31cf}'.
'\x{3200}-\x{33ff}\x{4dc0}-\x{4dff}\x{a015}\x{a490}-\x{a716}\x{a802}\x{a806}'.
'\x{a80b}\x{a823}-\x{a82b}\x{d800}-\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}\x{fd3f}'.
'\x{fdfc}-\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}\x{ff5b}-'.
'\x{ff65}\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}');
ส่วนนี้จะเป็น Pattern ในการตัดคำออกจากคำค้นหา ผมพบว่ามีการตัด 'ย' ออกด้วย
ต่อมา
AND sw.word LIKE '.($word[0] == '-' ? ' \''.pSQL(substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' : '\''.pSQL(substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'').'
แก้เป็น
AND sw.word LIKE '.($word[0] == '-' ? ' \''.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' : '\''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'').'
ต่อมา
$scoreArray[] = 'sw.word LIKE \''.pSQL(substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'';
แก้เป็น
$scoreArray[] = 'sw.word LIKE \''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'';
ต่อมา ตรงนี้จะขอกระโดดข้ามไปท้ายๆไฟล์ก่อน เพราะเป็นส่วนเก็บคำค้นหาเข้าตาราง Search_word ให้ไปที่ public static function indexation($full = false)
$products = $db->ExecuteS('
SELECT p.id_product, pl.id_lang, pl.name as pname, p.reference, p.ean13, pl.description_short, pl.description, cl.name as cname, m.name as mname
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = p.id_category_default AND pl.id_lang = cl.id_lang)
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON m.id_manufacturer = p.id_manufacturer
WHERE p.indexed = 0', false);
แก้เป็น
/*
$products = $db->ExecuteS('
SELECT p.id_product, pl.id_lang, pl.name as pname, p.reference, p.ean13, pl.description_short, pl.description, cl.name as cname, m.name as mname
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = p.id_category_default AND pl.id_lang = cl.id_lang)
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON m.id_manufacturer = p.id_manufacturer
WHERE p.indexed = 0', false);
*/
$products = $db->ExecuteS('
SELECT p.id_product, pl.id_lang, pl.name as pname, p.reference, p.ean13, cl.name as cname, m.name as mname
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = p.id_category_default AND pl.id_lang = cl.id_lang)
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON m.id_manufacturer = p.id_manufacturer
WHERE p.indexed = 0', false);
จะเห็นว่าผมตัด pl.description_short, pl.description, ออก เพราะส่วนนี้จะเป็นตัวกำหนดให้โปรแกรมเก็บคำค้นหาจากในส่วนของ Short Description และ Long Description ซึ่งก่อนหน้าที่ผมบอกไปแล้วว่า ถ้าข้อมูลสินค้าใครเยอะๆ ฐานข้อมูลแย่แน่ๆเลย ในส่วนนี้เราไม่จำเป็นต้องให้โปรแกรมไปเก็บคำค้นหาก็ได้ เก็บคำค้นหาจากชื่อสินค้า, ชื่อหมวดหมู่, ชื่อผู้ผลิต, ชื่อสินค้าจาก Feature แล้วก็ Tags ก็พอแล้วครับ อนาคตสดใสกว่า
บรรทัดถัดมา
$word = substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH);
แก้เป็น
$word = Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH);
ฟังค์ชั่น substr อีกแล้วครับท่าน ตรงนี้แหละครับที่ทำให้คำค้นหาที่อยู่ใน Tag ของท่านค้นหาข้อมูลสินค้าไม่เจอ ทั้งๆที่มีคำค้นหาอยู่ใน Tag แล้วก็มีสินค้าอยู่ เหตุผลเพราะว่า เมื่อคุณเพิ่มคำค้นหาเข้าไปใน Tags หรือส่วนต่างๆที่โปรแกรมจะไปเก็บคำค้นหา และถ้าคุณพิมพ์คำค้นหาเป็นภาษาไทย และติด สระเอ แอ เข้าไป เช่น ของแต่งบ้าน (คำนี้ผมไปเห็นอยู่เว็ปนึงครับ แอบเข้าไปเล่น อิอิอิ) คำค้นหาที่เป็นภาษาไทยบางคำนั้นจะไม่ถูกเก็บเข้าไปในตาราง Search_word เป็นเหตุให้คำค้นหาไม่อ้างอิงกับ id_product ตัวใดเลย ทำให้เวลา Search หรือคลิกที่ลิงค์ใน Blog Tag จะไม่เจอข้อมูลสินค้าครับ
ต่อมา ส่วนของ Ajax Search หรือช่อง Search เมื่อเราพิมตัวอักษรเข้าไป แล้วจะมี List สินค้าโชว์ขึ้นมาใต้ช่อง Search
if ($ajax)
{
$queryResults = '
SELECT p.id_product, pl.name as pname, IF(cl.name REGEXP "^[0-9]{2}\\.", SUBSTRING(cl.name, 4), cl.name) as cname '.$score.', cl.link_rewrite as crewrite, pl.link_rewrite as prewrite
FROM '._DB_PREFIX_.'product p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.intval($id_lang).')
WHERE '.implode(' AND ', $whereArray).'
AND p.active = 1
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.(!$cookie->id_customer ? '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
)
ORDER BY position DESC
LIMIT 20';
return Db::getInstance()->ExecuteS($queryResults);
}
แก้เป็น
$words = str_replace(' ', '', Search::sanitize($expr, $id_lang));
if ($ajax)
{
$queryResults = '
SELECT p.id_product, pl.name as pname, IF(cl.name REGEXP "^[0-9]{2}\\.", SUBSTRING(cl.name, 4), cl.name) as cname '.$score.', cl.link_rewrite as crewrite, pl.link_rewrite as prewrite
FROM '._DB_PREFIX_.'product p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.intval($id_lang).')
WHERE '.implode(' AND ', $whereArray).' AND pl.`name` LIKE \'%'.$words.'%\'
AND p.active = 1
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.(!$cookie->id_customer ? '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
)
ORDER BY position DESC
LIMIT 10';
return Db::getInstance()->ExecuteS($queryResults);
}
ส่วนที่ไฮไลสีเขียว คือ การ
ปรับค่า LIMIT มีความจำเป็นที่จะต้องปรับก็ต่อเมื่อ ปรับค่า max ในไฟล์ prestashop/modules/blogsearch/blogsearch.php หรือprestashop/modules/blogsearch/blogsearch-top.php
ส่วนที่ไฮไลสีแดงเข้ามา คือ
$words = str_replace(' ', '', Search::sanitize($expr, $id_lang)); เป็นส่วนที่นำคำค้นหาไปตรวจสอบและตัดตัวอักษรพิเศษออกไปแล้ว นำเข้าตัวแปร $word ตัวแปรนี้จะใช้ในการนำคำค้นหาไปค้นในฐานข้อมูลจากตาราง Product_lang ฟิวล์ของ name(เก็บชื่อของสินค้า)
AND pl.`name` LIKE \'%'.$words.'%\' ส่วนนี้จะเพิ่มหรือไม่เพิ่มก็ได้ เพราะผมเชื่อว่า แต่ละคนอาจชอบการทำงานแตกต่างกัน เพิ่มหรือไม่เพิ่มตรงนี้จะทำงานแตกต่างกันอย่างไร เดิมที่การทำงานตรงส่วนนี้เมื่อไม่ได้เพิ่มเติมโค้ดเข้าไป โปรแกรมจะนำคำค้นหาไปค้นหาคำในตาราง Search_word เท่านั้น คือ คำค้นหาคำนั้นตรงกับ id_product ตัวไหน ก็จะนำข้อมูล name ของ id_product ตัวนั้นๆมาแสดงภายใต้ช่อง Search แต่คำค้นหาไม่จำเป็นต้องมีอยู่ในฟิวล์ name(ฟิวล์เก็บชื่อสินค้า) แต่เมื่อคุณเติมโค้ดที่เพิ่มมาเข้าไป และเมื่อเราพิมพ์คำค้นหาลงไปในช่อง Search ถ้าคำค้นหาไม่มีอยู่ในชื่อสินค้าด้วยข้อมูลสินค้าก็จะไม่แสดงออกมาภายใต้ช่อง Search ครับ และถ้าผมเปลี่ยน AND เป็น OR จะได้ข้อมูลออกมาเท่ากับหรือมากกว่าเดิมคือ โปรแกรมจะเอาคำค้นหาไปค้นที่ตาราง Search_word และ Product_lang หรือก็คือ เอาข้อมูลที่ตรงกับคำค้นหาในตาราง Search_word และข้อมูลที่ตรงกับชื่อสินค้า(จะตรงหรือไม่ตรงก็ได้)ในตาราง Product_lang ออกมาแสดงภายใต้ช่อง Search แต่ไม่จำเป็นที่ id_product ของชื่อสินค้าตัวนั้นๆต้องอยู่ในตาราง Search_word
สรุปอีกรอบให้อ่านกัน
- ถ้าไม่เพิ่มโค้ดใหม่เข้าไป คำค้นหาต้องมีอยู่ในตาราง Search_word เท่านั้น
- ถ้าเพิ่มโค้ดใหม่เข้าไปเป็น AND คำค้นหาต้องมีอยู่ในตาราง Search_word และต้องมีอยู่ในฟิวล์ที่เก็บชื่อของสินค้าด้วย และ id_product ต้องอยู่ในตาราง Search_word ด้วยเท่านั้น ถึงจะได้ข้อมูลสินค้าออกมา
- ถ้าเพิ่มโค้ดใหม่เข้าไปเป็น OR คำค้นหาต้องมีอยู่ในตาราง Search_word แต่จะมีหรือไม่มีอยู่ในฟิวล์ที่เก็บชื่อสินค้าก็ได้ id_product ไม่จำเป็นต้องมีอยู่ในตาราง Search_word ขอให้ชื่อของสินค้าตรงกับคำค้นหาก็จะได้ข้อมูลสินค้าออกมาแสดงด้วย
และยังมีการกำหนดในส่วนนี้อีกครับ
AND pl.`name` LIKE \'%'.$words.'%\' ที่ไฮไลสีเขียวไว้ อ้างอิงจากข้อมูล Mysql
การค้นหาข้อมูลในฟิวล์ต่างๆ เช่น pl.name คือ หาในฟิวล์ชื่อข้อมูลสินค้า และสมมุติผมมีข้อมูลดังนี้ 'สี', 'เสีย', 'เส้นเสียง', 'เสียด', 'เสียง' ถ้าผมใส่รูปแบบนี้
pl.`name` LIKE \''.$words.'%\' หมายความว่า ตัวอักษรด้านหน้าต้องตรงกับตัวอักษรที่เราค้นหาทุกคำ เช่น ผมพิมพ์ 'เสี' ผมจะเจอคำว่า '
เสีย', '
เสียง' แต่จะไม่เจอคำว่า 'สี', 'เส้นเสียง'
อีกรูปแบบ
pl.`name` LIKE \'%'.$words.'%\' แบบนี้หมายความว่า ตัวอักษรอะไรอยู่ก่อนคำค้นหาก็ได้ เช่น พิมพ์คำว่า 'สีย' จะเจอข้อมูลดังนี้ 'เ
สีย', 'เส้นเ
สียง', 'เ
สียด', 'เ
สียง'
อย่างที่ผมตั้งหัวข้อเลยครับ ปรับ Search ให้โดนใจ(เรา) ใครอยากให้ Search ในเว็ปของเราทำงานแบบไหน ก็ปรับตั้งแต่ค่า AND OR แล้วก็ % กันตามใจชอบครับ
ในรูปแบบข้างต้นผมจะใช้รูปแบบนี้
AND pl.`name` LIKE \''.$words.'%\' เพราะผมต้องการให้ข้อมูลสินค้าที่ลิสออกมา มีคำเหมือนที่เราพิมพ์เท่านั้น หากคำที่พิมเข้าไปไม่เจอข้อมูลสินค้าใดเลย เราก็ยังมีอีกทางเลือกให้ค้นหา ก็คือ กดปุ่ม Search ที่อยู่ด้านข้าง แต่ของเดิมถ้าไม่มีในลิสใต้ช่อง Ajax Search กดปุ่ม Search ไปก็ไม่เจอข้อมูลครับ ต้องทำการปรับแต่งเพิ่มดังนี้ครับ ค้นหาช่วงนี้(ยังอยู่ในไฟล์ classes/Search.php นะครับ)
$queryResults = '
SELECT SQL_CALC_FOUND_ROWS p.*, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`,
t.`rate`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name
'.$score.'
FROM '._DB_PREFIX_.'product p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
LEFT OUTER JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (p.`id_tax` = t.`id_tax`)
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
WHERE '.implode(' AND ', $whereArray).'
AND p.active = 1
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.(!$cookie->id_customer ? '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
)
'.($orderBy ? 'ORDER BY '.$orderBy : '').($orderWay ? ' '.$orderWay : '').'
LIMIT '.intval(($pageNumber - 1) * $pageSize).','.intval($pageSize);
$result = Db::getInstance()->ExecuteS($queryResults);
$total = Db::getInstance()->getValue('SELECT FOUND_ROWS()');
แล้วเพิ่มตรงที่ไฮไลสีแดงเข้าไปครั�
$queryResults = '
SELECT SQL_CALC_FOUND_ROWS p.*, pl.`description`,pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`,
t.`rate`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name
'.$score.'
FROM '._DB_PREFIX_.'product p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
LEFT OUTER JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (p.`id_tax` = t.`id_tax`)
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
WHERE '.implode(' AND ', $whereArray).' OR pl.`name` LIKE \'%'.$words.'%\' OR pl.`description_short` LIKE \'%'.$words.'%\' OR pl.`description` LIKE \'%'.$words.'%\'
AND p.active = 1
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.(!$cookie->id_customer ? '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
)
'.($orderBy ? 'ORDER BY '.$orderBy : '').($orderWay ? ' '.$orderWay : '').'
LIMIT '.intval(($pageNumber - 1) * $pageSize).','.intval($pageSize);
$result = Db::getInstance()->ExecuteS($queryResults);
$total = Db::getInstance()->getValue('SELECT FOUND_ROWS()');
ส่วนที่เพิ่มเข้าไปจะเป็นการเพิ่มการค้นหาในฟิวล์ name(ชื่อสินค้า), description(รายละเอียดสินค้าแบบเต็ม), description_short(รายละเอียดสินค้าแบบย่อ) เราสามารถเอาฟิวล์ที่ไม่ต้องการให้เข้าไปค้นหาออกได้ โดยตัดช่วงนี้ออกครับ
OR pl.`ชื่อฟิวล์` LIKE \'%'.$words.'%\'ถ้าอ่านแล้วยังงงๆ ก็ลองทดสอบเลยครับ ผมจะคอยเข้ามาตอบปัญหาให้ ผมหวังว่าเพื่อนๆจะมี Search ดีๆที่มีประโยชน์ตามรูปแบบของตัวเองไว้ใช้ในร้านกันทุกคนนะครับ และหากเนื้อหาบางส่วนผิดพลาดไปบ้าง ผมก็ขออภัยไว้ ณ ที่นี้นะครับ
ส่งท้ายครับ แจก 3D Tags Flash support (for Prestashop)ภาษาไทยครับ ไม่รู้ว่ามีใช้กันหรือยังนะครับ เอาเป็นว่าแจกไว้ก่อน ตัวนี้แก้เองเลยครับ
hxxp://www.upload-thai.com/download.php?id=59ee401cb90c5f96b4c43f70147c1240