- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Nếu bạn đã từng gặp vấn đề mất template sau khi nâng cấp Prestashop, bài viết này mình sẽ giúp bạn khắc phục điều đó với giải pháp hiển thị module template cho trang Prestashopm, bạn sẽ không sợ thay thế file hệ thống sau khi nâng cấp mà vẫn dữ được những thay đổi của bạn.
Download Project Files
Tuần trước, mình có sử dụng hook bằng cách sửa đổi displayOverrideTemplate
mà có được đề cập trong tài liệu phát triển từ Prestashop nhưng chúng ta cần phải kế thừa hoặc sửa đổi template hiện tại mà không sợ bị mất dữ liệu của bạn khi nâng cấp phiên bản mới.
Nó được bổ xung ở phiên Prestashop 1.5 trong file FrontController.php:
/** * Returns the template corresponding to the current page. * By default this method return false but could easily be overridden in a specific controller * * @since 1.5 * @return bool */ public function getOverrideTemplate() { return Hook::exec('DisplayOverrideTemplate', array('controller' => $this)); }
Đúng vậy, bạn sẽ hiểu sức mạnh của hooks này để làm gì nhé.
Ví dụ – Override trang category
Trong ví dụ này, chúng ta sẽ sủ dụng một module đơn giản để override trang category. Tải file mẫu project ở trên và đặt thư mục ‘psoverridetemplatedemo’ vào trong folder ‘modules/’ của Prestashop. Thao tác vừa rồi rất đơn giản là bạn tạo một module trống;. Chúng ta sẽ thêm một vài thứ ở đây như phương thức install và đăng ký hook của chúng ta.
public function install() { if (!parent::install() || !$this->registerHook('displayOverrideTemplate') ) return false; return true; }
Cài đặt nó, sau đó để nó có thể hoạt động thực sự bạn sẽ cần thêm một vài thứ mà bạn kiểm soát được ví dụ mình sử dụng lệnh ngắt trang như thế này:
public function hookDisplayOverrideTemplate($params) { die('here'); // return dirname(__FILE__).'/views/templates/hook/skeleton.tpl'; }
Nó sẽ xóa mọi page của store và hiển thị chữ “here” thay vào đó. Nếu không phải vậy bạn hãy kiểm tra lại phương thức registerHook
.
Giá trị nào được trả về từ hook?
Không phải template như bạn có thể đang nghĩ tới và chúng ta sẽ include file smarty’ template. Chúng ta cần trả về đường dẫn tới file .tpl mà chúng ta sử dụng. CHúng ta có một file trong thư mục gốc của module (psoverridetemplatedemo.tpl).
public function hookDisplayOverrideTemplate($params) { return dirname(__FILE__).'/psoverridetemplatedemo.tpl'; }
Lưu và load lại trang. Bây giờ bạn thấy mỗi trang của Prestashop có thêm cột trống ở giữa. Tại sao như vậy? Bởi vì trong file template chưa có nội dung gì. Bạn có thể tự kiểm tra bằng cách thử thêm một vài nội dung vào file và bạn sẽ thấy nó xuất hiện ở mọi trang. Vậy mình muốn chỉ hiển thị ở một số template thì làm thế nào? Trong bài viết trước hướng dẫn cách sử dụng Module hooks cho từng page trong Prestashop. Tôi đã chỉ cho bạn cách lấy page sử dụng biến php_self:
$this->context->controller->php_self
Trong lớp FrontController chúng ta có thể lấy đối tượng controller hiện tại thông qua tham số $params
truy cập vào biến trên giống như sau:
$params['controller']->php_self;
Khá dễ dàng đúng không nào, giờ bạn có thể tùy biến hiển thị module với trang category rồi:
public function hookDisplayOverrideTemplate($params) { if ($params['controller']->php_self == 'category') return dirname(__FILE__).'/psoverridetemplatedemo.tpl'; }
Lưu và load lại trang nội dung template chỉ được thay thế khi bạn truy cập vào trang category, còn những pages khác thì sao? Để lấy tên các page khác chỉ đơn giản echo nội dung của biến php_self là bạn sẽ thấy ngay:
public function hookDisplayOverrideTemplate($params) { var_dump($params['controller']->php_self); //if ($params['controller']->php_self == 'category') // return dirname(__FILE__).'/psoverridetemplatedemo.tpl'; }
Tên page sẽ hiển thị ở trên đầu trang. Nhưng chú ý một vài page có thể không gán biến php_self và code php sẽ bị lỗi, nên để chắc bạn bạn cần kiểm tra biến đó có tồn tại hay không.
public function hookDisplayOverrideTemplate($params) { if (isset($params['controller']->php_self) && $params['controller']->php_self == 'category') return dirname(__FILE__).'/psoverridetemplatedemo.tpl'; }
Như vậy với cách này bạn có thể sử dụng riêng template của module cho từng trang trong Prestashop. Chúc bạn thành công.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype