From 50b7105e8bd0b4016228e83ab088353c062499a0 Mon Sep 17 00:00:00 2001 From: Phan Xuan Dung Date: Fri, 1 Mar 2019 17:39:55 +0700 Subject: [PATCH] Update, add Intro Upgrade from v1 --- docs/guide-vi/intro-upgrade-from-v1.md | 531 +++++++++++++++++++++++++++++++++ docs/guide-vi/structure-models.md | 2 +- docs/guide-vi/structure-views.md | 130 ++++---- 3 files changed, 597 insertions(+), 66 deletions(-) create mode 100644 docs/guide-vi/intro-upgrade-from-v1.md diff --git a/docs/guide-vi/intro-upgrade-from-v1.md b/docs/guide-vi/intro-upgrade-from-v1.md new file mode 100644 index 0000000..d4bc281 --- /dev/null +++ b/docs/guide-vi/intro-upgrade-from-v1.md @@ -0,0 +1,531 @@ +Nâng cấp lên từ phiên bản 1.1 +========================== + +Có nhiều sự khác biệt giữa các phiên bản 1.1 và 2.0 của Yii khi cấu trúc framework được viết lại hoàn toàn cho 2.0. +Do vậy, việc nâng cấp từ phiên bản 1.1 không dễ dàng như việc nâng cấp giữa các phiên bản nhỏ. Trong bản hướng dẫn này, bạn sẽ +thấy sựa khác biệt chính giữa hai phiên bản. + +Nếu bạn chưa sử dụng bản Yii 1.1, bạn có thể bỏ qua phần này một cách an toàn và chuyển trực tiếp qua mục "[Getting started](start-installation.md)". + +Xin lưu ý rằng Yii 2.0 giới thiệu nhiều tính năng mới hơn so với trong phần tóm tắt này. Do vậy chúng tôi khuyến khíc bạn đọc qua toàn bộ bài hướng dẫn +để tìm hiểu sâu hơn về Yii 2.0. Rất có thể là một số tính năng mà trước đây bạn phải phát triển cho chính mình nhưng bây giờ là một phần của mã cốt lõi. + + +Cài đặt +------------ + +Yii 2.0 được tích hợp hoàn toàn với [Composer](https://getcomposer.org/), trình quản lý các gói cho PHP. Việc cài đặt +các gói cốt lõi của framework, cũng như các thư viện, được thực hiện qua Composer. Vui lòng tham khảo mục +[Hướng dẫn cài đặt Yii](start-installation.md) để tìm hiểu việc cài đặt Yii 2.0. Nếu bạn muốn tạo các thư viện +mới, hoặc chuyển các thư viện từ phiên bản 1.1 hiện có của bạn cho tương thích với phiên bản 2.0, thì vui lòng tham khảo +phần [Tạo các thư viện](structure-extensions.md#creating-extensions) của hướng dẫn. + + +Các yêu cầu về PHP +---------------- + +Yii 2.0 yêu cầu PHP 5.4 trở lên, đó là một cải tiến rất lớn so với phiên bản PHP 5.2 được Yii 1.1 yêu cầu. +Như được liệt kê dưới, có nhiều sự khác biệt về cấp độ ngôn ngữ mà bạn nên chú ý. +Dưới đây là tóm tắt về những thay đổi lớn liên quan đến PHP: + +- [Namespaces](http://php.net/manual/en/language.namespaces.php). +- [Hàm ẩn danh (Anonymous functions)](http://php.net/manual/en/functions.anonymous.php). +- Cú pháp khai báo mảng ngắn `[...elements...]` được dùng thay cho cú pháp kiểu `array(...elements...)`. +- Thẻ echo ngắn ` 'MyClass', + 'property1' => 'abc', + 'property2' => 'cde', +], [$param1, $param2]); +``` + +Thông tin chi tiết về cấu hình có thể được tìm thấy trong phần [Cấu hình](concept-configurations.md). + + +Sự kiện (Events) +------ + +Trong Yii 1, các sự kiện đã được tạo bằng cách xác định phương thức `on` (ví dụ, `onBeforeSave`). Trong Yii 2, bây giờ bạn có thể sử dụng bất kỳ tên sự kiện +. Bạn kích hoạt một sự kiện bằng cách gọi phương thức [[yii\base\Component::trigger()|trigger()]]: + +```php +$event = new \yii\base\Event; +$component->trigger($eventName, $event); +``` + +Để đính kèm một trình xử lý vào một sự kiện, hãy sử dụng phương thức [[yii\base\Component::on()|on()]]: + +```php +$component->on($eventName, $handler); +// Để tách trình xử lý, sử dụng: +// $component->off($eventName, $handler); +``` + +Có nhiều cải tiến cho các tính năng sự kiện. Để biết thêm chi tiết, vui lòng tham khảo phần [Sự kiện](concept-events.md). + + +Đường dẫn cho bí danh (Aliases) +------------ + +Yii 2.0 mở rộng việc sử dụng các bí danh đường dẫn cho cả đường dẫn tệp / thư mục và URL. Yii 2.0 hiện cũng yêu cầu một +tên bí danh để bắt đầu bằng ký tự @, để phân biệt các bí danh với các đường dẫn tệp / thư mục thông thường hoặc URL. +Ví dụ, với bí danh `@yii` đề cập đến thư mục cài đặt Yii.Các bí danh đường dẫn được hỗ trợ ở hầu hết các vị trí trong +mã lõi Yii. Ví dụ, [[yii\caching\FileCache::cachePath]] có thể lấy cả bí danh đường dẫn +và đường dẫn thư mục bình thường. + +Một bí danh đường dẫn cũng liên quan chặt chẽ đến một không gian tên lớp. Bạn nên xác định một bí danh đường dẫn cho từng không gian tên gốc, do đó +cho phép bạn sử dụng trình tải tự động lớp Yii mà không cần cấu hình thêm. Ví dụ, vì bí danh `@yii` đề cập đến thư mục cài đặt Yii, +một lớp `yii\web\Request` có thể được tải tự động. Nếu bạn sử dụng thư viện của bên thứ ba, +chẳng hạn như thư viện Zend Framework, bạn có thể định nghĩa một bí danh đường dẫn `@Zend` đề cập đến thư mục cài đặt của framework đó +. Khi bạn đã thực hiện điều đó, Yii cũng sẽ có thể tự động tải bất kỳ lớp nào trong thư viện Zend Framework đó. + +Thông tin thêm về các đường dẫn bí danh có thể được tìm thấy trong phần [Bí danh](concept-aliases.md). + + +Giao diện (Views) +----- + +Thay đổi đáng kể nhất về views trong Yii 2 là biến `$this` trong view không còn đề cập đến +controller và widget hiện tại. Mà, biến `$this` bây giờ được đề cập tới đối tượng *view*, một khái niệm mới được giới thiệu trong phiên bản 2.0. +Đối tượng *view* là loại [[yii\web\View]], nó đại diện cho phần view +của mô hình MVC. Nếu bạn muốn truy cập tới controller hoặc widget trong view, bạn có thể sử dụng cú pháp là `$this->context`. + +Để được xuất bản một phần view trong một view khác, bạn dụng phương thức `$this->render()`, không phải là `$this->renderPartial()`. +Việc gọi `xuất bản` bây giờ phải được lặp lại rõ ràng, như phương thức `render()` sẽ trả về kết quả việc xuất bản, thay vì +trực tiếp hiển thị nó. Ví dụ: + +```php +echo $this->render('_item', ['item' => $item]); +``` + +Bên cạnh việc áp dụng PHP như là ngôn ngữ giao diện chính, Yii 2.0 cũng được trang bị hỗ trợ chính thức cho hai công cụ mẫu giao diện +phổ biến là: Smarty và Twig. Công cụ mẫu của Prado không còn được hỗ trợ. +Để sử dụng các công cụ mẫu này, bạn cần thiết lập cấu hình ứng dụng cho `view` bằng việc thiết lập thuộc tính +[[yii\base\View::$renderers|View::$renderers]]. Vui lòng tham khảo mục [Template Engines](tutorial-template-engines.md) +để biết thêm chi tiết. + + +Dữ liệu (Models) +------ + +Yii 2.0 dùng [[yii\base\Model]] làm model cơ sở, tương tự như `CModel` trong 1.1. +Lớp `CFormModel` đã bị loại bỏ hoàn toàn. Thay vào đó, trong Yii 2 bạn nên kế thừa [[yii\base\Model]] để tạo lớp model mẫu. + +Yii 2.0 giới thiệu một phương thức mới gọi là [[yii\base\Model::scenarios()|scenarios()]] để khai báo các kịch bản (scenarios) được hỗ trợ +, và để chỉ ra kịch bản nào mà một thuộc tính cần được xác nhận, có thể được coi là an toàn hay không, v.v. Ví dụ: + +```php +public function scenarios() +{ + return [ + 'backend' => ['email', 'role'], + 'frontend' => ['email', '!role'], + ]; +} +``` + +Ở trên, hai kịch bản được khai báo là: `backend` và `frontend`. Với kịch bản `backend`, cả 2 thuộc tính +`email` và `role` là thuộc tính an toàn, và có thể được gán dữ liệu an toàn. Còn với kịch bản `frontend`, thuộc tính +`email` có thể được gán dữ liệu an toàn trong khi đó thuộc tính `role` thì không. Cả 2 thuộc tính `email` và `role` nên được xác nhận bằng các quy tắc. + +Phức thức [[yii\base\Model::rules()|rules()]] vẫn được sử dụng để khai báo các quy tắc xác thực. Lưu ý rằng như giới thiệu về phương thức [[yii\base\Model::scenarios()|scenarios()]], +thì việc xác nhận đối tượng `unsafe` không còn được hỗ trợ. + +Trong hầu hết các trường hợp, bạn không cần ghi đè phương thức [[yii\base\Model::scenarios()|scenarios()]] +nếu trong phương thức [[yii\base\Model::rules()|rules()]] chỉ định đầy đủ các kịch bản sẽ tồn tại, và nếu không cần phải khai báo các thuộc tính +` không an toàn`. + +Để tìm hiểu thêm về models, vui lòng tham khảo mục [Models](structure-models.md) để biết thêm chi tiết. + + +Điều khiển (Controllers) +----------- + +Yii 2.0 sử dụng [[yii\web\Controller]] như lớp cơ sở cho controller, tương tự như lớp `CController` trong Yii 1.1. +[[yii\base\Action]] là lớp cơ sở cho các lớp hành động. + +Tác động rõ ràng nhất của những thay đổi này đối với mã của bạn là các action của bộ điều khiển sẽ trả về nội dung +mà bạn muốn xuất bản thay vì hiển thị nó: + +```php +public function actionView($id) +{ + $model = \app\models\Post::findOne($id); + if ($model) { + return $this->render('view', ['model' => $model]); + } else { + throw new \yii\web\NotFoundHttpException; + } +} +``` + +Vui lòng tham khảo mục [Controllers](structure-controllers.md) để biết thêm chi tiết về controllers. + + +Widgets +------- + +Yii 2.0 sử dụng [[yii\base\Widget]] như lớp cơ sở cho các widget, tương tự như `CWidget` trong Yii 1.1. + +Để được hỗ trợ tốt hơn cho framework trong các IDEs, Yii 2.0 giới thiệu một cú pháp mới để sử dụng widgets. Các phương thức tĩnh +[[yii\base\Widget::begin()|begin()]], [[yii\base\Widget::end()|end()]], và [[yii\base\Widget::widget()|widget()]] +đã được giới thiệu, được sử dụng như vậy: + +```php +use yii\widgets\Menu; +use yii\widgets\ActiveForm; + +// Lưu ý rằng bạn phải "echo" kết quả để hiển thị nó +echo Menu::widget(['items' => $items]); + +// Truyền một mảng để khởi tạo các thuộc tính đối tượng +$form = ActiveForm::begin([ + 'options' => ['class' => 'form-horizontal'], + 'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']], +]); +... các form input fields nằm tại đây ... +ActiveForm::end(); +``` + +Vui lòng tham khảo mục [Widgets](structure-widgets.md) để biết thêm thông tin. + + +Themes +------ + +Themes hoạt động hoàn toàn khác nhau trong 2.0. Bây giờ các theme dựa trên cơ chế ánh xạ tới đường dẫn có liên kết tới nguồn +đến đường dẫn file cho theme. Ví dụ, nếu đường dẫn liên kết cho theme là `['/web/views' => '/web/themes/basic']`, tiếp đến +phiên bản cho các file view là `/web/views/site/index.php` sẽ là `/web/themes/basic/site/index.php`. Vì lý do này, các themes +bây giờ có thể được áp dụng vào bất cứ file view, thậm chí một sự kiện được xuất bản bên ngoài của nội dung một controller hoặc một widget. + +Ngoài ra, không còn component`CThemeManager`. Thay vào đó, `theme` bây giờ được cấu hình qua thuộc tính của thành phần `view`. + +Vui lòng tham khảo mục [Theming](output-theming.md) để biết thêm thông tin chi tiết. + + +Ứng dụng Console +-------------------- + +Các ứng dụng Console hiện được tổ chức dưới dạng như controllers, như các ứng dụng Web. Các controller của ứng dụng Console +nên được kế thừa từ [[yii\console\Controller]], tương tự như `CConsoleCommand` trong bản 1.1. + +Để chạy lệnh console, nhập `yii `, với `` là viết tắt cho controller route +(v.d. `sitemap/index`). Các tham số ẩn danh được truyền qua như những tham số tương ứng +trong phương thức hành động của controller, trong khi các đối số được đặt tên được phân tích cú pháp +theo các khai báo trong [[yii\console\Controller::options()]]. + +Yii 2.0 hỗ trợ tự động xuất nội dung của các lệnh trợ giúp từ các khối bình luận. + +Vui lòng tham khảo mục [Console Commands](tutorial-console.md) để biết thêm thông tin chi tiết. + + +I18N +---- + +Yii 2.0 loại bỏ các phần định dạng ngày và phần định dạng số tích hợp có lợi cho [PECL intl PHP module](http://pecl.php.net/package/intl). + +Dịch văn bản bây giờ được thực hiện qua thành phần ứng dụng `i18n`. +Thành phần này quản lý một tập hợp các nguồn văn bản, cho phép bạn sử dụng các nguồn văn bản khác nhau dựa trên các loại văn bản. + +Vui lòng tham khảo mục [Internationalization](tutorial-i18n.md) để biết thêm thông tin chi tiết. + + +Bộ lọc Action +-------------- + +Bộ lọc Action bây giờ được thực hiện thông qua các hành vi (behaviors. Để xác định một cái mới, tùy biến filter, kế thừa tư [[yii\base\ActionFilter]]. +Để dùng các filter, gắn các lớp filter vào controller +như các behavior. Ví dụ, để sử dụng filter [[yii\filters\AccessControl]], bạn sẽ có đoạn mã sau trong controller: + +```php +public function behaviors() +{ + return [ + 'access' => [ + 'class' => 'yii\filters\AccessControl', + 'rules' => [ + ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']], + ], + ], + ]; +} +``` + +Vui lòng tham khảo mục [Filtering](structure-filters.md) để biết thêm thông tin chi tiết. + + +Assets +------ + +Yii 2.0 giới thiệu một khái niệm mới gọi là *asset bundle* thay thế khái niệm gói script được tìm thấy trong Yii 1.1. + +Một asset bundle là bộ tổng hớp các file asset (v.d. JavaScript files, CSS files, image files, vv.) +trong một thư mục. Mỗi asset bundle được đại diện như một class kế thừa từ [[yii\web\AssetBundle]]. +Bằng việc đăng ký một asset bundle qua [[yii\web\AssetBundle::register()]], bạn cho ra các +assets nằm trong bundle có thể được truy cập từ Web. Không giống như trong Yii 1, các trang đăng ký các bundle sẽ tự động +có chứa các tham chiếu đến các file JavaScript và CSS files được quy định trong bundle đó. + +Vui lòng tham khảo mục [Managing Assets](structure-assets.md) để biết thêm thông tin chi tiết. + + +Helpers +------- + +Yii 2.0 giới thiệu thêm nhiều các lớp helper thường được sử dụng, bao gồm. + +* [[yii\helpers\Html]] +* [[yii\helpers\ArrayHelper]] +* [[yii\helpers\StringHelper]] +* [[yii\helpers\FileHelper]] +* [[yii\helpers\Json]] + +Vui lòng tham khảo mục [Helper Overview](helper-overview.md) để biết thêm thông tin chi tiết. + +Forms +----- + +Yii 2.0 giới thiệu khái niệm *field* cho việc xây dựng form sử dụng [[yii\widgets\ActiveForm]]. Một field +bao gồm chứa một label, một input, một văn bản báo lỗi (error message), và/hoặc một trợ giúp văn bản (hint text). +Một field được đại diện như một đối tượng [[yii\widgets\ActiveField|ActiveField]]. +Để sử dụng các field, bạn có thể xây dựng một form gọn gàng hơn trước đây: + +```php + + field($model, 'username') ?> + field($model, 'password')->passwordInput() ?> +
+ +
+ +``` + +Vui lòng tham khảo mục [Creating Forms](input-forms.md) để biết thêm thông tin chi tiết. + + +Xây dựng các truy vấn (Query Builder) +------------- + +Trong 1.1, xây dựng truy vấn nằm rải rác trong một số lớp, bao gồm lớp `CDbCommand`, +`CDbCriteria`, và `CDbCommandBuilder`. Yii 2.0 đại diện cho các truy vấn CSDL nằm trong các khoản của đối tượng [[yii\db\Query|Query]] +có thể chuyển qua các lệnh SQL với sự giúp đỡ của đối tượng [[yii\db\QueryBuilder|QueryBuilder]] đàng sau. +Ví dụ: + +```php +$query = new \yii\db\Query(); +$query->select('id, name') + ->from('user') + ->limit(10); + +$command = $query->createCommand(); +$sql = $command->sql; +$rows = $command->queryAll(); +``` + +Cách tốt nhất, việc xây dựng các truy vấn có thể được dùng khi làm việc với [Active Record](db-active-record.md). + +Vui lòng tham khảo mục [Query Builder](db-query-builder.md) để biết thêm thông tin chi tiết. + + +Active Record +------------- + +Yii 2.0 giới thiệu rất nhiều thay đổi về [Active Record](db-active-record.md). The two most obvious ones involve +query building và relational query handling. + +Lớp `CDbCriteria` trong bản 1.1 được thay thế bởi lớp [[yii\db\ActiveQuery]] trong Yii 2. Lớp này được kế thừa tư [[yii\db\Query]], và đồng thời +kế thừa tất cả các phương thức xây dựng câu truy vấn. Bạn có thể thử gọi phương thức [[yii\db\ActiveRecord::find()]] để xây dựng câu truy vấn: + +```php +// để nhận tất cả các danh sách khách hàng có điều kiện được *active* và sắp xếp theo thứ tự ID: +$customers = Customer::find() + ->where(['status' => $active]) + ->orderBy('id') + ->all(); +``` + +Để khai bao một quan hệ (relation), cách đơn giản là khai báo một phương thức getter có trả về đối tượng [[yii\db\ActiveQuery|ActiveQuery]]. +Tên thuộc tính được xác định bởi getter đại diện cho tên quan hệ. Ví dụ, đoạn code sau khai báo một quan hệ +là `orders` (trong 1.1, bạn sẽ phải khai báo quan hệ ở vị trí nằm giữa phương thức `relations()`): + +```php +class Customer extends \yii\db\ActiveRecord +{ + public function getOrders() + { + return $this->hasMany('Order', ['customer_id' => 'id']); + } +} +``` + +Bây giờ bạn dùng `$customer->orders` để truy cập các orders trong khách hàng từ bảng quan hệ. Bạn có thể dùng đoạn mã sau +để thực hiện truy vấn quan hệ nhanh chóng với điều kiện truy vấn tùy chỉnh:: + +```php +$orders = $customer->getOrders()->andWhere('status=1')->all(); +``` + +When eager loading a relation, Yii 2.0 does it differently from 1.1. In particular, in 1.1 a JOIN query +would be created to select both the primary and the relational records. In Yii 2.0, two SQL statements are executed +without using JOIN: the first statement brings back the primary records and the second brings back the relational +records by filtering with the primary keys of the primary records. + +Instead of returning [[yii\db\ActiveRecord|ActiveRecord]] objects, you may chain the [[yii\db\ActiveQuery::asArray()|asArray()]] +method when building a query to return a large number of records. This will cause the query result to be returned +as arrays, which can significantly reduce the needed CPU time and memory if large number of records . Ví dụ: + +```php +$customers = Customer::find()->asArray()->all(); +``` + +Một thay đổi khác là bạn không thể khai báo các giá trị mặc định thuộc tính thông qua các thuộc tính công khai nữa. +Nếu bạn cần những thứ đó, bạn nên đặt chúng trong phương thức init của lớp bản ghi của bạn. + +```php +public function init() +{ + parent::init(); + $this->status = self::STATUS_NEW; +} +``` + +Có một số vấn đề với việc ghi đè hàm tạo của lớp ActiveRecord trong 1.1. Các vấn đề này không còn xuất hiện trong bản +2.0 nữa. Lưu ý rằng khi thêm tham số vào hàm tạo, bạn có thể phải ghi đè [[yii\db\ActiveRecord::instantiate()]]. + +Có nhiều thay đổi và cải tiến khác đối với Active Record. Vui lòng tham khảo mục +[Active Record](db-active-record.md) để biết thêm thông tin chi tiết. + + +Các hành vi trong Active Record +----------------------- + +Trong 2.0, chúng tôi đã lược bỏ lớp lớp base của hành vi `CActiveRecordBehavior`. Nếu bạn muốn tạo một hành vi cho Active Record, +bạn cần được kế thừa trực tiếp từ lớp `yii\base\Behavior`. Nếu trong lớp hành vi cần được phản hồi một số sự kiện của lớp cha, bạn +cần ghi đề phương thức `events()` như sau: + +```php +namespace app\components; + +use yii\db\ActiveRecord; +use yii\base\Behavior; + +class MyBehavior extends Behavior +{ + // ... + + public function events() + { + return [ + ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate', + ]; + } + + public function beforeValidate($event) + { + // ... + } +} +``` + + +User và IdentityInterface +-------------------------- + +Lớp `CWebUser` trong 1.1 bây giời được thay thế bởi [[yii\web\User]], và không còn hỗ trợ lớp +`CUserIdentity` nữa. Thay vì đó, bạn nên hiện thực lớp [[yii\web\IdentityInterface]] để được sử dụng được đơn giản hơn. +Trong mẫu dự án advanced có tích hợp một vài ví dụ như vậy . + +Vui lòng tham khảo mục [Authentication](security-authentication.md), [Authorization](security-authorization.md), và [Mẫu dự án Advanced](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) để biết thêm thông tin chi tiết. + + +Quản lý các URL +-------------- + +Quản lý các URL trong Yii 2 tương tự như trong 1.1. Một cải tiến lớn cho việc quản lý các URL bây giờ hỗ trợ tùy chọn các +tham số. Ví dụ, nếu bạn có một quy tắc (rule) được khai báo như sau, tiếp sau đó quy tắc này phù hợp với cả hai +`post/popular` và `post/1/popular`. Trong 1.1, bạn sẽ phải sử dụng hai quy tắc để đạt được cùng một mục tiêu. + +```php +[ + 'pattern' => 'post//', + 'route' => 'post/index', + 'defaults' => ['page' => 1], +] +``` + +Vui lòng tham khảo mục [Url manager docs](runtime-routing.md) để biết thêm thông tin chi tiết. + +Một thay đổi quan trọng trong quy ước đặt tên cho các routes và tên camel case của controllers +và actions hiện được chuyển đổi thành ký tự thấp mỗi từ được phân tách bằng một gạch ngang, bd. định danh cho controller +`CamelCaseController` sẽ là `camel-case`. +Xem thêm ở mục [định danh controller](structure-controllers.md#controller-ids) và [định danh action](structure-controllers.md#action-ids) để biết thêm thông tin. + + +Dùng Yii 1.1 và 2.x cùng với nhau +------------------------------ + +Nếu bạn có các đoạn mã Yii 1.1 trước đây mà bạn muốn sử dụng cùng với Yii 2.0, vui lòng tham khảo mục +[Using Yii 1.1 and 2.0 Together](tutorial-yii-integration.md#using-both-yii2-yii1). + diff --git a/docs/guide-vi/structure-models.md b/docs/guide-vi/structure-models.md index 34ec181..ecf914e 100644 --- a/docs/guide-vi/structure-models.md +++ b/docs/guide-vi/structure-models.md @@ -521,7 +521,7 @@ bạn có thể được thực hiện các chiến lược sau: ta định nghĩa lớp khung model bằng việc kế thừa từ lớp model cơ sở. Lớp khung model này có thể chứa các quy tắc logic được mô tả cụ thể chi ứng dụng hoặc module này. -Ví dụ, với [Mẫu Dự án Advanced](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md), bạn có thể định nghĩa lớp cơ sở model +Ví dụ, với [Mẫu dự án Advanced](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md), bạn có thể định nghĩa lớp cơ sở model là `common\models\Post`. Tiếp đến tại ứng dụng front end, bạn định nghĩa lớp khung là `frontend\models\Post` lớp này kế thừa từ lớp `common\models\Post`. Và tương tự cho ứng dụng back end, bạn định nghĩa model `backend\models\Post`. Với cách giải quyết này, bạn sẽ chắc chắn rằng mã của bạn tại model `frontend\models\Post` diff --git a/docs/guide-vi/structure-views.md b/docs/guide-vi/structure-views.md index 1cacd6f..5c78793 100644 --- a/docs/guide-vi/structure-views.md +++ b/docs/guide-vi/structure-views.md @@ -406,67 +406,67 @@ class PostController extends Controller Với controller thuộc trong module, bạn có thể thiết lập thuộc tính [[yii\base\Module::layout|layout]] trong module để thiết lập layout cụ thể cho những controller. -Because the `layout` property may be configured at different levels (controllers, modules, application), -behind the scene Yii takes two steps to determine what is the actual layout file being used for a particular controller. +Bởi vì thuộc tính `layout` có thể đã thiết lập ở những vị trí khác như (controllers, modules, application), +phía nền Yii cũng thực hiện 2 bước để xác định rằnglayout file sẽ được dùng vào controller cụ thể. -In the first step, it determines the layout value and the context module: +Tại bước đầu tiên, Yii xác định giá trị layout và context module: -- If the [[yii\base\Controller::layout]] property of the controller is not `null`, use it as the layout value and - the [[yii\base\Controller::module|module]] of the controller as the context module. -- If the [[yii\base\Controller::layout]] property of the controller is `null`, search through all ancestor modules (including the application itself) of the controller and - find the first module whose [[yii\base\Module::layout|layout]] property is not `null`. Use that module and - its [[yii\base\Module::layout|layout]] value as the context module and the chosen layout value. - If such a module cannot be found, it means no layout will be applied. +- Nếu thuộc tính [[yii\base\Controller::layout]] tại controller có giá trị khác `null`, sẽ dùng nó như giá trị layout và + thuộc tính [[yii\base\Controller::module|module]] của controller như là một context module. +- Nếu thuộc tính [[yii\base\Controller::layout]] của controller có giá trị là `null`, tìm kiếm tất cả trong các modules liên quan (bao gồm bên trong ứng dụng) của controller và + tìm kiếm module đầu tiên mà có thuộc tính [[yii\base\Module::layout|layout]] có giá trị khác `null`. Sử dụng nó như module và + giá trị [[yii\base\Module::layout|layout]] như một context module và chọn lấy giá trị layout. + Nếu một trong những module không được tìm thấy, đồng nghĩa với việc không có layout nào được chọn. -In the second step, it determines the actual layout file according to the layout value and the context module -determined in the first step. The layout value can be: +Tại bước tiếp theo, nó xác định file layout được dùng dựa vào giá trị layout và context module +được xác định ở bước. Giá trị layout có thể là: -- a path alias (e.g. `@app/views/layouts/main`). -- an absolute path (e.g. `/main`): the layout value starts with a slash. The actual layout file will be - looked for under the application's [[yii\base\Application::layoutPath|layout path]] which defaults to +- một đường dẫn bí danh (vd. `@app/views/layouts/main`). +- một đường dẫn tuyệt đối (vd. `/main`): giá trị layout bắt đầu với dấu gách chéo. thì file layout thực tế sẽ được tìm + dưới đường dẫn của ứng dụng [[yii\base\Application::layoutPath|layout path]] có mặc định là `@app/views/layouts`. -- a relative path (e.g. `main`): the actual layout file will be looked for under the context module's - [[yii\base\Module::layoutPath|layout path]] which defaults to the `views/layouts` directory under the +- một đường dẫn tương đối (vd. `main`): thì file layout được tìm dưới các context module's + [[yii\base\Module::layoutPath|layout path]] có mặc định ở đường dẫn `views/layouts` dưới đường dẫn module [[yii\base\Module::basePath|module directory]]. -- the boolean value `false`: no layout will be applied. +- giá trị là `false`: không có layout nào được áp dụng. -If the layout value does not contain a file extension, it will use the default one `.php`. +Nếu tên layout không có chứa thông tin phần mở rộng tệp, thì Yii sử dụng đuôi mở rộng là `.php`. -### Nested Layouts +### Layout lồng nhau -Sometimes you may want to nest one layout in another. Ví dụ, in different sections of a Web site, you -want to use different layouts, while all these layouts share the same basic layout that generates the overall -HTML5 page structure. You can achieve this goal by calling [[yii\base\View::beginContent()|beginContent()]] and -[[yii\base\View::endContent()|endContent()]] in the child layouts like the following: +Đôi lúc bạn muốn nhúng layout vào layout khác. Ví dụ, tại những mục khác nhau của Web site, bạn muốn +sử dụng những layout khác, trong khi tất cả các layouts chia sẽ với layout chung được sinh bởi hầu hết các trang +HTML5. Bạn có thể kết hợp các layout bằng việc gọi phương thức [[yii\base\View::beginContent()|beginContent()]] và +[[yii\base\View::endContent()|endContent()]] tại những layout con như sau: ```php beginContent('@app/views/layouts/base.php'); ?> -...child layout content here... +...nội dung layout con nằm trong đây... endContent(); ?> ``` -As shown above, the child layout content should be enclosed within [[yii\base\View::beginContent()|beginContent()]] and -[[yii\base\View::endContent()|endContent()]]. The parameter passed to [[yii\base\View::beginContent()|beginContent()]] -specifies what is the parent layout. It can be either a layout file or alias. +Như mô tả trên, nội dung layout nên được nằm trong phương thức [[yii\base\View::beginContent()|beginContent()]] và phương thức +[[yii\base\View::endContent()|endContent()]]. Các tham số được gán vào phương thức [[yii\base\View::beginContent()|beginContent()]] +có chỉ định các thông tin của layout cha. Nó có thể dùng cả các file layout hoặc alias. -Using the above approach, you can nest layouts in more than one levels. +Việc sử dụng phương pháp trên, bạn có thể lồng các layout theo nhiều cấp độ. -### Using Blocks +### Sử dụng các khối(Block) -Blocks allow you to specify the view content in one place while displaying it in another. They are often used together -with layouts. Ví dụ, you can define a block in a content view and display it in the layout. +Các khối cho phép bạn xác định các nội dung ở view tại một vị trí khi muốn hiển thị khối đó tại nơi khác trong view. Chúng thường được dùng với +các layout. Ví dụ, bạn có thể định nghĩa các khối ở nội dung view và hiển thị nó vào layout. -You call [[yii\base\View::beginBlock()|beginBlock()]] and [[yii\base\View::endBlock()|endBlock()]] to define a block. -The block can then be accessed via `$view->blocks[$blockID]`, where `$blockID` stands for a unique ID that you assign -to the block when defining it. +Khi gọi các phương thức [[yii\base\View::beginBlock()|beginBlock()]] và [[yii\base\View::endBlock()|endBlock()]] để định nghĩa các khối. +Khối được truy cập qua phương thức `$view->blocks[$blockID]`, với `$blockID` là một định danh ID duy nhất mà bạn gán +vào khối khi định nghĩa khối đó. -The following example shows how you can use blocks to customize specific parts of a layout in a content view. +Ví dụ sau sẽ chỉ cho bạn các để sử dụng các khối để tùy biến các phần của layout tại nội dung view. -First, in a content view, define one or multiple blocks: +Đầu tiên, tại trang nội dung của view, ta định nghĩa một hoặc nhiều khối: ```php ... @@ -486,15 +486,15 @@ First, in a content view, define one or multiple blocks: endBlock(); ?> ``` -Then, in the layout view, render the blocks if they are available, or display some default content if a block is -not defined. +Tiếp đến, tại giao diện layout, sẽ xuất bản các khối nếu khối này có nội dung, còn không sẽ hiển thị các nội dung mặc định của khối nếu +các khối không được định nghĩa. ```php ... blocks['block1'])): ?> blocks['block1'] ?> - ... default content for block1 ... + ... nội dung mặc định cho khối block1 ... ... @@ -502,7 +502,7 @@ not defined. blocks['block2'])): ?> blocks['block2'] ?> - ... default content for block2 ... + ... nội dung mặc định cho khối block2 ... ... @@ -510,7 +510,7 @@ not defined. blocks['block3'])): ?> blocks['block3'] ?> - ... default content for block3 ... + ... nội dung mặc định cho khối block3 ... ... ``` @@ -518,10 +518,10 @@ not defined. ## Sử dụng các thành phần View -[[yii\base\View|View components]] provides many view-related features. While you can get view components +[[yii\base\View|View components]] cung cấp nhiều tính năng cho phần giao diện. While you can get view components by creating individual instances of [[yii\base\View]] or its child class, in most cases you will mainly use -the `view` application component. You can configure this component in [application configurations](structure-applications.md#application-configurations) -like the following: +the `view` application component. Bạn có thể cấu hình các component trong mục [application configurations](structure-applications.md#application-configurations) +như sau: ```php [ @@ -535,25 +535,25 @@ like the following: ] ``` -View components provide the following useful view-related features, each described in more details in a separate section: +Các thành phần View cung cấp các tính năng hữu ích được liệt kê dưới, mỗi mô tả có trong các trang chi tiết: -* [theming](output-theming.md): allows you to develop and change the theme for your Web site. -* [fragment caching](caching-fragment.md): allows you to cache a fragment within a Web page. -* [client script handling](output-client-scripts.md): supports CSS and JavaScript registration and rendering. -* [asset bundle handling](structure-assets.md): supports registering and rendering of [asset bundles](structure-assets.md). -* [alternative template engines](tutorial-template-engines.md): allows you to use other template engines, such as +* [theming](output-theming.md): cho phép bạn xây dựng và thay đổi theme cho các trang Web. +* [fragment caching](caching-fragment.md): cho phép bạn xử lý cache các fragment trong các trang Web. +* [client script handling](output-client-scripts.md): hỗ trợ đăng ký vào xuất bản các nội dung về CSS và JavaScript. +* [asset bundle handling](structure-assets.md): hỗ trợ việc đăng ký và xuất bản các [asset bundles](structure-assets.md). +* [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. -### Setting Page Titles +### Thiết lập tiêu đề trang -Every Web page should have a title. Normally the title tag is being displayed in a [layout](#layouts). However, in practice -the title is often determined in content views rather than layouts. To solve this problem, [[yii\web\View]] provides -the [[yii\web\View::title|title]] property for you to pass the title information from content views to layouts. +Tại mỗi trang Web cần có các tiêu đề. Thông thường các thẻ tiêu đề được hiển hị trong các [layout](#layouts). Tuy nhiên, trong bài thực hành này +các tiêu đề thường được xác định tại trang nội dung của view hơn là xác định tại các layout. Để làm được việc này, lớp [[yii\web\View]] cung cấp +thuộc tính [[yii\web\View::title|title]] cho bạn đẩy thông tin tiêu đề từ nội dung view qua các layout. -To make use of this feature, in each content view, you can set the page title like the following: +Để thực hiện tính năng này, tại mỗi trang nội dung của view, bạn có thể thiết lập tiêu đề trang như sau: ```php title = 'My page title'; ?> ``` -Then in the layout, make sure you have the following code in the `` section: +Tiếp đến tại layout, hãy chắc chắn rằng bạn đặt đoạn mã sau vào mục ``: ```php <?= Html::encode($this->title) ?> ``` -### Registering Meta Tags +### 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. @@ -701,16 +701,16 @@ to change the directory for searching these views. ## Bài thực hành -Views are responsible for presenting models in the format that end users desire. In general, views +Các View chịu trách nhiệm trong việc hiển thị dữ liệu từ model tới người dùng. Trong các trường hợp, view thường -* should mainly contain presentational code, such as HTML, and simple PHP code to traverse, format and render data. -* should not contain code that performs DB queries. Such code should be done in models. -* should avoid direct access to request data, such as `$_GET`, `$_POST`. This belongs to controllers. - If request data is needed, they should be pushed into views by controllers. -* may read model properties, but should not modify them. +* nên chứa các mã code hiển thị, như HTML, và các câu lệnh PHP đơn giản để xử lý, định dạng và xuất bản dữ liệu. +* không nên chứa các mã code có chứa các câu lệnh truy vấn vào CSDL. Những câu lệnh này nên đặt trong các model. +* nên tranh các câu lệnh điều hướng yêu cầu dữ liệu, như `$_GET`, `$_POST`. Các lệnh này nên xử lý ở các controller. + Nếu cấn lấy dữ liệu, chúng nên được đẩy vào view qua controller. +* nên có đọc các thuộc tính của model, nhưng không được sửa nội dung trong đó. -To make views more manageable, avoid creating views that are too complex or contain too much redundant code. -You may use the following techniques to achieve this goal: +Để 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