Đổ bộ Rhea, chinh phục Sao Thổ


Đổ bộ Rhea, chinh phục Sao Thổ
nedka

nedka

20/12/2016 22:31
Bài viết này tổng hợp những thay đổi trong thiết kế giao diện và lập trình với các thành phần từ phpBB 3.1 lên 3.2, giúp bạn nhanh chóng cập nhật cho giao diện hay gói mở rộng của mình để sẵn sàng cho sự kiện phpBB 3.2.0 chính thức phát hành chưa đầy 3 tuần nữa.

DÀNH CHO NGƯỜI THIẾT KẾ
Vòng lặp Twig
Tên biến Twig là một mảng (vòng lặp) trong 3.1 phải có tiền tố đầu loops. đi kèm. Tiền tố này không còn yêu cầu nữa từ 3.2, giờ đây bạn thoải mái đặt tên biến theo ý mình.

Kiểu cũ:

Chép
{% for item in loops.items %}
{{ item.NAME }}
{% endfor %}
Kiểu mới:
Chép
{% for item in items %}
{{ item.NAME }}
{% endfor %}
Sử dụng kiểu cũ trong 3.2: Được

Gọi thêm tập tin CSS
Cú pháp theo kiểu phpBB <!-- INCLUDECSS abc.css --> trong 3.1 chỉ có thể dùng được trong phạm vi sự kiện giao diện overall_header_head_append, hoặc trước khi sự kiện này được xử lý. Còn với 3.2, bạn thoải mái sử dụng nó tại bất kỳ vị trí nào.

Font Awesome
phpBB 3.2 tích hợp sẵn Font Awesome ở giao diện mặc định prosilver cũng như giao diện quản trị. Bỏ qua prosilver vì hầu như ai cũng có thể dễ dàng gọi tập tin CSS của Font Awesome vào giao diện của mình, việc giao diện quản trị đã có bộ biểu tượng này giúp bạn có thể trang trí sinh động hơn các trang quản lý, thiết lập của gói mở rộng.

DÀNH CHO NGƯỜI LẬP TRÌNH
Thông báo
Thông báo tương tác là thành phần thay đổi quan trọng nhất trong 3.2, bởi vì tất cả gói mở rộng có dùng đến thông báo trong 3.1 sẽ không thể hoạt động trên 3.2.

Lấy danh sách người dùng cần gửi thông báo (Phương thức find_users_for_notification)
Kiểu cũ:
Chép
public function find_users_for_notification($data, $options = array())
{
$sql = 'SELECT user_id
FROM ' . USERS_TABLE . '
WHERE user_type <> ' . USER_IGNORE;
$result = $this->db->sql_query($sql);

$users = array();
while ($row = $this->db->sql_fetchrow($result))
{
$users[$row['user_id']] = array('');
}
$this->db->sql_freeresult($result);

return $users;
}
Kiểu mới:
Chép
public function find_users_for_notification($data, $options = array())
{
$sql = 'SELECT user_id
FROM ' . USERS_TABLE . '
WHERE user_type <> ' . USER_IGNORE;
$result = $this->db->sql_query($sql);

$users = array();
while ($row = $this->db->sql_fetchrow($result))
{
$users[$row['user_id']] = $this->notification_manager->get_default_methods();
}
$this->db->sql_freeresult($result);

return $users;
}
Điểm khác biệt nằm ở dòng gán giá trị mảng:
Chép
$users[$row['user_id']] = array('');
Chép
$users[$row['user_id']] = $this->notification_manager->get_default_methods();
Nếu như ở 3.1, trong mảng dữ liệu trả về chúng ta chỉ cần gán khóa là user_id và để trống giá trị (mảng rỗng array('')) thì ở 3.2, ta cần xác định rõ phương pháp người dùng chọn nhận thông báo (gửi qua thư hoặc thông báo trực tiếp trong diễn đàn) để chỉ gửi một lần qua phương pháp họ đã chọn. Phương pháp này được lưu vào giá trị mảng, tạo ra sự khác biệt trong mã giữa 2 nhánh phiên bản phpBB.

Chèn dữ liệu thông báo vào bảng dữ liệu (Phương thức create_insert_array)
Kiểu cũ:
Chép
public function create_insert_array($data, $pre_create_data = array())
{
// Mã xử lý...
return parent::create_insert_array($data, $pre_create_data);
}
Kiểu mới:
Chép
public function create_insert_array($data, $pre_create_data = array())
{
// Mã xử lý...
parent::create_insert_array($data, $pre_create_data);
}
Điểm khác biệt là 3.1 phải có kiểu trả về return cuối phương thức, trong khi 3.2 không có kiểu trả về này.

Cấu hình loại thông báo trong YAML (./config/services.yml)
Kiểu cũ:
Chép
services:
vinabb.demo.notification.type.abc:
class: vinabb\demo\notification\type\abc
scope: prototype
Kiểu mới:
Chép
services:
vinabb.demo.notification.type.abc:
class: vinabb\demo\notification\type\abc
shared: false
Điểm khác biệt là trong 3.1 ta dùng scope: prototype, trong khi lên 3.2 ta dùng shared: false. Sự thay đổi này là yêu cầu bắt buộc từ phiên bản Symfony của phpBB 3.2.

Sử dụng kiểu cũ trong 3.2: Không

Thiết lập chia sẻ trong Symfony
Nếu bạn đã đọc những thay đổi trong phần Thông báo ở trên, thì bạn đã hiểu phần này thông qua bước cấu hình tập tin services.yml cho loại thông báo.

Mặc định, tất cả đối tượng trong Symfony đều chia sẻ với nhau. Nghĩa là đối tượng đó chỉ cần khởi tạo một lần, và truyền sang các đối tượng khác cần đến nó. Nhưng có những loại đối tượng cần phải tạo mới lại mỗi lần sử dụng, và ta gọi đó là những đối tượng "không chia sẻ" . Để gán thuộc tính này, ta dùng scope: prototype trong các phiên bản Symfony cũ trước 2.8, tương ứng với phpBB 3.1. Với Symfony 2.8 trong phpBB 3.2 và mới hơn sau này, scope: prototype đã bị loại bỏ và thay bằng shared: false.

Sử dụng kiểu cũ trong 3.2: Không

Tên đối tượng làm đối số khi cấu hình YAML
Cũng từ Symfony 2.8, tên các đối tượng @abc hay tham số %abc% đều phải đặt trong dấu nháy đơn '...'. Việc không dùng dấu nháy đơn sẽ sớm được xem là lỗi trong các phiên bản Symfony sau này.

Kiểu cũ:
Chép
services:
vinabb.demo.abc:
class: vinabb\demo\controller\abc
arguments:
- @cache.driver
- %tables.notifications%
calls:
- [set_controller_helper, [@controller.helper]]
Kiểu mới:
Chép
services:
vinabb.demo.abc:
class: vinabb\demo\controller\abc
arguments:
- '@cache.driver'
- '%tables.notifications%'
calls:
- [set_controller_helper, ['@controller.helper']]
Sử dụng kiểu cũ trong 3.2: Được

Ngôn ngữ
3.2 có một đối tượng ngôn ngữ mới, language, tách ra độc lập khỏi user. Tất cả thao tác liên quan ngôn ngữ như gọi thêm tập tin, gán ngôn ngữ bắt buộc, lấy giá trị chuỗi dịch... đều thông qua đối tượng language mới này.

Gọi thêm tập tin ngôn ngữ của phpBB
Kiểu cũ:
Chép
$this->user->add_lang('posting');
Kiểu mới:
Chép
$this->language->add_lang('posting');
Gọi thêm tập tin ngôn ngữ từ gói mở rộng
Kiểu cũ:
Chép
$this->user->add_lang_ext('vinabb/demo', 'posting');
Kiểu mới:
Chép
$this->language->add_lang('posting', 'vinabb/demo');
Gán ngôn ngữ bắt buộc cho người dùng
Kiểu cũ: (gán trước khi ngôn ngữ được gọi)
Chép
$this->user->data['user_lang'] = 'vi';
Kiểu mới:
Chép
$this->language->set_user_language('vi');
Gán ngôn ngữ bắt buộc cho hệ thống
Kiểu cũ: (gán trước khi ngôn ngữ được gọi)
Chép
$this->config['default_lang'] = 'vi';
Kiểu mới:
Chép
$this->language->set_default_language('vi');
Lấy giá trị chuỗi dịch
Kiểu cũ:
Chép
$this->user->lang['ABC'];
$this->user->lang('ABC', 123);
Kiểu mới:
Chép
$this->language->lang('ABC');
$this->language->lang('ABC', 123);
Kiểm tra biến ngôn ngữ tồn tại
Kiểu cũ:
Chép
if (isset($this->user->lang['ABC']))
Kiểu mới:
Chép
if ($this->language->is_set('ABC'))
Sử dụng kiểu cũ trong 3.2: Được

Bộ nhân BBCode mới
Nội dung BBCode trong 3.1 được lưu trữ và hiển thị dưới dạng HTML. Còn trong 3.2, với sự tích hợp bộ xử lý văn bản mới s9e Text Formatter, nội dung BBCode được lưu trữ ở dạng XML và chuyển sang HTML khi hiển thị. Tất cả các hàm xử lý BBCode của phpBB vẫn như cũ. Dữ liệu BBCode cũ đã lưu dạng HTML vẫn tương thích và sẽ được chuyển sang dạng mới một lần có thao tác sửa - lưu lại nội dung.

Tuy nhiên, bạn nên chủ động cập nhật dữ liệu BBCode cũ sang XML để tránh rắc rối sau này.
Chép
$parser = $this->container->get('text_formatter.parser')->get_parser();
$text_formatter_utils = $this->container->get('text_formatter.utils');
$text = 'nội dung BBCode cũ đã lưu dạng HTML';

// Trả về dạng thô
$text = $text_formatter_utils->unparse($text);

// Chuyển sang XML
$text = $parser->parse($text);

Tên nhóm
Kiểu cũ:
Chép
$name = ($row['group_type'] == GROUP_SPECIAL) ? $this->user->lang['G_' . $row['group_name']] : $row['group_name'];
Kiểu mới:
Chép
$name = $this->group_helper->get_name($row['group_name']);
Sử dụng kiểu cũ trong 3.2: Được

Mảng PHP
Kể từ PHP 5.4, mảng có thể khởi tạo bằng cú pháp ngắn $array = [];. Do phiên bản PHP tối thiểu của phpBB 3.1 là 5.3.3 nên ta buộc phải dùng kiểu cũ $array = array(); để đảm bảo sự tương thích. Từ phpBB 3.2, phiên bản PHP tối thiểu đã nâng lên 5.4, do đó bạn có thể thoải mái dùng kiểu tạo mảng ngắn kể trên. Sự thay đổi này không quan trọng, nó tùy thuộc vào thói quen viết mã của mỗi người.

Sử dụng kiểu cũ trong 3.2: Được

Hệ quản trị dữ liệu
Cũng do nâng lên PHP tối thiểu 5.4, phpBB 3.2 đã gỡ bỏ 2 hệ quản trị lỗi thời là MSSQL và SQlite 2. Do đó, khi ta dùng phương thức $this->db->get_sql_layer() để xác định hệ quản trị của người dùng, có 2 giá trị không còn tồn tại: mssqlsqlite.

Giá trị cũ:
Chép
mssql -> SQL Server 2000
mssql_odbc -> SQL Server 2000 (ODBC)
mssqlnative -> SQL Server 2005+
mysql -> MySQL
mysqli -> MySQLi
oracle -> Oracle
postgres -> PostgreSQL
sqlite -> SQLite 2.8.2 - 3.6.14
sqlite3 -> SQLite 3.6.15+
Giá trị mới:
Chép
mssql_odbc -> SQL Server 2000 (ODBC)
mssqlnative -> SQL Server 2005+
mysql -> MySQL
mysqli -> MySQLi
oracle -> Oracle
postgres -> PostgreSQL
sqlite3 -> SQLite 3.6.15+

Hệ thống tập tin
phpBB 3.2 có một đối tượng mới filesystem dùng xử lý các thao tác với tập tin và thư mục. Hãy đọc qua bài viết Phát triển gói mở rộng: Tập tin để tìm hiểu các phương thức sử dụng của nó.

Tải tập tin lên
phpBB 3.2 mang đến 2 đối tượng mới: filespecupload để xử lý việc tải tập tin lên. Dưới đây là đoạn mã mẫu để tải một hình ảnh lên máy chủ dùng 2 đối tượng mới này.
Chép
// Tên của thẻ input chọn tập tin trong mã HTML, ví dụ: <input type="file" name="test_image">
protected $form_name = 'test_image';

// Đường dẫn thư mục chứa tập tin tải lên
protected $path;

// Mảng lưu lại các lỗi xảy ra khi tải tập tin lên
protected $errors = [];

public function upload_file()
{
// Giới hạn loại tập tin là hình ảnh
$this->upload->set_allowed_extensions(['gif', 'jpg', 'jpeg', 'png', 'svg'])
->set_disallowed_content((isset($this->config['mime_triggers']) ? explode('|', $this->config['mime_triggers']) : false));

// Kiểm tra người dùng đã chọn tập tin chưa
$form_name = $this->request->file($this->form_name);

if ($form_name['name'] == '')
{
return false;
}

// Tiến hành tải lên
$file = $this->upload->handle_upload('files.types.form', $this->form_name);

// Nếu có lỗi xảy ra, ghi nhận lại cũng như gỡ bỏ tập tin đã tải lên
if (sizeof($file->error))
{
$file->remove();
$this->errors = array_merge($this->errors, $file->error);

return false;
}

// Chuyển tập tin đến thư mục máy chủ đã xác định
if (!sizeof($this->errors))
{
$file->move_file($this->path, true);
}

// Trả về tên tập tin
return $file->get('realname');
}
Sử dụng kiểu cũ trong 3.2: Không

TỔNG KẾT
Vậy là bạn đã cùng chúng tôi điểm qua 3 thay đổi trong thiết kế giao diện và 10 đối tượng lập trình thay đổi trong phpBB 3.2. Còn 3 tuần nữa, phpBB 3.2.0 sẽ chính thức phát hành. Hãy nhanh tay cập nhật cho giao diện và gói mở rộng của bạn để sẵn sàng đổ bộ mặt trăng Rhea của Sao Thổ nào, các phi hành gia kính mến!

Tham khảo: https://area51.phpbb.com/docs/dev/32x/e ... _rhea.html


VinaBB

Quan điểm

  • Không đề cập chính trị, tôn giáo, nội dung đồi trụy.
  • Giữ gìn sự trong sáng của Tiếng Việt.
  • Không chia sẻ phần mềm vi phạm bản quyền.
  • Không rao vặt và không nhận đặt quảng cáo.
  • Dù trong túi hết tiền thì diễn đàn phpBB của anh cũng phải ngay ngắn.

Chuyện tình VinaBB

17/07/2004: Yêu phpBB từ phiên bản 2.0.10.
22/10/2006: Cất tiếng cười chào đời.
11/06/2007: Chính thức định cư trên Olympus, Sao Hỏa.
11/06/2009: Mất liên lạc với Trái Đất. [ Phiên bản 2007 ]
28/07/2016: Trôi dạt đến mặt trăng Rhea, Sao Thổ.
12/12/2016: Cuộc hành trình mới lại bắt đầu…

Code in Viet Nam

Cống hiến hết mình vì Tổ Quốc Việt Nam Xã Hội Chủ Nghĩa

Quản trị viên

nedka

NEDKA Solutions

NEDKA Solutions

Đơn vị chủ quản

Chúng tôi chịu trách nhiệm toàn bộ nội dung có trên VinaBB.vn trước pháp luật.