Đừng sửa mã gốc, hãy cố vượt dốc


Đừng sửa mã gốc, hãy cố vượt dốc
nedka

nedka

14/12/2016 17:48
Khi phpBB 3.1 bản Alpha đầu ra mắt, chúng tôi đã vội khoác cho mình suy nghĩ rằng thú vui cài MOD năm nào sẽ không còn nữa. Với người dùng bình thường hay những bạn mới, sẽ chẳng bao giờ hiểu được cảm giác đó nữa. Nhưng nó lại mở ra một thú vui khác: 'cố gắng len lỏi mà đạt mục đích'.

Với số lượng điểm cho trước hạn chế (sự kiện PHP), làm thế nào để ta hoàn thành chức năng mà không phải chơi chiêu cuối cùng: sửa mã gốc phpBB. Hay phải lết xác qua GitHub, Bug Tracker của phpBB làm cho 'đúng quy trình' để được tạo mới một sự kiện, mà có khi nửa năm nữa nó mới phát hành để mà có xài.

Bài viết này chúng tôi sẽ chia sẻ cho bạn 3 chiêu có khả năng ứng dụng nhiều nhé.

Chiêu 1: Làm thế nào bắt được một thao tác thực thi thành công nếu thiếu sự kiện?
Dựa vào ghi nhận! Gần như bất kỳ một thao tác xử lý dữ liệu nào trong bảng quản trị đều có một ghi nhận thành công. Hãy bắt nó thông qua sự kiện core.add_log.

Ví dụ: Bạn muốn cập nhật mới dữ liệu tạm (cache) cho bảng dữ liệu nhóm (phpbb_groups), hãy bắt khi phpBB lưu lại 3 ghi nhận: tạo nhóm mới, sửa nhóm và xóa nhóm.

Mã mẫu:
Chép
if ($event['log_operation'] == 'LOG_GROUP_CREATED' || $event['log_operation'] == 'LOG_GROUP_DELETE' || $event['log_operation'] == 'LOG_GROUP_UPDATED')
{
	$this->cache->clear_group_data();
}

Chiêu 2: Làm thế nào chèn mã vào một trang hoàn toàn không có sự kiện nào?
Bất kỳ trang nào của phpBB cũng cần khởi tạo phiên người dùng. Hãy bắt đúng trang thông qua tên tập tin PHP đang thực thi hoặc tên đường dẫn (routing) đang truy cập bằng giá trị từ $this->user->page['page_name']. Các trang lẻ thì trả về tên tập tin như viewforum.php, ucp.php... còn các đường dẫn luôn có app.php đầu, ví dụ: app.php/demo/, app.php/post/123/report...

Mã mẫu:
Chép
if (in_array($this->user->page['page_name'], array("app.$phpEx/demo/", "app.$phpEx/demo/acp", "app.$phpEx/demo/acp/")))
{
	$helper = $phpbb_container->get('controller.helper');
	$response = new \Symfony\Component\HttpFoundation\RedirectResponse(
		$helper->route('vinabb_stylesdemo_route', array('mode' => '')),
		301
	);
	$response->send();
}

Chiêu 3: Làm thế nào "SEO" lại các liên kết chủ đề, bài viết khi nó xuất hiện mọi ngõ ngách?
Đừng dại dột nghĩ đến sự kiện hay mở rộng, thay thế hàm, đối tượng có sẵn vì bạn sẽ... 'đuối' ngay trước số lượng của nó. Hãy bình tĩnh suy xét lại nào, tất cả mọi liên kết trong phpBB đều đi qua hàm append_sid(), thế sao không 'phang' ngay vào nó?

Từ sự kiện core.append_sid, lọc ra những liên kết có chứa viewforum.php:
Chép
if (strpos($event['url'], "viewforum.{$this->php_ext}") !== false)
Sau đó, lấy hết các tham số từ liên kết, ví dụ ?f=...&t=..., xử lý chúng rồi trả về "chuẩn SEO" đại loại như: .../forum/ten-chuyen-muc.17/page-2/.

Mã mẫu:
Chép
if (strpos($event['url'], "viewforum.{$this->php_ext}") !== false)
{
	$forum_data = $this->cache->get_forum_data();

	if (!sizeof($this->route_data))
	{
		$this->route_data['f'] = '';
	}

	if (isset($this->route_data['f']))
	{
		$this->route_data['forum_id'] = $this->route_data['f'];

		unset($this->route_data['f']);

		if ($this->route_data['forum_id'])
		{
			$this->route_data['seo'] = $forum_data[$this->route_data['forum_id']]['name_seo'] . constants::REWRITE_URL_SEO;
		}
	}

	$this->route_name = 'vinabb_web_board_forum_route';
}
Nào, hãy thử thực hành đi các chàng trai cô gái, phpBB có một 'ma lực' rất ghê gớm mà chỉ những ai hiểu và yêu nó mới cảm nhận được.


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

VinaBB

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.