Thông báo

VinaBB đang trong trạng thái vọc phá liên tục, mọi trang đều có thể xuất hiện lỗi >w< O:)
Nếu bạn không thể gửi bài trong diễn đàn hỗ trợ, hãy gửi tin nhắn cho chúng tôi qua Facebook: https://facebook.com/vinabb
Trả lời

Chuyển đổi biến giao diện từ cú pháp phpBB sang Twig


nedka

nedka

Quản trị viên
11/08/2016 10:29

Mục lục

  1. Giới thiệu
  2. Cú pháp nhận diện chung
  3. Các câu lệnh
  4. Biến ngôn ngữ
  5. Tạo thêm biến và gán giá trị
  6. Chèn mã từ tập tin khác vào
  7. Toán tử
  8. Các ưu điểm của Twig so với cú pháp phpBB
  9. Khác biệt giữa Twig trong phpBB 3.1.x và 3.2.x
  10. Twig nâng cao

Biến giao diện, dòng lệnh giao diện là gì?
Biến giao diện nằm trong mã HTML, chứa giá trị kết quả đã được xử lý trong mã PHP. Ngoài việc đơn thuần trả về kết quả hiển thị trong giao diện, chúng còn có thể là những dòng lệnh lập trình giúp người thiết kế giao diện tùy biến việc hiển thị nội dung mà không cần can thiệp vào mã PHP.

Từ phpBB 2.x cho đến 3.0.x, phpBB sử dụng bộ xử lý với cú pháp của riêng mình. Chuyển lên 3.1.x, phpBB bắt đầu tích hợp với Twig nhưng vẫn giữ cú pháp cũ của mình. Hai loại cú pháp cũ và mới này tồn tại song song nhau, bạn có thể tùy ý muốn sử dụng loại nào cũng được.

Twig có nhiều ưu điểm hơn và đặc biệt là khi hiển thị trang kết quả, cú pháp phpBB sẽ được chuyển sang Twig trước, do đó mất thời gian xử lý, dù rằng lượng thời gian này thực tế không đáng kể.

Cú pháp nhận diện chung


nedka

nedka

Quản trị viên
11/08/2016 10:33

Ghi chú
phpBB: Không có, sử dụng ghi chú theo kiểu HTML

Chép
<!-- ghi_chú -->
Twig:
Chép
{# ghi_chú #}
Ghi chú kiểu Twig sẽ không xuất ra trong mã HTML mà trình duyệt nhận được, thích hợp cho các ghi chú nhạy cảm, nội bộ.

Biến
phpBB:
Chép
{tên_biến}
Twig:
Chép
{{ tên_biến }}
Câu lệnh
phpBB:
Chép
<!-- câu_lệnh -->
Twig:
Chép
{% câu_lệnh %}
Sự kiện
phpBB:
Chép
<!-- EVENT abc -->
Twig:
Chép
{% EVENT abc %}
EVENT là từ khóa Twig duy nhất phải viết hoa, thay vì phải viết thường như số còn lại.

Các câu lệnh


nedka

nedka

Quản trị viên
11/08/2016 11:19

Kiểm tra điều kiện
phpBB:

Chép
<!-- IF ABC == 1 -->...<!-- ELSEIF ABC == 2  -->...<!-- ELSE -->...<!-- ENDIF -->
Twig:
Chép
{% if ABC == 1 %}...{% elseif ABC == 2 %}...{% else %}...{% endif %}
Vòng lặp
phpBB:
Chép
<!-- BEGIN abc -->...{abc.XYZ}...<!-- BEGINELSE -->Không có phần tử nào...<!-- END abc -->
Twig:
Chép
{% for row in abc %}...{{ row.XYZ }}...{% else %}Không có phần tử nào...{% endfor %} 
Vòng lặp có điều kiện
phpBB:
Chép
<!-- BEGIN abc --><!-- IF abc.X -->...{abc.XYZ}...<!-- ENDIF --><!-- END abc -->
Twig:
Chép
{% for row in abc if row.X %}...{{ row.XYZ }}...{% endfor %} 
Nhiều vòng lặp lồng nhau
phpBB:
Chép
<!-- BEGIN abc --><!-- BEGIN xyz -->...{abc.xyz.XYZ}...<!-- END xyz --><!-- END abc -->
Twig:
Chép
{% for row in abc %}{% for subrow in row.xyz %}...{{ subrow.XYZ }}...{% endfor %}{% endfor %}
Bỏ bớt phần tử trong vòng lặp
phpBB:
Chép
<!-- BEGIN abc(2) -->: Bắt đầu vòng lặp từ phần tử thứ 3, bỏ đi phần từ đầu tiên (số 0) và thứ hai (số 1)
<!-- BEGIN abc(-2) -->: Chỉ lấy 2 phần tử cuối cùng
<!-- BEGIN abc(2, 5) -->: Bắt đầu vòng lặp từ phần tử thứ 3 (số 2), kết thúc tại phần tử thứ 6 (số 5)
<!-- BEGIN abc(2, -5) -->: Bắt đầu vòng lặp từ phần tử thứ 3 (số 2), bỏ qua 5 phần tử cuối 
Twig:
Chép
{% for row in abc|slice(2) %}: Bắt đầu vòng lặp từ phần tử thứ 3, bỏ đi phần từ đầu tiên (số 0) và thứ hai (số 1)
{% for row in abc|slice(-2) %}: Chỉ lấy 2 phần tử cuối cùng
{% for row in abc|slice(2, 5) %}: Bắt đầu vòng lặp từ phần tử thứ 3 (số 2), kết thúc tại phần tử thứ 6 (số 5)
{% for row in abc|slice(2, -5) %}: Bắt đầu vòng lặp từ phần tử thứ 3 (số 2), bỏ qua 5 phần tử cuối 
Giá trị luôn có trong vòng lặp
phpBB:
Chép
<!-- IF abc.S_FIRST_ROW -->: true nếu là phần tử đầu tiên
<!-- IF abc.S_LAST_ROW -->: true nếu là phần tử cuối cùng
<!-- IF abc.ROW_COUNT is odd -->: true nếu thứ tự phần tử là lẻ
<!-- IF abc.ROW_COUNT is even -->: true nếu thứ tự phần tử là chẵn
<!-- IF .abc -->: tổng số phần tử
Twig:
Chép
{% if loop.first %}: true nếu là phần tử đầu tiên
{% if loop.last %}: true nếu là phần tử cuối cùng, không thể dùng trong vòng lặp có điều kiện
{% if loop.index is odd %}: true nếu thứ tự phần tử là lẻ
{% if loop.index is even %}: true nếu thứ tự phần tử là chẵn
{% if loop.length %}: tổng số phần tử

Biến ngôn ngữ


nedka

nedka

Quản trị viên
11/08/2016 11:30

Biến ngôn ngữ thường
phpBB:

Chép
{L_ABC}
Twig:
Chép
{{ lang('ABC') }}
Biến ngôn ngữ mã hóa dùng trong JavaScript
phpBB:
Chép
{LA_ABC}
Twig:
Chép
{{ lang('ABC')|e('js') }}
Biến ngôn ngữ kèm tham số
phpBB: Không thể dùng
Twig:
Chép
{{ lang('ABC', 'Giá trị thứ 1', 'Giá trị thứ 2') }}
Biến ngôn ngữ là một mảng
phpBB: Không thể dùng
Twig:
Chép
{{ lang(['ABC', 'tên_chỉ_mục_thứ_1', 'tên_chỉ_mục_thứ_2']) }}

Tạo thêm biến và gán giá trị


nedka

nedka

Quản trị viên
11/08/2016 11:42

Gán giá trị
phpBB:

Chép
<!-- DEFINE ABC = 123 -->
Twig:
Chép
{% set ABC = 123 %}
Gán giá trị nhiều dòng
phpBB:
Chép
<!-- DEFINE ABC -->...<!-- ENDDEFINE -->
Twig:
Chép
{% set ABC %}...{% endset %}
Hủy biến
phpBB:
Chép
<!-- UNDEFINE ABC -->
Twig: Không có, tạm dùng
Chép
{% set ABC = null %}

Chèn mã từ tập tin khác vào


nedka

nedka

Quản trị viên
11/08/2016 12:04

Gọi mã PHP trực tiếp
phpBB:

Chép
<!-- PHP -->mã<!-- ENDPHP -->
Twig: Không có và không nên dùng

Chèn tập tin PHP
phpBB:
Chép
<!-- INCLUDEPHP abc.php -->
Twig: Không có và không nên dùng

Chèn tập tin HTML
phpBB:
Chép
<!-- INCLUDE abc.html -->
Twig:
Chép
{% include 'abc.html' %}
Chèn tập tin CSS
phpBB:
Chép
<!-- INCLUDECSS abc.css -->
Twig: Không có, dùng HTML thay thế

Chèn tập tin JavaScript
phpBB:
Chép
<!-- INCLUDEJS abc.js -->
Twig: Không có, dùng HTML thay thế

Chèn tập tin HTML/CSS/JS nằm trong một gói mở rộng
Ví dụ ta muốn chèn tập tin boardrules_controller.js của gói mở rộng phpbb/boardrules
phpBB:
Chép
<!-- INCLUDEJS @phpbb_boardrules/boardrules_controller.js -->
Twig: Không thể dùng

Toán tử


nedka

nedka

Quản trị viên
11/08/2016 12:28

Các toán tử giống nhau

Chép
and
or
not
is (is odd, is even)
+
-
*
/
%
>
>=
<
<=
==
!=
===
!==
Các toán tử khác nhau
Phép AND nhị phân
phpBB:
Chép
<!-- DEFINE X = A & B -->
Twig:
Chép
{% set X = A b-and B %}
Phép OR nhị phân
phpBB:
Chép
<!-- DEFINE X = A | B -->
Twig:
Chép
{% set X = A b-or B %}
Phép XOR nhị phân
phpBB:
Chép
<!-- DEFINE X = A ^ B -->
Twig:
Chép
{% set X = A b-xor B %}
Các toán tử giống nhau nhưng chức năng khác nhau
Toán tử ~ trong cú pháp phpBB là phép phủ định nhị phân, trong khi trong Twig dùng để ghép 2 biến thành 1 biến dạng chuỗi.
phpBB:
Chép
<!-- DEFINE ABC = ~ABC -->
Twig:
Chép
{% set HELLO_WORLD = row.HELLO ~ row.WORLD %}
Toán tử | trong cú pháp phpBB là phép OR nhị phân, trong khi trong Twig dùng để gọi hàm xử lý cho biến đứng trước.
phpBB:
Chép
<!-- DEFINE X = A | B -->
Twig:
Chép
{{ ABC|number_format }}
Chỉ có trong cú pháp phpBB
Chép
&&
||
!
<> (không bằng)
ne (không bằng)
neq (không bằng)
eq (bằng)
gt (lớn hơn)
gte (lớn hơn hoặc bằng)
lt (nhỏ hơn)
lte (nhỏ hơn hoặc bằng)
>>
<<
mod (chia lấy dư)
Chỉ có trong cú pháp Twig
Chép
// (chia lấy phần nguyên)
** (lũy thừa)

Các ưu điểm của Twig so với cú pháp phpBB


nedka

nedka

Quản trị viên
11/08/2016 13:49

Kiểm tra điều kiện
phpBB: Chỉ có thể kiểm tra đơn giản điều kiện là đúng/sai hoặc có giá trị / rỗng.

Chép
<!-- IF ABC -->: ABC có giá trị true hoặc không rỗng
<!-- IF ABC === true -->: ABC có giá trị true hay không?
<!-- IF ABC === '' -->: ABC có rỗng hay không?
Twig: Kiểm tra kỹ lưỡng hơn như biến đã được khởi tạo hay chưa, trạng thái null hay rỗng
Chép
{% if ABC %}: ABC có giá trị true hoặc không rỗng
{% if ABC is defined %}: ABC đã được khởi tạo hay chưa?
{% if ABC is null %}: ABC có null hay không?
{% if ABC is empty %}: ABC có rỗng hay không? (Bao gồm cả trường hợp ABC mang giá trị false, null hoặc là một mảng rỗng không có phần tử nào)
{% if ABC is iterable %}: ABC là một mảng hoặc đối tượng có phần tử con
{% if ABC is divisible by(2) %}: ABC có chia hết cho 2 hay không?
Kiểm tra điều kiện trên cùng một dòng
phpBB: Phải sử dụng nhiều câu lệnh
Chép
<!-- IF ABC -->...<!-- ELSE -->...<!-- ENDIF -->
Twig:
Chép
{{ (ABC) ? 'đúng' : 'sai' }}
Vòng lặp
PHP:
Chép
$data = array('text' => 'ABC', 'value' => '123');
phpBB: Chỉ lấy được với giá trị trong vòng lặp (giá trị trong mảng PHP) là ABC, 123.
Twig: Có thể lấy tên chỉ mục trong mảng PHP.

Trả về tên chỉ mục thay vì giá trị của nó
Chép
{% for row in forumrow|keys %}...{{ row.ABC }}...{% endfor %}
Hoặc lấy cả hai: vừa tên chỉ mục vừa giá trị
Chép
{% for key, row in forumrow %}...{{ key.ABC }}: {{ row.ABC }}...{% endfor %}
Gán giá trị
phpBB: Có thể gán giá trị nhiều dòng cho một biến, nhưng chỉ là một đoạn văn bản không hơn không kém.
Twig: Giá trị gán có thể là một mảng hay một đối tượng PHP.

Gán mảng
Chép
{% set ABC = [1, 2, 3] %}
Gán đối tượng
Chép
{% set ABC = {'x': 'Hello world', 'y': ['a', 'b', 'c'], 'z': {...}} %}

Khác biệt giữa Twig trong phpBB 3.1.x và 3.2.x


nedka

nedka

Quản trị viên
11/08/2016 13:53

Ngoài sự khác nhau do phiên bản Twig, điểm khác biệt duy nhất khi sử dụng Twig trong 3.1.x và 3.2.x là ở tên vòng lặp.

Trong 3.1.x, tất cả tên vòng lặp phải có tiền tố loops. đứng đầu:

Chép
{% for row in loops.forumrow %}
Trong 3.2.x, tiền tố này không còn yêu cầu nữa:
Chép
{% for row in forumrow %}
Nếu muốn viết mã tương thích cho cả 2 nhánh phiên bản, hãy sử dụng cách của 3.1.x!

Twig nâng cao


nedka

nedka

Quản trị viên
11/08/2016 13:55

Sử dụng nhiều lần một đoạn mã HTML
Với câu lệnh DEFINE trong cú pháp phpBB, ta cũng có thể dùng đi dùng lại một đoạn mã HTML, nhưng bắt buộc nội dung phải giống nhau hoàn toàn, không thể tùy biến chỉ vài ba chỗ, ví dụ: nội dung thông báo, màu chữ... Với Twig, điều này hoàn toàn dễ dàng thực hiện.

Đầu tiên, ta định nghĩa đoạn mã HTML, có tên ví dụ là error_box với 2 tham số thay đổi: nội dung (text) và màu chữ (color).

Chép
{% macro error_box(text, color) %}
<div style="color: {{ color }}">
	<h4>{{ lang('ERROR') }}</4>
	<p>{{ text }}</p>
</div>
{% endmacro %}
Nếu đoạn mã HTML này nằm cùng tập tin với nơi sử dụng nó thì:
Chép
{% import _self as tpl %}
{{ tpl.error_box('Vui lòng đăng nhập...', 'red') }}
Nếu đoạn mã HTML nằm ở tập tin khác, ví dụ errors.html thì:
Chép
{% import 'errors.html' as tpl %}
{{ tpl.error_box('Vui lòng đăng nhập...', 'red') }}
Trong 2 đoạn mã trên, 'tpl' chỉ là tên tiền tố ta tự đặt để phân biệt nhằm tránh xung đột trùng tên khi gọi từ nhiều tập tin khác nhau.

Kiểm tra chuỗi ký tự
Ký tự đầu chuỗi:
Chép
{% if ABC starts with 'Hello' %}
Ký tự cuối chuỗi:
Chép
{% if ABC ends with 'world' %}
Có chứa ký tự ở vị trí bất kỳ:
Chép
{% if 'Hello' in ABC %}
Kiểm tra phức tạp hơn với regular expression:
Chép
{% if ABC matches "/Hello world/" %}
Kiểm tra giá trị nằm trong mảng
Chép
{% if ABC in ['a', 'b', 'c'] %}
{% if ABC in tên_biến_mảng %}
Xử lý giá trị biến trước khi hiển thị
Chép
{{ ABC|upper }}: viết hoa toàn bộ
{{ ABC|lower }}: viết thường toàn bộ
{{ ABC|trim }}: bỏ khoảng trắng dư trước và sau
{{ ABC|capitalize }}: viết hoa các chữ cái đầu
{{ ABC|date('định_dạng_ngày_tháng_của_PHP') }}: định dạng lại ngày tháng
{{ ABC|length }}: độ dài chuỗi hoặc số phần tử trong mảng
{{ ABC|replace('chuỗi_tìm', 'chuỗi_thay_thế') }}: thay thế chuỗi ký tự
{{ ABC|abs }}: trả về giá trị tuyệt đối
{{ ABC|number_format('số_chữ_số_hàng_thập_phân', 'ký_hiệu_số_thập_phân', 'ký_hiệu_phân_tách_hàng_nghìn') }}: định dạng số
{{ ABC|round('số_chữ_số_hàng_thập_phân') }}: làm tròn số
{{ ABC|url_encode }}: mã hóa liên kết
{{ ABC|e('js') }}: mã hóa biến ngôn ngữ trong JavaScript
Ta có thể áp dụng nhiều hàm xử lý lồng vào nhau, nhưng phải chú ý thứ tự một vài trường hợp:
Chép
{{ lang('ABC')|upper|e('js') }}: phải viết hoa toàn bộ trước rồi mới mã hóa sau cùng
{{ lang('ABC')|upper|trim }}: viết hoa trước hay bỏ khoảng trắng trước đều không ảnh hưởng gì nhau
Bài viết này chỉ đề cập một vài tính năng nâng cao của Twig mà cú pháp cũ của phpBB không có và thường dùng khi thiết kế giao diện cho phpBB. Còn nhiều tính năng khác của Twig mà bạn có thể tham khảo trong tài liệu chính thức.

Trả lời

VinaBB • The Holy Land of phpBB

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 phpBB

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
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 trước pháp luật.
Sử dụng phần mềm phpBB
cron