Tom Worster
9 years ago
1086 changed files with 68889 additions and 34404 deletions
@ -1,63 +0,0 @@ |
|||||||
Widgets de Bootstrap |
|
||||||
==================== |
|
||||||
|
|
||||||
> Nota: Esta sección está bajo desarrollo. |
|
||||||
|
|
||||||
Yii incluye soporta las marcas y componentes del framework [Bootstrap 3](http://getbootstrap.com/) (también conocido como "Twitter Bootstrap"). Bootstrap es un excelente, adaptable framework que puede aumentar la velocidad de desarrollo de los procesos del lado del cliente. |
|
||||||
|
|
||||||
El núcleo de Bootstrap está representado en dos partes: |
|
||||||
|
|
||||||
- Elementos básicos de CSS, como son un sistema de diseño en formato cuadrícula , tipografía, clases de ayuda (helpers), y utilidades adaptables(responsive). |
|
||||||
|
|
||||||
- Componentes preparados para su uso, tales como formularios, menús, paginación, cajas modales, pestañas, etc |
|
||||||
|
|
||||||
Elementos básicos |
|
||||||
----------------- |
|
||||||
|
|
||||||
Yii no hace uso de elementos básicos de boostrap en el código PHP ya que HTML es muy simple por sí mismo, en este caso. Puedes encontrar detalle del uso de estos elementos básicos en [sitio web de la documentación de bootstrap](http://getbootstrap.com/css/). Aún así Yii provee una manera conveniente de incluir los elementos básicos de los recursos de bootstrap en tus páginas con una simple línea añadida a `AppAsset.php` localizada en tu directorio `@app/assets` : |
|
||||||
|
|
||||||
```php |
|
||||||
public $depends = [ |
|
||||||
'yii\web\YiiAsset', |
|
||||||
'yii\bootstrap\BootstrapAsset', // Esta línea |
|
||||||
]; |
|
||||||
``` |
|
||||||
|
|
||||||
Usar bootstrap a través de el gestor de recursos Yii te permite minimizar estos recursos y combinar con tus propios recursos cuando sea necesario.. |
|
||||||
|
|
||||||
Widgets de Yii |
|
||||||
-------------- |
|
||||||
|
|
||||||
Componentes más complejos de bootstrap components están envueltos dentro de widgets de Yii para permitir una sintaxis más robusta e integrar con las posibilidades y características del framework. Todos los widgets pertenecen al espacio de nombres `\yii\bootstrap` : |
|
||||||
|
|
||||||
- [[yii\bootstrap\ActiveForm|ActiveForm]] |
|
||||||
- [[yii\bootstrap\Alert|Alert]] |
|
||||||
- [[yii\bootstrap\Button|Button]] |
|
||||||
- [[yii\bootstrap\ButtonDropdown|ButtonDropdown]] |
|
||||||
- [[yii\bootstrap\ButtonGroup|ButtonGroup]] |
|
||||||
- [[yii\bootstrap\Carousel|Carousel]] |
|
||||||
- [[yii\bootstrap\Collapse|Collapse]] |
|
||||||
- [[yii\bootstrap\Dropdown|Dropdown]] |
|
||||||
- [[yii\bootstrap\Modal|Modal]] |
|
||||||
- [[yii\bootstrap\Nav|Nav]] |
|
||||||
- [[yii\bootstrap\NavBar|NavBar]] |
|
||||||
- [[yii\bootstrap\Progress|Progress]] |
|
||||||
- [[yii\bootstrap\Tabs|Tabs]] |
|
||||||
|
|
||||||
|
|
||||||
Usando los ficheros .less de Bootstrap directamente |
|
||||||
--------------------------------------------------- |
|
||||||
|
|
||||||
Si quieres incluir el [CSS Bootstrap directamente en tus ficheros less](http://getbootstrap.com/getting-started/#customizing) puedes necesitar desactivar la carga los ficheros css originales de bootstrap. |
|
||||||
Esto lo puedes hacer poniendo la propiedad css de [[yii\bootstrap\BootstrapAsset|BootstrapAsset]] vacía. |
|
||||||
Para esto necesitas configurar el `assetManager` [componente de la aplicación](structure-application-components.md) como sigue: |
|
||||||
|
|
||||||
```php |
|
||||||
'assetManager' => [ |
|
||||||
'bundles' => [ |
|
||||||
'yii\bootstrap\BootstrapAsset' => [ |
|
||||||
'css' => [], |
|
||||||
] |
|
||||||
] |
|
||||||
] |
|
||||||
``` |
|
@ -1,27 +0,0 @@ |
|||||||
Widgets de Jquery UI |
|
||||||
==================== |
|
||||||
|
|
||||||
> Nota: Esta sección está en desarrollo. |
|
||||||
|
|
||||||
Además de lo anterior, Yii incluye soporte para la librería jquery [jQuery UI](http://api.jqueryui.com/). jQuery UI es un probado conjunto de interacciones con el interface de usuario, efectos, widgets, y temas sobre la librería JavaScript de jquery. |
|
||||||
|
|
||||||
widgets de Yii |
|
||||||
-------------- |
|
||||||
|
|
||||||
Los componentes más complejos de jQuery UI están envueltos dentro de los widgets de Yii para permitir una sintaxis más robusta e integralas con las características del framework. Todos los widgets pertenecen al espacio de nombre `\yii\jui` : |
|
||||||
|
|
||||||
- [[yii\jui\Accordion|Accordion]] |
|
||||||
- [[yii\jui\AutoComplete|AutoComplete]] |
|
||||||
- [[yii\jui\DatePicker|DatePicker]] |
|
||||||
- [[yii\jui\Dialog|Dialog]] |
|
||||||
- [[yii\jui\Draggable|Draggable]] |
|
||||||
- [[yii\jui\Droppable|Droppable]] |
|
||||||
- [[yii\jui\Menu|Menu]] |
|
||||||
- [[yii\jui\ProgressBar|ProgressBar]] |
|
||||||
- [[yii\jui\Resizable|Resizable]] |
|
||||||
- [[yii\jui\Selectable|Selectable]] |
|
||||||
- [[yii\jui\Slider|Slider]] |
|
||||||
- [[yii\jui\SliderInput|SliderInput]] |
|
||||||
- [[yii\jui\Sortable|Sortable]] |
|
||||||
- [[yii\jui\Spinner|Spinner]] |
|
||||||
- [[yii\jui\Tabs|Tabs]] |
|
@ -0,0 +1,106 @@ |
|||||||
|
Les Alias |
||||||
|
========= |
||||||
|
Les alias sont utilisés pour représenter des chemins de fichier ou des URLs de sorte que vous n'ayez pas à spécifier des chemins ou des URLs explicitement dans votre projet. Un alias doit commencer par le caractère `@` de façon à le différencier des chemins de fichiers habituels et des URLs. Yii dispose déjà d'un nombre important d'alias prédéfinis. Par exemple, l'alias `@yii` représéente le chemin d'installation du framework Yii; `@web` représente l'URL de base pour l'application web courante. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Définir des alias <span id="defining-aliases"></span> |
||||||
|
----------------- |
||||||
|
|
||||||
|
Vous pouvez définir un alias soit pour un chemin de fichier ou pour une URL en appelant [[Yii::setAlias()]]: |
||||||
|
|
||||||
|
```php |
||||||
|
// un alias pour un chemin de fichier |
||||||
|
Yii::setAlias('@foo', '/path/to/foo'); |
||||||
|
|
||||||
|
// un alias pour une URL |
||||||
|
Yii::setAlias('@bar', 'http://www.example.com'); |
||||||
|
``` |
||||||
|
> Note: le chemin de fichier ou l'URL cible de l'alias *ne* doit *pas* nécessairement référencer un fichier ou une ressource existante. |
||||||
|
|
||||||
|
Etant donné un alias défini, il est possible de faire dériver un nouvel alias (sans appeler la commande [[Yii::setAlias()]]) en ajoutant une barre oblique `/` suivi d'un ou de plusieurs segments de chemin de fichier. Les alias définis via la commande [[Yii::setAlias()]] sont des *alias racines*, les alias qui en dérivent sont des *alias dérivés*. Par example, `@foo` est un alias racine, tandis que `@foo/bar/file.php` est un alias dérivé. |
||||||
|
|
||||||
|
Il est possible de définir une alias en utilisant un autre alias (qu'il soit racine ou dérivé): |
||||||
|
|
||||||
|
```php |
||||||
|
Yii::setAlias('@foobar', '@foo/bar'); |
||||||
|
``` |
||||||
|
|
||||||
|
Les alias racines sont habituellement définit pendant l'étape d'[amorçage](runtime-bootstrapping.md). Vous pouvez par exemple appeler la commande [[Yii::setAlias()]] dans le [script d'entrée](structure-entry-scripts.md). Pour plus de commodité, [Application](structure-applications.md) propose une propriété modifiable appelée `aliases` que vous pouvez définir dans la [configuration](concept-configurations.md) de l'application: |
||||||
|
|
||||||
|
```php |
||||||
|
return [ |
||||||
|
// ... |
||||||
|
'aliases' => [ |
||||||
|
'@foo' => '/chemin/vers/foo', |
||||||
|
'@bar' => 'http://www.example.com', |
||||||
|
], |
||||||
|
]; |
||||||
|
``` |
||||||
|
|
||||||
|
Résolution des alias <span id="resolving-aliases"></span> |
||||||
|
-------------------- |
||||||
|
|
||||||
|
Vous pouvez appeler la méthode [[Yii::getAlias()]] pour obtenir le chemin de fichier ou l'URL qu'un alias représente. La même méthode peut aussi convertir des alias dérivés dans leur chemin de fichier ou URL correspondants: |
||||||
|
|
||||||
|
```php |
||||||
|
echo Yii::getAlias('@foo'); // displays: /path/to/foo |
||||||
|
echo Yii::getAlias('@bar'); // displays: http://www.example.com |
||||||
|
echo Yii::getAlias('@foo/bar/file.php'); // displays: /path/to/foo/bar/file.php |
||||||
|
``` |
||||||
|
|
||||||
|
Le chemin/URL représenté par un alias dérivé est déterminé en renplaçant la partie alias racine avec son chemain/URL correspondant dans l'alias dérivé. |
||||||
|
> Note: La méthode [[Yii::getAlias()]] ne vérifie pas si le chemin/URL obtenu représente un fichier ou une ressource existante. |
||||||
|
|
||||||
|
Un alias racine peut également conctenir des barres obliques `/`. La méthode [[Yii::getAlias()]] est suffisement intelligeante pour déterminer quelle part de l'alias est un alias racine et donc détermine correctement le chemin de fichier ou l'url correspondant: |
||||||
|
|
||||||
|
```php |
||||||
|
Yii::setAlias('@foo', '/chemin/vers/foo'); |
||||||
|
Yii::setAlias('@foo/bar', '/chemin2/bar'); |
||||||
|
Yii::getAlias('@foo/test/file.php'); // affiche /chemin/vers/foo/test/file.php |
||||||
|
Yii::getAlias('@foo/bar/file.php'); // affiche /chemin2/bar/file.php |
||||||
|
``` |
||||||
|
|
||||||
|
Si `@foo/bar` n'est pas défini comme un alias racine, le dernier exemple affichierait `/chemin/vers/foo/bar/file.php`. |
||||||
|
|
||||||
|
|
||||||
|
Utilisation des alias <span id="using-aliases"></span> |
||||||
|
---------------------- |
||||||
|
|
||||||
|
Les alias sont reconnus en de nombreux endroits de Yii sans avoir besoin d'appeler la méthode [[Yii::getAlias()]] pour les convertir en chemin ou URLs. A titre d'exemple, la méthode [[yii\caching\FileCache::cachePath]] accepte aussi bien un chemin de fichier et un alias représentant un chemin de fichier, grâce au préfixe `@` qui permet de différencier le chemin de fichier d'un alias. |
||||||
|
|
||||||
|
```php |
||||||
|
use yii\caching\FileCache; |
||||||
|
|
||||||
|
$cache = new FileCache([ |
||||||
|
'cachePath' => '@runtime/cache', |
||||||
|
]); |
||||||
|
``` |
||||||
|
Merci de porter attention à la documentation de l'API pour vérifier si une propriété ou un paramètre d'une méthode supporte les alias. |
||||||
|
|
||||||
|
|
||||||
|
Alias prédéfinis <span id="predefined-aliases"></span> |
||||||
|
---------------- |
||||||
|
Yii définit une série d'alias pour faciliter le référencement des chemins de fichier et URLs souvent utilisés: |
||||||
|
|
||||||
|
- `@yii`, le répertoire où se situe le fichier `BaseYii.php` (aussi appelé le répertoire framework). |
||||||
|
- `@app`, le [[yii\base\Application::basePath|chemin de base]] de l'application courante. |
||||||
|
- `@runtime`, le [[yii\base\Application::runtimePath|le chemin d'exécution]] de l'application courante. Valeur par défaut: `@app/runtime`. |
||||||
|
- `@webroot`, La répertoire web racine de l'application web courante. It is determined based on the directory |
||||||
|
containing the [entry script](structure-entry-scripts.md). |
||||||
|
- `@web`, l'url de base de l'application courante. Cet alias a la même valeur que la propriété [[yii\web\Request::baseUrl]]. |
||||||
|
- `@vendor`, le [[yii\base\Application::vendorPath|Le répertoire vendor de Composer]]. Valeur par défaut: `@app/vendor`. |
||||||
|
- `@bower`, le répertoire racine qui contient [les paquets bower](http://bower.io/). Valeur par défaut: `@vendor/bower`. |
||||||
|
- `@npm`, le répertoire racine qui contient [les paquets npm](https://www.npmjs.org/). Valeur par défaut: `@vendor/npm`. |
||||||
|
|
||||||
|
L'alias `@yii` est défini quand le fichier `Yii.php`est inclu dans votre [script d'entrée](structure-entry-scripts.md). Le reste des alias sont définit dans le constructeur de l'application au moment ou la [configuration](concept-configurations.md) de cette dernière est appliquée |
||||||
|
|
||||||
|
Alias d'extension <span id="extension-aliases"></span> |
||||||
|
----------------- |
||||||
|
|
||||||
|
Un alias est automatiquement définit pour chaque [extension](structure-extensions.md) installée via Composer. |
||||||
|
Chacun de ces alias est nommé par l'espace de nom (namespace) racine de l'extension tel que déclaré dans son fichier `composer.json`, et chacun pointe sur le répertoire racine du paquet. Par exemple, si vous installez l'extension `yiisoft/yii2-jui`, vous obtiendrez automatiquement un alias `@yii/jui` défini pendant la [phase d'amorçage](runtime-bootstrapping.md), équivalent à |
||||||
|
|
||||||
|
```php |
||||||
|
Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui'); |
||||||
|
``` |
@ -1,6 +0,0 @@ |
|||||||
Elasticsearch |
|
||||||
============= |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
> |
|
||||||
> まだ内容がありません。 |
|
@ -1,6 +0,0 @@ |
|||||||
Mongo DB |
|
||||||
======== |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
> |
|
||||||
> まだ内容がありません。 |
|
@ -1,6 +0,0 @@ |
|||||||
Redis |
|
||||||
===== |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
> |
|
||||||
> まだ内容がありません。 |
|
@ -1,6 +0,0 @@ |
|||||||
Sphinx Search |
|
||||||
============= |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
> |
|
||||||
> まだ内容がありません。 |
|
@ -1,33 +1,76 @@ |
|||||||
複数のモデルを扱う複雑なフォーム |
複数のモデルのデータを取得する |
||||||
================================ |
============================== |
||||||
|
|
||||||
複雑なユーザインタフェイスにおいては、一つのフォームにユーザが入力したデータをデータベースの異なる複数のテーブルに保存しなければならないということが生じ得ます。 |
複雑なデータを扱う場合には、複数の異なるモデルを使用してユーザの入力を収集する必要があることがあり得ます。 |
||||||
Yii のフォームの概念に従うと、単一モデルのフォームと比べても、ほとんど複雑さを加えることなく、そういうフォームを構築することが出来ます。 |
例えば、ユーザのログイン情報は `user` テーブルに保存されているけれども、ユーザのプロファイル情報は `profile` テーブルに保存されているという場合を考えて見ると、ユーザに関して入力されたデータを `User` モデルと `Profile` モデルによって収集しなければならないでしょう。 |
||||||
|
Yii のモデルとフォームのサポートを使えば、単一のモデルを扱うのとそれほど違いのない方法によってこの問題を解決することが出来ます。 |
||||||
|
|
||||||
単一モデルの場合と同じように、サーバ側では次のような検証のスキーマに従います。 |
下記において、`User` と `Profile` の二つのモデルのデータを収集することが出来るフォームをどのようにして作成することが出来るかを示します。 |
||||||
|
|
||||||
1. モデルのクラスをインスタンス化する。 |
最初に、ユーザとプロファイルのデータを収集するためのコントローラアクションは、次のように書くことが出来ます。 |
||||||
2. モデルの属性に入力されたデータを投入する。 |
|
||||||
3. 全てのモデルを検証する。 |
|
||||||
4. 全てのモデルに対して検証が通った場合は、それらを保存する。 |
|
||||||
5. 検証が失敗した場合、または、データが送信されなかった場合は、全てのモデルのインスタンスをビューに渡してフォームを表示する。 |
|
||||||
|
|
||||||
次に、一つのフォームで複数のモデルを使用する例を示します ... (未定) |
```php |
||||||
|
namespace app\controllers; |
||||||
|
|
||||||
複数のモデルの例 |
use Yii; |
||||||
---------------- |
use yii\base\Model; |
||||||
|
use yii\web\Controller; |
||||||
|
use yii\web\NotFoundHttpException; |
||||||
|
use app\models\User; |
||||||
|
use app\models\Profile; |
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
class UserController extends Controller |
||||||
> |
{ |
||||||
> まだ内容がありません。 |
public function actionUpdate($id) |
||||||
|
{ |
||||||
|
$user = User::findOne($id); |
||||||
|
$profile = Profile::findOne($id); |
||||||
|
|
||||||
|
if (!isset($user, $profile)) { |
||||||
|
throw new NotFoundHttpException("ユーザが見つかりませんでした。"); |
||||||
|
} |
||||||
|
|
||||||
|
$user->scenario = 'update'; |
||||||
|
$profile->scenario = 'update'; |
||||||
|
|
||||||
|
if (Model::loadMultiple([$user, $profile], Yii::$app->request->post())) { |
||||||
|
if ($user->validate() && $profile->validate()) { |
||||||
|
$user->save(false); |
||||||
|
$profile->save(false); |
||||||
|
return $this->redirect(['user/view', 'id' => $id]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $this->render('update', [ |
||||||
|
'user' => $user, |
||||||
|
'profile' => $profile, |
||||||
|
]); |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
(未定) |
この `update` アクションでは、最初に、更新の対象になる `$user` と `$profile` のモデルをデータベースからロードします。 |
||||||
|
次に [[yii\base\Model::loadMultiple()]] を呼んで、これら二つのモデルにユーザ入力を代入します。 |
||||||
|
代入が成功すれば、二つのモデルを検証して保存します。 |
||||||
|
そうでない場合は、次の内容を持つ `update` ビューをレンダリングします。 |
||||||
|
|
||||||
依存するモデル |
```php |
||||||
-------------- |
<?php |
||||||
|
use yii\helpers\Html; |
||||||
|
use yii\widgets\ActiveForm; |
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
$form = ActiveForm::begin([ |
||||||
> |
'id' => 'user-update-form', |
||||||
> まだ内容がありません。 |
'options' => ['class' => 'form-horizontal'], |
||||||
|
]) ?> |
||||||
|
<?= $form->field($user, 'username') ?> |
||||||
|
|
||||||
(未定) |
...other input fields... |
||||||
|
|
||||||
|
<?= $form->field($profile, 'website') ?> |
||||||
|
|
||||||
|
<?= Html::submitButton('更新', ['class' => 'btn btn-primary']) ?> |
||||||
|
<?php ActiveForm::end() ?> |
||||||
|
``` |
||||||
|
|
||||||
|
ご覧のように、`update` ビューでは、二つのモデル、すなわち `$user` と `$profile` を使ってインプットフィールドをレンダリングすることになります。 |
||||||
|
@ -1,40 +1,73 @@ |
|||||||
ページネーション |
ページネーション |
||||||
================ |
================ |
||||||
|
|
||||||
一つのページに一度に表示するにはデータ数が多すぎる場合に、それぞれ一定数のデータアイテムを含む部分にデータを分割して、一度に一つの部分だけを表示することがよく行われます。 |
一つのページに表示するにはデータの数が多すぎるという場合に、データを複数のページに分割して、それぞれのページでは一部分だけを表示する、という戦略がよく使われます。 |
||||||
このような部分はページと呼ばれますが、それがページネーションという名前の由来です。 |
この戦略が *ページネーション* として知られるものです。 |
||||||
|
|
||||||
あなたが [データウィジェット](output-data-widgets.md) の一つとともに [データプロバイダ](output-data-providers.md) を使っている場合は、ページネーションは既に自動的に設定されて、うまく動作するようになっています。 |
Yii は [[yii\data\Pagination]] オブジェクトを使って、ページネーションのスキームに関する情報を表します。 |
||||||
そうでない場合は、あなたが [[\yii\data\Pagination]] オブジェクトを作成し、[[\yii\data\Pagination::$totalCount|総アイテム数]]、[[\yii\data\Pagination::$pageSize|ページサイズ]]、[[\yii\data\Pagination::$page|現在のページ]] などのデータを代入して、クエリに適用し、そして [[\yii\widgets\LinkPager|リンクページャ]] に与えなければなりません。 |
具体的に言えば、 |
||||||
|
|
||||||
まず最初に、コントローラアクションの中でページネーションオブジェクトを作成し、データを代入します。 |
* [[yii\data\Pagination::$totalCount|totalCount]] データアイテムの総数を指定します。 |
||||||
|
通常、データアイテムの総数は、一つのページを表示するのに必要なデータアイテムの数より、ずっと大きなものになることに注意してください。 |
||||||
|
* [[yii\data\Pagination::$pageSize|pageSize]] 各ページが含むアイテムの数を指定します。 |
||||||
|
デフォルト値は 20 です。 |
||||||
|
* [[yii\data\Pagination::$page|page]] 現在のページ番号 (0 から始まる) を示します。 |
||||||
|
デフォルト値は 0 であり、最初のページを意味します。 |
||||||
|
|
||||||
|
これらの情報を全て定義した [[yii\data\Pagination]] オブジェクトを使って、データの一部分を取得して表示することが出来ます。 |
||||||
|
例えば、データプロバイダからデータを取得する場合であれば、ページネーションによって提供される値によって、それに対応する `OFFSET` と `LIMIT` の句を DB クエリに指定することが出来ます。 |
||||||
|
下記に例を挙げます。 |
||||||
|
|
||||||
```php |
```php |
||||||
function actionIndex() |
use yii\data\Pagination; |
||||||
{ |
|
||||||
$query = Article::find()->where(['status' => 1]); |
// status = 1 である全ての記事を取得する DB クエリを構築する |
||||||
$countQuery = clone $query; |
$query = Article::find()->where(['status' => 1]); |
||||||
$pages = new Pagination(['totalCount' => $countQuery->count()]); |
|
||||||
$models = $query->offset($pages->offset) |
// 記事の総数を取得する (ただし、記事のデータはまだ取得しない) |
||||||
->limit($pages->limit) |
$count = $query->count(); |
||||||
->all(); |
|
||||||
|
// 記事の総数を使ってページネーションオブジェクトを作成する |
||||||
return $this->render('index', [ |
$pagination = new Pagination(['totalCount' => $count]); |
||||||
'models' => $models, |
|
||||||
'pages' => $pages, |
// ページネーションを使ってクエリの OFFSET と LIMIT を修正して記事を取得する |
||||||
]); |
$articles = $query->offset($pages->offset) |
||||||
} |
->limit($pages->limit) |
||||||
|
->all(); |
||||||
``` |
``` |
||||||
|
|
||||||
次に、ビューにおいて、現在のページのモデルを出力し、リンクページャにページネーションオブジェクトを渡します。 |
上記の例で返される記事のページ番号はどうなるでしょう? |
||||||
|
それは `page` という名前のクエリパラメータがリクエストに含まれるかどうかによって決ります。 |
||||||
|
デフォルトでは、ページネーションオブジェクトは [[yii\data\Pagination::$page|page]] に `page` パラメータの値をセットしようと試みます。 |
||||||
|
そして、このパラメータが提供されていない場合には、デフォルト値である 0 が使用されます。 |
||||||
|
|
||||||
|
ページネーションをサポートする UI 要素の構築を容易にするために、Yii はページボタンのリストを表示する [[yii\widgets\LinkPager]] ウィジェットを提供しています。 |
||||||
|
これは、ユーザがページボタンをクリックして、どのページを表示すべきかを指示することが出来るものです。 |
||||||
|
このウィジェットは、ページネーションオブジェクトを受け取って、現在のページ番号が何であるかを知り、何個のページボタンを表示すべきかを知ります。 |
||||||
|
例えば、 |
||||||
|
|
||||||
```php |
```php |
||||||
foreach ($models as $model) { |
use yii\widgets\LinkPager; |
||||||
// ここで $model を表示 |
|
||||||
} |
|
||||||
|
|
||||||
// ページネーションを表示 |
|
||||||
echo LinkPager::widget([ |
echo LinkPager::widget([ |
||||||
'pagination' => $pages, |
'pagination' => $pagination, |
||||||
]); |
]); |
||||||
``` |
``` |
||||||
|
|
||||||
|
UI 要素を手動で構築したい場合は、[[yii\data\Pagination::createUrl()]] を使って、いろんなページに跳ぶ URL を作成することが出来ます。 |
||||||
|
このメソッドは page パラメータを要求し、その page パラメータを含む正しくフォーマットされた URL を作成します。 |
||||||
|
例えば、 |
||||||
|
|
||||||
|
```php |
||||||
|
// 作成される URL が使用すべきルートを指定する |
||||||
|
// 指定しない場合は、現在リクエストされているルートが使用される |
||||||
|
$pagination->route = 'article/index'; |
||||||
|
|
||||||
|
// /index.php?r=article/index&page=100 を表示 |
||||||
|
echo $pagination->createUrl(100); |
||||||
|
|
||||||
|
// /index.php?r=article/index&page=101 を表示 |
||||||
|
echo $pagination->createUrl(101); |
||||||
|
``` |
||||||
|
|
||||||
|
> Tip|ヒント: `page` クエリパラメータの名前をカスタマイズするためには、ページネーションオブジェクトを作成する際に [[yii\data\Pagination::pageParam|pageParam]] プロパティを構成します。 |
||||||
|
@ -1,54 +1,89 @@ |
|||||||
並べ替え |
並べ替え |
||||||
======== |
======== |
||||||
|
|
||||||
表示するデータを一つまたはいくつかの属性に従って並べ替えなければならないことがあります。 |
複数のデータ行を表示する際に、エンドユーザによって指定されるカラムに従ってデータを並べ替えなければならないことがよくあります。 |
||||||
あなたが [データウィジェット](output-data-widgets.md) の一つとともに [データプロバイダ](output-data-providers.md) を使っている場合は、並べ替えはあなたに代って自動的に処理されます。 |
Yii は [[yii\data\Sort]] オブジェクトを使って並べ替えのスキーマに関する情報を表します。 |
||||||
そうでない場合は、[[\yii\data\Sort]] のインスタンスを作成して構成し、クエリに適用しなければなりません。 |
具体的に言えば、 |
||||||
また、[[\yii\data\Sort]] のインスタンスをビューに渡して、属性による並べ替えのためのリンクを作成することが出来ます。 |
|
||||||
|
|
||||||
典型的な使用方法の例を次に示します。 |
* [[yii\data\Sort::$attributes|attributes]] データの並べ替えに使用できる *属性* を指定します。 |
||||||
|
単純で良ければ、[モデルの属性](structure-models.md#attributes) をこの属性とすることが出来ます。 |
||||||
|
また、複数のモデル属性や DB のカラムを結合した合成的な属性を指定することも出来ます。 |
||||||
|
詳細については後述します。 |
||||||
|
* [[yii\data\Sort::$attributeOrders|attributeOrders]] 各属性について、現在リクエストされている並べ替えの方向を指定します。 |
||||||
|
* [[yii\data\Sort::$orders|orders]] 並べ替えの方向をカラムを使う低レベルな形式で示します。 |
||||||
|
|
||||||
|
[[yii\data\Sort]] を使用するためには、最初にどの属性が並べ替え可能であるかを宣言します。 |
||||||
|
次に、現在リクエストされている並べ替え情報を [[yii\data\Sort::$attributeOrders|attributeOrders]] または [[yii\data\Sort::$orders|orders]] から取得して、データのクエリをカスタマイズします。 |
||||||
|
例えば、 |
||||||
|
|
||||||
```php |
```php |
||||||
function actionIndex() |
use yii\data\Sort; |
||||||
{ |
|
||||||
$sort = new Sort([ |
$sort = new Sort([ |
||||||
'attributes' => [ |
'attributes' => [ |
||||||
'age', |
'age', |
||||||
'name' => [ |
'name' => [ |
||||||
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC], |
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC], |
||||||
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC], |
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC], |
||||||
'default' => SORT_DESC, |
'default' => SORT_DESC, |
||||||
'label' => 'Name', |
'label' => '氏名', |
||||||
], |
|
||||||
], |
], |
||||||
]); |
], |
||||||
|
]); |
||||||
$models = Article::find() |
|
||||||
->where(['status' => 1]) |
$articles = Article::find() |
||||||
->orderBy($sort->orders) |
->where(['status' => 1]) |
||||||
->all(); |
->orderBy($sort->orders) |
||||||
|
->all(); |
||||||
return $this->render('index', [ |
|
||||||
'models' => $models, |
|
||||||
'sort' => $sort, |
|
||||||
]); |
|
||||||
} |
|
||||||
``` |
``` |
||||||
|
|
||||||
ビューにおいては、 |
上記の例では、[[yii\data\Sort|Sort]] オブジェクトに対して二つの属性が宣言されています。 |
||||||
|
すなわち、`age` と `name` です。 |
||||||
|
|
||||||
|
`age` 属性は `Article` アクティブレコードクラスの `age` 属性に対応する *単純な* 属性です。 |
||||||
|
これは、次の宣言と等価です。 |
||||||
|
|
||||||
```php |
```php |
||||||
// 並べ替えのアクションに導くリンクを表示 |
'age' => [ |
||||||
|
'asc' => ['age' => SORT_ASC], |
||||||
|
'desc' => ['age' => SORT_DESC], |
||||||
|
'default' => SORT_ASC, |
||||||
|
'label' => Inflector::camel2words('age'), |
||||||
|
] |
||||||
|
``` |
||||||
|
|
||||||
|
`name` 属性は `Article` の `first_name` と `last_name` によって定義される *合成的な* 属性です。 |
||||||
|
これは次のような配列構造を使って宣言されています。 |
||||||
|
|
||||||
|
- `asc` および `desc` の要素は、それぞれ、この属性を昇順および降順に並べ替える方法を指定します。 |
||||||
|
この値が、データの並べ替えに使用されるべき実際のカラムと方向を表します。 |
||||||
|
一つまたは複数のカラムを指定して、単純な並べ替えや合成的な並べ替えを示すことが出来ます。 |
||||||
|
- `default` 要素は、最初にリクエストされたときの属性の並べ替えに使用されるべき方向を指定します。 |
||||||
|
デフォルト値は昇順です。 |
||||||
|
つまり、以前に並べ替えられたことがない状態でこの属性による並べ替えをリクエストすると、この属性の昇順に従ってデータが並べ替えられることになります。 |
||||||
|
- `label` 要素は、並べ替えのリンクを作成するために [[yii\data\Sort::link()]] を呼んだときに、どういうラベルを使用すべきかを指定するものです。 |
||||||
|
設定されていない場合は、[[yii\helpers\Inflector::camel2words()]] が呼ばれて、属性名からラベルが生成されます。 |
||||||
|
ラベルは HTML エンコードされないことに注意してください。 |
||||||
|
|
||||||
|
> Info|情報: [[yii\data\Sort::$orders|orders]] の値をデータベースのクエリに直接に供給して、`ORDER BY` 句を構築することが出来ます。 |
||||||
|
データベースのクエリが認識できない合成的な属性が入っている場合があるため、[[yii\data\Sort::$attributeOrders|attributeOrders]] を使ってはいけません。 |
||||||
|
|
||||||
|
[[yii\data\Sort::link()]] を呼んでハイパーリンクを生成すれば、それをクリックして、指定した属性によるデータの並べ替えをリクエストすることが出来るようになります。 |
||||||
|
[[yii\data\Sort::createUrl()]] を呼んで並べ替えを実行する URL を生成することも出来ます。 |
||||||
|
例えば、 |
||||||
|
|
||||||
|
```php |
||||||
|
// 生成される URL が使用すべきルートを指定する |
||||||
|
// これを指定しない場合は、現在リクエストされているルートが使用される |
||||||
|
$sort->route = 'article/index'; |
||||||
|
|
||||||
|
// 氏名による並べ替えと年齢による並べ替えを実行するリンクを表示 |
||||||
echo $sort->link('name') . ' | ' . $sort->link('age'); |
echo $sort->link('name') . ' | ' . $sort->link('age'); |
||||||
|
|
||||||
foreach ($models as $model) { |
// /index.php?r=article/index&sort=age を表示 |
||||||
// ここで $model を表示 |
echo $sort->createUrl('age'); |
||||||
} |
|
||||||
``` |
``` |
||||||
|
|
||||||
上記においては、並べ替えをサポートする二つの属性、すなわち、`name` と `age` を宣言しています。 |
[[yii\data\Sort]] は、リクエストの `sort` クエリパラメータをチェックして、どの属性による並べ替えがリクエストされたかを判断します。 |
||||||
並べ替えの情報を Article クエリに渡して、クエリ結果が Sort オブジェクトで指定された順序に従って並べ替えられるようにしています。 |
このクエリパラメータが存在しない場合のデフォルトの並べ替え方法は [[yii\data\Sort::defaultOrder]] によって指定することが出来ます。 |
||||||
ビューにおいては、二つのハイパーリンクを表示して、対応する属性によって並べ替えられたデータを表示するページへ移動できるようにしています。 |
また、[[yii\data\Sort::sortParam|sortParam]] プロパティを構成して、このクエリパラメータの名前をカスタマイズすることも出来ます。 |
||||||
|
|
||||||
[[yii\data\Sort|Sort]] クラスは、リクエストで渡されたパラメータを自動的に取得して、それに応じて並べ替えのオプションを調整します。 |
|
||||||
パラメータは [[yii\data\Sort::$params|$params]] プロパティを構成して調整することが出来ます。 |
|
||||||
|
@ -1,377 +0,0 @@ |
|||||||
認証クライアント |
|
||||||
================ |
|
||||||
|
|
||||||
Yii は、[OpenID](http://openid.net/)、[OAuth](http://oauth.net/) または [OAuth2](http://oauth.net/2/) のコンシューマとして、外部サービスを使用して認証 および/または 権限付与を行うことを可能にする公式エクステンションを提供しています。 |
|
||||||
|
|
||||||
エクステンションをインストールする |
|
||||||
--------------------------------- |
|
||||||
|
|
||||||
エクステンションをインストールするためには、Composer を使います。次のコマンドを実行します。 |
|
||||||
|
|
||||||
``` |
|
||||||
composer require --prefer-dist yiisoft/yii2-authclient "*" |
|
||||||
``` |
|
||||||
|
|
||||||
または、あなたの composer.json の `require` セクションに次の行を追加します。 |
|
||||||
|
|
||||||
```json |
|
||||||
"yiisoft/yii2-authclient": "*" |
|
||||||
``` |
|
||||||
|
|
||||||
クライアントを構成する |
|
||||||
---------------------- |
|
||||||
|
|
||||||
エクステンションがインストールされた後に、認証クライアントコレクションのアプリケーションコンポーネントをセットアップする必要があります。 |
|
||||||
|
|
||||||
```php |
|
||||||
'components' => [ |
|
||||||
'authClientCollection' => [ |
|
||||||
'class' => 'yii\authclient\Collection', |
|
||||||
'clients' => [ |
|
||||||
'google' => [ |
|
||||||
'class' => 'yii\authclient\clients\GoogleOpenId' |
|
||||||
], |
|
||||||
'facebook' => [ |
|
||||||
'class' => 'yii\authclient\clients\Facebook', |
|
||||||
'clientId' => 'facebook_client_id', |
|
||||||
'clientSecret' => 'facebook_client_secret', |
|
||||||
], |
|
||||||
// etc. |
|
||||||
], |
|
||||||
] |
|
||||||
... |
|
||||||
] |
|
||||||
``` |
|
||||||
|
|
||||||
特別な設定なしに使用できる次のクライアントが提供されています。 |
|
||||||
|
|
||||||
- [[\yii\authclient\clients\Facebook|Facebook]] |
|
||||||
- [[yii\authclient\clients\GitHub|GitHub]] |
|
||||||
- Google ([[yii\authclient\clients\GoogleOpenId|OpenID]] または [[yii\authclient\clients\GoogleOAuth|OAuth]] で) |
|
||||||
- [[yii\authclient\clients\LinkedIn|LinkedIn]] |
|
||||||
- [[yii\authclient\clients\Live|Microsoft Live]] |
|
||||||
- [[yii\authclient\clients\Twitter|Twitter]] |
|
||||||
- [[yii\authclient\clients\VKontakte|VKontakte]] |
|
||||||
- Yandex ([[yii\authclient\clients\YandexOpenId|OpenID]] または [[yii\authclient\clients\YandexOAuth|OAuth]] で) |
|
||||||
|
|
||||||
それぞれのクライアントの構成は少しずつ異なります。 |
|
||||||
OAuth では、使おうとしているサービスからクライアント ID と秘密キーを取得することが必要です。 |
|
||||||
OpenID では、たいていの場合、何も設定しなくても動作します。 |
|
||||||
|
|
||||||
|
|
||||||
認証データを保存する |
|
||||||
-------------------- |
|
||||||
|
|
||||||
外部サービスによって認証されたユーザを認識するために、最初の認証のときに提供された ID を保存し、以後の認証のときにはそれをチェックする必要があります。 |
|
||||||
ログインのオプションを外部サービスに限定するのは良いアイデアではありません。 |
|
||||||
外部サービスによる認証が失敗して、ユーザがログインする方法がなくなるかもしれないからです。 |
|
||||||
そんなことはせずに、外部認証と昔ながらのパスワードによるログインの両方を提供する方が適切です。 |
|
||||||
|
|
||||||
ユーザの情報をデータベースに保存しようとする場合、スキーマは次のようなものになります。 |
|
||||||
|
|
||||||
```sql |
|
||||||
CREATE TABLE user ( |
|
||||||
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, |
|
||||||
username varchar(255) NOT NULL, |
|
||||||
auth_key varchar(32) NOT NULL, |
|
||||||
password_hash varchar(255) NOT NULL, |
|
||||||
password_reset_token varchar(255), |
|
||||||
email varchar(255) NOT NULL, |
|
||||||
status smallint(6) NOT NULL DEFAULT 10, |
|
||||||
created_at int(11) NOT NULL, |
|
||||||
updated_at int(11) NOT NULL |
|
||||||
); |
|
||||||
|
|
||||||
CREATE TABLE auth ( |
|
||||||
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, |
|
||||||
user_id int(11) NOT NULL, |
|
||||||
source string(255) NOT NULL, |
|
||||||
source_id string(255) NOT NULL |
|
||||||
); |
|
||||||
|
|
||||||
ALTER TABLE auth ADD CONSTRAINT fk-auth-user_id-user-id |
|
||||||
FOREIGN KEY user_id REFERENCES auth(id); |
|
||||||
``` |
|
||||||
|
|
||||||
上記の SQL における `user` は、アドバンストアプリケーションテンプレートでユーザ情報を保存するために使われている標準的なテーブルです。 |
|
||||||
全てのユーザはそれぞれ複数の外部サービスを使って認証できますので、全ての `user` レコードはそれぞれ複数の `auth` レコードと関連を持ち得ます。 |
|
||||||
`auth` テーブルにおいて `source` は使用される認証プロバイダの名前であり、`source_id` はログイン成功後に外部サービスから提供される一意のユーザ識別子です。 |
|
||||||
|
|
||||||
上記で作成されたテーブルを使って `Auth` モデルを生成することが出来ます。これ以上の修正は必要ありません。 |
|
||||||
|
|
||||||
|
|
||||||
コントローラにアクションを追加する |
|
||||||
---------------------------------- |
|
||||||
|
|
||||||
次のステップでは、ウェブのコントローラ、典型的には `SiteController` に [[yii\authclient\AuthAction]] を追加します。 |
|
||||||
|
|
||||||
```php |
|
||||||
class SiteController extends Controller |
|
||||||
{ |
|
||||||
public function actions() |
|
||||||
{ |
|
||||||
return [ |
|
||||||
'auth' => [ |
|
||||||
'class' => 'yii\authclient\AuthAction', |
|
||||||
'successCallback' => [$this, 'onAuthSuccess'], |
|
||||||
], |
|
||||||
]; |
|
||||||
} |
|
||||||
|
|
||||||
public function onAuthSuccess($client) |
|
||||||
{ |
|
||||||
$attributes = $client->getUserAttributes(); |
|
||||||
|
|
||||||
/** @var Auth $auth */ |
|
||||||
$auth = Auth::find()->where([ |
|
||||||
'source' => $client->getId(), |
|
||||||
'source_id' => $attributes['id'], |
|
||||||
])->one(); |
|
||||||
|
|
||||||
if (Yii::$app->user->isGuest) { |
|
||||||
if ($auth) { // ログイン |
|
||||||
$user = $auth->user; |
|
||||||
Yii::$app->user->login($user); |
|
||||||
} else { // ユーザ登録 |
|
||||||
if (User::find()->where(['email' => $attributes['email']])->exists()) { |
|
||||||
Yii::$app->getSession()->setFlash('error', [ |
|
||||||
Yii::t('app', "{client} のアカウントと同じメールアドレスを持つユーザが既に存在しますが、まだそのアカウントとリンクされていません。リンクするために、まずメールアドレスを使ってログインしてください。", ['client' => $client->getTitle()]), |
|
||||||
]); |
|
||||||
} else { |
|
||||||
$password = Yii::$app->security->generateRandomString(6); |
|
||||||
$user = new User([ |
|
||||||
'username' => $attributes['login'], |
|
||||||
'email' => $attributes['email'], |
|
||||||
'password' => $password, |
|
||||||
]); |
|
||||||
$user->generateAuthKey(); |
|
||||||
$user->generatePasswordResetToken(); |
|
||||||
$transaction = $user->getDb()->beginTransaction(); |
|
||||||
if ($user->save()) { |
|
||||||
$auth = new Auth([ |
|
||||||
'user_id' => $user->id, |
|
||||||
'source' => $client->getId(), |
|
||||||
'source_id' => (string)$attributes['id'], |
|
||||||
]); |
|
||||||
if ($auth->save()) { |
|
||||||
$transaction->commit(); |
|
||||||
Yii::$app->user->login($user); |
|
||||||
} else { |
|
||||||
print_r($auth->getErrors()); |
|
||||||
} |
|
||||||
} else { |
|
||||||
print_r($user->getErrors()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} else { // ユーザは既にログインしている |
|
||||||
if (!$auth) { // 認証プロバイダを追加 |
|
||||||
$auth = new Auth([ |
|
||||||
'user_id' => Yii::$app->user->id, |
|
||||||
'source' => $client->getId(), |
|
||||||
'source_id' => $attributes['id'], |
|
||||||
]); |
|
||||||
$auth->save(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
外部サービスによるユーザの認証が成功すると `successCallback` メソッドが呼ばれます。 |
|
||||||
`$client` インスタンスを通じて、外部サービスから受け取った情報を取得することが出来ます。 |
|
||||||
私たちの例では、次のことをしようとしています。 |
|
||||||
|
|
||||||
- ユーザがゲストであり、auth にレコードが見つかった場合は、そのユーザをログインさせる。 |
|
||||||
- ユーザがゲストであり、auth にレコードが見つからなかった場合は、新しいユーザを作成して、auth テーブルにレコードを作成する。そして、ログインさせる。 |
|
||||||
- ユーザがログインしており、auth にレコードが見つからなかった場合は、追加のアカウントにも接続するようにする (そのデータを auth テーブルに保存する)。 |
|
||||||
|
|
||||||
全ての Auth クライアントには違いがありますが、同じインタフェイス [[yii\authclient\ClientInterface]] を共有し、共通の API によって管理されます。 |
|
||||||
|
|
||||||
各クライアントは、異なる目的に使用できるいくつかの説明的なデータを持っています。 |
|
||||||
|
|
||||||
- `id` - クライアントを他のクライアントから区別する一意の ID。 |
|
||||||
URL やログに使うことが出来ます。 |
|
||||||
- `name` - このクライアントが属する外部認証プロバイダの名前。 |
|
||||||
認証クライアントが異なっても、同じ外部認証プロバイダを参照している場合は、同じ名前になることがあります。 |
|
||||||
例えば、Google OpenID のクライアントと Google OAuth のクライアントは同じ名前 "google" を持ちます。 |
|
||||||
この属性は内部的にデータベースや CSS スタイルなどにおいて使用することが出来ます。 |
|
||||||
- `title` - 外部認証プロバイダのユーザフレンドリな名前。ビューのレイヤにおいて認証クライアントを表示するのに使用されます。 |
|
||||||
|
|
||||||
それぞれの認証クライアントは異なる認証フローを持ちますが、すべてのものが `getUserAttributes()` メソッドをサポートしており、認証が成功した後にこのメソッドを呼び出すことが出来ます。 |
|
||||||
|
|
||||||
このメソッドによって、外部のユーザアカウントの情報、例えば、ID、メールアドレス、フルネーム、優先される言語などを取得することが出来ます。 |
|
||||||
ただし、プロバイダごとに利用できるフィールドの有無や名前が異なることに注意してください。 |
|
||||||
|
|
||||||
外部認証プロバイダが返すべき属性を定義するリストは、クライアントのタイプに依存します。 |
|
||||||
|
|
||||||
- [[yii\authclient\OpenId]]: `requiredAttributes` と `optionalAttributes` の組み合わせ。 |
|
||||||
- [[yii\authclient\OAuth1]] と [[yii\authclient\OAuth2]]: `scope` フィールド。 |
|
||||||
プロバイダによってスコープの形式が異なることに注意。 |
|
||||||
|
|
||||||
### API 呼び出しによって追加のデータを取得する |
|
||||||
|
|
||||||
[[yii\authclient\OAuth1]] と [[yii\authclient\OAuth2]] は、ともに、`api()` メソッドをサポートしており、これによって外部認証プロバイダの REST API にアクセスすることが出来ます。 |
|
||||||
ただし、このメソッドは非常に基本的なもので、外部 API の完全な機能にアクセスするためには、十分なものではありません。 |
|
||||||
このメソッドは、主として、外部のユーザアカウントの情報を取得するために使用されます。 |
|
||||||
|
|
||||||
API の呼び出しを使用するためには、API の仕様に従って [[yii\authclient\BaseOAuth::apiBaseUrl]] をセットアップする必要があります。 |
|
||||||
そうすれば [[yii\authclient\BaseOAuth::api()]] メソッドを呼ぶことが出来ます。 |
|
||||||
|
|
||||||
```php |
|
||||||
use yii\authclient\OAuth2; |
|
||||||
|
|
||||||
$client = new OAuth2; |
|
||||||
|
|
||||||
// ... |
|
||||||
|
|
||||||
$client->apiBaseUrl = 'https://www.googleapis.com/oauth2/v1'; |
|
||||||
$userInfo = $client->api('userinfo', 'GET'); |
|
||||||
``` |
|
||||||
|
|
||||||
ログインビューにウィジェットを追加する |
|
||||||
-------------------------------------- |
|
||||||
|
|
||||||
そのまま使える [[yii\authclient\widgets\AuthChoice]] ウィジェットをビューで使用することが出来ます。 |
|
||||||
|
|
||||||
```php |
|
||||||
<?= yii\authclient\widgets\AuthChoice::widget([ |
|
||||||
'baseAuthUrl' => ['site/auth'], |
|
||||||
'popupMode' => false, |
|
||||||
]) ?> |
|
||||||
``` |
|
||||||
|
|
||||||
あなた自身の認証クライアントを作成する |
|
||||||
-------------------------------------- |
|
||||||
|
|
||||||
どの外部認証プロバイダでも、あなた自身の認証クライアントを作成して、OpenID または OAuth プロトコルをサポートすることが出来ます。 |
|
||||||
そうするためには、最初に、外部認証プロバイダによってどのプロトコルがサポートされているかを見出す必要があります。 |
|
||||||
それによって、あなたのエクステンションの基底クラスの名前が決ります。 |
|
||||||
|
|
||||||
- OAuth 2 のためには [[yii\authclient\OAuth2]] を使います。 |
|
||||||
- OAuth 1/1.0a のためには [[yii\authclient\OAuth1]] を使います。 |
|
||||||
- OpenID のためには [[yii\authclient\OpenId]] を使います。 |
|
||||||
|
|
||||||
この段階で、対応するメソッドを宣言することによって、認証クライアントのデフォルトの名前、タイトル、および、ビューオプションを決定することが出来ます。 |
|
||||||
|
|
||||||
```php |
|
||||||
use yii\authclient\OAuth2; |
|
||||||
|
|
||||||
class MyAuthClient extends OAuth2 |
|
||||||
{ |
|
||||||
protected function defaultName() |
|
||||||
{ |
|
||||||
return 'my_auth_client'; |
|
||||||
} |
|
||||||
|
|
||||||
protected function defaultTitle() |
|
||||||
{ |
|
||||||
return 'My Auth Client'; |
|
||||||
} |
|
||||||
|
|
||||||
protected function defaultViewOptions() |
|
||||||
{ |
|
||||||
return [ |
|
||||||
'popupWidth' => 800, |
|
||||||
'popupHeight' => 500, |
|
||||||
]; |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
使用する基底クラスによって、宣言し直さなければならないフィールドやメソッドが異なります。 |
|
||||||
|
|
||||||
### [[yii\authclient\OpenId]] |
|
||||||
|
|
||||||
必要なことは、`authUrl` フィールドを宣言し直して URL を指定することだけです。 |
|
||||||
デフォルトの 必須属性 および/または オプション属性を設定することも可能です。 |
|
||||||
例えば、 |
|
||||||
|
|
||||||
```php |
|
||||||
use yii\authclient\OpenId; |
|
||||||
|
|
||||||
class MyAuthClient extends OpenId |
|
||||||
{ |
|
||||||
public $authUrl = 'https://www.my.com/openid/'; |
|
||||||
|
|
||||||
public $requiredAttributes = [ |
|
||||||
'contact/email', |
|
||||||
]; |
|
||||||
|
|
||||||
public $optionalAttributes = [ |
|
||||||
'namePerson/first', |
|
||||||
'namePerson/last', |
|
||||||
]; |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
### [[yii\authclient\OAuth2]] |
|
||||||
|
|
||||||
以下のものを指定する必要があります。 |
|
||||||
|
|
||||||
- 認証 URL - `authUrl` フィールド。 |
|
||||||
- トークンリクエスト URL - `tokenUrl` フィールド。 |
|
||||||
- API のベース URL - `apiBaseUrl` フィールド。 |
|
||||||
- ユーザ属性取得ストラテジー - `initUserAttributes()` メソッド。 |
|
||||||
|
|
||||||
例えば、 |
|
||||||
|
|
||||||
```php |
|
||||||
use yii\authclient\OAuth2; |
|
||||||
|
|
||||||
class MyAuthClient extends OAuth2 |
|
||||||
{ |
|
||||||
public $authUrl = 'https://www.my.com/oauth2/auth'; |
|
||||||
|
|
||||||
public $tokenUrl = 'https://www.my.com/oauth2/token'; |
|
||||||
|
|
||||||
public $apiBaseUrl = 'https://www.my.com/apis/oauth2/v1'; |
|
||||||
|
|
||||||
protected function initUserAttributes() |
|
||||||
{ |
|
||||||
return $this->api('userinfo', 'GET'); |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
デフォルトの auth スコープを指定することも出来ます。 |
|
||||||
|
|
||||||
> Note|注意: OAuth プロバイダの中には、OAuth の標準を厳格に遵守せず、標準と異なる仕様を導入しているものもあります。 |
|
||||||
そのようなものに対してクライアントを実装するためには、追加の労力が必要になることがあります。 |
|
||||||
|
|
||||||
### [[yii\authclient\OAuth1]] |
|
||||||
|
|
||||||
以下のものを指定する必要があります。 |
|
||||||
|
|
||||||
- 認証 URL - `authUrl` フィールド。 |
|
||||||
- リクエストトークン URL - `requestTokenUrl` フィールド。 |
|
||||||
- アクセストークン URL - `accessTokenUrl` フィールド。 |
|
||||||
- API のベース URL - `apiBaseUrl` フィールド。 |
|
||||||
- ユーザ属性取得ストラテジー - `initUserAttributes()` メソッド。 |
|
||||||
|
|
||||||
例えば、 |
|
||||||
|
|
||||||
```php |
|
||||||
use yii\authclient\OAuth1; |
|
||||||
|
|
||||||
class MyAuthClient extends OAuth1 |
|
||||||
{ |
|
||||||
public $authUrl = 'https://www.my.com/oauth/auth'; |
|
||||||
|
|
||||||
public $requestTokenUrl = 'https://www.my.com/oauth/request_token'; |
|
||||||
|
|
||||||
public $accessTokenUrl = 'https://www.my.com/oauth/access_token'; |
|
||||||
|
|
||||||
public $apiBaseUrl = 'https://www.my.com/apis/oauth/v1'; |
|
||||||
|
|
||||||
protected function initUserAttributes() |
|
||||||
{ |
|
||||||
return $this->api('userinfo', 'GET'); |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
デフォルトの auth スコープを指定することも出来ます。 |
|
||||||
|
|
||||||
> Note|注意: OAuth プロバイダの中には、OAuth の標準を厳格に遵守せず、標準と異なる仕様を導入しているものもあります。 |
|
||||||
そのようなものに対してクライアントを実装するためには、追加の労力が必要になることがあります。 |
|
@ -1,199 +0,0 @@ |
|||||||
デバッグツールバーとデバッガ |
|
||||||
============================ |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
|
|
||||||
Yii2 には、アプリケーションの迅速な開発とデバッグのために、便利なツールバーと内蔵のデバッガが付いています。 |
|
||||||
ツールバーは現在開かれているページに関する情報を表示します。 |
|
||||||
そして、デバッガはそれまでに収集したデータを分析する (すなわち、変数の値を確認する) のに使用できます。 |
|
||||||
|
|
||||||
これらのツールは、特別な設定をしなくても、次のことを可能にしてくれます。 |
|
||||||
|
|
||||||
- フレームワークのバージョン、PHP バージョン、レスポンスステータス、現在のコントローラとアクション、パフォーマンス情報、その他をツールバーによって素速く取得 |
|
||||||
- アプリケーションと PHP の構成の閲覧 |
|
||||||
- リクエストデータ、リクエストとレスポンスのヘッダ、セッションデータ、そして環境変数の閲覧 |
|
||||||
- ログの閲覧、検索、フィルタリング |
|
||||||
- プロファイリング結果の閲覧 |
|
||||||
- ページによって実行されたデータベースクエリの閲覧 |
|
||||||
- アプリケーションから送信されたメールの閲覧 |
|
||||||
|
|
||||||
これらの情報の全てはリクエストごとに閲覧できますが、過去のリクエストに遡って情報を閲覧することも可能です。 |
|
||||||
|
|
||||||
|
|
||||||
インストールと構成 |
|
||||||
------------------ |
|
||||||
|
|
||||||
これらの機能を有効にするためには、構成情報ファイルに以下の行を追加してデバッグモジュールを有効にします。 |
|
||||||
|
|
||||||
```php |
|
||||||
'bootstrap' => ['debug'], |
|
||||||
'modules' => [ |
|
||||||
'debug' => 'yii\debug\Module', |
|
||||||
] |
|
||||||
``` |
|
||||||
|
|
||||||
デフォルトでは、デバッグモジュールはウェブサイトをローカルホストから閲覧した場合にだけ動作します。 |
|
||||||
これをリモートサーバ (ステージングサーバ) で使いたい場合は、パラメータ `allowedIPs` を構成情報に追加して、あなたの IP をホワイトリストに加えてください。 |
|
||||||
|
|
||||||
```php |
|
||||||
'bootstrap' => ['debug'], |
|
||||||
'modules' => [ |
|
||||||
'debug' => [ |
|
||||||
'class' => 'yii\debug\Module', |
|
||||||
'allowedIPs' => ['1.2.3.4', '127.0.0.1', '::1'] |
|
||||||
] |
|
||||||
] |
|
||||||
``` |
|
||||||
|
|
||||||
URL マネージャで `enableStrictParsing` オプションを使っている場合は、`rules` に次の行を追加してください。 |
|
||||||
|
|
||||||
```php |
|
||||||
'urlManager' => [ |
|
||||||
'enableStrictParsing' => true, |
|
||||||
'rules' => [ |
|
||||||
// ... |
|
||||||
'debug/<controller>/<action>' => 'debug/<controller>/<action>', |
|
||||||
], |
|
||||||
], |
|
||||||
``` |
|
||||||
|
|
||||||
> Note|注意: デバッガは各リクエストに関する情報を `@runtime/debug` ディレクトリに保存します。 |
|
||||||
> デバッガを使用するのに問題が生じたとき、例えば、デバッガを使おうとするとおかしなエラーメッセージが出たり、ツールバーが表示されなかったり、リクエストの情報が何も表示されなかったりしたときは、ウェブサーバがこのディレクトリとその中に置かれるファイルに対して十分なアクセス権限を持っているかどうかを確認してください。 |
|
||||||
|
|
||||||
|
|
||||||
### ロギングとプロファイリングのための追加の構成 |
|
||||||
|
|
||||||
ロギングとプロファイリングは、フレームワークとアプリケーションの両方の実行フローを理解するのを助けてくれる、単純ながら強力なツールです。これらのツールは、開発環境でも本番環境でも役に立ちます。 |
|
||||||
|
|
||||||
本番環境では、[ロギング](logging.md) のガイドの節で説明されているように、著しく重要なメッセージを手動でログに取るだけにとどめるべきです。 |
|
||||||
本番環境で全てのメッセージをログに取り続けるのは、パフォーマンスへの損害が大きすぎます。 |
|
||||||
|
|
||||||
開発環境では、ログは多く取れば取るほど良いでしょう。とりわけ、実行トレースの記録は有用です。 |
|
||||||
|
|
||||||
フレームワークのフードの下で何が起っているかを理解する手助けとなるトレースメッセージを見るためには、構成情報ファイルでトレースレベルを設定する必要があります。 |
|
||||||
|
|
||||||
```php |
|
||||||
return [ |
|
||||||
// ... |
|
||||||
'components' => [ |
|
||||||
'log' => [ |
|
||||||
'traceLevel' => YII_DEBUG ? 3 : 0, // <-- ここ |
|
||||||
``` |
|
||||||
|
|
||||||
デフォルトでは、Yii がデバッグモードで走っている場合のトレースレベルは自動的に `3` に設定されます。 |
|
||||||
デバッグモードは `index.php` ファイルに次の行が存在することによって決定されます。 |
|
||||||
|
|
||||||
```php |
|
||||||
defined('YII_DEBUG') or define('YII_DEBUG', true); |
|
||||||
``` |
|
||||||
|
|
||||||
> Note|注意: デバッグモードはパフォーマンスに著しい悪影響を及ぼし得ますので、本番環境では必ずデバッグモードを無効にしてください。 |
|
||||||
更に、デバッグモードは公開すべきでない情報をエンドユーザに曝露することがあり得ます。 |
|
||||||
|
|
||||||
|
|
||||||
あなた自身のパネルを作る |
|
||||||
------------------------ |
|
||||||
|
|
||||||
ツールバーとデバッガは、ともに、高い構成可能性とカスタマイズ性を持っています。 |
|
||||||
これらをカスタマイズするために、あなた自身のパネルを作成して、あなたが必要とする特定のデータを収集して表示することが出来ます。 |
|
||||||
以下において、簡単なカスタムパネルを作るプロセスを説明します。そのパネルは以下の機能を持つものとします。 |
|
||||||
|
|
||||||
- リクエストの間にレンダリングされたビューを収集する |
|
||||||
- ツールバーにレンダリングされたビューの数を表示する |
|
||||||
- デバッガでビューの名前を確認することが出来る |
|
||||||
|
|
||||||
なお、あなたがベーシックアプリケーションテンプレートを使用しているものと仮定しています。 |
|
||||||
|
|
||||||
最初に、`panels/ViewsPanel.php` で `Panel` クラスを実装する必要があります。 |
|
||||||
|
|
||||||
```php |
|
||||||
<?php |
|
||||||
namespace app\panels; |
|
||||||
|
|
||||||
use yii\base\Event; |
|
||||||
use yii\base\View; |
|
||||||
use yii\base\ViewEvent; |
|
||||||
use yii\debug\Panel; |
|
||||||
|
|
||||||
|
|
||||||
class ViewsPanel extends Panel |
|
||||||
{ |
|
||||||
private $_viewFiles = []; |
|
||||||
|
|
||||||
public function init() |
|
||||||
{ |
|
||||||
parent::init(); |
|
||||||
Event::on(View::className(), View::EVENT_BEFORE_RENDER, function (ViewEvent $event) { |
|
||||||
$this->_viewFiles[] = $event->sender->getViewFile(); |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @inheritdoc |
|
||||||
*/ |
|
||||||
public function getName() |
|
||||||
{ |
|
||||||
return 'Views'; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @inheritdoc |
|
||||||
*/ |
|
||||||
public function getSummary() |
|
||||||
{ |
|
||||||
$url = $this->getUrl(); |
|
||||||
$count = count($this->data); |
|
||||||
return "<div class=\"yii-debug-toolbar-block\"><a href=\"$url\">ビュー数 <span class=\"label\">$count</span></a></div>"; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @inheritdoc |
|
||||||
*/ |
|
||||||
public function getDetail() |
|
||||||
{ |
|
||||||
return '<ol><li>' . implode('<li>', $this->data) . '</ol>'; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @inheritdoc |
|
||||||
*/ |
|
||||||
public function save() |
|
||||||
{ |
|
||||||
return $this->_viewFiles; |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
上記のコードのワークフローは以下のとおりです。 |
|
||||||
|
|
||||||
1. 全てのコントローラのアクションが走る前に `init` が実行されます。 |
|
||||||
コントローラのアクションが実行される間にデータを収集するハンドラをアタッチするには、このメソッドが最適の場所です。 |
|
||||||
2. コントローラのアクションが実行された後に `save` が呼ばれます。 |
|
||||||
このメソッドによって返されたデータは、データファイルに保存されます。 |
|
||||||
このメソッドが何も返さなかった場合には、パネルは表示されません。 |
|
||||||
3. データファイルからのデータは `$this->data` にロードされます。 |
|
||||||
ツールバーの場合は、これは常に最新のデータを表します。 |
|
||||||
デバッガの場合は、このプロパティが以前のデータファイルから読み出されるようにセットされることもあります。 |
|
||||||
4. ツールバーはその内容を `getSummary` から取得します。 |
|
||||||
そこではレンダリングされたビューの数を表示します。 |
|
||||||
デバッガは同じ目的のために `getDetail` を使用します。 |
|
||||||
|
|
||||||
さあ、それでは、デバッガに新しいパネルを使うように教えましょう。 |
|
||||||
`config/web.php` で、デバッガの構成を次のように変更します。 |
|
||||||
|
|
||||||
```php |
|
||||||
if (YII_ENV_DEV) { |
|
||||||
// configuration adjustments for 'dev' environment |
|
||||||
$config['bootstrap'][] = 'debug'; |
|
||||||
$config['modules']['debug'] = [ |
|
||||||
'class' => 'yii\debug\Module', |
|
||||||
'panels' => [ |
|
||||||
'views' => ['class' => 'app\panels\ViewsPanel'], |
|
||||||
], |
|
||||||
]; |
|
||||||
|
|
||||||
// ... |
|
||||||
``` |
|
||||||
|
|
||||||
以上です。これで、たいしてコードを書くこともなく、もう一つの便利なパネルを手に入れました。 |
|
@ -1,268 +0,0 @@ |
|||||||
Gii コード生成ツール |
|
||||||
==================== |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
|
|
||||||
Yii は、Gii という名前の便利なツールを持っています。 |
|
||||||
Gii は、よく使用されるコード断片だけでなく、完全な CRUD コントローラを生成することによって、迅速なプロトタイピングの機能を提供するツールです。 |
|
||||||
|
|
||||||
Gii はウェブベースのインタフェイスを提供しており、あなたの望みのコードを対話的に生成することが出来ます。 |
|
||||||
Gii は、また、ほとんどの時間はコンソールウィンドウで仕事をすることを好む人たちのために、コマンドラインのインタフェイスも提供しています。 |
|
||||||
|
|
||||||
|
|
||||||
インストールと構成 |
|
||||||
------------------ |
|
||||||
|
|
||||||
Gii は Yii の公式エクステンションです。 |
|
||||||
このエクステンションをインストールする望ましい方法は、[composer](http://getcomposer.org/download/) を使うことです。 |
|
||||||
|
|
||||||
次のコマンドを走らせてください。 |
|
||||||
|
|
||||||
``` |
|
||||||
composer require "yiisoft/yii2-gii:*" |
|
||||||
``` |
|
||||||
|
|
||||||
または、次のコードをあなたの `composer.json` ファイルの `require` セクションに追加してください。 |
|
||||||
|
|
||||||
``` |
|
||||||
"yiisoft/yii2-gii": "*" |
|
||||||
``` |
|
||||||
|
|
||||||
Gii エクステンションがインストールされたら、アプリケーションの構成情報ファイルに以下の行を追加して、Gii を有効にします。 |
|
||||||
|
|
||||||
```php |
|
||||||
return [ |
|
||||||
'bootstrap' => ['gii'], |
|
||||||
'modules' => [ |
|
||||||
'gii' => 'yii\gii\Module', |
|
||||||
// ... |
|
||||||
], |
|
||||||
// ... |
|
||||||
]; |
|
||||||
``` |
|
||||||
|
|
||||||
そうすると、次の URL で Gii にアクセスすることが出来ます。 |
|
||||||
|
|
||||||
``` |
|
||||||
http://localhost/path/to/index.php?r=gii |
|
||||||
``` |
|
||||||
|
|
||||||
綺麗な URL を有効にしている場合は、次の URL を使います。 |
|
||||||
|
|
||||||
``` |
|
||||||
http://localhost/path/to/index.php/gii |
|
||||||
``` |
|
||||||
|
|
||||||
> Note|注意: ローカルホスト以外の IP から Gii にアクセスしようとすると、デフォルトでは、アクセスが拒否されます。 |
|
||||||
> このデフォルトを回避するためには、許可される IP アドレスを構成情報に追加してください。 |
|
||||||
> |
|
||||||
```php |
|
||||||
'gii' => [ |
|
||||||
'class' => 'yii\gii\Module', |
|
||||||
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // 必要に応じて修正 |
|
||||||
], |
|
||||||
``` |
|
||||||
|
|
||||||
コンソールアプリケーションの構成情報において同じように Gii を構成すると、次のようにして、コマンドウィンドウから Gii にアクセスすることが出来ます。 |
|
||||||
|
|
||||||
``` |
|
||||||
# パスをアプリケーションのベースパスに変更 |
|
||||||
cd path/to/AppBasePath |
|
||||||
|
|
||||||
# Gii に関するヘルプ情報を表示 |
|
||||||
yii help gii |
|
||||||
|
|
||||||
# Gii のモデルジェネレータに関するヘルプ情報を表示 |
|
||||||
yii help gii/model |
|
||||||
|
|
||||||
# city テーブルから City モデルを生成 |
|
||||||
yii gii/model --tableName=city --modelClass=City |
|
||||||
``` |
|
||||||
|
|
||||||
|
|
||||||
### ベーシックアプリケーション |
|
||||||
|
|
||||||
ベーシックアプリケーションテンプレートの構成情報の構造は少し違っており、Gii は `config/web.php` の中で構成しなければなりません。 |
|
||||||
|
|
||||||
```php |
|
||||||
// ... |
|
||||||
if (YII_ENV_DEV) { |
|
||||||
// 'dev' 環境のための構成の修正 |
|
||||||
$config['bootstrap'][] = 'debug'; |
|
||||||
$config['modules']['debug'] = 'yii\debug\Module'; |
|
||||||
|
|
||||||
$config['bootstrap'][] = 'gii'; |
|
||||||
$config['modules']['gii'] = 'yii\gii\Module'; // <--- ここ |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
従って、IP アドレスを調整するためには、次のようにする必要があります。 |
|
||||||
|
|
||||||
```php |
|
||||||
if (YII_ENV_DEV) { |
|
||||||
// 'dev' 環境のための構成の修正 |
|
||||||
$config['bootstrap'][] = 'debug'; |
|
||||||
$config['modules']['debug'] = 'yii\debug\Module'; |
|
||||||
|
|
||||||
$config['bootstrap'][] = 'gii'; |
|
||||||
$config['modules']['gii'] = [ |
|
||||||
'class' => 'yii\gii\Module', |
|
||||||
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'], |
|
||||||
]; |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
どのように使うか |
|
||||||
---------------- |
|
||||||
|
|
||||||
Gii にアクセスすると、最初に、ジェネレータを選択できるエントリページが開かれます。 |
|
||||||
|
|
||||||
![Gii エントリページ](images/gii-entry.png) |
|
||||||
|
|
||||||
デフォルトでは、以下のジェネレータを利用できます。 |
|
||||||
|
|
||||||
- **モデルジェネレータ** - このジェネレータは、指定したデータベーステーブルの ActiveRecord クラスを生成します。 |
|
||||||
- **CRUD ジェネレータ** - このジェネレータは、指定されたデータモデルの CRUD 操作 (作成・読み出し・更新・削除) を実装するコントローラとビューを生成します。 |
|
||||||
- **コントローラジェネレータ** - このジェネレータは、新しいコントローラのクラスと、一つまたはいくつかのコントローラアクションおよびそれに対応するビューを迅速に生成するのを手助けしてくれます。 |
|
||||||
- **フォームジェネレータ** - このジェネレータは、指定されたモデルクラスのための、入力を収集するフォームを表示するビュースクリプトを生成します。 |
|
||||||
- **モジュールジェネレータ** - このジェネレータは、Yii のモジュールが必要とするコードのスケルトンを生成するのを手助けしてくれます。 |
|
||||||
- **エクステンションジェネレータ** - このジェネレータは、Yii のエクステンションが必要とするファイルの生成を手助けしてくれます。 |
|
||||||
|
|
||||||
"Start" ボタンをクリックしてジェネレータを選択すると、ジェネレータのパラメータを構成するためのフォームが表示されます。 |
|
||||||
あなたの要求を満たすようにフォームに入力して "Preview" ボタンをクリックすると、Gii が生成しようとしているコードのプレビューが出来ます。 |
|
||||||
選択したジェネレータや、既存のファイルの有無によって多少異なりますが、次の画像で見るのと同じような出力が得られます。 |
|
||||||
|
|
||||||
![Gii プレビュー](images/gii-preview.png) |
|
||||||
|
|
||||||
ファイル名をクリックすると、そのファイルのために生成されるコードのプレビューを見ることが出来ます。 |
|
||||||
ファイルが既に存在する場合は、既存のコードと生成されるコードのどこが異なるかを示す差分ビューも提供されます。 |
|
||||||
その場合は、どのファイルを上書きし、どのファイルを上書きしないかを選択することも出来ます。 |
|
||||||
|
|
||||||
> Tip|ヒント: データベースに変更を加えた後で、モデルジェネレータを使ってモデルを更新したい場合は、Gii のプレビューからコードをコピーして、あなたのコードに変更をマージすることが出来ます。 |
|
||||||
PHPStorm の [クリップボードと比較](http://www.jetbrains.com/phpstorm/webhelp/comparing-files.html) のような IDE の機能を使うと良いでしょう。 |
|
||||||
[Aptana Studio](http://www.aptana.com/products/studio3/download) や [Eclipse](http://www.eclipse.org/pdt/) ベースのエディタも [AnyEdit tools plugin](http://andrei.gmxhome.de/anyedit/) を使って [クリップボードと比較](http://andrei.gmxhome.de/anyedit/examples.html) をすることが出来ます。 |
|
||||||
この機能を使うと、関係のある変更だけを取り込んで、あなた自身のコードを取り消すような他の変更は放っておくことが出来ます。 |
|
||||||
|
|
||||||
コードをレビューして、生成すべきファイルを選択し、"Generate" ボタンをクリックするとファイルが生成されます。 |
|
||||||
すべてうまく行けば、これで終りです。 |
|
||||||
Gii がファイルを生成できないというエラーが出た場合は、ウェブサーバがファイルを作成してディレクトリに書き込むことが出来るように、ディレクトリのアクセス権限を修正しなければなりません。 |
|
||||||
|
|
||||||
> Note|注意: Gii によって生成されるコードは、あなたの要求に従って修正すべきテンプレートに過ぎません。 |
|
||||||
Gii は新しいものを素早く作成する手助けをするために存在するものですが、そのまま使用できるコードを作成するようなものではありません。 |
|
||||||
Gii によって生成されたモデルを変更せずに、ちょっとした所だけを修正して使っている人をよく見かけます。 |
|
||||||
これは、意図されている Gii の使い方ではありません。 |
|
||||||
Gii によって生成されるコードは不完全であったり、間違っていたりする可能性があるもので、あなたの要求を満たすように変更して初めて使用できるようになるものです。 |
|
||||||
|
|
||||||
|
|
||||||
あなた自身のテンプレートを作成する |
|
||||||
---------------------------------- |
|
||||||
|
|
||||||
すべてのジェネレータのフォームには `Code Template` というフィールドがあり、コード生成に使用するテンプレートを選択できるようになっています。 |
|
||||||
デフォルトでは、Gii は `default` という一つのテンプレートだけを提供しますが、あなたの要求を満たすように修正されたあなた自身のテンプレートを作成することも出来ます。 |
|
||||||
|
|
||||||
フォルダ `@app\vendor\yiisoft\yii2-gii\generators` を開くと、ジェネレータのフォルダが 6 つあるのに気づくでしょう。 |
|
||||||
|
|
||||||
``` |
|
||||||
+ controller |
|
||||||
- crud |
|
||||||
+ default |
|
||||||
+ extension |
|
||||||
+ form |
|
||||||
+ model |
|
||||||
+ module |
|
||||||
``` |
|
||||||
|
|
||||||
これらはジェネレータの名前です。 |
|
||||||
どれでもフォルダを開くと、その中に `default` というフォルダがあります。 |
|
||||||
これがテンプレートの名前です。 |
|
||||||
|
|
||||||
フォルダ `@app\vendor\yiisoft\yii2-gii\generators\crud\default` を他の場所、例えば、`@app\myTemplates\crud\` にコピーします。 |
|
||||||
このフォルダを開いて、どれでもテンプレートをあなたの要求に合うように修正します。 |
|
||||||
例えば、`views\_form.php` に `errorSummary` を追加しましょう。 |
|
||||||
|
|
||||||
```php |
|
||||||
<?php |
|
||||||
//... |
|
||||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-form"> |
|
||||||
|
|
||||||
<?= "<?php " ?>$form = ActiveForm::begin(); ?> |
|
||||||
<?= "<?=" ?> $form->errorSummary($model) ?> <!-- これを追加 --> |
|
||||||
<?php foreach ($safeAttributes as $attribute) { |
|
||||||
echo " <?= " . $generator->generateActiveField($attribute) . " ?>\n\n"; |
|
||||||
} ?> |
|
||||||
//... |
|
||||||
``` |
|
||||||
|
|
||||||
次に、Gii に私たちのテンプレートについて教える必要があります。 |
|
||||||
その設定は構成情報ファイルの中で行います。 |
|
||||||
|
|
||||||
```php |
|
||||||
// config/web.php for basic app |
|
||||||
// ... |
|
||||||
if (YII_ENV_DEV) { |
|
||||||
$config['modules']['gii'] = [ |
|
||||||
'class' => 'yii\gii\Module', |
|
||||||
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'], |
|
||||||
'generators' => [ // ここ |
|
||||||
'crud' => [ // ジェネレータの名前 |
|
||||||
'class' => 'yii\gii\generators\crud\Generator', // ジェネレータクラス |
|
||||||
'templates' => [ //setting for out templates |
|
||||||
'myCrud' => '@app/myTemplates/crud/default', // テンプレート名 => テンプレートへのパス |
|
||||||
] |
|
||||||
] |
|
||||||
], |
|
||||||
]; |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
CRUD ジェネレータを開くと、フォームの `Code Template` のフィールドに、あなた自身のテンプレートが出現するようになっています。 |
|
||||||
|
|
||||||
あなた自身のジェネレータを作成する |
|
||||||
---------------------------------- |
|
||||||
|
|
||||||
どれでもジェネレータのフォルダを開くと、`form.php` と `Generator.php` の二つのファイルがあります。 |
|
||||||
一つはフォームで、二番目のものがジェネレータクラスです。 |
|
||||||
あなた自身のジェネレータを作成するためには、このクラスをどこかのフォルダで作成またはオーバーライドする必要があります。 |
|
||||||
ここでも、前の項でしたのと同じように、構成情報をカスタマイズします。 |
|
||||||
|
|
||||||
```php |
|
||||||
//config/web.php for basic app |
|
||||||
//.. |
|
||||||
if (YII_ENV_DEV) { |
|
||||||
$config['modules']['gii'] = [ |
|
||||||
'class' => 'yii\gii\Module', |
|
||||||
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'], |
|
||||||
'generators' => [ |
|
||||||
'myCrud' => [ |
|
||||||
'class' => 'app\myTemplates\crud\Generator', |
|
||||||
'templates' => [ |
|
||||||
'my' => '@app/myTemplates/crud/default', |
|
||||||
] |
|
||||||
] |
|
||||||
], |
|
||||||
]; |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
```php |
|
||||||
// @app/myTemplates/crud/Generator.php |
|
||||||
<?php |
|
||||||
namespace app\myTemplates\crud; |
|
||||||
|
|
||||||
class Generator extends \yii\gii\Generator |
|
||||||
{ |
|
||||||
public function getName() |
|
||||||
{ |
|
||||||
return 'MY CRUD ジェネレータ'; |
|
||||||
} |
|
||||||
|
|
||||||
public function getDescription() |
|
||||||
{ |
|
||||||
return 'My crud ジェネレータ。本来のものと同じだが、云々、、、'; |
|
||||||
} |
|
||||||
|
|
||||||
// ... |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
Gii モジュールを開くと、新しいジェネレータがその中に出現します。 |
|
@ -1,262 +0,0 @@ |
|||||||
アドバンストアプリケーションテンプレート |
|
||||||
======================================== |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
|
|
||||||
このテンプレートは、バックエンドがフロントエンドから分離されたり、アプリケーションが複数のサーバに配備されたりするような、チーム開発による大規模なプロジェクトのためのものです。 |
|
||||||
また、このアプリケーションテンプレートは機能に関して少し踏み込んで、不可欠なデータベースやユーザ登録、パスワード回復などをそのまま使える形で提供しています。 |
|
||||||
|
|
||||||
次の表はアドバンストとベーシックのアプリケーションテンプレートの違いを比較するものです。 |
|
||||||
|
|
||||||
|
|
||||||
| 機能 | ベーシック | アドバンスト | |
|
||||||
|---|:---:|:---:| |
|
||||||
| プロジェクト構造 | ✓ | ✓ | |
|
||||||
| Site コントローラ | ✓ | ✓ | |
|
||||||
| ユーザのログイン/ログアウト | ✓ | ✓ | |
|
||||||
| フォーム | ✓ | ✓ | |
|
||||||
| DB 接続 | ✓ | ✓ | |
|
||||||
| コンソールコマンド | ✓ | ✓ | |
|
||||||
| アセットバンドル | ✓ | ✓ | |
|
||||||
| Codeception によるテスト | ✓ | ✓ | |
|
||||||
| Twitter Bootstrap | ✓ | ✓ | |
|
||||||
| フロントエンドとバックエンド | | ✓ | |
|
||||||
| すぐに使える User モデル | | ✓ | |
|
||||||
| ユーザの登録とパスワード回復 | | ✓ | |
|
||||||
|
|
||||||
|
|
||||||
インストール |
|
||||||
------------ |
|
||||||
|
|
||||||
### Composer によってインストールする |
|
||||||
|
|
||||||
[Composer](http://getcomposer.org/) を持っていない場合は、[Yii をインストールする](start-installation.md#installing-via-composer) の節の指示に従ってインストールしてください。 |
|
||||||
|
|
||||||
Composer がインストールされていれば、次のコマンドを使ってアプリケーションをインストールすることが出来ます。 |
|
||||||
|
|
||||||
composer global require "fxp/composer-asset-plugin:1.0.0" |
|
||||||
composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application |
|
||||||
|
|
||||||
最初のコマンドは [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。 |
|
||||||
これにより、Composer を通じて bower と npm の依存パッケージを管理することが出来るようになります。 |
|
||||||
このコマンドは全体で一度だけ走らせれば十分です。 |
|
||||||
第二のコマンドは `yii-application` という名前のディレクトリにアドバンストアプリケーションをインストールします。 |
|
||||||
望むなら別のディレクトリ名を選ぶことも出来ます。 |
|
||||||
|
|
||||||
|
|
||||||
始めよう |
|
||||||
-------- |
|
||||||
|
|
||||||
アプリケーションをインストールした後に、インストールされたアプリケーションの初期設定をするために、次の各ステップを実行しなければなりません。 |
|
||||||
これらは全体で一度だけやれば十分です。 |
|
||||||
|
|
||||||
1. `init` コマンドを実行して、環境として `dev` を選択します。 |
|
||||||
|
|
||||||
``` |
|
||||||
php /path/to/yii-application/init |
|
||||||
``` |
|
||||||
|
|
||||||
あるいは、本番サーバで、非対話モードで `init` を実行します。 |
|
||||||
|
|
||||||
``` |
|
||||||
php /path/to/yii-application/init --env=Production --overwrite=All |
|
||||||
``` |
|
||||||
|
|
||||||
2. 新しいデータベースを作成し、それに従って `common/config/main-local.php` の `components['db']` の構成情報を修正します。 |
|
||||||
3. コンソールコマンド `yii migrate` でマイグレーションを適用します。 |
|
||||||
4. ウェブサーバのドキュメントルートを設定します。 |
|
||||||
|
|
||||||
- フロントエンドのパスは `/path/to/yii-application/frontend/web/`、URL は `http://frontend/` を使用 |
|
||||||
- バックエンドのパスは `/path/to/yii-application/backend/web/`、URL は `http://backend/` を使用 |
|
||||||
|
|
||||||
アプリケーションにログインするためには、最初にユーザ登録をする必要があります。 |
|
||||||
あなたの任意のメールアドレス、ユーザ名、パスワードを指定してください。 |
|
||||||
そうすれば、同じメールアドレスとパスワードを使って何時でもアプリケーションにログインすることが出来ます。 |
|
||||||
|
|
||||||
ディレクトリ構造 |
|
||||||
---------------- |
|
||||||
|
|
||||||
ルートディレクトリは次のサブディレクトリを含みます。 |
|
||||||
|
|
||||||
- `backend` - バックエンドのウェブアプリケーション |
|
||||||
- `common` - 全てのアプリケーションに共通なファイル |
|
||||||
- `console` - コンソールアプリケーション |
|
||||||
- `environments` - 環境設定 |
|
||||||
- `frontend` - フロントエンドのアプリケーション |
|
||||||
|
|
||||||
ルートディレクトリは次の一群のファイルを含みます。 |
|
||||||
|
|
||||||
- `.gitignore` - git バージョン管理システムによって無視されるディレクトリの一覧を含みます。 |
|
||||||
ソースコードのレポジトリに決して入れたくないものがあれば、それをこれに追加してください。 |
|
||||||
- `composer.json` - Composer の構成。下の「Composer を構成する」で説明します。 |
|
||||||
- `init` - 初期化スクリプト。下の「構成情報と環境」で説明します。 |
|
||||||
- `init.bat` - 同上 (Windows 用)。 |
|
||||||
- `LICENSE.md` - ライセンス情報。プロジェクトのライセンスを置きます。特にオープンソースにする場合。 |
|
||||||
- `README.md` - テンプレートのインストールに関する基本的な情報。 |
|
||||||
あなたのプロジェクトとそのインストールに関する情報に置き換えることを検討してください。 |
|
||||||
- `requirements.php` - Yii 必要条件チェッカ。 |
|
||||||
- `yii` - コンソールアプリケーションのブートストラップスクリプト。 |
|
||||||
- `yii.bat` - 同上 (Windows 用)。 |
|
||||||
|
|
||||||
事前定義されたパスエイリアス |
|
||||||
---------------------------- |
|
||||||
|
|
||||||
- `@yii` - フレームワークのディレクトリ。 |
|
||||||
- `@app` - 現在走っているアプリケーションのベースパス。 |
|
||||||
- `@common` - 共通ディレクトリ。 |
|
||||||
- `@frontend` - フロントエンドウェブアプリケーションのディレクトリ。 |
|
||||||
- `@backend` - バックエンドウェブアプリケーションのディレクトリ。 |
|
||||||
- `@console` - コンソールアプリケーションのディレクトリ。 |
|
||||||
- `@runtime` - 現在走っているウェブアプリケーションのランタイムディレクトリ。 |
|
||||||
- `@vendor` - Composer の ベンダーディレクトリ。 |
|
||||||
- `@bower` - [bower パッケージ](http://bower.io/) を含むベンダーディレクトリ。 |
|
||||||
- `@npm` - [npm パッケージ](https://www.npmjs.org/) を含むベンダーディレクトリ。 |
|
||||||
- `@web` - 現在走っているウェブアプリケーションのベース URL。 |
|
||||||
- `@webroot` - 現在走っているウェブアプリケーションのウェブルートディレクトリ。 |
|
||||||
|
|
||||||
アドバンストアプリケーションのディレクトリ構造特有のエイリアス (`@common`、`@frontend`、`@backend`、`@console`) は `common/config/bootstrap.php` で定義されています。 |
|
||||||
|
|
||||||
|
|
||||||
アプリケーション |
|
||||||
---------------- |
|
||||||
|
|
||||||
アドバンストテンプレートには三つのアプリケーションがあります。 |
|
||||||
すなわち、フロントエンド、バックエンド、そして、コンソールです。 |
|
||||||
フロントエンドは典型的にはエンドユーザに提示されるもので、プロジェクトの本体です。 |
|
||||||
バックエンドは管理パネルや、分析などの機能です。 |
|
||||||
コンソールは典型的にはクロンジョブや低レベルのサーバ管理に使用されます。 |
|
||||||
コンソールは、また、アプリケーションの配備の際にも使われ、マイグレーションやアセットを処理します。 |
|
||||||
|
|
||||||
さらに、二つ以上のアプリケーションから使われるファイルを含む `common` ディレクトリがあります。 |
|
||||||
例えば、`User` モデルがそうです。 |
|
||||||
|
|
||||||
フロントエンドとバックエンドは両方ともウェブアプリケーションであり、ともに `web` ディレクトリを含んでいます。 |
|
||||||
これがウェブサーバのウェブルートとすべきディレクトリです。 |
|
||||||
|
|
||||||
各アプリケーションはそれ自身の名前空間と、その名前に対応するエイリアスをもっています。 |
|
||||||
同じことは `common` ディレクトリにも当てはまります。 |
|
||||||
|
|
||||||
構成情報と環境 |
|
||||||
-------------- |
|
||||||
|
|
||||||
構成情報に対する典型的なアプローチには、複数の問題があります。 |
|
||||||
|
|
||||||
- チームの各メンバーは、自分自身の構成オプションを持っています。 |
|
||||||
そのような構成をコミットすると、他のメンバーに影響を与えます。 |
|
||||||
- 本番のデータベースのパスワードと API キーは、レポジトリに入れるべきではありません。 |
|
||||||
- 複数のサーバ環境があります。すなわち、開発、テスト、本番などです。各サーバはそれ自身の構成情報を持たなければなりません。 |
|
||||||
- 全ての構成オプションを各ケースに対して定義することは反復の多い作業であり、保守するのに時間を取りすぎます。 |
|
||||||
|
|
||||||
これらの問題を解決するために、Yii は単純な環境の概念を導入しています。 |
|
||||||
それぞれの環境は `environments` ディレクトリ配下の一群のファイルとして表現されます。 |
|
||||||
`init` コマンドがこれらの環境を切り替えるのに使用されます。 |
|
||||||
`init` コマンドが実際にやっていることは、環境ディレクトリから、全てのアプリケーションがあるルートディレクトリへと、すべてをごっそりとコピーすることです。 |
|
||||||
|
|
||||||
デフォルトでは二つの環境があります。すなわち、`dev` と `prod` です。 |
|
||||||
最初のものは開発用の環境で、全ての開発ツールとデバッグが有効になっています。 |
|
||||||
第二のものは本番サーバ配備用の環境で、デバッグと開発ツールは無効になっています。 |
|
||||||
|
|
||||||
典型的には、環境ディレクトリは `index.php` のようなアプリケーションブートストラップファイルや、`-local.php` という接尾辞を持つ構成情報ファイルを含んでいます。 |
|
||||||
これらは `.gitignore` に追加されて、ソースコードレポジトリには決して追加されないようになっています。 |
|
||||||
|
|
||||||
重複を避けるために、構成情報はお互いを上書きします。 |
|
||||||
例えば、フロントエンドは次の順序で構成情報を読み取ります。 |
|
||||||
|
|
||||||
- `common/config/main.php` |
|
||||||
- `common/config/main-local.php` |
|
||||||
- `frontend/config/main.php` |
|
||||||
- `frontend/config/main-local.php` |
|
||||||
|
|
||||||
パラメータは次の順序で読まれます。 |
|
||||||
|
|
||||||
- `common/config/params.php` |
|
||||||
- `common/config/params-local.php` |
|
||||||
- `frontend/config/params.php` |
|
||||||
- `frontend/config/params-local.php` |
|
||||||
|
|
||||||
後の構成情報ファイルが先のものを上書きするわけです。 |
|
||||||
|
|
||||||
全体の枠組みはこのようになります。 |
|
||||||
|
|
||||||
![アドバンストアプリケーションの構成情報](images/advanced-app-configs.png) |
|
||||||
|
|
||||||
Composer を構成する |
|
||||||
------------------- |
|
||||||
|
|
||||||
アプリケーションテンプレートがインストールされた後に、ルートディレクトリにあるデフォルトの `composer.json` を修正するのは良い考えです。 |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"name": "yiisoft/yii2-app-advanced", |
|
||||||
"description": "Yii 2 Advanced Application Template", |
|
||||||
"keywords": ["yii2", "framework", "advanced", "application template"], |
|
||||||
"homepage": "http://www.yiiframework.com/", |
|
||||||
"type": "project", |
|
||||||
"license": "BSD-3-Clause", |
|
||||||
"support": { |
|
||||||
"issues": "https://github.com/yiisoft/yii2/issues?state=open", |
|
||||||
"forum": "http://www.yiiframework.com/forum/", |
|
||||||
"wiki": "http://www.yiiframework.com/wiki/", |
|
||||||
"irc": "irc://irc.freenode.net/yii", |
|
||||||
"source": "https://github.com/yiisoft/yii2" |
|
||||||
}, |
|
||||||
"minimum-stability": "dev", |
|
||||||
"require": { |
|
||||||
"php": ">=5.4.0", |
|
||||||
"yiisoft/yii2": "*", |
|
||||||
"yiisoft/yii2-bootstrap": "*", |
|
||||||
"yiisoft/yii2-swiftmailer": "*" |
|
||||||
}, |
|
||||||
"require-dev": { |
|
||||||
"yiisoft/yii2-codeception": "*", |
|
||||||
"yiisoft/yii2-debug": "*", |
|
||||||
"yiisoft/yii2-gii": "*", |
|
||||||
"yiisoft/yii2-faker": "*" |
|
||||||
}, |
|
||||||
"config": { |
|
||||||
"process-timeout": 1800 |
|
||||||
}, |
|
||||||
"extra": { |
|
||||||
"asset-installer-paths": { |
|
||||||
"npm-asset-library": "vendor/npm", |
|
||||||
"bower-asset-library": "vendor/bower" |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
最初に、基本的な情報を更新しましょう。 |
|
||||||
`name`、`description`、`keywords`、`homepage` および `support` をあなたのプロジェクトに合うように変更します。 |
|
||||||
|
|
||||||
次に興味深い部分です。 |
|
||||||
あなたは、あなたのアプリケーションが必要とするパッケージを `require` セクションに追加することが出来ます。 |
|
||||||
追加のパッケージは全て [packagist.org](https://packagist.org/) から取ってくることが出来ます。ウェブサイトを閲覧して、役に立つコードを探してください。 |
|
||||||
|
|
||||||
`composer.json` を修正した後、`composer update --prefer-dist` を実行し、パッケージがダウンロードされインストールされるのを待ちます。 |
|
||||||
後はただ使用するだけです。クラスのオートロードは自動的に処理されます。 |
|
||||||
|
|
||||||
バックエンドからフロントエンドにリンクを張る |
|
||||||
-------------------------------------------- |
|
||||||
|
|
||||||
バックエンドアプリケーションからフロントエンドアプリケーションにリンクを張らなければならないことがよくあります。 |
|
||||||
フロントエンドアプリケーションはそれ自身の URL マネージャ規則を持っている場合がありますので、それをバックエンドアプリケーションのために別の名前で複製する必要があります。 |
|
||||||
|
|
||||||
```php |
|
||||||
return [ |
|
||||||
'components' => [ |
|
||||||
'urlManager' => [ |
|
||||||
// ここに通常のバックエンドの URL マネージャの構成 |
|
||||||
], |
|
||||||
'urlManagerFrontend' => [ |
|
||||||
// ここにフロントエンドの URL マネージャの構成 |
|
||||||
], |
|
||||||
|
|
||||||
], |
|
||||||
]; |
|
||||||
``` |
|
||||||
|
|
||||||
このようにすると、フロントエンドを指す URL を次のようにして取得することが出来ます。 |
|
||||||
|
|
||||||
```php |
|
||||||
echo Yii::$app->urlManagerFrontend->createUrl(...); |
|
||||||
``` |
|
@ -1,68 +0,0 @@ |
|||||||
Bootstrap ウィジェット |
|
||||||
====================== |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
|
|
||||||
Yii は、追加設定なしで、マークアップとコンポーネントのフレームワーク [Bootstrap 3](http://getbootstrap.com/) ("Twitter Bootstrap" としても知られています) をサポートしています。 |
|
||||||
Bootstrap は優れた、レスポンシブなフレームワークであり、クライアント側の開発プロセスを大いにスピードアップすることが出来るものです。 |
|
||||||
|
|
||||||
Bootstrap のコアは二つの部分によって表されます。 |
|
||||||
|
|
||||||
- CSS の基礎。例えば、グリッドのレイアウトシステム、タイポグラフィ、ヘルパクラス、レスポンシブユーティリティなど。 |
|
||||||
- そのまま使えるコンポーネント。フォーム、メニュー、ページネーション、モーダルボックス、タブなど。 |
|
||||||
|
|
||||||
基礎 |
|
||||||
---- |
|
||||||
|
|
||||||
Yii は bootstrap の基礎を PHP コードでラップすることをしていません。 |
|
||||||
なぜなら、この場合の HTML コードがそれ自体として非常にシンプルだからです。 |
|
||||||
bootstrap の基礎を使用することに関する詳細は、[bootstrap ドキュメントウェブサイト](http://getbootstrap.com/css/) で見ることが出来ます。 |
|
||||||
それでも、Yii はあなたのページに bootstrap のアセットをインクルードするための便利な方法を提供しています。 |
|
||||||
`@app/assets` ディレクトリに配置されている `AppAsset.php` に一行を加えるだけで大丈夫です。 |
|
||||||
|
|
||||||
```php |
|
||||||
public $depends = [ |
|
||||||
'yii\web\YiiAsset', |
|
||||||
'yii\bootstrap\BootstrapAsset', // この行です |
|
||||||
]; |
|
||||||
``` |
|
||||||
|
|
||||||
Yii のアセットマネージャによって bootstrap を使うと、bootstrap のリソースを最小化したり、必要な場合にはあなた自身のリソースと結合したりすることが出来ます。 |
|
||||||
|
|
||||||
Yii ウィジェット |
|
||||||
---------------- |
|
||||||
|
|
||||||
複雑な bootstrap コンポーネントのほとんどは Yii ウィジェットでラップされて、より堅牢な構文を与えられ、フレームワークの諸機能と統合されています。 |
|
||||||
全てのウィジェットは `\yii\bootstrap` 名前空間に属します。 |
|
||||||
|
|
||||||
- [[yii\bootstrap\ActiveForm|ActiveForm]] |
|
||||||
- [[yii\bootstrap\Alert|Alert]] |
|
||||||
- [[yii\bootstrap\Button|Button]] |
|
||||||
- [[yii\bootstrap\ButtonDropdown|ButtonDropdown]] |
|
||||||
- [[yii\bootstrap\ButtonGroup|ButtonGroup]] |
|
||||||
- [[yii\bootstrap\Carousel|Carousel]] |
|
||||||
- [[yii\bootstrap\Collapse|Collapse]] |
|
||||||
- [[yii\bootstrap\Dropdown|Dropdown]] |
|
||||||
- [[yii\bootstrap\Modal|Modal]] |
|
||||||
- [[yii\bootstrap\Nav|Nav]] |
|
||||||
- [[yii\bootstrap\NavBar|NavBar]] |
|
||||||
- [[yii\bootstrap\Progress|Progress]] |
|
||||||
- [[yii\bootstrap\Tabs|Tabs]] |
|
||||||
|
|
||||||
|
|
||||||
Bootstrap の .less ファイルを直接に使用する |
|
||||||
------------------------------------------- |
|
||||||
|
|
||||||
あなたが [Bootstrap CSS をあなたの less ファイルに直接含める](http://getbootstrap.com/getting-started/#customizing) ことを望む場合は、オリジナルの CSS ファイルがロードされないように無効化する必要があるでしょう。 |
|
||||||
[[yii\bootstrap\BootstrapAsset|BootstrapAsset]] の `css` プロパティを空に設定することによって、そうすることが出来ます。 |
|
||||||
そのためには、`assetManager` [アプリケーションコンポーネント](structure-application-components.md) を以下のように構成します。 |
|
||||||
|
|
||||||
```php |
|
||||||
'assetManager' => [ |
|
||||||
'bundles' => [ |
|
||||||
'yii\bootstrap\BootstrapAsset' => [ |
|
||||||
'css' => [], |
|
||||||
] |
|
||||||
] |
|
||||||
] |
|
||||||
``` |
|
@ -1,46 +0,0 @@ |
|||||||
jQuery UI ウィジェット |
|
||||||
====================== |
|
||||||
|
|
||||||
> Note|注意: この節はまだ執筆中です。 |
|
||||||
|
|
||||||
Yii は公式エクステンションによって [jQuery UI](http://api.jqueryui.com/) ライブラリをサポートしています。 |
|
||||||
jQuery UI は、jQuery JavaScript ライブラリの上に構築された、一連のユーザインタフェイスインタラクション、イフェクト、ウィジェットおよびテーマです。 |
|
||||||
|
|
||||||
インストール |
|
||||||
------------ |
|
||||||
|
|
||||||
このエクステンションの推奨されるインストール方法は、[composer](http://getcomposer.org/download/) を使う方法です。 |
|
||||||
|
|
||||||
下記を実行します。 |
|
||||||
|
|
||||||
``` |
|
||||||
php composer.phar require --prefer-dist yiisoft/yii2-jui "*" |
|
||||||
``` |
|
||||||
|
|
||||||
または、`composer.json` ファイルの `require` セクションに下記を追加します。 |
|
||||||
|
|
||||||
``` |
|
||||||
"yiisoft/yii2-jui": "*" |
|
||||||
``` |
|
||||||
|
|
||||||
Yii ウィジェット |
|
||||||
---------------- |
|
||||||
|
|
||||||
複雑な jQuery UI コンポーネントのほとんどは Yii ウィジェットでラップされて、より堅牢な構文を与えられ、フレームワークの諸機能と統合されています。 |
|
||||||
全てのウィジェットは `\yii\jui` 名前空間に属します。 |
|
||||||
|
|
||||||
- [[yii\jui\Accordion|Accordion]] |
|
||||||
- [[yii\jui\AutoComplete|AutoComplete]] |
|
||||||
- [[yii\jui\DatePicker|DatePicker]] |
|
||||||
- [[yii\jui\Dialog|Dialog]] |
|
||||||
- [[yii\jui\Draggable|Draggable]] |
|
||||||
- [[yii\jui\Droppable|Droppable]] |
|
||||||
- [[yii\jui\Menu|Menu]] |
|
||||||
- [[yii\jui\ProgressBar|ProgressBar]] |
|
||||||
- [[yii\jui\Resizable|Resizable]] |
|
||||||
- [[yii\jui\Selectable|Selectable]] |
|
||||||
- [[yii\jui\Slider|Slider]] |
|
||||||
- [[yii\jui\SliderInput|SliderInput]] |
|
||||||
- [[yii\jui\Sortable|Sortable]] |
|
||||||
- [[yii\jui\Spinner|Spinner]] |
|
||||||
- [[yii\jui\Tabs|Tabs]] |
|
@ -0,0 +1,18 @@ |
|||||||
|
Pamięć podręczna |
||||||
|
================ |
||||||
|
|
||||||
|
Mechanizmy wykorzystujące pamięć podręczną pozwalają na poprawienie wydajności aplikacji sieciowej w tani i efektywny sposób. |
||||||
|
Zapisanie mniej lub bardziej statycznych danych w pamięci podręcznej i serwowanie ich stamtąd, zamiast generować je od podstaw przy każdym |
||||||
|
wywołaniu, pozwala na znaczne zaoszczędzenie czasu odpowiedzi aplikacji. |
||||||
|
|
||||||
|
Zapis pamięci podręcznej może odbywać się na wielu poziomach i w wielu miejscach aplikacji. Po stronie serwera, na niskim poziomie, |
||||||
|
można wykorzystać pamięć podręczną do zapisania podstawowych danych, takich jak zbiór informacji o najnowszych artykułach pobieranych z bazy danych. |
||||||
|
Na wyższym poziomie, pamięci podręcznej można użyć do przechowania części bądź całości strony www, na przykład w postaci rezultatu wyrenderowania |
||||||
|
listy ww. najświeższych artykułów. Po stronie klienta, pamięć podręczna HTTP przeglądarki może zapisać zawartość ostatnio odwiedzonej strony. |
||||||
|
|
||||||
|
Yii wpiera wszystkie te mechanizmy zapisu w pamięci podręcznej: |
||||||
|
|
||||||
|
* [Pamięć podręczna danych](caching-data.md) |
||||||
|
* [Pamięć podręczna fragmentów](caching-fragment.md) |
||||||
|
* [Pamięć podręczna stron](caching-page.md) |
||||||
|
* [Pamięć podręczna HTTP](caching-http.md) |
@ -0,0 +1,41 @@ |
|||||||
|
Pamięć podręczna stron |
||||||
|
====================== |
||||||
|
|
||||||
|
Pamięć podręczna stron odnosi się do zapisu zawartości całej strony po stronie serwera. Kiedy zostanie ona ponownie wywołana, |
||||||
|
zawartość zostanie wyświetlona od razu z pamięci podręcznej zamiast generować ją ponownie od podstaw. |
||||||
|
|
||||||
|
Pamięć podręczna stron jest obsługiwana przez [[yii\filters\PageCache]], [filtr akcji](structure-filters.md). |
||||||
|
Poniżej znajdziesz przykładowy sposób użycia w klasie kontrolera: |
||||||
|
|
||||||
|
```php |
||||||
|
public function behaviors() |
||||||
|
{ |
||||||
|
return [ |
||||||
|
[ |
||||||
|
'class' => 'yii\filters\PageCache', |
||||||
|
'only' => ['index'], |
||||||
|
'duration' => 60, |
||||||
|
'variations' => [ |
||||||
|
\Yii::$app->language, |
||||||
|
], |
||||||
|
'dependency' => [ |
||||||
|
'class' => 'yii\caching\DbDependency', |
||||||
|
'sql' => 'SELECT COUNT(*) FROM post', |
||||||
|
], |
||||||
|
], |
||||||
|
]; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
W powyższym przykładzie kod zakłada użycie pamięci tylko dla akcji `index` - zawartość strony powinna zostać zapisana na maksymalnie |
||||||
|
60 sekund i powinna różnić się w zależności od wybranego w aplikacji języka. Dodatkowo, jeśli całkowita liczba postów w bazie danych ulegnie zmianie, |
||||||
|
zawartość pamięci powinna natychmiast stracić ważność i zostać pobrana ponownie. |
||||||
|
|
||||||
|
Jak widać, pamięć podręczna stron jest bardzo podobna do [pamięci podręcznej fragmentów](caching-fragment.md). W obu przypadkach można |
||||||
|
użyć opcji takich jak `duration` (czas ważności), `dependencies` (zależności), `variations` (warianty) oraz `enabled` (flaga aktywowania). |
||||||
|
Główną różnicą tych dwóch przypadków jest to, że pamięć podręczna stron jest implemetowana jako [filtr akcji](structure-filters.md), a |
||||||
|
pamięć podręczna fragmentów jako [widżet](structure-widgets.md). |
||||||
|
|
||||||
|
Oczywiście nic nie stoi na przeszkodzie, aby używać [pamięci podręcznej fragmentów](caching-fragment.md) jak |
||||||
|
i [zawartości dynamicznej](caching-fragment.md#dynamic-content) w połączeniu z pamięcią podręczną stron. |
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue