From 7b84ddb758bed57f12079408607599995c1d6308 Mon Sep 17 00:00:00 2001 From: Phan Xuan Dung Date: Wed, 13 Mar 2019 16:41:59 +0700 Subject: [PATCH] general update, add structure-modules.md --- docs/guide-vi/README.md | 41 +++-- docs/guide-vi/intro-upgrade-from-v1.md | 2 +- docs/guide-vi/structure-models.md | 16 +- docs/guide-vi/structure-modules.md | 322 +++++++++++++++++++++++++++++++++ docs/guide-vi/structure-views.md | 96 +++++----- 5 files changed, 401 insertions(+), 76 deletions(-) create mode 100644 docs/guide-vi/structure-modules.md diff --git a/docs/guide-vi/README.md b/docs/guide-vi/README.md index 954213c..0524c90 100644 --- a/docs/guide-vi/README.md +++ b/docs/guide-vi/README.md @@ -18,6 +18,7 @@ Giới thiệu Bắt đầu --------------- +* [Những gì bạn cần biết](start-prerequisites.md) * [Cài đặt Yii](start-installation.md) * [Thực hiện chạy ứng dụng](start-workflow.md) * [Viết chương trình đầu tiên](start-hello.md) @@ -78,10 +79,10 @@ Làm việc với Databases * [Query Builder](db-query-builder.md): Sử dụng một truy vấn đơn giản, các lớp cơ sở dữ liệu trừu tượng * [Active Record](db-active-record.md): The Active Record ORM, truy vấn và thao tác với dữ liệu, định nghĩa các mối quan hệ giữa các bảng * [Migrations](db-migrations.md): Cung cấp cho đội dự án một công cụ dễ dàng trong việc quản lý những schema CSDL trong ứng dụng -* **TBD** [Sphinx](db-sphinx.md) -* **TBD** [Redis](db-redis.md) -* **TBD** [MongoDB](db-mongodb.md) -* **TBD** [ElasticSearch](db-elasticsearch.md) +* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide) +* [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide) +* [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide) +* [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide) Nhận dữ liệu từ user @@ -92,6 +93,7 @@ Nhận dữ liệu từ user * [File Upload](input-file-upload.md) * [Thu thập dữ liệu từ danh sách đầu vào (Đang phát triển)](input-tabular-input.md) * [Lấy dữ liệu cho nhiều Models (Chưa giải quyết)](input-multiple-models.md) +* [Mở rộng ActiveForm ở phía Máy khách](input-form-javascript.md) Hiển thị dữ liệu @@ -112,7 +114,7 @@ Bảo mật (Security) * [Xác thực (Authentication)](security-authentication.md) * [Quyền (Authorization)](security-authorization.md) * [Các thao tác xử lý với Passwords (Đang phát triển)](security-passwords.md) -* [Auth Clients](security-auth-clients.md) +* [Auth Clients](https://www.yiiframework.com/extension/yiisoft/yii2-authclient/doc/guide) * [Best Practices](security-best-practices.md) @@ -143,9 +145,9 @@ RESTful Web Services Công cụ phát triển (Development Tools) ----------------- -* [Thanh công cụ gỡ lỗi và sửa lỗi (Debug Toolbar và Debugger)](tool-debugger.md) -* [Sử dụng Gii để tạo code](tool-gii.md) -* **TBD** [Tạo tài liệu về API ](tool-api-doc.md) +* [Thanh công cụ gỡ lỗi và sửa lỗi (Debug Toolbar và Debugger)](https://www.yiiframework.com/extension/yiisoft/yii2-debug/doc/guide) +* [Sử dụng Gii để tạo code](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) +* [Tạo tài liệu về API ](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc) Testing @@ -162,7 +164,7 @@ Testing Chủ đề năng cao -------------- -* [Advanced Application Template](tutorial-advanced-app.md) +* [Advanced Application Template](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) * [Building Application from Scratch](tutorial-start-from-scratch.md) * [Giao diện dòng lệnh (Console Commands)](tutorial-console.md) * [Core Validators](tutorial-core-validators.md) @@ -172,21 +174,22 @@ Chủ đề năng cao * [Shared Hosting Environment](tutorial-shared-hosting.md) * [Template Engines](tutorial-template-engines.md) * [Tích hợp mã nguồn của bên thứ ba (Working with Third-Party Code)](tutorial-yii-integration.md) +* [Dùng Yii như các framework nhỏ](tutorial-yii-as-micro-framework.md) Widgets ------- -* GridView: **TBD** liên kết tới trang demo -* ListView: **TBD** liên kết tới trang demo -* DetailView: **TBD** liên kết tới trang demo -* ActiveForm: **TBD** liên kết tới trang demo -* Pjax: **TBD** liên kết tới trang demo -* Menu: **TBD** liên kết tới trang demo -* LinkPager: **TBD** liên kết tới trang demo -* LinkSorter: **TBD** liên kết tới trang demo -* [Bootstrap Widgets](widget-bootstrap.md) -* [jQuery UI Widgets](widget-jui.md) +* [GridView](https://www.yiiframework.com/doc-2.0/yii-grid-gridview.html) +* [ListView](https://www.yiiframework.com/doc-2.0/yii-widgets-listview.html) +* [DetailView](https://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html) +* [ActiveForm](https://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform) +* [Pjax](https://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html) +* [Menu](https://www.yiiframework.com/doc-2.0/yii-widgets-menu.html) +* [LinkPager](https://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html) +* [LinkSorter](https://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html) +* [Bootstrap Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide) +* [jQuery UI Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide) Helpers diff --git a/docs/guide-vi/intro-upgrade-from-v1.md b/docs/guide-vi/intro-upgrade-from-v1.md index d4bc281..ba16259 100644 --- a/docs/guide-vi/intro-upgrade-from-v1.md +++ b/docs/guide-vi/intro-upgrade-from-v1.md @@ -65,7 +65,7 @@ Object Configuration -------------------- Lớp [[yii\base\BaseObject|BaseObject]] giới thiệu một cách thống nhất để cấu hình các đối tượng. Bất kỳ các lớp con của -lớp [[yii\base\BaseObject|BaseObject]] nên khai báo các hàm hởi tạo (constructor) (nếu cần thiết) theo cách sau để có thể được +lớp [[yii\base\BaseObject|BaseObject]] nên khai báo các hàm khởi tạo (constructor) (nếu cần thiết) theo cách sau để có thể được cấu hình đúng: ```php diff --git a/docs/guide-vi/structure-models.md b/docs/guide-vi/structure-models.md index 9f2921e..3af1aa4 100644 --- a/docs/guide-vi/structure-models.md +++ b/docs/guide-vi/structure-models.md @@ -119,10 +119,10 @@ class ContactForm extends Model public function attributeLabels() { return [ - 'name' => 'Your name', - 'email' => 'Your email address', - 'subject' => 'Subject', - 'body' => 'Content', + 'name' => 'Tên liên hệ', + 'email' => 'Địa chỉ email', + 'subject' => 'Tiêu đề', + 'body' => 'Nội dung', ]; } } @@ -135,10 +135,10 @@ Với ứng dụng cần hỗ trợ đa ngôn ngữ, bạn cần dịch lại nh public function attributeLabels() { return [ - 'name' => \Yii::t('app', 'Your name'), - 'email' => \Yii::t('app', 'Your email address'), - 'subject' => \Yii::t('app', 'Subject'), - 'body' => \Yii::t('app', 'Content'), + 'name' => \Yii::t('app', 'Tên liên hệ'), + 'email' => \Yii::t('app', 'Địa chỉ email'), + 'subject' => \Yii::t('app', 'Tiêu đề'), + 'body' => \Yii::t('app', 'Nội dung'), ]; } ``` diff --git a/docs/guide-vi/structure-modules.md b/docs/guide-vi/structure-modules.md new file mode 100644 index 0000000..28885c2 --- /dev/null +++ b/docs/guide-vi/structure-modules.md @@ -0,0 +1,322 @@ +Modules +======= + +Modules là các đơn vị phần mềm độc lập bao gồm các [models](structure-models.md), [views](structure-views.md), +[controllers](structure-controllers.md), và các thành phần hỗ trợ khác. Người dùng cuối có thể truy cập các controller +của module khi các controller đã được cài đặt trong [application](structure-applications.md). Vì những lý do này, thường được xem là +ứng dụng nhỏ. Modules khác với [applications](structure-applications.md) trong đó các mô-đun không thể tự được triển khai +và phải nằm trong các ứng dụng + + +## Tạo Modules + +Một module được tổ chức dưới dạng như một thư mục được gọi là [[yii\base\Module::basePath|đường dẫn cơ sở]] của module. +Trong thư mục, còn có các thư mục con, như là `controllers`, `models`, `views`, những thư mục này chứa các controllers, +models, views, và các đoạn mã khác, giống như trong một ứng dụng. Ví dụ sau đây cho thấy nội dung trong một module: + +``` +forum/ + Module.php tập tin lớp module + controllers/ chứa các tệp controller + DefaultController.php lớp controller mặc định + models/ chứa các tệp model + views/ chứa các tệp view và layout + layouts/ chứa các tệp layout của view + default/ chứa các file view cho DefaultController + index.php tập tin index cho view +``` + + +### Lớp Module + +Mỗi module nên có một lớp module cơ sở được kế thừa từ lớp [[yii\base\Module]]. Lớp nên được đặt ngay dưới +module [[yii\base\Module::basePath|base path]] và nên được [autoloadable](concept-autoloading.md). +Khi một module đang được truy cập, một phiên bản của lớp module tương ứng sẽ được tạo. +Giống như các [application instances](structure-applications.md), các phiên bản của module được dùng để chia sẽ dữ liệu và các component +cho mã trong các module. + +Ví dụ sau cho thấy lớp module trông như thế nào: + +```php +namespace app\modules\forum; + +class Module extends \yii\base\Module +{ + public function init() + { + parent::init(); + + $this->params['foo'] = 'bar'; + // ... các đoạn mã khởi tạo khác ... + } +} +``` + +Nếu phương thức `init()` có chứa một số đoạn mã khởi tạo cho các thuộc tính module, bạn có thể lưu chúng theo các điều khoản +của mục [cấu hình](concept-configurations.md) và tải chúng theo đoạn mã sau ở phương thức `init()`: + +```php +public function init() +{ + parent::init(); + // khởi tạo module với các cấu hình được tải từ file config.php + \Yii::configure($this, require __DIR__ . '/config.php'); +} +``` + +nơi tập tin cấu hình `config.php` có thể chứa nội dung sau, tương tự như trong +[cấu hình ứng dụng](structure-applications.md#application-configurations). + +```php + [ + // danh sách các cấu hình thành phần + ], + 'params' => [ + // danh sách các parameter + ], +]; +``` + + +### Controller trong Modules + +Khi tạo controllers trong module, các quy ước đặt tên lớp controller theo `controllers` với +không gian tên phụ của không gian tên của lớp module. Điều này cũng có nghĩa là các tệp lớp controller nên được đặt trong +đường dẫn `controllers` nằm trong module [[yii\base\Module::basePath|đường dẫn cơ sở]]. +Ví dụ, để tạo controller `post` nằm trong module `forum` thể hiện trong mục con, bạn nên +khai báo lớp controller như sau: + +```php +namespace app\modules\forum\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + // ... +} +``` + +Bạn có thể tùy chỉnh không gian tên của lớp controller bằng việc cấu hình thuộc tính [[yii\base\Module::controllerNamespace]] +. Trong trường hợp một số controllers nằm ngoài không gian tên, bạn có thể làm cho chúng có thể truy cập bằng cách cấu hình +qua thuộc tính [[yii\base\Module::controllerMap]], tương tự như [điều bạn làm cho ứng dụng](structure-applications.md#controller-map). + + +### Views trong Modules + +Views trong module nên đặt tại đường dẫn là `views` nằm trong module [[yii\base\Module::basePath|base path]]. +Đối với các views được xuất bản bởi controller trong module, chúng nên được đặt trong thư mục `views/ControllerID`, +với `ControllerID` đề cập đến [controller ID](structure-controllers.md#routes). Ví dụ, nếu lớp +controller là `PostController`, thì đường dẫn sẽ là `views/post` nằm trong +[[yii\base\Module::basePath|đường dẫn cơ sở]] của module. + +Một module có thể chỉ định [layout](structure-views.md#layouts) được áp dụng để views được xuất bản qua các controller trong module +. Các layout nên mặc định đặt trong đường dẫn là `views/layouts`, và bạn nên cấu hình +thuộc tính [[yii\base\Module::layout]] để đề cập tới tên của layout. Nếu bạn không cấu hình thuộc tính `layout`, +thì layout trong ứng dụng sẽ được dùng thay thế. + + +### Console commands trong Modules + +Module có thể được khai báo các command, sẽ có sẵn thông qua chế độ [Console](tutorial-console.md). + +Để tiện ích command nhìn thấy các command của bạn, bạn sẽ cần thay đổi thuộc tính [[yii\base\Module::controllerNamespace]] +, khi Yii được thực thi ở chế độ dòng lệnh, và trỏ nó vào không gian tên của các command. + +Một cách để đạt điều trên là kiểm tra các loại instance của ứng dụng Yii trong phương thức `init()` của module: + +```php +public function init() +{ + parent::init(); + if (Yii::$app instanceof \yii\console\Application) { + $this->controllerNamespace = 'app\modules\forum\commands'; + } +} +``` + +Các lệnh của bạn sau đó sẽ có sẵn từ dòng lệnh bằng cách sử dụng route sau: + +``` +yii // +``` + +## Sử dụng Module + +Để sử dụng module trong ứng dụng, chỉ cần cấu hình ứng dụng bằng cách liệt kê các module trong thuộc tính +[[yii\base\Application::modules|modules]] của ứng dụng. Đoạn mã sau đây trong mục +[cấu hình ứng dụng](structure-applications.md#application-configurations) sử dụng từ khóa `forum` module: + +```php +[ + 'modules' => [ + 'forum' => [ + 'class' => 'app\modules\forum\Module', + // ... các cấu hình khác cho module ... + ], + ], +] +``` + +Thuộc tính [[yii\base\Application::modules|modules]] nhận một mảng cấu hình cho các module. Mỗi key của mảng +đại diện cho *định danh module* trong đó xác định duy nhất module trong số tất cả các module trong ứng dụng, và giá trị +tương ứng của mảng là các [cấu hình](concept-configurations.md) cho việc tạo module. + + +### Routes + +Giống như truy cập các controller trong ứng dụng, [routes](structure-controllers.md#routes) được dùng để truy cập tới các +controller trong module. Một route cho controller trong một module phải bắt đầu bằng định danh module theo sau là +[định danh controller](structure-controllers.md#controller-ids) và [định danh action](structure-controllers.md#action-ids). +Ví dụ, nếu một ứng dụng sử dụng module là `forum`, sau đó route +`forum/post/index` sẽ đại diện cho action `index` của controller `post` nằm trong module. Nếu route +chỉ có chứa định danh module, và thuộc tính [[yii\base\Module::defaultRoute]], sẽ mặc định là `default`, +sẽ xác định cho controller/action nào được sử dụng. Điều này có nghĩa là route `forum` sẽ đại diện cho controller `default` +trong module `forum`. + +Các quy tắc quản lý URL cho các module nên được thêm vào trước phương thức [[yii\web\UrlManager::parseRequest()]] được kích hoạt. Có nghĩa là +thực hiện nó trong phương thức `init()` của module sẽ không hoạt động vì module sẽ được khởi tạo khi các routes được xử lý. Vì vậy, các quy tắc +nên được thêm vào ở [giai đoạn bootstrap](structure-extensions.md#bootstrapping-classes). Đây cũng là cách hay để +để nhóm các quy tắc URL của module bằng [[\yii\web\GroupUrlRule]]. + +Trong trường hợp một module được sử dụng để [version API](rest-versioning.md), quy tắc URL của nó nên được thêm trực tiếp vào mục `urlManager` +của cấu hình ứng dụng. + + +### Truy cập vào Module + +Trong một module, bạn có thể cần lấy thông tin instance của [lớp module](#module-classes) do vậy bạn có thể truy cập qua +định danh của module, tham số của module, module components, vv. Bạn có thể làm như vậy bằng cách sử dụng câu lệnh sau: + +```php +$module = MyModuleClass::getInstance(); +``` + +trong đó `MyModuleClass` đề cập đến tên của lớp module mà bạn đang quan tâm. Phương thức `getInstance()` method +sẽ trả về instance được yêu cầu của lớp module. Nếu module không được yêu cầu, phương thức sẽ trả về là +`null`. Lưu ý rằng bạn không muốn tự tạo một instance mới của lớp module vì nó sẽ khác với phiên bản được tạo bởi +Yii để đáp ứng các yêu cầu. + +> Thông tin: Khi phát triển một module, bạn không nên cho rằng module sẽ có định danh cố định. Điều này là do một module + có thể liên kế tới một định danh tùy ý khi được sử dụng trong một ứng dụng hoặc một module khác. Để có một định danh + module, bạn nên sử dụng cách tiếp cận ở trên để lấy một instance của module trước, và nhận thông tin định danh qua + `$module->id`. + +Bạn cũng có thể truy cập vào instance của module bằng các phương pháp sau: + +```php +// lấy module con có định danh là "forum" +$module = \Yii::$app->getModule('forum'); + +// lấy module mà controller đang yêu cầu +$module = \Yii::$app->controller->module; +``` + +Cách tiếp cận đầu tiên chỉ hữu ích khi bạn biết rõ định danh của module, trong khi cách tiếp cận thứ hai +được sử dụng tốt nhất khi bạn biết về các controller đang được yêu cầu. + +Một khi bạn có các instance module, bạn có thể truy cập các tham số và các components đã đăng ký với module. Ví dụ, + +```php +$maxPostCount = $module->params['maxPostCount']; +``` + + +### Tải trước các module + +Một số module có thể cần phải được chạy cho mọi yêu cầu. Module [[yii\debug\Module|debug]] là một ví dụ như vậy. +Để làm được như vậy, liệt kê ra các định danh của modules trong thuộc tính [[yii\base\Application::bootstrap|bootstrap]] của ứng dụng. + +Ví dụ, cấu hình ứng dụng sau đây đảm bảo module `debug` luôn luôn được tải: + +```php +[ + 'bootstrap' => [ + 'debug', + ], + + 'modules' => [ + 'debug' => 'yii\debug\Module', + ], +] +``` + + +## Các module con + +Các module có thể được lồng vào nhau với không giới hạn. Đó là, một module có thể chứa một module khác và module này có thể chứa +một module khác. Chúng tôi gọi module đầu là *module cha mẹ* trong khi module sau gọi là *module con*. Các module con phải được khai báo trong +thuộc tính [[yii\base\Module::modules|modules]] của các module cha mẹ. Ví dụ, + +```php +namespace app\modules\forum; + +class Module extends \yii\base\Module +{ + public function init() + { + parent::init(); + + $this->modules = [ + 'admin' => [ + // bạn nên xem xét sử dụng một không gian tên ngắn hơn ở đây! + 'class' => 'app\modules\forum\modules\admin\Module', + ], + ]; + } +} +``` + +Đối với controller trong các module con, các route của nó nên bao gồm các định danh của các module cha. +Ví dụ, với route `forum/admin/dashboard/index` đại diện cho action `index` của controller`dashboard` +bên trong module `admin` đó là một module con của module`forum`. + +> Thông tin: Phương thức [[yii\base\Module::getModule()|getModule()]] chỉ trả về mô đun con trực tiếp thuộc về nó +. Thuộc tính [[yii\base\Application::loadedModules]] giữ một danh sách các module được tải, bao gồm cả +module trực tiếp và module lồng nhau, được đánh dầu bởi tên class. + +## Truy cập các thành phần từ bên trong các module + +Kể từ phiên bản 2.0.13 modules hỗ trợ [tree traversal](concept-service-locator.md#tree-traversal). Điều này cho phép các nhà phát triển +xây dựng module tham chiếu tới các thành phần (ứng dụng) thông qua service locator nằm trong module. +Điều này có nghĩa là nó được sử dụng `$module->get('db')` hơn là `Yii::$app->get('db')`. +Người dùng module có thể chỉ định thành phần cụ thể được sử dụng cho các module trong trường hợp thành phần (cấu hình) khác +được yêu cầu. + +Ví dụ, xem xét một phần cấu hình ứng dụng này: + +```php +'components' => [ + 'db' => [ + 'tablePrefix' => 'main_', + 'class' => Connection::class, + 'enableQueryCache' => false + ], +], +'modules' => [ + 'mymodule' => [ + 'components' => [ + 'db' => [ + 'tablePrefix' => 'module_', + 'class' => Connection::class + ], + ], + ], +], +``` + +Các bảng cơ sở dữ liệu ứng dụng sẽ có tiền tố là `main_`, trong khi đó các bảng trong module có tiền tố là `module_`. +Lưu ý rằng cấu hình ở trên không được hợp nhất; thành phần modules cho ví dụ trên sẽ có các bộ đệm truy vấn được bật +vì nó là giá trị mặc định. + +## Bài thực hành + +Các module được sử dụng tốt nhất trong các ứng dụng lớn có tính năng có thể được chia thành nhiều nhóm, mỗi bộ bao gồm một tập hợp các +tính năng liên quan chặt chẽ. Mỗi nhóm tính năng như vậy có thể được phát triển dưới dạng một module được phát triển và duy trì bởi +một nhà phát triển hoặc nhóm cụ thể. + +Các module cũng là một cách tốt để sử dụng lại mã ở cấp độ nhóm tính năng. Một số tính năng thường được sử dụng,chẳng hạn như +quản lý người dùng, quản lý bình luận, tất cả đều có thể được phát triển về mặt module để chúng +có thể được tái sử dụng dễ dàng trong các dự án trong tương lai. diff --git a/docs/guide-vi/structure-views.md b/docs/guide-vi/structure-views.md index 3776786..43e2d8e 100644 --- a/docs/guide-vi/structure-views.md +++ b/docs/guide-vi/structure-views.md @@ -544,7 +544,7 @@ Các thành phần View cung cấp các tính năng hữu ích được liệt k * [alternative template engines](tutorial-template-engines.md): cho phép bạn sử dụng các bộ giao diện, chẳng hạn như [Twig](http://twig.sensiolabs.org/), [Smarty](http://www.smarty.net/). -You may also frequently use the following minor yet useful features when you are developing Web pages. +Bạn cũng có thể thường xuyên sử dụng các tính năng nhỏ nhưng hữu ích sau đây khi bạn đang phát triển các trang Web. ### Thiết lập tiêu đề trang @@ -557,7 +557,7 @@ thuộc tính [[yii\web\View::title|title]] cho bạn đẩy thông tin tiêu đ ```php title = 'My page title'; +$this->title = 'Tiêu đề trang'; ?> ``` @@ -570,11 +570,11 @@ Tiếp đến tại layout, hãy chắc chắn rằng bạn đặt đoạn mã s ### Thực hiện đăng ký các thẻ Meta Tags -Web pages usually need to generate various meta tags needed by different parties. Like page titles, meta tags -appear in the `` section and are usually generated in layouts. +Các trang web thường cần tạo các thẻ meta khác nhau cần thiết cho các trang khác nhau. Như các thẻ tiêu đề trang, các thẻ meta +xuất hiện ở mục `` và thường được tạo ở các layouts. -If you want to specify what meta tags to generate in content views, you can call [[yii\web\View::registerMetaTag()]] -in a content view, like the following: +Nếu bạn muốn chỉ định thẻ meta nào sẽ tạo trong trang views, bạn có thể gọi phương thức [[yii\web\View::registerMetaTag()]] +trong nội dung của view, như đoạn sau: ```php registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php' ?> ``` -The above code will register a "keywords" meta tag with the view component. The registered meta tag is -rendered after the layout finishes rendering. The following HTML code will be generated and inserted -at the place where you call [[yii\web\View::head()]] in the layout: +Đoạn mã trên sẽ đăng ký thẻ mata là "keywords" với thành phần của view. Thẻ meta đã đăng ký được hiển thị sau +việc xuất bản layout được xong. Đoạn mã HTML sau sẽ xuất bản và chèn vào vị trí nơi bạn gọi phương thức +[[yii\web\View::head()]] tại layout: ```php -Lưu ý rằng nếu bạn gọi phương thức [[yii\web\View::registerMetaTag()]] multiple times, it will register multiple meta tags, -regardless whether the meta tags are the same or not. +Lưu ý rằng nếu bạn gọi phương thức [[yii\web\View::registerMetaTag()]] nhiều lần, nó sẽ đăng ký nhiều thẻ meta, +cho dù bất kể các thẻ meta có giống nhau hay không. -To make sure there is only a single instance of a meta tag type, you can specify a key as a second parameter when calling the method. -Ví dụ, the following code registers two "description" meta tags. However, only the second one will be rendered. +Để đảm bảo chỉ có một phiên bản duy nhất của loại thẻ meta, bạn có thể chỉ định một khóa làm tham số thứ hai khi gọi phương thức. +Ví dụ, đoạn mã sau sẽ đăng ký 2 thẻ meta là "description". Tuy nhiên, chỉ có thẻ thứ 2 được hiển thị. ```php $this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); @@ -602,11 +602,11 @@ $this->registerMetaTag(['name' => 'description', 'content' => 'This website is a ``` -### Registering Link Tags +### Đăng ký các thẻ liên kết (Link Tags) -Like [meta tags](#registering-meta-tags), link tags are useful in many cases, such as customizing favicon, pointing to -RSS feed or delegating OpenID to another server. You can work with link tags in the similar way as meta tags -by using [[yii\web\View::registerLinkTag()]]. Ví dụ, in a content view, you can register a link tag like follows, +Giống như các [thẻ meta](#registering-meta-tags), các thẻ liên kết rất hữu ích trong nhiều trường hợp, như tùy biến favicon, trỏ đến nguồn cấp dữ liệu RSS hoặc ủy quyền OpenID +cho máy chủ khác. Bạn có thể làm việc với các thẻ liên kết theo cách tương tự như thẻ meta bằng cách sử dụng phương thức [[yii\web\View::registerLinkTag()]]. +Ví dụ, trong trang nội dung view, bạn có thể đăng ký một thẻ liên kết như sau, ```php $this->registerLinkTag([ @@ -617,32 +617,32 @@ $this->registerLinkTag([ ]); ``` -The code above will result in +Đoạn mã trên sẽ ra kết quả như sau ```html ``` -Similar as [[yii\web\View::registerMetaTag()|registerMetaTag()]], you can specify a key when calling -[[yii\web\View::registerLinkTag()|registerLinkTag()]] to avoid generating repeated link tags. +Giống như phương thức [[yii\web\View::registerMetaTag()|registerMetaTag()]], bạn có thể chỉ định từ khóa khi gọi phương thức +[[yii\web\View::registerLinkTag()|registerLinkTag()]] để tránh tạo ra các thẻ liên kết lặp đi lặp lại. ## Sự kiện View -[[yii\base\View|View components]] trigger several events during the view rendering process. You may respond -to these events to inject content into views or process the rendering results before they are sent to end users. +[[thành phần yii\base\View|View]] kích hoạt một số sự kiện trong quá trình xuất bản view. Bạn có thể phản hồi các sự kiện này để đưa nội dung +vào chế độ xem hoặc xử lý kết quả hiển thị trước khi chúng được gửi đến người dùng cuối. -- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: triggered at the beginning of rendering a file - in a controller. Handlers of this event may set [[yii\base\ViewEvent::isValid]] to be `false` to cancel the rendering process. -- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: triggered after rendering a file by the call of [[yii\base\View::afterRender()]]. - Handlers of this event may obtain the rendering result through [[yii\base\ViewEvent::output]] and may modify - this property to change the rendering result. -- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: triggered by the call of [[yii\base\View::beginPage()]] in layouts. -- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: triggered by the call of [[yii\base\View::endPage()]] in layouts. -- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: triggered by the call of [[yii\web\View::beginBody()]] in layouts. -- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: triggered by the call of [[yii\web\View::endBody()]] in layouts. +- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: sự kiện được kích hoạt khi bắt đầu xuất bản file trong + controller. Người xử lý sự kiện này có thể thiết lập [[yii\base\ViewEvent::isValid]] giá trị là `false` để hủy quá trình xuất bản. +- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: được kích hoạt sau khi xuất bản một file bằng việc gọi phương thức [[yii\base\View::afterRender()]]. + Những người xử lý sự kiện này có thể có được kết quả xuất bản thông qua thuộc tính [[yii\base\ViewEvent::output]] và có thể sửa đổi thuộc tính này + để thay đổi kết quả xuất bản. +- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: được kích hoạt khi gọi phương thức [[yii\base\View::beginPage()]] tại layouts. +- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: được kích hoạt khi gọi phương thức [[yii\base\View::endPage()]] tại layouts. +- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: được kích hoạt khi gọi phương thức [[yii\web\View::beginBody()]] tại layouts. +- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: được kích hoạt khi gọi phương thức [[yii\web\View::endBody()]] tại layouts. -Ví dụ, the following code injects the current date at the end of the page body: +Ví dụ, đoạn mã sau sẽ chèn nội dung ngày hiện tại vào cuối trang: ```php \Yii::$app->view->on(View::EVENT_END_BODY, function () { @@ -653,10 +653,10 @@ Ví dụ, the following code injects the current date at the end of the page bod ## Xuất bản các trang tĩnh -Static pages refer to those Web pages whose main content are mostly static without the need of accessing -dynamic data pushed from controllers. +Các trang tĩnh đề cập đến các trang Web có nội dung chính chủ yếu là tĩnh mà không cần truy cập dữ liệu động được đẩy từ các +controller. -You can output static pages by putting their code in the view, and then using the code like the following in a controller: +Bạn có thể hiển thị trang tĩnh bằng cách đặt các đoạn mã vào view, và sử dụng đoạn mã sau ở controller: ```php public function actionAbout() @@ -665,9 +665,9 @@ public function actionAbout() } ``` -If a Web site contains many static pages, it would be very tedious repeating the similar code many times. -To solve this problem, you may introduce a [standalone action](structure-controllers.md#standalone-actions) -called [[yii\web\ViewAction]] in a controller. Ví dụ, +Nếu một trang web chứa nhiều trang tĩnh, nó sẽ không linh hoạt khi sử dụng các đoạn mã nhiều lần. +Để giải quyết vấn đề này, bạn có thể cho vào một [standalone action](structure-controllers.md#standalone-actions) +được gọi là [[yii\web\ViewAction]] trong controller. Ví dụ, ```php namespace app\controllers; @@ -687,16 +687,16 @@ class SiteController extends Controller } ``` -Now if you create a view named `about` under the directory `@app/views/site/pages`, you will be able to -display this view by the following URL: +Bây giờ nếu bạn tạo một view đặt là `about` nằm dưới đường dẫn `@app/views/site/pages`, bạn có thể hiển thị +view này qua URL sau: ``` http://localhost/index.php?r=site%2Fpage&view=about ``` -The `GET` parameter `view` tells [[yii\web\ViewAction]] which view is requested. The action will then look -for this view under the directory `@app/views/site/pages`. You may configure [[yii\web\ViewAction::viewPrefix]] -to change the directory for searching these views. +Tham số `GET` là `view` sẽ gọi đến hành động [[yii\web\ViewAction]] với view được yêu cầu. Hành động sau đó sẽ +tìm kiếm view này trong thư mục `@app/views/site/pages`. Bạn có thể cấu hình [[yii\web\ViewAction::viewPrefix]] +để thay đổi thư mục tìm kiếm các view này. ## Bài thực hành @@ -712,9 +712,9 @@ Các View chịu trách nhiệm trong việc hiển thị dữ liệu từ model Để việc quản lý các view dễ dàng hơn, nên tránh việc tạo các view quá phức tạp hoặc chứa nhiều các mã code dự phòng. Bạn có thể tham khảo các thủ thuật sau để đạt việc quản lý view tốt: -* use [layouts](#layouts) to represent common presentational sections (e.g. page header, footer). -* divide a complicated view into several smaller ones. The smaller views can be rendered and assembled into a bigger - one using the rendering methods that we have described. -* create and use [widgets](structure-widgets.md) as building blocks of views. -* create and use helper classes to transform and format data in views. +* dùng [layouts](#layouts) để hiển thị cho các mục chung (vd. trang header, footer). +* chia các view phức tạp thành các view nhỏ hơn. Các view nhỏ hơn có thể được hiển thị và lắp ráp thành một view lớn hơn +bằng các phương thức xuất bản mà chúng tôi đã mô tả. +* tạo và dùng các [widgets](structure-widgets.md) như việc xây dựng các khối của view. +* tạo vào dung các lớp helper classes để định dạng và chuyển đổi các nội dung trong view.