Naht 911

[Sáng Lập Viên]

Deprecated: Function create_function() is deprecated in /home/shoptcom/fvnn.mobi/data/fvnn.system/vendor/geshi/geshi/src/geshi.php on line 4698
Giới thiệu
Twig là một template engine cho PHP, được sử dụng trong rất nhiều framework khác nhau như Symfony, Drupal8, eZPublish, phpBB, Piwik, OroCRM và được hỗ trợ trong một vài framework khác, có thể kể đến Slim, Yii, Laravel, Codeigniter. Được thiết kế và phát triển dựa trên các nguyên tắc cơ bản của PHP dưới các tiêu chí : Fast, Secure, Flexible.
Còn ở FVNN được cài đặt tự động khi bạn tạo web site của mình. FVNN hiện tại đang dùng Twig phiên bản 2.0 hỗ trợ tất cả các function/chức năng củ Twig

Sử dụng cơ bản
Trong Twig, chúng ta sẽ sử dụng hai lọai kí hiệu, đó là {% ... %} dùng để thực hiện các câu lệnh như vòng lặp hoặc điều kiện. Kí hiệu tiếp theo đó là {{ ... }} dùng để in ra kết quả của biến hoặc biểu thức ra màn hình.

Variables (Biến)

Twig hỗ trợ việc truy xuất các biến rất đơn giản, chỉ với dấu (.), chúng ta có thể lấy các giá trị của Object hoặc Array.

  1. {{ foo.bar }}
  2. {{ foo['bar'] }}

Trong trường hợp có kí tự đặc biệt, hàm attribute() có thể hỗ trợ chúng ta.

  1. {{ attribute(foo, 'data-foo') }}

Với biến Global, chúng ta có thể sử dụng ở bất kì chỗ nào

_self : tham chiếu đến template hiện tại
_context : tham chiếu đến context hiện tại
_charset : tham chiếu đến charset hiện tại
Nếu cần thì bạn cũng có thể gán giá trị cho biến
  1.  
  2. {% set foo = 'foo' %}
  3. {% set foo = [1, 2] %}
  4. {% set foo = {'foo': 'bar'} %}
  5.  

Filters (Bộ lọc)


Đây là một thứ rất hay của Twig, nó có thể giúp chúng ta tùy biến kết quả được hiển thị.

Number format lọc biến có giá trị number giống với hàm number_format của PHP.
  1.  
  2. {{ 200000|number_format }}
  3.  

Hoặc có thể sắp xếp một mảng ngay tại template.
  1.  
  2. {% for number in numbers|sort %}
  3. {{ number }}
  4. {% endfor %}
  5.  

Tham khảo thêm tại Filters.

Named Arguments

Từ phiên bản 1.12, Twig bắt đầu hỗ trợ named arguments.

  1. {% for i in range(low=1, high=10, step=2) %}
  2. {{ i }},
  3. {% endfor %}

Sử dụng named arguments giúp cho template của bạn rõ ràng hơn khi truyền vào các đối số.

  1. {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }}
  2.  
  3. {# versus #}
  4.  
  5. {{ data|convert_encoding(from='iso-2022-jp', to='UTF-8') }}

Bạn cũng có thể cho phép bạn bỏ qua một số arguments mà bạn không muốn thay đổi giá trị mặc định.

  1. {# the first argument is the date format, which defaults to the global date format if null is passed #}
  2. {{ "now"|date(null, "Europe/Paris") }}
  3.  
  4. {# or skip the format value by using a named argument for the time zone #}
  5. {{ "now"|date(timezone="Europe/Paris") }}

Hoặc sử dụng cả hai kiểu trong một lần gọi

  1. {{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}

Functions (Hàm)

Twig cũng hỗ trợ nhiều function cho chúng ta sử dụng, không hề khác với các ngôn ngữ lập trình nói chung.

Hàm dump() sẽ giúp chúng ta debug đơn giản hơn.

  1. <pre>
  2. {{ dump(user) }}
  3. </pre>

Và rất nhiều hàm khác ở Twig function. Ngoài ra ở FVNN cũng có thệ thống custom function riêng của mình

Control Structure

Các câu lệnh điều khiển trong Twig được sử dụng trong cặp dấu {% ... %}.
  1.  
  2. <h1>Members</h1>
  3. <ul>
  4. {% for user in users %}
  5. <li>{{ user.username|e }}</li>
  6. {% endfor %}
  7. </ul>
  8. {% if users|length > 0 %}
  9. <ul>
  10. {% for user in users %}
  11. <li>{{ user.username|e }}</li>
  12. {% endfor %}
  13. </ul>
  14. {% endif %}
  15.  

Comment (Chú thích trong code)

Tất nhiên là mỗi dòng code chúng ta viết nên có ghi chú để có thể mai kia có thể hiểu được mình đã từng viết gì.
  1.  
  2. {# note: disabled template because we no longer use this
  3. {% for user in users %}
  4. ...
  5. {% endfor %}
  6. #}
  7.  

Macros

Macro có thể được so sánh với functions trong các ngôn ngữ lập trình, nó được dùng để tái sử dụng các đoạn HTML mà tránh sự lặp lại không đáng có. Một macro được định nghĩa qua macro tag.

Ví dụ đơn giản về macro
  1.  
  2. {% macro input(name, value, type, size) %}
  3. <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
  4. {% endmacro %}
  5. Chúng ta cũng có thể thiết lập các giá trị mặc định của tham số trong macro
  6.  
  7. {% macro input(name, value = "", type = "text", size = 20) %}
  8. <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}" />
  9. {% endmacro %}

Để sử dụng Macro thì chỉ cần import vào là xong
  1.  
  2. {% import "forms.html" as forms %}
  3.  
  4. <p>{{ forms.input('username') }}</p>
  5.  

Bạn cũng có thể đổi tên cho macro đó khi import
  1.  
  2. {% from 'forms.html' import input as input_field %}
  3.  
  4. <dl>
  5. <dt>Username</dt>
  6. <dd>{{ input_field('username') }}</dd>
  7. <dt>Password</dt>
  8. <dd>{{ input_field('password', '', 'password') }}</dd>
  9. </dl>
  10.  

Expressions (Biễu thức)

Twig cho phép sử dụng expressions ở bất kì chỗ nào. Nó rất giống với PHP và nếu bạn không biết gì về PHP, bạn vẫn có thể dễ dàng sử dụng nó.
  1.  
  2. {% set greeting = 'Hello ' %}
  3. {% set name = 'Fabien' %}
  4.  
  5. {{ greeting ~ name|lower }} {# Hello fabien #}
  6.  
  7. {# use parenthesis to change precedence #}
  8. {{ (greeting ~ name)|lower }} {# hello fabien #}
  9.  

Mảng và đối tượng cũng có thể lồng vào nhau

  1. {% set foo = [1, {"foo": "bar"}] %}

Biểu thức toán học : +, -, /, %, //, *, **

Biểu thức logic : and, or, not, (expr)

Bạn cũng có thể kiểm tra một chuỗi bắt đầu hoặc kết thúc bằng một chuỗi con nào đó.
  1.  
  2. {% if 'Fabien' starts with 'F' %}
  3. {% endif %}
  4.  
  5. {% if 'Fabien' ends with 'n' %}
  6. {% endif %}
  7.  

Hoặc sử dụng biểu thức chính quy để đơn giản hóa
  1.  
  2. {% if phone matches '/^[\\d\\.]+$/' %}
  3. {% endif %}
  4.  

Toán tử Containment sẽ trả về true nếu toán hạng bên trái nằm trong đối tượng bên phải
  1.  
  2. {# returns true #}
  3.  
  4. {{ 1 in [1, 2, 3] }}
  5.  
  6. {{ 'cd' in 'abcde' }}
  7.  

Toán tử Test có thể sử dụng như một sự kiểm tra các biến
  1.  
  2. {% if post.status is not constant('Post::PUBLISHED') %}
  3.  
  4. {# is equivalent to #}
  5. {% if not (post.status is constant('Post::PUBLISHED')) %}

Và có một vài toán tử khác, ví dụ như

  1. {{ foo ? 'yes' : 'no' }}
  2.  
  3. {# as of Twig 1.12.0 #}
  4. {{ foo ?: 'no' }} is the same as {{ foo ? foo : 'no' }}
  5. {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}
  6.  

Template

Nếu đã dùng Blade của Laravel thì bạn sẽ không lạ gì với các chức năng này. Twig hỗ trợ include các template khác

  1. {{ include('_head') }}

Sẽ đơn giản hơn nếu bạn kế thừa các template khác khi phát triển sản phầm
  1.  
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. {% block head %}
  6. <link rel="stylesheet" href="style.css" />
  7. <title>{% block title %}{% endblock %} - My Webpage</title>
  8. {% endblock %}
  9. </head>
  10. <body>
  11. <div id="content">{% block content %}{% endblock %}</div>
  12. <div id="footer">
  13. {% block footer %}
  14. © Copyright 2011 by <a href="https://domain.invalid/">you</a>.
  15. {% endblock %}
  16. </div>
  17. </body>
  18. </html>
  19.  

Có thể sử dụng lại nội dung từ các template cha nếu có nhu cầu.
  1.  
  2. {% block sidebar %}
  3. <h3>Table
  4. Of Contents</h3>
  5. ...
  6. {{ parent() }}
  7. {% endblock %}
  8.  

Twig cũng chỉ là một sản phẩm và tất nhiên sẽ có cả ưu và nhược điểm. Tuy nhiên chúng ta vẫn nên sử dụng để đơn giản hóa công việc khi phải thao tác với template. Và nếu có thể thì hãy đóng góp để Twig ngày một hoàn thiện hơn ^^.

Tài liệu tham khảo

https://twig.sensiolabs.org/documentation
Nguồn: Viblo

19/07/2019 ,20:45

Lượt Xem: 926

© Phát Triển Bởi Tất Cả Thành Viên - FVNN.MOBI