Post by tzabaman » Thu Mar 31, 2011 6:06 pm

Μετά από ψάξιμο κατάφερα να λύσω το πρόβλημα της αναζήτησης προϊόντων των οποίων ο τίτλος, περιγραφή, μοντέλο κτλ περιέχει ελληνικούς χαρακτήρες. Τώρα η αναζήτηση θα φέρει όλα τα προϊοντα τα οποία ΤΑΙΡΙΑΖΟΥΝ στο keyword με το οποίο αναζητούμε, ανεξάρτητα αν αυτό είναι τονισμένο, ατόνιστο, κεφαλαίο ή μικρό (Case-Insesitive και Αccent-Insesitive).
Αρχικά να πω ότι δεν πείραξα το collation της βάσης ή του κάθε πεδίου ξεχωριστά. Είναι όλα utf8-bin.
Η αλλαγή που περιγραφω πιο κάτω αφορά το search στο front-end by keword. Οι αλλαγές μπορούν να επεκταθούν και στο search by tag front-end και στο διαχειριστικό, γενικά όπου υπάρχει search.

πχ.
- catalog/model/catalog/product.php
- function getTotalProductsByKeyword(...)

ας πάρουμε τη γραμμή που λέει:

Code: Select all

$sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%'";
πρέπει να γίνουν 2 αλλαγές

1)

Code: Select all

strtolower($keyword)
να γίνει

Code: Select all

mb_strtolower($keyword,'UTF-8')
2) να προστεθεί (περίπου) στο τέλος της γραμμής το

Code: Select all

COLLATE utf8_general_ci
. Αυτό αλλάζει το COLLATION του πεδίου on-the-fly σε utf8_general_ci.

Άρα η γραμμή διαμορφώνεται ως εξής

Code: Select all

$sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(mb_strtolower($keyword,'UTF-8')) . "%' COLLATE utf8_general_ci ";
Αυτές οι 2 αλλαγές πρέπει να γίνονται μέσα στα sql ερωτήματα τα οποία ζητάνε δεδομένα από πεδία τα οποία μπορεί να περιέχουν ελληνικούς χαρακτήρες, πχ name, descpription κτλ.

Οι αλλαγές αυτές πρέπει να γίνουν σε αρκετα σημεία μέσα στο αρχείο που αναφέρω πιο πάνω και το on-the-fly conversion του πεδίου να προστίθεται μετα από κάθε αναφορά πεδίου στο ερώτημα.

δηλαδή...

Code: Select all

$sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%'";
πρέπει να γίνει

Code: Select all

$sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(mb_strtolower($keyword,'UTF-8')) . "%' COLLATE utf8_general_ci OR LCASE(pd.description) LIKE '%" . $this->db->escape(mb_strtolower($keyword,'UTF-8')) . "%' COLLATE utf8_general_ci";
Πιστέυω να έγινα κατανοητός!! O0

Newbie

Posts

Joined
Wed Jan 19, 2011 9:40 pm

Post by kyprios1 » Sun Jun 05, 2011 5:42 am

Να΄σαι καλά, πολύ χρήσιμη η μόντα αυτή.

New member

Posts

Joined
Mon Jan 31, 2011 9:56 am

Post by sisa » Tue Jun 07, 2011 10:34 pm

ωραίος!!!!

Newbie

Posts

Joined
Fri Apr 15, 2011 3:47 pm
Who is online

Users browsing this forum: No registered users and 121 guests