Browse Source

Merge remote-tracking branch 'upstream/master'

tags/2.0.7
Tom Worster 9 years ago
parent
commit
f96b182760
  1. 8
      .travis.yml
  2. 3
      CONTRIBUTING.md
  3. 38
      README.md
  4. 4
      build/build
  5. 52
      build/controllers/DevController.php
  6. 122
      build/controllers/ReleaseController.php
  7. 27
      composer.json
  8. 696
      composer.lock
  9. 6
      docs/guide-es/README.md
  10. 4
      docs/guide-es/intro-yii.md
  11. 4
      docs/guide-es/start-gii.md
  12. 6
      docs/guide-es/start-installation.md
  13. 4
      docs/guide-es/structure-applications.md
  14. 10
      docs/guide-es/structure-controllers.md
  15. 6
      docs/guide-es/structure-entry-scripts.md
  16. 63
      docs/guide-es/widget-bootstrap.md
  17. 27
      docs/guide-es/widget-jui.md
  18. 106
      docs/guide-fr/concept-aliases.md
  19. 4
      docs/guide-fr/intro-yii.md
  20. 4
      docs/guide-fr/start-gii.md
  21. 4
      docs/guide-fr/start-installation.md
  22. 6
      docs/guide-fr/structure-entry-scripts.md
  23. 4
      docs/guide-it/intro-yii.md
  24. 6
      docs/guide-it/start-installation.md
  25. 26
      docs/guide-ja/README.md
  26. 2
      docs/guide-ja/caching-data.md
  27. 25
      docs/guide-ja/concept-autoloading.md
  28. 4
      docs/guide-ja/concept-di-container.md
  29. 10
      docs/guide-ja/concept-events.md
  30. 3
      docs/guide-ja/concept-properties.md
  31. 13
      docs/guide-ja/concept-service-locator.md
  32. 100
      docs/guide-ja/db-active-record.md
  33. 12
      docs/guide-ja/db-dao.md
  34. 6
      docs/guide-ja/db-elasticsearch.md
  35. 26
      docs/guide-ja/db-migrations.md
  36. 6
      docs/guide-ja/db-mongodb.md
  37. 16
      docs/guide-ja/db-query-builder.md
  38. 6
      docs/guide-ja/db-redis.md
  39. 6
      docs/guide-ja/db-sphinx.md
  40. 8
      docs/guide-ja/helper-array.md
  41. 52
      docs/guide-ja/helper-html.md
  42. 6
      docs/guide-ja/helper-overview.md
  43. 6
      docs/guide-ja/helper-url.md
  44. 212
      docs/guide-ja/input-file-upload.md
  45. 12
      docs/guide-ja/input-forms.md
  46. 89
      docs/guide-ja/input-multiple-models.md
  47. 31
      docs/guide-ja/input-validation.md
  48. 6
      docs/guide-ja/intro-upgrade-from-v1.md
  49. 4
      docs/guide-ja/intro-yii.md
  50. 258
      docs/guide-ja/output-data-providers.md
  51. 237
      docs/guide-ja/output-formatting.md
  52. 79
      docs/guide-ja/output-pagination.md
  53. 89
      docs/guide-ja/output-sorting.md
  54. 109
      docs/guide-ja/output-theming.md
  55. 18
      docs/guide-ja/rest-authentication.md
  56. 2
      docs/guide-ja/rest-error-handling.md
  57. 11
      docs/guide-ja/rest-quick-start.md
  58. 3
      docs/guide-ja/rest-response-formatting.md
  59. 2
      docs/guide-ja/rest-routing.md
  60. 4
      docs/guide-ja/runtime-handling-errors.md
  61. 10
      docs/guide-ja/runtime-requests.md
  62. 8
      docs/guide-ja/runtime-routing.md
  63. 9
      docs/guide-ja/runtime-sessions-cookies.md
  64. 377
      docs/guide-ja/security-auth-clients.md
  65. 147
      docs/guide-ja/security-authentication.md
  66. 51
      docs/guide-ja/security-authorization.md
  67. 14
      docs/guide-ja/security-best-practices.md
  68. 4
      docs/guide-ja/security-passwords.md
  69. 2
      docs/guide-ja/start-databases.md
  70. 5
      docs/guide-ja/start-forms.md
  71. 10
      docs/guide-ja/start-gii.md
  72. 2
      docs/guide-ja/start-hello.md
  73. 8
      docs/guide-ja/start-installation.md
  74. 2
      docs/guide-ja/start-looking-ahead.md
  75. 2
      docs/guide-ja/start-workflow.md
  76. 21
      docs/guide-ja/structure-applications.md
  77. 17
      docs/guide-ja/structure-assets.md
  78. 44
      docs/guide-ja/structure-controllers.md
  79. 8
      docs/guide-ja/structure-entry-scripts.md
  80. 4
      docs/guide-ja/structure-models.md
  81. 2
      docs/guide-ja/structure-modules.md
  82. 17
      docs/guide-ja/test-environment-setup.md
  83. 2
      docs/guide-ja/test-fixtures.md
  84. 2
      docs/guide-ja/test-overview.md
  85. 199
      docs/guide-ja/tool-debugger.md
  86. 268
      docs/guide-ja/tool-gii.md
  87. 262
      docs/guide-ja/tutorial-advanced-app.md
  88. 16
      docs/guide-ja/tutorial-console.md
  89. 49
      docs/guide-ja/tutorial-core-validators.md
  90. 31
      docs/guide-ja/tutorial-i18n.md
  91. 4
      docs/guide-ja/tutorial-mailing.md
  92. 233
      docs/guide-ja/tutorial-performance-tuning.md
  93. 2
      docs/guide-ja/tutorial-start-from-scratch.md
  94. 409
      docs/guide-ja/tutorial-template-engines.md
  95. 2
      docs/guide-ja/tutorial-yii-integration.md
  96. 68
      docs/guide-ja/widget-bootstrap.md
  97. 46
      docs/guide-ja/widget-jui.md
  98. 138
      docs/guide-pl/README.md
  99. 18
      docs/guide-pl/caching-overview.md
  100. 41
      docs/guide-pl/caching-page.md
  101. Some files were not shown because too many files have changed in this diff Show More

8
.travis.yml

@ -38,13 +38,13 @@ addons:
install:
- travis_retry composer self-update && composer --version
- travis_retry composer global require "fxp/composer-asset-plugin:1.0.0"
- travis_retry composer global require "fxp/composer-asset-plugin:~1.0.0"
- export PATH="$HOME/.composer/vendor/bin:$PATH"
# core framework:
- travis_retry composer install --prefer-dist --no-interaction
- tests/unit/data/travis/apc-setup.sh
- tests/unit/data/travis/memcache-setup.sh
# - tests/unit/data/travis/cubrid-setup.sh
- tests/data/travis/apc-setup.sh
- tests/data/travis/memcache-setup.sh
# - tests/data/travis/cubrid-setup.sh
before_script:
# show some versions and env information

3
CONTRIBUTING.md

@ -3,4 +3,5 @@ Contributing to Yii2
- [Report an issue](docs/internals/report-an-issue.md)
- [Translate documentation or messages](docs/internals/translation-workflow.md)
- [Contribute to the core code or fix bugs](docs/internals/getting-started.md)
- [Give us feedback or start a design discussion](http://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/)
- [Contribute to the core code or fix bugs](docs/internals/git-workflow.md)

38
README.md

@ -11,12 +11,12 @@ Yii 2 requires PHP 5.4 and embraces the best practices and protocols found in mo
[![Latest Stable Version](https://poser.pugx.org/yiisoft/yii2/v/stable.png)](https://packagist.org/packages/yiisoft/yii2)
[![Total Downloads](https://poser.pugx.org/yiisoft/yii2/downloads.png)](https://packagist.org/packages/yiisoft/yii2)
[![Reference Status](https://www.versioneye.com/php/yiisoft:yii2/reference_badge.svg)](https://www.versioneye.com/php/yiisoft:yii2/references)
[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2)
[![Build Status](https://img.shields.io/travis/yiisoft/yii2.svg)](http://travis-ci.org/yiisoft/yii2)
[![Dependency Status](https://www.versioneye.com/php/yiisoft:yii2/dev-master/badge.png)](https://www.versioneye.com/php/yiisoft:yii2/dev-master)
[![HHVM Status](http://hhvm.h4cc.de/badge/yiisoft/yii2-dev.png)](http://hhvm.h4cc.de/package/yiisoft/yii2-dev)
[![HHVM Status](https://img.shields.io/hhvm/yiisoft/yii2-dev.svg)](http://hhvm.h4cc.de/package/yiisoft/yii2-dev)
[![Code Coverage](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/coverage.png?s=31d80f1036099e9d6a3e4d7738f6b000b3c3d10e)](https://scrutinizer-ci.com/g/yiisoft/yii2/)
[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/quality-score.png?s=b1074a1ff6d0b214d54fa5ab7abbb90fc092471d)](https://scrutinizer-ci.com/g/yiisoft/yii2/)
[![Code Climate](https://codeclimate.com/github/yiisoft/yii2.png)](https://codeclimate.com/github/yiisoft/yii2)
[![Code Climate](https://img.shields.io/codeclimate/github/yiisoft/yii2.svg)](https://codeclimate.com/github/yiisoft/yii2)
DIRECTORY STRUCTURE
-------------------
@ -42,7 +42,7 @@ Yii 2.0 has a [Definitive Guide](http://www.yiiframework.com/doc-2.0/guide-index
a [Class Reference](http://www.yiiframework.com/doc-2.0/index.html) which cover every detail of Yii.
There is also a [PDF version](http://stuff.cebe.cc/yii2-guide.pdf) of the Definitive Guide
and a [Definitive Guide Mirror](http://stuff.cebe.cc/yii2docs/) which update every 15 minutes.
and a [Definitive Guide Mirror](http://stuff.cebe.cc/yii2docs/) which is updated every 15 minutes.
For 1.1 users, you may refer to [Upgrading from Yii 1.1](docs/guide/intro-upgrade-from-v1.md)
to have a general idea of what has changed in 2.0.
@ -51,15 +51,31 @@ to have a general idea of what has changed in 2.0.
HOW TO PARTICIPATE
------------------
**Your participation to Yii 2 development is very welcome!**
### Your participation to Yii 2 development is very welcome!
You may participate in the following ways:
* [Report issues](https://github.com/yiisoft/yii2/issues)
* [Give us feedback or start a design discussion](http://www.yiiframework.com/forum/index.php/forum/42-design-discussions-for-yii-20/)
* Fix issues, develop features, write/polish documentation
- Before you start, please adopt an existing issue (labelled with "ready for adoption") or start a new one to avoid duplicated efforts.
- Please submit a merge request after you finish development.
- [Report an issue](docs/internals/report-an-issue.md)
- [Translate documentation or messages](docs/internals/translation-workflow.md)
- [Give us feedback or start a design discussion](http://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/)
- [Contribute to the core code or fix bugs](docs/internals/git-workflow.md)
In order to make it easier we've prepared [special `yii2-dev` Composer package](https://github.com/yiisoft/yii2/blob/master/docs/internals/getting-started.md).
### Acknowledging or citing Yii 2
**In presentations**
If you are giving a presentation or talk featuring work that makes use of Yii 2 and would like to acknowledge it,
we suggest using [our logo](http://www.yiiframework.com/logo/) on your title slide.
**In projects**
If you are using Yii 2 as part of an OpenSource project, a way to acknowledge it is to
[use a special badge](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat) in your README:
![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat)
If your code is hosted at GitHub, you can place the following in your README.md file to get the badge:
```
[![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat)](http://www.yiiframework.com/)
```

4
build/build

@ -8,10 +8,6 @@
* @license http://www.yiiframework.com/license/
*/
// fcgi doesn't have STDIN and STDOUT defined by default
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
define('YII_DEBUG', true);
$composerAutoload = [

52
build/controllers/DevController.php

@ -26,9 +26,15 @@ class DevController extends Controller
{
public $defaultAction = 'all';
/**
* @var bool whether to use HTTP when cloning github repositories
*/
public $useHttp = false;
public $apps = [
'basic' => 'git@github.com:yiisoft/yii2-app-basic.git',
'advanced' => 'git@github.com:yiisoft/yii2-app-advanced.git',
'benchmark' => 'git@github.com:yiisoft/yii2-app-benchmark.git',
];
public $extensions = [
@ -62,14 +68,14 @@ class DevController extends Controller
}
foreach($this->extensions as $ext => $repo) {
$ret = $this->actionExt($ext, $repo);
$ret = $this->actionExt($ext);
if ($ret !== 0) {
return $ret;
}
}
foreach($this->apps as $app => $repo) {
$ret = $this->actionApp($app, $repo);
$ret = $this->actionApp($app);
if ($ret !== 0) {
return $ret;
}
@ -97,12 +103,15 @@ class DevController extends Controller
$dirs = array_merge($dirs, $this->listSubDirs("$base/apps"));
asort($dirs);
$oldcwd = getcwd();
foreach($dirs as $dir) {
$displayDir = substr($dir, strlen($base));
$this->stdout("Running '$command' in $displayDir...\n", Console::BOLD);
chdir($dir);
passthru($command);
$this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);
}
chdir($oldcwd);
}
/**
@ -132,6 +141,9 @@ class DevController extends Controller
if (empty($repo)) {
if (isset($this->apps[$app])) {
$repo = $this->apps[$app];
if ($this->useHttp) {
$repo = str_replace('git@github.com:', 'https://github.com/', $repo);
}
} else {
$this->stderr("Repo argument is required for app '$app'.\n", Console::FG_RED);
return 1;
@ -167,6 +179,8 @@ class DevController extends Controller
*
* @param string $extension the application name e.g. `basic` or `advanced`.
* @param string $repo url of the git repo to clone if it does not already exist.
*
* @return int
*/
public function actionExt($extension, $repo = null)
{
@ -178,6 +192,9 @@ class DevController extends Controller
if (empty($repo)) {
if (isset($this->extensions[$extension])) {
$repo = $this->extensions[$extension];
if ($this->useHttp) {
$repo = str_replace('git@github.com:', 'https://github.com/', $repo);
}
} else {
$this->stderr("Repo argument is required for extension '$extension'.\n", Console::FG_RED);
return 1;
@ -208,7 +225,23 @@ class DevController extends Controller
return 0;
}
/**
* @inheritdoc
*/
public function options($actionID)
{
$options = parent::options($actionID);
if (in_array($actionID, ['ext', 'app', 'all'], true)) {
$options[] = 'useHttp';
}
return $options;
}
/**
* Remove all symlinks in the vendor subdirectory of the directory specified
* @param string $dir base directory
*/
protected function cleanupVendorDir($dir)
{
if (is_link($link = "$dir/vendor/yiisoft/yii2")) {
@ -224,6 +257,13 @@ class DevController extends Controller
}
}
/**
* Creates symlinks to freamework and extension sources for the application
* @param string $dir application directory
* @param string $base Yii sources base directory
*
* @return int
*/
protected function linkFrameworkAndExtensions($dir, $base)
{
if (is_dir($link = "$dir/vendor/yiisoft/yii2")) {
@ -263,6 +303,12 @@ class DevController extends Controller
}
}
/**
* Get a list of subdirectories for directory specified
* @param string $dir directory to read
*
* @return array list of subdirectories
*/
protected function listSubDirs($dir)
{
$list = [];
@ -311,7 +357,7 @@ class DevController extends Controller
closedir($handle);
foreach($list as $i => $e) {
if ($e == 'composer') { // skip composer to not break composer update
if ($e === 'composer') { // skip composer to not break composer update
unset($list[$i]);
}
}

122
build/controllers/ReleaseController.php

@ -10,6 +10,7 @@ namespace yii\build\controllers;
use Yii;
use yii\base\Exception;
use yii\console\Controller;
use yii\helpers\ArrayHelper;
/**
* ReleaseController is there to help preparing releases
@ -25,50 +26,54 @@ class ReleaseController extends Controller
* Usage:
*
* ```
* ./build/build release/prepare 2.0.0-beta
* ./build/build release/prepare framework 2.0.0-beta
* ./build/build release/prepare redis 2.0.0-beta
* ```
*
*/
public function actionPrepare($version)
public function actionPrepare(array $what, $version)
{
$this->resortChangelogs($version);
$this->mergeChangelogs($version);
$this->closeChangelogs($version);
$this->composerSetStability($version);
$this->resortChangelogs($what, $version);
$this->closeChangelogs($what, $version);
$this->composerSetStability($what, $version);
if (in_array('framework', $what)) {
$this->updateYiiVersion($version);
}
}
/**
* Usage:
*
* ```
* ./build/build release/done 2.0.0-dev 2.0.0-rc
* ./build/build release/done framework 2.0.0-dev 2.0.0-rc
* ./build/build release/done redis 2.0.0-dev 2.0.0-rc
* ```
*/
public function actionDone($devVersion, $nextVersion)
public function actionDone(array $what, $devVersion, $nextVersion)
{
$this->openChangelogs($nextVersion);
$this->composerSetStability('dev');
$this->openChangelogs($what, $nextVersion);
$this->composerSetStability($what, 'dev');
if (in_array('framework', $what)) {
$this->updateYiiVersion($devVersion);
}
}
protected function closeChangelogs($version)
protected function closeChangelogs($what, $version)
{
$v = str_replace('\\-', '[\\- ]', preg_quote($version, '/'));
$headline = $version . ' ' . date('F d, Y');
$this->sed(
'/'.$v.' under development\n(-+?)\n/',
$headline . "\n" . str_repeat('-', strlen($headline)) . "\n",
$this->getChangelogs()
$this->getChangelogs($what)
);
}
protected function openChangelogs($version)
protected function openChangelogs($what, $version)
{
$headline = "\n$version under development\n";
$headline .= str_repeat('-', strlen($headline) - 2) . "\n\n";
$headline .= "- no changes in this release.\n";
foreach($this->getChangelogs() as $file) {
foreach($this->getChangelogs($what) as $file) {
$lines = explode("\n", file_get_contents($file));
$hl = [
array_shift($lines),
@ -80,9 +85,9 @@ class ReleaseController extends Controller
}
}
protected function resortChangelogs($version)
protected function resortChangelogs($what, $version)
{
foreach($this->getChangelogs() as $file) {
foreach($this->getChangelogs($what) as $file) {
// split the file into relevant parts
list($start, $changelog, $end) = $this->splitChangelog($file, $version);
$changelog = $this->resortChangelog($changelog);
@ -90,31 +95,6 @@ class ReleaseController extends Controller
}
}
protected function mergeChangelogs($version)
{
$file = $this->getFrameworkChangelog();
// split the file into relevant parts
list($start, $changelog, $end) = $this->splitChangelog($file, $version);
$changelog = $this->resortChangelog($changelog);
$changelog[] = '';
$extensions = $this->getExtensionChangelogs();
asort($extensions);
foreach($extensions as $changelogFile) {
if (!preg_match('~extensions/([a-z]+)/CHANGELOG\\.md~', $changelogFile, $m)) {
throw new Exception("Illegal extension changelog file: " . $changelogFile);
}
list( , $extensionChangelog, ) = $this->splitChangelog($changelogFile, $version);
$name = $m[1];
$ucname = ucfirst($name);
$changelog[] = "### $ucname Extension (yii2-$name)";
$changelog = array_merge($changelog, $extensionChangelog);
}
file_put_contents($file, implode("\n", array_merge($start, $changelog, $end)));
}
/**
* Extract changelog content for a specific version
*/
@ -151,14 +131,33 @@ class ReleaseController extends Controller
foreach($changelog as $i => $line) {
$changelog[$i] = rtrim($line);
}
$changelog = array_filter($changelog);
$i = 0;
ArrayHelper::multisort($changelog, function($line) use (&$i) {
if (preg_match('/^- (Chg|Enh|Bug)( #\d+(, #\d+)*)?: .+$/', $line, $m)) {
$o = ['Bug' => 'C', 'Enh' => 'D', 'Chg' => 'E'];
return $o[$m[1]] . ' ' . (!empty($m[2]) ? $m[2] : 'AAAA' . $i++);
}
return 'B' . $i++;
}, SORT_ASC, SORT_NATURAL);
// re-add leading and trailing lines
array_unshift($changelog, '');
$changelog[] = '';
$changelog[] = '';
// TODO sorting
return $changelog;
}
protected function getChangelogs()
protected function getChangelogs($what)
{
return array_merge([$this->getFrameworkChangelog()], $this->getExtensionChangelogs());
$changelogs = [];
if (in_array('framework', $what)) {
$changelogs[] = $this->getFrameworkChangelog();
}
return array_merge($changelogs, $this->getExtensionChangelogs($what));
}
protected function getFrameworkChangelog()
@ -166,13 +165,34 @@ class ReleaseController extends Controller
return YII2_PATH . '/CHANGELOG.md';
}
protected function getExtensionChangelogs()
protected function getExtensionChangelogs($what)
{
return glob(dirname(YII2_PATH) . '/extensions/*/CHANGELOG.md');
return array_filter(glob(dirname(YII2_PATH) . '/extensions/*/CHANGELOG.md'), function($elem) use ($what) {
foreach($what as $ext) {
if (strpos($elem, "extensions/$ext/CHANGELOG.md") !== false) {
return true;
}
}
return false;
});
}
protected function composerSetStability($version)
protected function composerSetStability($what, $version)
{
$apps = [];
if (in_array('app-advanced', $what)) {
$apps[] = dirname(YII2_PATH) . '/apps/advanced/composer.json';
}
if (in_array('app-basic', $what)) {
$apps[] = dirname(YII2_PATH) . '/apps/basic/composer.json';
}
if (in_array('app-benchmark', $what)) {
$apps[] = dirname(YII2_PATH) . '/apps/benchmark/composer.json';
}
if (empty($apps)) {
return;
}
$stability = 'stable';
if (strpos($version, 'alpha') !== false) {
$stability = 'alpha';
@ -187,11 +207,7 @@ class ReleaseController extends Controller
$this->sed(
'/"minimum-stability": "(.+?)",/',
'"minimum-stability": "' . $stability . '",',
[
dirname(YII2_PATH) . '/apps/advanced/composer.json',
dirname(YII2_PATH) . '/apps/basic/composer.json',
dirname(YII2_PATH) . '/apps/benchmark/composer.json',
]
$apps
);
}

27
composer.json

@ -52,41 +52,26 @@
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "dev",
"replace": {
"yiisoft/yii2": "self.version"
},
"require": {
"php": ">=5.4.0",
"ext-mbstring": "*",
"lib-pcre": "*",
"yiisoft/yii2-composer": "*",
"ezyang/htmlpurifier": "4.6.*",
"cebe/markdown": "~1.0.0 | ~1.1.0",
"bower-asset/jquery": "2.1.*@stable | 1.11.*@stable",
"bower-asset/jquery.inputmask": "3.1.*",
"bower-asset/punycode": "1.3.*",
"bower-asset/yii2-pjax": "2.0.*",
"bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*",
"bower-asset/jquery-ui": "1.11.*@stable",
"bower-asset/typeahead.js": "0.10.*"
"bower-asset/yii2-pjax": ">=2.0.1"
},
"require-dev": {
"phpunit/phpunit": "~4.5",
"twig/twig": "*",
"smarty/smarty": "~3.1",
"imagine/imagine": "0.5.*",
"swiftmailer/swiftmailer": "*",
"fzaninotto/faker": "*",
"phpunit/phpunit": "~4.4",
"cebe/indent": "*"
},
"suggest": {
"phpdocumentor/reflection": "required by yii2-apidoc extension",
"ext-curl": "required by yii2-elasticsearch extension",
"ext-mongo": "required by yii2-mongo extension",
"ext-pdo": "required by yii2-sphinx extension",
"ext-pdo_mysql": "required by yii2-sphinx extension",
"fzaninotto/faker": "required by yii2-faker extension",
"imagine/imagine": "required by yii2-imagine extension",
"phpspec/php-diff": "required by yii2-gii extension",
"smarty/smarty": "required by yii2-smarty extension",
"swiftmailer/swiftmailer": "required by yii2-swiftmailer extension",
"twig/twig": "required by yii2-twig extension",
"yiisoft/yii2-coding-standards": "you can use this package to check for code style issues when contributing to yii"
},
"autoload": {

696
composer.lock generated

File diff suppressed because it is too large Load Diff

6
docs/guide-es/README.md

@ -147,7 +147,7 @@ Servicios Web RESTful
Herramientas de Desarrollo
--------------------------
* **TBD** [Depurador y Barra de Herramientas de Depuración](tool-debugger.md)
* [Depurador y Barra de Herramientas de Depuración](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-es/README.md)
* **TBD** [Generación de códigos con Gii](tool-gii.md)
* **TBD** [Generación de documentación de API](tool-api-doc.md)
@ -189,8 +189,8 @@ Widgets
* Menu: **TBD** link to demo page
* LinkPager: **TBD** link to demo page
* LinkSorter: **TBD** link to demo page
* **TBD** [Bootstrap Widgets](bootstrap-widgets.md)
* **TBD** [Jquery UI Widgets](jui-widgets.md)
* [Bootstrap Widgets](https://github.com/yiisoft/yii2-bootstrap/blob/master/docs/guide-es/README.md)
* [Jquery UI Widgets](https://github.com/yiisoft/yii2-jui/blob/master/docs/guide-es/README.md)
Clases auxiliares

4
docs/guide-es/intro-yii.md

@ -25,11 +25,11 @@ Si estás familiarizado con otros framework, puedes apreciar como se compara Yii
- Yii es extremadamente extensible. Puedes personalizar o reemplazar prácticamente cualquier pieza de código de base, como se puede también aprovechar su sólida arquitectura de extensiones para utilizar o desarrollar extensiones distribuibles.
- El alto rendimiento es siempre la meta principal de Yii.
Yii no es un proyecto de un sola persona, detrás de Yii hay un [sólido equipo de desarrollo][], así como una gran comunidad en la que numerosos profesionales contribuyen constantemente a su desarrollo.
Yii no es un proyecto de un sola persona, detrás de Yii hay un [sólido equipo de desarrollo][about_yii], así como una gran comunidad en la que numerosos profesionales contribuyen constantemente a su desarrollo.
El equipo de desarrollo de Yii se mantiene atento a las últimas tendencias de desarrollo web, así como a las mejores prácticas y características de otros frameworks y proyectos.
Las buenas prácticas y características más relevantes de otros proyectos se incorporan regularmente a la base del framework y se exponen a través de interfaces simples y elegantes.
[sólido equipo de desarrollo]: http://www.yiiframework.com/about/
[about_yii]: http://www.yiiframework.com/about/
Versiones de Yii
----------------

4
docs/guide-es/start-gii.md

@ -24,7 +24,9 @@ $config = [ ... ];
if (YII_ENV_DEV) {
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
```

6
docs/guide-es/start-installation.md

@ -1,7 +1,7 @@
Instalando Yii
==============
Yii puede ser instalado de dos maneras, usando [Composer](http://getcomposer.org/) o descargando un archivo comprimido.
Yii puede ser instalado de dos maneras, usando [Composer](https://getcomposer.org/) o descargando un archivo comprimido.
Es preferible usar la primera forma, ya que te permite instalar [extensiones](structure-extensions.md) o actualizar Yii ejecutando un simple comando.
> Nota: A diferencia de Yii 1, la instalación estándar de Yii 2 resulta en la descarga e instalación tanto del framework como del esqueleto de la aplicación.
@ -13,7 +13,7 @@ Instalando a través de Composer <span id="installing-via-composer"></span>
Si aún no tienes Composer instalado, puedes hacerlo siguiendo las instrucciones que se encuentran en
[getcomposer.org](https://getcomposer.org/download/). En Linux y Mac OS X, se ejecutan los siguientes comandos:
curl -s http://getcomposer.org/installer | php
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
En Windows, tendrás que descargar y ejecutar [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).
@ -26,7 +26,7 @@ Si ya tienes composer instalado asegurate que esté actualizado ejecutando `comp
Teniendo Composer instalado, puedes instalar Yii ejecutando los siguientes comandos en un directorio accesible vía Web:
Nota: es posible que en al ejecutar el primer comando te pida tu username
composer global require "fxp/composer-asset-plugin:1.0.0"
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
El comando anterior instala Yii dentro del directorio `basic`.

4
docs/guide-es/structure-applications.md

@ -386,7 +386,7 @@ sin proveer ningún argumento, mostrará la información de ayuda.
Esta propiedad especifica la lista de [extensiones](structure-extensions.md) que se encuentran instaladas y son utilizadas
por la aplicación.
Por defecto, tomará el array devuelto por el archivo `@vendor/yiisoft/extensions.php`. El archivo `extensions.php`
es generado y mantenido automáticamente cuando utilizas [Composer](http://getcomposer.org) para instalar extensiones.
es generado y mantenido automáticamente cuando utilizas [Composer](https://getcomposer.org) para instalar extensiones.
Por lo tanto, en la mayoría de los casos no necesitas configurarla.
En el caso especial de que quieras mantener las extensiones a mano, puedes configurar la propiedad como se muestra a continuación:
@ -456,7 +456,7 @@ representado por el alias `@app/views`. Puedes configurarlo como un directorio o
#### [[yii\base\Application::vendorPath|vendorPath]] <span id="vendorPath"></span>
Esta propiedad especifica el directorio `vendor` que maneja [Composer](http://getcomposer.org). Contiene
Esta propiedad especifica el directorio `vendor` que maneja [Composer](https://getcomposer.org). Contiene
todas las librerías de terceros utilizadas por tu aplicación, incluyendo el núcleo de Yii. Su valor por defecto
está representado por el alias `@app/vendor`.

10
docs/guide-es/structure-controllers.md

@ -112,7 +112,7 @@ Por esta razón, los IDs de controladores son a menudo sustantivos de los tipos
Por ejemplo, podrías utilizar `article` como el ID de un controlador que maneja datos de artículos.
Por defecto, los IDs de controladores deberían contener sólo estos caracteres: letras del Inglés en minúscula, dígitos,
guiones bajos y medios, y barras. Por ejemplo, `article`, `post-comment`, `admin/post2-comment` son todos
guiones bajos y medios, y barras. Por ejemplo, `article`, `post-comment`, `admin/post-comment` son todos
IDs de controladores válidos, mientras que `article?`, `PostComment`, `admin\post` no lo son.
Los guiones en un ID de controlador son utilizados para separar palabras, mientras que las barras diagonales lo son para
@ -134,14 +134,14 @@ toma el valor por defecto: `app\controllers`:
* `article` deriva en `app\controllers\ArticleController`;
* `post-comment` deriva en `app\controllers\PostCommentController`;
* `admin/post2-comment` deriva en `app\controllers\admin\Post2CommentController`.
* `admin/post-comment` deriva en `app\controllers\admin\PostCommentController`.
Las clases de controladores deben ser [autocargables](concept-autoloading.md). Por esta razón, en los ejemplos anteriores,
la clase del controlador `article` debe ser guardada en un archivo cuyo alias [alias](concept-aliases.md)
es `@app/controllers/ArticleController.php`; mientras que el controlador `admin/post2-comment` debería estar
en `@app/controllers/admin/Post2CommentController.php`.
es `@app/controllers/ArticleController.php`; mientras que el controlador `admin/post-comment` debería estar
en `@app/controllers/admin/PostCommentController.php`.
> Información: En el último ejemplo, `admin/post2-comment`, demuestra cómo puedes poner un controlador bajo un sub-directorio
> Información: En el último ejemplo, `admin/post-comment`, demuestra cómo puedes poner un controlador bajo un sub-directorio
del [[yii\base\Application::controllerNamespace|controller namespace]]. Esto es útil cuando quieres organizar
tus controladores en varias categorías pero sin utilizar [módulos](structure-modules.md).

6
docs/guide-es/structure-entry-scripts.md

@ -17,7 +17,7 @@ deberían ser ejecutables para que los usuarios puedan ejecutar las aplicaciones
El script de entrada principalmente hace los siguientes trabajos:
* Definir las constantes globales;
* Registrar el [cargador automático de Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Registrar el [cargador automático de Composer](https://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Incluir el archivo de clase [[Yii]];
* Cargar la configuración de la aplicación;
* Crear y configurar una instancia de [aplicación](structure-applications.md);
@ -63,10 +63,6 @@ De la misma manera, el siguiente código es el script de entrada para la [aplica
defined('YII_DEBUG') or define('YII_DEBUG', true);
// el fcgi no tiene STDIN y STDOUT definidos por defecto
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
// registrar el cargador automático de Composer
require(__DIR__ . '/vendor/autoload.php');

63
docs/guide-es/widget-bootstrap.md

@ -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' => [],
]
]
]
```

27
docs/guide-es/widget-jui.md

@ -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]]

106
docs/guide-fr/concept-aliases.md

@ -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');
```

4
docs/guide-fr/intro-yii.md

@ -29,13 +29,13 @@ support cache multi-niveaux; et plus.
profiter de son architecture extensible solide, afin d'utiliser ou développer des extensions redistribuables.
- La haute performance est toujours un des principaux objectifs de Yii.
Yii n'est pas un one-man show, il est soutenu par une [solide équipe de développement du noyau][] ainsi que d'une grande communauté
Yii n'est pas un one-man show, il est soutenu par une [solide équipe de développement du noyau][about_yii] ainsi que d'une grande communauté
avec de nombreux professionnels qui contribuent constamment au développement de Yii. L'équipe de développeurs de Yii
garde un œil attentif sur les dernières tendances en développement Web, et sur les meilleures pratiques et caractéristiques
trouvées dans d'autres frameworks ou projets. Les meilleures pratiques et caractéristiques les plus pertinentes trouvées ailleurs sont régulièrement intégrées dans le code du noyau et utilisables
via des interfaces simples et élégantes.
[solide équipe de développement du noyau]: http://www.yiiframework.com/about/
[about_yii]: http://www.yiiframework.com/about/
Versions de Yii
---------------

4
docs/guide-fr/start-gii.md

@ -26,7 +26,9 @@ $config = [ ... ];
if (YII_ENV_DEV) {
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
```

4
docs/guide-fr/start-installation.md

@ -1,7 +1,7 @@
Installer Yii
=============
Vous pouvez installer Yii de deux façons, en utilisant [Composer](http://getcomposer.org/) ou en téléchargeant une archive.
Vous pouvez installer Yii de deux façons, en utilisant [Composer](https://getcomposer.org/) ou en téléchargeant une archive.
La première méthode est conseillée, étant donné qu'elle permet d'installer de nouvelles [extensions](extend-creating-extensions.md) ou de mettre à jour Yii en éxécutant simplement une commande.
> Remarque : Contrairement à Yii 1, les installations standards de Yii 2 auront pour résultat le téléchargement et l'installation du framework, ainsi que d'un squelette d'application.
@ -13,7 +13,7 @@ Installer via Composer <span id="installing-via-composer"></span>
Si vous n'avez pas déjà installé Composer, vous pouvez le faire en suivant les instructions sur le site [getcomposer.org](https://getcomposer.org/download/).
Sous Linux et Mac OS X, vous pouvez éxécuter les commandes :
curl -s http://getcomposer.org/installer | php
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Sous Windows, téléchargez et éxécutez [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).

6
docs/guide-fr/structure-entry-scripts.md

@ -16,7 +16,7 @@ utilisateurs puissent lancer des applications console grâce à la commande `./y
Les scipts de démarrage effectuent principalement les tâches suivantes :
* Définir des constantes globales;
* Enregistrer l'[autoloader Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Enregistrer l'[autoloader Composer](https://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Inclure le fichier de classe de [[Yii]];
* Charger la configuration de l'application;
* Créer et configurer une instance d'[application](structure-applications.md);
@ -64,10 +64,6 @@ De même, le code qui suit est le code du script de démarrage d'une application
defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi doesn't have STDIN and STDOUT defined by default
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
// register Composer autoloader
require(__DIR__ . '/vendor/autoload.php');

4
docs/guide-it/intro-yii.md

@ -29,13 +29,13 @@ Se hai già familiarità con altri framework potrai apprezzare questi punti in c
sfuttare la solida architettura delle estensioni di Yii per usare o sviluppare estensioni ridistribuibili.
- Le prestazioni elevate sono sempre il focus primario di Yii.
Yii non è frutto di un uomo solo, ma è supportato da un [folto gruppo di sviluppatori][], così come da una numerosa
Yii non è frutto di un uomo solo, ma è supportato da un [folto gruppo di sviluppatori][about_yii], così come da una numerosa
comunità di professionisti che contribuiscono costantemente allo sviluppo. Il gruppo di sviluppatori tiene sempre
sott'occhio le ultime tendenze e tecnologie di sviluppo web, sulle pratiche ottimali e funzionalità degli altri
framework e progetti. Le peculiarità più rilevanti che si trovano altrove sono regolarmente incorporate nel
codice principale del framework, e rese disponibili tramite semplici ed eleganti interfacce.
[folto gruppo di sviluppatori]: http://www.yiiframework.com/about/
[about_yii]: http://www.yiiframework.com/about/
Versioni di Yii
---------------

6
docs/guide-it/start-installation.md

@ -1,7 +1,7 @@
Installare Yii
==============
Puoi installare Yii in due modi, usando [Composer](http://getcomposer.org/) o scaricando un archivio.
Puoi installare Yii in due modi, usando [Composer](https://getcomposer.org/) o scaricando un archivio.
Il metodo preferito è il primo, perché ti consente di installare [estensioni](structure-extensions.md) o aggiornare il core di Yii
semplicemente eseguendo un comando.
@ -14,7 +14,7 @@ Installazione via Composer <span id="installing-via-composer"></span>
Se non hai già installato Composer puoi farlo seguendo le istruzioni al sito
[getcomposer.org](https://getcomposer.org/download/). Su Linux e Mac OS X puoi installare Composer con questo comando:
curl -s http://getcomposer.org/installer | php
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Su Windows devi scaricare ed eseguire [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).
@ -27,7 +27,7 @@ Se hai già Composer installato assicurati di avere una versione aggiornata. Puo
Una volta installato Composer, puoi installare Yii eseguendo questo comando in una directory accessbile via web:
composer global require "fxp/composer-asset-plugin:1.0.0"
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Il primo comando installa il [plugin composer asset](https://github.com/francoispluchino/composer-asset-plugin/)

26
docs/guide-ja/README.md

@ -78,10 +78,10 @@ All Rights Reserved.
* [クエリビルダ](db-query-builder.md): シンプルな抽象レイヤを使ってデータベースに対してクエリを行う
* [アクティブレコード](db-active-record.md): アクティブレコード ORM、レコードの読み出しと操作、リレーションの定義
* [マイグレーション](db-migrations.md): チーム開発環境においてデータベースにバージョンコントロールを適用
* **未定** [Sphinx](db-sphinx.md)
* **未定** [Redis](db-redis.md)
* **未定** [MongoDB](db-mongodb.md)
* **未定** [ElasticSearch](db-elasticsearch.md)
* [Sphinx](https://github.com/yiisoft/yii2-sphinx/blob/master/docs/guide-ja/README.md)
* [Redis](https://github.com/yiisoft/yii2-redis/blob/master/docs/guide-ja/README.md)
* [MongoDB](https://github.com/yiisoft/yii2-mongodb/blob/master/docs/guide-ja/README.md)
* [ElasticSearch](https://github.com/yiisoft/yii2-elasticsearch/blob/master/docs/guide-ja/README.md)
ユーザからのデータ取得
@ -91,7 +91,7 @@ All Rights Reserved.
* [入力を検証する](input-validation.md)
* [ファイルをアップロードする](input-file-upload.md)
* [表形式インプットのデータ収集](input-tabular-input.md)
* [複数モデルのデータ取得](input-multiple-models.md)
* [複数モデルのデータ取得する](input-multiple-models.md)
データの表示
@ -112,7 +112,7 @@ All Rights Reserved.
* [認証](security-authentication.md)
* [権限付与](security-authorization.md)
* [パスワードを扱う](security-passwords.md)
* [認証クライアント](security-auth-clients.md)
* [認証クライアント](https://github.com/yiisoft/yii2-authclient/blob/master/docs/guide-ja/README.md)
* [ベストプラクティス](security-best-practices.md)
@ -143,8 +143,8 @@ RESTful ウェブサービス
開発ツール
----------
* [デバッグツールバーとデバッガ](tool-debugger.md)
* [Gii を使ってコードを生成する](tool-gii.md)
* [デバッグツールバーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md)
* [Gii を使ってコードを生成する](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/README.md)
テスト
@ -184,14 +184,14 @@ RESTful ウェブサービス
* Menu: **未定** デモページへリンク
* LinkPager: **未定** デモページへリンク
* LinkSorter: **未定** デモページへリンク
* [Bootstrap ウィジェット](widget-bootstrap.md)
* [jQuery UI ウィジェット](widget-jui.md)
* [Bootstrap ウィジェット](https://github.com/yiisoft/yii2-bootstrap/blob/master/docs/guide-ja/README.md)
* [jQuery UI ウィジェット](https://github.com/yiisoft/yii2-jui/blob/master/docs/guide-ja/README.md)
ヘルパ
------
* [概要](helper-overview.md)
* [ArrayHelper](helper-array.md)
* [Html](helper-html.md)
* [Url](helper-url.md)
* [配列ヘルパ](helper-array.md)
* [Html ヘルパ](helper-html.md)
* [Url ヘルパ](helper-url.md)

2
docs/guide-ja/caching-data.md

@ -213,7 +213,7 @@ $data = $cache->get($key);
クエリキャッシュは、データキャッシュ上に構築された特別なキャッシュ機能で、データベースのクエリ結果をキャッシュするために提供されています。
クエリキャッシュは [[yii\db\Connection|データベース接続]] と有効な `cache` アプリケーションコンポーネントを必要とします。
クエリキャッシュは [[yii\db\Connection|データベース接続]] と有効な `cache` [アプリケーションコンポーネント](#cache-components) を必要とします。
`$db` を [[yii\db\Connection]] のインスタンスと仮定した場合、クエリキャッシュの基本的な使い方は以下のようになります:
```php

25
docs/guide-ja/concept-autoloading.md

@ -1,8 +1,8 @@
クラスのオートローディング
=================
Yiiは、必要となるすべてのクラスファイルを特定してインクルードするにあたり、 [クラスのオートローディングメカニズム](http://www.php.net/manual/ja/language.oop5.autoload.php)
を頼りにします。[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md) に準拠した、高性能なクラスのオートローダーを提供します。
Yiiは、必要となるすべてのクラスファイルを特定してインクルードするにあたり、 [クラスのオートローディングメカニズム](http://www.php.net/manual/ja/language.oop5.autoload.php)
を頼りにします。Yii は、[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md) に準拠した、高性能なクラスのオートローダーを提供しています。
このオートローダーは、あなたが `Yii.php` ファイルをインクルードするときにインストールされます。
> 補足: 説明を簡単にするため、このセクションではクラスのオートローディングについてのみお話しします。しかし、
@ -14,24 +14,24 @@ Yii オートローダーの使用 <span id="using-yii-autoloader"></span>
Yii のクラスオートローダーを使用するには、自分のクラスを作成して名前を付けるとき、次の2つの単純なルールに従わなければなりません:
* 各クラスは名前空間の下になければなりません (例 `foo\bar\MyClass`)
* 各クラスは [名前空間](http://php.net/manual/ja/language.namespaces.php) の下になければなりません (例 `foo\bar\MyClass`)
* 各クラスは次のアルゴリズムで決定される個別のファイルに保存されなければなりません:
```php
// $className は先頭にバックスラッシュを持つ完全修飾
// $className は先頭にバックスラッシュを持たない完全修飾クラス
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
```
たとえば、クラス名と名前空間が `foo\bar\MyClass` であれば、対応するクラスファイルのパスの [エイリアス](concept-aliases.md) は、
`@foo/bar/MyClass.php` になります。このエイリアスがファイルパスになるようにするには、`@foo` または `@foo/bar`
`@foo/bar/MyClass.php` になります。このエイリアスがファイルパスとして解決できるようにするためには、`@foo` または `@foo/bar`
のどちらかが、 [ルートエイリアス](concept-aliases.md#defining-aliases) でなければなりません。
[ベーシックプロジェクトテンプレート](start-basic.md) を使用している場合、最上位の名前空間 `app` の下にクラスを置くことができ、
[ベーシックプロジェクトテンプレート](start-installation.md) を使用している場合、最上位の名前空間 `app` の下にクラスを置くことができ、
そうすると、新しいエイリアスを定義しなくても、Yii によってそれらをオートロードできるようになります。これは `@app`
が [事前定義されたエイリアス](concept-aliases.md#predefined-aliases) であるためで、`app\components\MyClass` のようなクラス名を
今説明したアルゴリズムに従って、クラスファイル `AppBasePath/components/MyClass.php` だと解決できるのです。
今説明したアルゴリズムに従って、クラスファイル `AppBasePath/components/MyClass.php` であると解決することが出来ます。
[アドバンストプロジェクトテンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) では、各階層にそれ自身のルートエイリアスを持っています。たとえば、
フロントエンド層はルートエイリアス `@frontend` を持ち、バックエンド層は `@backend` です。その結果、名前空間 `frontend` の下に
[アドバンストプロジェクトテンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) では、各層がそれ自身のルートエイリアスを持っています。たとえば、
フロントエンド層はルートエイリアス `@frontend` を持ち、バックエンド層のルートエイリアス`@backend` です。その結果、名前空間 `frontend` の下に
フロントエンドクラスを置き、バックエンドクラスを `backend` の下に置けます。これで、これらのクラスは Yii のオートローダーによって
オートロードできるようになります。
@ -62,7 +62,7 @@ Yii はパッケージ依存関係マネージャとして Composer を包含し
Yii オートローダーを他のオートローダーと一緒に使うときは、他のすべてのオートローダーがインストールされた *後で*`Yii.php`
ファイルをインクルードする必要があります。これで Yii のオートローダーが、任意クラスのオートローディング要求に応答する最初のものになります。
たとえば、次のコードは [Basic Application Template](start-basic.md) の [エントリスクリプト](structure-entry-scripts.md) から抜粋したものです。
たとえば、次のコードは [ベーシックプロジェクトテンプレート](start-installation.md) の [エントリスクリプト](structure-entry-scripts.md) から抜粋したものです。
最初の行は、Composer のオートローダーをインストールしており、二行目は Yii のオートローダーをインストールしています。
```php
@ -73,7 +73,7 @@ require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
あなたは Yii のオートローダーを使わず、Composer のオートローダーだけを単独で使用することもできます。しかし、そうすることによって、
あなたのクラスのオートローディングのパフォーマンスは低下し、クラスをオートロード可能にするために Composer が設定したルールに従わなければならなくなります。
> Info: Yiiのオートローダーを使用したくない場合は、 `Yii.php` ファイルの独自のバージョンを作成し、
> Info: Yiiのオートローダーを使用したくない場合は、 `Yii.php` ファイルのあなた独自のバージョンを作成し、
それを [エントリスクリプト](structure-entry-scripts.md) でインクルードする必要があります。
@ -84,5 +84,4 @@ Yii のオートローダーは、 [エクステンション](structure-extensio
エクステンションがその `composer.json` ファイルに正しく `autoload` セクションを指定していることです。
`autoload` 指定方法の詳細については [Composer のドキュメント](https://getcomposer.org/doc/04-schema.md#autoload) 参照してください。
Yii のオートローダーを使用しない場合でも、まだ Composer のオートローダーはエクステンションクラスをオートロード可能です。
Yii のオートローダーを使用しない場合でも、まだ Composer のオートローダーがエクステンションクラスをオートロードすることが可能です。

4
docs/guide-ja/concept-di-container.md

@ -325,8 +325,8 @@ class HotelController extends Controller
}
```
あなたがブラウザからこのコントローラにアクセスすると、 `BookingInterface` をインスタンス化できませんとい
不具合報告エラーが表示されるでしょう。これは、この依存関係に対処する方法を DI コンテナに教える必要があるからです:
あなたがブラウザからこのコントローラにアクセスすると、 `BookingInterface` をインスタンス化できない、という不平を言
エラーが表示されるでしょう。これは、この依存関係に対処する方法を DI コンテナに教える必要があるからです:
```php
\Yii::$container->set('app\components\BookingInterface', 'app\components\BookingService');

10
docs/guide-ja/concept-events.md

@ -4,7 +4,7 @@
イベントを使うと、既存のコードの特定の実行ポイントに、カスタムコードを挿入することができます。イベントにカスタムコードを添付すると、
イベントがトリガされたときにコードが自動的に実行されます。たとえば、メーラーオブジェクトがメッセージを正しく送信できたとき、
`messageSent` イベントをトリガするとします。もしメッセージの送信がうまく行ったことを知りたければ、単に `messageSent`
イベントにトラッキングコードを付与するだけで、それが可能になります。
イベントにトラッキングコードを付与するだけで、それが可能になります。
Yiiはイベントをサポートするために、 [[yii\base\Component]] と呼ばれる基底クラスを導入してします。クラスがイベントをトリガする必要がある場合は、
[[yii\base\Component]] もしくはその子クラスを継承する必要があります。
@ -16,10 +16,10 @@ Yiiはイベントをサポートするために、 [[yii\base\Component]] と
イベントハンドラとは、関連するイベントがトリガされたときに実行される、 [PHP コールバック](http://www.php.net/manual/ja/language.types.callable.php)
です。次のコールバックのいずれも使用可能です:
- 文字列で指定されたグローバル PHP 関数 (括弧を除く) `'trim'` など
- オブジェクトとメソッド名文字列の配列で指定された、オブジェクトのメソッド (括弧を除く) `[$object, 'methodName']` など
- クラス名文字列とメソッド名文字列の配列で指定された、静的なクラスメソッド (括弧を除く) `['ClassName', 'methodName']` など
- 無名関数 `function ($event) { ... }` など
- 文字列で指定されたグローバル PHP 関数 (括弧を除く)、例えば `'trim'`
- オブジェクトとメソッド名文字列の配列で指定された、オブジェクトのメソッド (括弧を除く)、例えば `[$object, 'methodName']`
- クラス名文字列とメソッド名文字列の配列で指定された、静的なクラスメソッド (括弧を除く)、例えば `['ClassName', 'methodName']`
- 無名関数、例えば `function ($event) { ... }`
イベントハンドラのシグネチャはこのようになります:

3
docs/guide-ja/concept-properties.md

@ -65,7 +65,7 @@ setter なしの getter で定義されたプロパティは、 *読み取り専
getter と setter で定義されたプロパティには、いくつかの特別なルールと制限があります:
* この種のプロパティでは、名前の *大文字と小文字を区別しません* 。たとえば、 `$object->label``$object->Label` は同じです。
これは、PHPのメソッド名が大文字と小文字を区別しないためです。
これは、PHP のメソッド名が大文字と小文字を区別しないためです。
* この種のプロパティの名前と、クラスのメンバ変数の名前とが同じである場合、後者が優先されます。
たとえば、上記の `Foo` クラスがもしメンバ変数 `label` を持っているとすると、`$object->label = 'abc'`
という代入は *メンバ変数の* `label` に作用することになり、その行で `setLabel()` setter メソッドは呼び出されなくなります。
@ -75,4 +75,3 @@ getter と setter で定義されたプロパティには、いくつかの特
このガイドの冒頭で説明した問題に戻ると、 `label` に値が代入されているあらゆる箇所で `trim()` を呼ぶのではなく、もう `setLabel()` という setter の内部だけで `trim()` を呼べば済むのです。
さらに、新しい要求でラベルの先頭を大文字にする必要が発生しても、他のいっさいのコードに触れることなく、すぐに `setLabel()` メソッドを変更することができます。一箇所の変更は、すべての `label` への代入に普遍的に作用します。

13
docs/guide-ja/concept-service-locator.md

@ -1,15 +1,14 @@
サービスロケータ
===============
================
サービスロケータは、アプリケーションが必要とする可能性のある各種のサービス (またはコンポーネント) を提供する方法を知っているオブジェクトです。
サービスロケータ内では、各コンポーネントは単一のインスタンスとして存在し、IDによって一意に識別されます。
あなたは、このIDを使用してサービスロケータからコンポーネントを取得できます。
サービスロケータ内では、各コンポーネントは単一のインスタンスとして存在し、ID によって一意に識別されます。
あなたは、この ID を使用してサービスロケータからコンポーネントを取得できます。
Yii では、サービスロケータは単純に [[yii\di\ServiceLocator]] のインスタンス、または子クラスのインスタンスです。
Yii の中で最も一般的に使用されるサービスロケータは、 *アプリケーション* オブジェクトで、 `\Yii::$app`
を通じてアクセスできます。それが提供するサービスは、 *アプリケーションコンポーネント* と呼ばれ、それは `request`
`response``urlManager` のようなコンポーネントです。あなたはサービスロケータによって提供される機能を通じて、
Yii の中で最も一般的に使用されるサービスロケータは、`\Yii::$app` を通じてアクセスできる *アプリケーション* オブジェクトです。これが提供するサービスは、 *アプリケーションコンポーネント* と呼ばれる `request`
`response``urlManager` などのコンポーネントです。あなたはサービスロケータによって提供される機能を通じて、
簡単に、これらのコンポーネントを構成、あるいは独自の実装に置き換え、といったことができます。
アプリケーションオブジェクトの他に、各モジュールオブジェクトもまたサービスロケータです。
@ -56,7 +55,7 @@ $cache = $locator->cache;
それを返します。後でそのコンポーネントが再度アクセスされた場合、サービスロケータは同じインスタンスを返します。
[[yii\di\ServiceLocator::has()]] を使って、コンポーネント ID がすでに登録されているかをチェックできます。
無効なIDで [[yii\di\ServiceLocator::get()]] を呼び出した場合、例外がスローされます。
無効な ID で [[yii\di\ServiceLocator::get()]] を呼び出した場合、例外がスローされます。
サービスロケータは多くの場合、 [構成情報](concept-configurations.md) で作成されるため、
[[yii\di\ServiceLocator::setComponents()|components]] という名前の書き込み可能プロパティが提供されています。

100
docs/guide-ja/db-active-record.md

@ -145,7 +145,7 @@ $count = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->count();
// アクティブな全ての顧客を顧客IDによってインデックスされた配列として返す
// 全ての顧客を顧客IDによってインデックスされた配列として返す
// SELECT * FROM `customer`
$customers = Customer::find()
->indexBy('id')
@ -190,7 +190,7 @@ $customer = Customer::findOne([
// アクティブでない全ての顧客を返す
// SELECT * FROM `customer` WHERE `status` = 0
$customer = Customer::findAll([
$customers = Customer::findAll([
'status' => Customer::STATUS_INACTIVE,
]);
```
@ -236,7 +236,7 @@ $email = $customer->email;
入力または表示されるデータの形式が、データベースにデータを保存するときに使われるものと異なる場合がよくあります。
例えば、データベースでは顧客の誕生日を UNIX タイムスタンプで保存している (まあ、あまり良い設計ではありませんが) けれども、ほとんどの場合において誕生日を `'YYYY/MM/DD'` という形式の文字列として操作したい、というような場合です。
この目的を達するために、次のように、`Customer` アクティブレコードクラスにおいてデータ変換メソッドを定義することが出来ます。
この目的を達するために、次のように、`Customer` アクティブレコードクラスにおいて *データ変換* メソッドを定義することが出来ます。
```php
class Customer extends ActiveRecord
@ -409,6 +409,10 @@ $post->updateCounters(['view_count' => 1]);
最新の修正を受ける前の属性値を知りたい場合は、[[yii\db\ActiveRecord::getOldAttributes()|getOldAttributes()]] または [[yii\db\ActiveRecord::getOldAttribute()|getOldAttribute()]] を呼ぶことが出来ます。
> Note|注意: 新旧の値は `===` 演算子を使って比較されるため、同じ値を持っていても型が違うとダーティであると見なされます。
> このことは、モデルが HTML フォームからユーザの入力を受け取るときにしばしば生じます。
> HTML フォームでは全ての値が文字列として表現されるからです。
> 入力値が正しい型、例えば整数値となることを保証するために、`['attributeName', 'filter', 'filter' => 'intval']` のように [検証フィルタ](input-validation.md#data-filtering) を適用することが出来ます。
### デフォルト属性値 <span id="default-attribute-values"></span>
@ -618,7 +622,7 @@ public function actionUpdate($id)
try {
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', <?= $urlParams ?>]);
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
@ -695,7 +699,7 @@ $customer = Customer::findOne(123);
$orders = $customer->orders;
```
> Info|情報: `xyz` という名前のリレーションを getter メソッド `getXyz()` によって宣言すると、`xyz` をオブジェクト [プロパティ](concept-properties.md) のようにアクセスすることが出来るようになります。
> Info|情報: `xyz` という名前のリレーションを getter メソッド `getXyz()` によって宣言すると、`xyz` を [オブジェクトプロパティ](concept-properties.md) のようにアクセスすることが出来るようになります。
名前は大文字と小文字を区別することに注意してください。
リレーションが [[yii\db\ActiveRecord::hasMany()|hasMany()]] によって宣言されている場合は、このリレーションプロパティにアクセスすると、関連付けられたアクティブレコードインスタンスの配列が返されます。
@ -705,6 +709,16 @@ $orders = $customer->orders;
その同じプロパティに再びアクセスしたときは、SQL 文を再実行することなく、以前の結果が返されます。
SQL 文の再実行を強制するためには、まず、リレーションプロパティの割り当てを解除 (unset) しなければなりません : `unset($customer->orders)`
> Note|注意: リレーションプロパティの概念は [オブジェクトプロパティ](concept-properties.md) の機能と同一であるように見えますが、一つ、重要な相違点があります。
> 通常のオブジェクトプロパティでは、プロパティの値はそれを定義する getter メソッドと同じ型を持ちます。
> しかし、リレーションプロパティにアクセスすると [[yii\db\ActiveRecord]] のインスタンスまたはその配列が返されるのに対して、リレーションメソッドは [[yii\db\ActiveQuery]] のインスタンスを返します。
>
> ```php
> $customer->orders; // `Order` オブジェクトの配列
> $customer->getOrders(); // ActiveQuery のインスタンス
> ```
>
> このことは、次の項で説明するように、カスタマイズしたクエリを作成するのに役に立ちます。
### 動的なリレーショナルクエリ <span id="dynamic-relational-query"></span>
@ -721,6 +735,8 @@ $orders = $customer->getOrders()
->all();
```
リレーションプロパティにアクセスする場合と違って、リレーションメソッドによって動的なリレーショナルクエリを実行する場合は、同じ動的なリレーショナルクエリが以前に実行されたことがあっても、毎回、SQL 文が実行されます。
さらに進んで、もっと簡単に動的なリレーショナルクエリを実行できるように、リレーションの宣言をパラメータ化したい場合もあるでしょう。
例えば、`bigOrders` リレーションを下記のように宣言することが出来ます。
@ -746,11 +762,6 @@ $orders = $customer->getBigOrders(200)->all();
$orders = $customer->bigOrders;
```
> Note|注意: リレーションメソッドが [[yii\db\ActiveQuery]] インスタンスを返すのに対して、リレーションプロパティにアクセスすると [[yii\db\ActiveRecord]] のインスタンスまたはその配列が返されます。
この点で、通常のオブジェクト [プロパティ](concept-properties.md) が、そのプロパティを定義する getter メソッドと同じ型の値を持つのと異なります。
リレーショナルプロパティにアクセスする場合と異なって、リレーショナルメソッドを使って動的なリレーショナルクエリを実行する場合は、前に同じ動的リレーショナルクエリが実行されている場合であっても、毎回、SQL 文が実行されます。
### 中間テーブルによるリレーション <span id="junction-table"></span>
@ -1253,3 +1264,72 @@ $customers = Customer::find()->with([
> Info|情報: Yii 1.1 には、*スコープ* と呼ばれる概念がありました。
Yii 2.0 では、スコープはもはや直接にはサポートされません。
同じ目的を達するためには、カスタマイズされたクエリクラスとクエリメソッドを使わなければなりません。
## 追加のフィールドを選択する
アクティブレコードのインスタンスにクエリ結果からデータが投入されるときは、受け取ったデータセットのカラムの値が対応する属性に入れられます。
クエリ結果から追加のカラムや値を取得して、アクティブレコードの内部に格納することが出来ます。
例えば、ホテルの客室の情報を含む 'room' という名前のテーブルがあるとしましょう。
そして、全ての客室のデータは 'length' (長さ)、'width' (幅)、'height' (高さ) というフィールドを使って、部屋の幾何学的なサイズに関する情報を格納しているとします。
空いている全ての部屋の一覧を容積の降順で取得する必要がある場合を考えて見てください。
レコードをその値で並べ替える必要があるので、PHP を使って容積を計算することは出来ません。
しかし、同時に、一覧には 'volume' (容積) も表示したいでしょう。
目的を達するためには、'Room' アクティブレコードクラスにおいて追加のフィールドを宣言し、'volume' の値を格納する必要があります。
```php
class Room extends \yii\db\ActiveRecord
{
public $volume;
// ...
}
```
そして、部屋の容積を計算して並べ替えを実行するクエリを構築しなければなりません。
```php
$rooms = Room::find()
->select([
'{{room}}.*', // 全てのカラムを選択
'([[length]] * [[width]].* [[height]]) AS volume', // 容積を計算
])
->orderBy('volume DESC') // 並べ替えを適用
->all();
foreach ($rooms as $room) {
echo $room->volume; // SQL によって計算された値を含んでいる
}
```
追加のフィールドが選択できることは、集計クエリに対して特に有効に機能します。
注文の数とともに顧客の一覧を表示する必要がある場合を想定してください。
まず初めに、`Customer` クラスの中で、'orders' リレーションと、注文数を格納するための追加のフィールドを宣言しなければなりません。
```php
class Customer extends \yii\db\ActiveRecord
{
public $ordersCount;
// ...
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}
```
そして、order を結合して注文数を計算するクエリを構築することが出来ます。
```php
$customers = Customer::find()
->select([
'{{customer}}.*', // 顧客の全てのフィールドを選択
'COUNT({{order}}.id) AS ordersCount' // 注文数を計算
])
->joinWith('orders') // テーブルの結合を保証する
->groupBy('{{customer}}.id') // 結果をグループ化して、集計関数の動作を保証する
->all();
```

12
docs/guide-ja/db-dao.md

@ -87,6 +87,18 @@ ODBC 経由でデータベースに接続しようとする場合は、[[yii\db\
> Info|情報: DB 接続のインスタンスを作成するとき、実際のデータベース接続は、最初の SQL を実行するか、[[yii\db\Connection::open()|open()]] メソッドを明示的に呼ぶかするまでは確立されません。
> Tip|ヒント: 時として、何らかの環境変数を初期化するために、データベース接続を確立した直後に何かクエリを実行したい場合があります。
> そのためには、データベース接続の [[yii\db\Connection::EVENT_AFTER_OPEN|afterOpen]] イベントに対するイベントハンドラを登録することが出来ます。
> 以下のように、アプリケーションの構成情報に直接にハンドラを登録してください。
>
> ```php
> 'db' => [
> // ...
> 'on afterOpen' => function($event) {
> $event->sender->createCommand("YOUR SQL HERE")->execute();
> }
> ]
> ```
## SQL クエリを実行する <span id="executing-sql-queries"></span>

6
docs/guide-ja/db-elasticsearch.md

@ -1,6 +0,0 @@
Elasticsearch
=============
> Note|注意: この節はまだ執筆中です。
>
> まだ内容がありません。

26
docs/guide-ja/db-migrations.md

@ -10,7 +10,7 @@
1. Tim が新しいマイグレーション (例えば、新しいテーブルを作成したり、カラムの定義を変更したりなど) を作る。
2. Tim が新しいマイグレーションをソースコントロールシステム (例えば Git や Mercurial) にコミットする。
3. Doug がソースコントロールシステムから自分のレポジトリを更新して新しいマイグレーションを受け取る。
4. Doug がマイグレーションを彼のローカルの開発用データベースに適用して、Tim が行った変更を反映するように自分のデータベースの同期を取る。
4. Doug がマイグレーションを彼のローカルの開発用データベースに適用して、自分のデータベースの同期を取り、Tim が行った変更を反映する。
そして、次の一連のステップは、本番環境でデータベースマイグレーションとともに新しいリリースを配備する方法を示すものです。
@ -18,18 +18,21 @@
2. Scott は本番サーバでソースコードをリリースタグまで更新する。
3. Scott は本番のデータベースに対して累積したデータベースマイグレーションを全て適用する。
Yii は一連のマイグレーションコマンドラインツールを提供しており、以下の機能をサポートしています。
Yii は一連のマイグレーションコマンドラインツールを提供して、以下の機能をサポートします。
* 新しいマイグレーションの作成
* マイグレーションの適用
* マイグレーションの取消
* マイグレーションの再適用
* マイグレーションの履歴と状態の閲覧
* マイグレーションの履歴と状態の表示
これらのツールは、全て、`yii migrate` コマンドからアクセスすることが出来ます。
この節では、これらのツールを使用して、さまざまなタスクをどうやって達成するかを詳細に説明します。
各ツールの使用方法は、ヘルプコマンド `yii help migrate` によっても知ることが出来ます。
> Note|注意: マイグレーションはデータベーススキーマに影響を及ぼすだけでなく、既存のデータを新しいスキーマに合うように修正したり、RBAC 階層を作成したり、キャッシュをクリーンアップしたりすることも出来ます。
## マイグレーションを作成する <span id="creating-migrations"></span>
新しいマイグレーションを作成するためには、次のコマンドを実行します。
@ -48,7 +51,7 @@ yii migrate/create create_news_table
> Note|注意: この `name` 引数は、生成されるマイグレーションクラス名の一部として使用されますので、アルファベット、数字、および/または、アンダースコアだけを含むものでなければなりません。
上記のコマンドは、`m150101_185401_create_news_table.php` という名前の新しい PHP クラスファイルを `@app/migrations` ディレクトリに作成します。
このファイルは、主として、`m150101_185401_create_news_table` というマイグレーションクラスを宣言するためのもので、次のようなスケルトンコードを含んでいます。
このファイルは次のようなコードを含み、主として、スケルトンコードを持った `m150101_185401_create_news_table` というマイグレーションクラスを宣言するためのものす。
```php
<?php
@ -207,7 +210,7 @@ class m150101_185401_create_news_table extends Migration
* [[yii\db\Migration::dropIndex()|dropIndex()]]: インデックスを削除
> Info|情報: [[yii\db\Migration]] は、データベースクエリメソッドを提供しません。
これは、データベースからデータ取得することについては、通常、追加のメッセージを表示する必要がないからです。
これは、通常、データベースからデータ取得については、メッセージを追加して表示する必要がないからです。
更にまた、複雑なクエリを構築して実行するためには、強力な [クエリビルダ](db-query-builder.md) を使うことが出来るからです。
@ -231,13 +234,13 @@ yii migrate
時として、利用できる全てのマイグレーションではなく、一つまたは数個の新しいマイグレーションだけを適用したい場合があります。
コマンドを実行するときに、適用したいマイグレーションの数を指定することによって、そうすることが出来ます。
例えば、次のコマンドは、利用できるマイグレーションのうち、次の三個を適用しようとするものです。
例えば、次のコマンドは、次の三個の利用できるマイグレーションを適用しようとするものです。
```
yii migrate 3
```
また、このマイグレーションまでデータベースに適用したいという特定のマイグレーションを明示的に指定することも出来ます。
また、そのマイグレーションまでをデータベースに適用するという、特定のマイグレーションを明示的に指定することも出来ます。
そのためには、`migrate/to` コマンドを、次のどれかの形式で使います。
```
@ -258,8 +261,8 @@ yii migrate/to 1392853618 # UNIX タイムスタンプ
```
yii migrate/down # 最近に適用されたマイグレーションを取り消す
yii migrate/down 3 # 最近に適用された三個のマイグレーションを取り消す
yii migrate/down # 最近に適用されたマイグレーション一個を取り消す
yii migrate/down 3 # 最近に適用されたマイグレーション三個を取り消す
```
> Note|注意: 全てのマイグレーションが取り消せるとは限りません。
@ -272,13 +275,12 @@ yii migrate/down 3 # 最近に適用された三個のマイグレーション
これは次のコマンドによって実行することが出来ます。
```
yii migrate/redo # 最後に適用されたマイグレーションを再適用する
yii migrate/redo # 最後に適用された一個のマイグレーションを再適用する
yii migrate/redo 3 # 最後に適用された三個のマイグレーションを再適用する
```
> Note|注意: マイグレーションが取り消し不可能な場合は、それを再適用することは出来ません。
[kihara]
## マイグレーションをリスト表示する <span id="listing-migrations"></span>
@ -298,7 +300,7 @@ yii migrate/new all # 適用可能な全てのマイグレーションを表
## マイグレーション履歴を修正する <span id="modifying-migration-history"></span>
時として、実際にマイグレーションを適用したり取り消したりするのではなく、データベースが特定のマイグレーションまでアップグレードされたとマークしたいだけ、という場合があります。
このようなことがよく起るのは、データベースを手作業で特定の状態に変更した後に、その変更のための一つまたは複数のマイグレーションを記録はするが適用はしたくない、という場合です。
このようなことがよく起るのは、データベースを手作業で特定の状態に変更した後に、その変更のための一つまたは複数のマイグレーションを記録はするが再度適用はしたくない、という場合です。
次のコマンドでこの目的を達することが出来ます。
```

6
docs/guide-ja/db-mongodb.md

@ -1,6 +0,0 @@
Mongo DB
========
> Note|注意: この節はまだ執筆中です。
>
> まだ内容がありません。

16
docs/guide-ja/db-query-builder.md

@ -2,7 +2,7 @@
============
[データベースアクセスオブジェクト](db-dao.md) の上に構築されているクエリビルダは、SQL 文をプログラム的に、かつ、DBMS の違いを意識せずに作成することを可能にしてくれます。
クエリビルダを使うと、生の SQL を書くことに比べて、より読みやすい SQL 関連のコードを書き、より安全な SQL 文を生成することが容易になります。
クエリビルダを使うと、生の SQL を書くことに比べて、より読みやすい SQL 関連のコードを書き、より安全な SQL 文を生成することが容易になります。
通常、クエリビルダの使用は、二つのステップから成ります。
@ -58,7 +58,7 @@ $query->select(['id', 'email']);
$query->select('id, email');
```
選択されるカラム名は、生の SQL を書くときにするように、テーブル接頭辞 および/または カラムのエイリアスを含むことが出来ます。
選択されるカラム名は、生の SQL を書くときにするように、テーブル接頭辞 および/または カラムのエイリアスを含むことが出来ます。
例えば、
```php
@ -84,7 +84,7 @@ $query->select(['user_id' => 'user.id', 'email']);
例えば、
```php
$query->select(["CONCAT(first_name, ' ', last_name]) AS full_name", 'email']);
$query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']);
```
バージョン 2.0.1 以降では、サブクエリもセレクトすることが出来ます。
@ -116,7 +116,7 @@ $query->from('user');
```
セレクトの対象になる (一つまたは複数の) テーブルは、文字列または配列として指定することが出来ます。
テーブル名は、生の SQL を書くときにするように、スキーマ接頭辞 および/または テーブルエイリアスを含むことが出来ます。例えば、
テーブル名は、生の SQL を書くときにするように、スキーマ接頭辞 および/または テーブルエイリアスを含むことが出来ます。例えば、
```php
$query->from(['public.user u', 'public.post p']);
@ -332,7 +332,7 @@ $query->orderBy([
上記のコードにおいて、配列のキーはカラム名であり、配列の値は並べ替えの方向です。
PHP の定数 `SORT_ASC` は昇順、`SORT_DESC` は降順を指定するものです。
`ORDER BY` が単純なカラム名だけを含む場合は、生の SQL を書くときにするように、文字列を使って指定することが出来ます。
`ORDER BY` が単純なカラム名だけを含む場合は、生の SQL を書くときにするように、文字列を使って指定することが出来ます。
例えば、
```php
@ -359,11 +359,11 @@ $query->orderBy('id ASC')
$query->groupBy(['id', 'status']);
```
`GROUP BY` が単純なカラム名だけを含む場合は、生の SQL を書くときにするように、文字列を使って指定することが出来ます。
`GROUP BY` が単純なカラム名だけを含む場合は、生の SQL を書くときにするように、文字列を使って指定することが出来ます。
例えば、
```php
$query->groupBy('id, status']);
$query->groupBy('id, status');
```
> Note|注意: `GROUP BY` が何らかの DB 式を含む場合は、配列形式を使わなければなりません。
@ -494,7 +494,7 @@ $query1->union($query2);
これらのメソッドでは、`$q` パラメータは必須であり、カラム名または DB 式とすることが出来る。
上記のメソッドの全ては、オプションで、DB クエリの実行に使用されるべき [[yii\db\Connection|DB 接続]] を表す `$db` パラメータを取ることが出来ます。
このパラメータを省略した場合は、DB 接続として `db` アプリケーションコンポーネントが使用されます。
このパラメータを省略した場合は、DB 接続として `db` [アプリケーションコンポーネント](structure-application-components.md) が使用されます。
次に `count()` クエリメソッドを使う例をもう一つ挙げます。
```php

6
docs/guide-ja/db-redis.md

@ -1,6 +0,0 @@
Redis
=====
> Note|注意: この節はまだ執筆中です。
>
> まだ内容がありません。

6
docs/guide-ja/db-sphinx.md

@ -1,6 +0,0 @@
Sphinx Search
=============
> Note|注意: この節はまだ執筆中です。
>
> まだ内容がありません。

8
docs/guide-ja/helper-array.md

@ -1,12 +1,12 @@
ArrayHelper
===========
配列ヘルパ
==========
[PHP の充実した配列関数](http://php.net/manual/ja/book.array.php) への追加として、Yii の配列ヘルパは、配列をさらに効率的に扱うことを可能にするスタティックなメソッドを提供しています。
## 値を取得する <span id="getting-values"></span>
配列、オブジェクト、またはその両方から成る複雑な構造から標準的な PHP を使って値を取得することは、何度も繰り返さねばならない面倒くさい仕事です。
配列、オブジェクト、またはその両方から成る複雑な構造から標準的な PHP を使って値を取得することは、非常に面倒くさい仕事です。
最初に `isset` でキーの存在をチェックしなければならず、次に、キーが存在していれば値を取得し、存在していなければ、デフォルト値を提供しなければなりません。
```php
@ -264,7 +264,7 @@ $decoded = ArrayHelper::htmlDecode($data);
```php
$posts = Post::find()->limit(10)->all();
$data = ArrayHelper::toArray($post, [
$data = ArrayHelper::toArray($posts, [
'app\models\Post' => [
'id',
'title',

52
docs/guide-ja/helper-html.md

@ -74,7 +74,57 @@ echo Html::tag('div', 'Pwede na', $options);
// <div class="btn btn-success">Pwede na</div>
```
同じことを `style` 属性のスタイルについて行うためには、次のようにします。
配列形式を使って複数の CSS クラスを指定することも出来ます。
```php
$options = ['class' => ['btn', 'btn-default']];
echo Html::tag('div', 'Save', $options);
// '<div class="btn btn-default">Save</div>' をレンダリングする
```
クラスを追加・削除する際にも配列形式を使うことが出来ます。
```php
$options = ['class' => 'btn'];
if ($type === 'success') {
Html::addCssClass($options, ['btn-success', 'btn-lg']);
}
echo Html::tag('div', 'Save', $options);
// '<div class="btn btn-success btn-lg">Save</div>' をレンダリングする
```
`Html::addCssClass()` はクラスの重複を防止しますので、同じクラスが二度出現するかも知れないと心配する必要はありません。
```php
$options = ['class' => 'btn btn-default'];
Html::addCssClass($options, 'btn-default'); // クラス 'btn-default' は既に存在する
echo Html::tag('div', 'Save', $options);
// '<div class="btn btn-default">Save</div>' をレンダリングする
```
CSS のクラスオプションを配列形式で指定する場合には、名前付きのキーを使ってクラスの論理的な目的を示すことが出来ます。
この場合、`Html::addCssClass()` で同じキーを持つクラスを指定しても無視されます。
```php
$options = [
'class' => [
'btn',
'theme' => 'btn-default',
]
];
Html::addCssClass($options, ['theme' => 'btn-success']); // 'theme' キーは既に使用されている
echo Html::tag('div', 'Save', $options);
// '<div class="btn btn-default">Save</div>' をレンダリングする
```
CSS のスタイルも `style` 属性を使って、同じように設定することが出来ます。
```php
$options = ['style' => ['width' => '100px', 'height' => '100px']];

6
docs/guide-ja/helper-overview.md

@ -25,10 +25,10 @@ echo Html::encode('Test > test');
以下のコアヘルパクラスが Yii のリリースにおいて提供されています。
- [ArrayHelper](helper-array.md)
- [配列ヘルパ](helper-array.md)
- Console
- FileHelper
- [Html](helper-html.md)
- [Html ヘルパ](helper-html.md)
- HtmlPurifier
- Image
- Inflector
@ -36,7 +36,7 @@ echo Html::encode('Test > test');
- Markdown
- Security
- StringHelper
- [Url](helper-url.md)
- [Url ヘルパ](helper-url.md)
- VarDumper

6
docs/guide-ja/helper-url.md

@ -16,9 +16,9 @@ $absoluteHomeUrl = Url::home(true);
$httpsAbsoluteHomeUrl = Url::home('https');
```
パラメータが渡されない場合は、相対 URL が生成されます。
`true` を渡すと、現在のスキーマの絶対 URL を取得することが出来ます。
または、スキーマを明示的に指定して (`http`, `https`) 絶対 URL を取得することも出来ます
パラメータが渡されない場合は、生成される URL は相対 URL になります。
パラメータとして `true` を渡せば、現在のスキーマの絶対 URL を取得することが出来ます。
または、スキーマ (`http`, `https`) を明示的に指定しても構いません
現在のリクエストのベース URL を取得するためには、次のようにします。

212
docs/guide-ja/input-file-upload.md

@ -1,15 +1,16 @@
ファイルをアップロードする
==========================
Yii におけるファイルのアップロードは、フォームモデル、その検証規則、そして、いくらかのコントローラコードによって行われます。
アップロードを適切に処理するために何が必要とされるのか、見ていきましよう
Yii におけるファイルのアップロードは、通常、アップロードされる個々のファイルを `UploadedFile` としてカプセル化する [[yii\web\UploadedFile]] の助けを借りて実行されます。
これを [[yii\widgets\ActiveForm]] および [モデル](structure-models.md) と組み合わせることで、安全なファイルアップロードメカニズムを簡単に実装することが出来ます
一つのファイルをアップロードする
--------------------------------
## モデルを作成する <span id="creating-models"></span>
プレーンなテキストインプットを扱うのと同じように、一つのファイルをアップロードするためには、モデルクラスを作成して、そのモデルの一つの属性を使ってアップロードされるファイルのインスタンスを保持します。
また、ファイルのアップロードを検証するために、検証規則も宣言しなければなりません。
例えば、
まず最初に、ファイルのアップロードを処理するモデルを作成する必要があります。
次の内容を持つ `models/UploadForm.php` を作成してください。
```php
namespace app\models;
@ -17,34 +18,49 @@ namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
/**
* UploadForm : アップロードのフォームの背後にあるモデル
*/
class UploadForm extends Model
{
/**
* @var UploadedFile file 属性
* @var UploadedFile
*/
public $file;
public $imageFile;
/**
* @return array 検証規則
*/
public function rules()
{
return [
[['file'], 'file'],
[['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
];
}
public function upload()
{
if ($this->validate()) {
$this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
return true;
} else {
return false;
}
}
}
```
上記のコードにおいては、`imageFile` 属性がアップロードされたファイルのインスタンスを保持するのに使われます。
この属性が関連付けられている `file` 検証規則は、[[yii\validators\FileValidator]] を使って、`png` または `jpg` の拡張子を持つファイルがアップロードされることを保証しています。
`upload()` メソッドは検証を実行して、アップロードされたファイルをサーバに保存します。
`file` バリデータによって、ファイル拡張子、サイズ、MIME タイプなどをチェックすることが出来ます。
詳細については、[コアバリデータ](tutorial-core-validators.md#file) の節を参照してください。
> Tip|ヒント: 画像をアップロードしようとする場合は、`image` バリデータを代りに使うことを考慮しても構いません。
`image` バリデータは [[yii\validators\ImageValidator]] によって実装されており、属性が有効な画像、すなわち、保存したり [Imagine エクステンション](https://github.com/yiisoft/yii2-imagine) を使って処理したりすることが可能な有効な画像を、受け取ったかどうかを検証します。
上記のコードにおいて作成した `UploadForm` というモデルは、HTML フォームで `<input type="file">` となる `$file` という属性を持ちます。
この属性は [[yii\validators\FileValidator|FileValidator]] を使用する `file` という検証規則を持ちます。
### フォームのビュー
## ファイルインプットをレンダリングする <span id="rendering-file-input"></span>
次に、フォームを表示するビューを作成します。
次に、ビューでファイルインプットを作成します。
```php
<?php
@ -53,19 +69,20 @@ use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($model, 'file')->fileInput() ?>
<?= $form->field($model, 'imageFile')->fileInput() ?>
<button>送信</button>
<button>送信</button>
<?php ActiveForm::end() ?>
```
ファイルのアップロードを可能にする `'enctype' => 'multipart/form-data'` は不可欠です。
`fileInput()` がフォームの入力フィールドを表します。
ファイルが正しくアップロードされるように、フォームに `enctype` オプションを追加することを憶えておくのは重要なことです。
`fileInput()` を呼ぶと `<input type="file">` のタグがレンダリングされて、ユーザがアップロードするファイルを選ぶことが出来るようになります。
### コントローラ
そして、フォームとモデルを結び付けるコントローラを作成します。
## 繋ぎ合せる <span id="wiring-up"></span>
そして、コントローラアクションの中で、モデルとビューを繋ぎ合せるコードを書いて、ファイルのアップロードを実装します。
```php
namespace app\controllers;
@ -82,10 +99,10 @@ class SiteController extends Controller
$model = new UploadForm();
if (Yii::$app->request->isPost) {
$model->file = UploadedFile::getInstance($model, 'file');
if ($model->file && $model->validate()) {
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
$model->imageFile = UploadedFile::getInstance($model, 'imageFile');
if ($model->upload()) {
// ファイルのアップロードが成功
return;
}
}
@ -94,134 +111,68 @@ class SiteController extends Controller
}
```
`model->load(...)` の代りに `UploadedFile::getInstance(...)` を使っています。
[[\yii\web\UploadedFile|UploadedFile]] はモデルの検証を実行せず、アップロードされたファイルに関する情報を提供するだけです。
そのため、`$model->validate()` を手作業で実行して、[[yii\validators\FileValidator|FileValidator]] を起動する必要があります。
[[yii\validators\FileValidator|FileValidator]] は、下記のコアコードが示しているように、属性がファイルであることを要求します。
上記のコードでは、フォームが送信されると [[yii\web\UploadedFile::getInstance()]] メソッドが呼ばれて、アップロードされたファイルが `UploadedFile` のインスタンスとして表現されます。
そして、次に、モデルの検証によってアップロードされたファイルが有効なものであることを確かめ、サーバにファイルを保存します。
```php
if (!$file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE) {
return [$this->uploadRequired, []]; // "ファイルをアップロードしてください。" というエラーメッセージ
}
```
検証が成功したら、ファイルを保存します。
## 複数のファイルをアップロードする <span id="uploading-multiple-files"></span>
```php
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
```
ここまでの項で示したコードに若干の修正を加えれば、複数のファイルを一度にアップロードすることも出来ます。
「ベーシック」プロジェクトテンプレートを使っている場合は、`uploads` フォルダを `web` の下に作成しなければなりません。
以上です。ページをロードして、アップロードを試して見てください。ファイルは `basic/web/uploads` にアップロードされます。
検証
----
たいていの場合、検証規則を調整して、特定のファイルだけを受け取るようにしたり、アップロードを必須としたりする必要があります。
下記で、よく使われる規則の構成を見てみましよう。
### Required
ファイルのアップロードを必須とする必要がある場合は、次のように `skipOnEmpty``false` に設定します。
最初に、モデルクラスを修正して、`file` 検証規則に `maxFiles` オプションを追加して、アップロードを許可されるファイルの最大数を制限しなければなりません。
`upload()` メソッドも、アップロードされた複数のファイルを一つずつ保存するように修正しなければなりません。
```php
public function rules()
{
return [
[['file'], 'file', 'skipOnEmpty' => false],
];
}
```
### MIME タイプ
アップロードされるファイルのタイプを検証することは賢明なことです。
`FileValidator` はこの目的のための `extensions` プロパティを持っています。
```php
public function rules()
{
return [
[['file'], 'file', 'extensions' => 'gif, jpg'],
];
}
```
デフォルトでは、ファイルのコンテントの MIME タイプが指定された拡張子に対応するものであるかどうかが検証されます。
例えば、`gif` に対しては `image/gif`、`jpg` に対しては `image/jpeg` であるかどうかが検証されます。
MIME タイプの中には、`file` バリデータによって使われている PHP fileinfo 拡張では適切に検知することが出来ないものがあることに注意してください。
例えば、`csv` ファイルは `text/csv` ではなく `text/plain` として検知されます。
このような振る舞いを避けるために、`checkExtensionByMimeType` を `false` に設定して、MIME タイプを手動で指定することが出来ます。
```php
public function rules()
{
return [
[['file'], 'file', 'checkExtensionByMimeType' => false, 'extensions' => 'csv', 'mimeTypes' => 'text/plain'],
];
}
```
[一般的なメディアタイプの一覧表](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types)
### 画像のプロパティ
画像をアップロードするときは、[[yii\validators\ImageValidator|ImageValidator]] が重宝するでしょう。
このバリデータは、属性が有効な画像を受け取ったか否かを検証します。
画像は、保存するか、または、[Imagine エクステンション](https://github.com/yiisoft/yii2/tree/master/extensions/imagine) によって処理することが出来ます。
複数のファイルをアップロードする
--------------------------------
複数のファイルを一度にアップロードする必要がある場合は、少し修正が必要になります。
namespace app\models;
モデル:
use yii\base\Model;
use yii\web\UploadedFile;
```php
class UploadForm extends Model
{
/**
* @var UploadedFile|Null ファイル属性
* @var UploadedFile[]
*/
public $file;
public $imageFiles;
/**
* @return array 検証規則
*/
public function rules()
{
return [
[['file'], 'file', 'maxFiles' => 10], // <--- ここ !
[['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4],
];
}
public function upload()
{
if ($this->validate()) {
foreach ($this->imageFiles as $file) {
$file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
}
return true;
} else {
return false;
}
}
}
```
ビュー:
ビューファイルでは、`fileInput()` の呼び出しに `multiple` オプションを追加して、ファイルアップロードのフィールドが複数のファイルを受け取ることが出来るようにしなければなりません。
```php
<?php
use yii\widgets\ActiveForm;
$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]);
?>
<?= $form->field($model, 'file[]')->fileInput(['multiple' => true]) ?>
<button>送信</button>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<?php ActiveForm::end(); ?>
```
<?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?>
違いがあるのは、次の行です。
<button>送信</button>
```php
<?= $form->field($model, 'file[]')->fileInput(['multiple' => true]) ?>
<?php ActiveForm::end() ?>
```
コントローラ:
そして、最後に、コントローラアクションの中では、`UploadedFile::getInstance()` の代りに `UploadedFile::getInstances()` を呼んで、`UploadedFile` インスタンスの配列を `UploadForm::imageFiles` に代入しなければなりません。
```php
namespace app\controllers;
@ -238,12 +189,10 @@ class SiteController extends Controller
$model = new UploadForm();
if (Yii::$app->request->isPost) {
$model->file = UploadedFile::getInstances($model, 'file');
if ($model->file && $model->validate()) {
foreach ($model->file as $file) {
$file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
}
$model->imageFiles = UploadedFile::getInstances($model, 'imageFiles');
if ($model->upload()) {
// ファイルのアップロードが成功
return;
}
}
@ -251,8 +200,3 @@ class SiteController extends Controller
}
}
```
単一のファイルのアップロードとは、二つの点で異なります。
最初の違いは、`UploadedFile::getInstance($model, 'file');` の代りに `UploadedFile::getInstances($model, 'file');` が使用されることです。
前者が一つのインスタンスを返すだけなのに対して、後者はアップロードされた **全ての** ファイルのインスタンスを返します。
第二の違いは、`foreach` によって、全てのファイルをそれぞれ保存している点です。

12
docs/guide-ja/input-forms.md

@ -50,14 +50,14 @@ $form = ActiveForm::begin([
<?php ActiveForm::end() ?>
```
上記のコードでは、[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] がフォームのインスタンスを作成するだけでなく、フォームの開始をマークしています。
上記のコードでは、[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] がフォームのインスタンスを作成するとともに、フォームの開始をマークしています。
[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] と [[yii\widgets\ActiveForm::end()|ActiveForm::end()]] の間に置かれた全てのコンテントが HTML の `<form>` タグによって囲まれます。
どのウィジェットでも同じですが、ウィジェットをどのように構成すべきかに関するオプションを指定するために、`begin` メソッドに配列を渡すことが出来ます。
この例では、追加の CSS クラスと要素を特定するための ID が渡されて、`<form>` の開始タグに適用されています。
利用できるオプションはすべて [[yii\widgets\ActiveForm]] の API ドキュメントに記されていますので参照してください。
利用できるオプションの全ては [[yii\widgets\ActiveForm]] の API ドキュメントに記されていますので参照してください。
フォームの中では、フォームの要素を作成するために、ActiveForm ウィジェットの [[yii\widgets\ActiveForm::field()|ActiveForm::field()]] メソッドが呼ばれています。
は、フォームの要素だけでなく、そのラベルも作成し、適用できる JavaScript の検証メソッドがあれば、それも追加します。
のメソッドは、フォームの要素だけでなく、そのラベルも作成し、適用できる JavaScript の検証メソッドがあれば、それも追加します。
[[yii\widgets\ActiveForm::field()|ActiveForm::field()]] メソッドは、[[yii\widgets\ActiveField]] のインスタンスを返します。
このメソッドの呼び出し結果を直接にエコーすると、結果は通常の (text の) インプットになります。
このメソッドの呼び出しに追加の [[yii\widgets\ActiveField|ActiveField]] のメソッドをチェーンして、出力結果をカスタマイズすることが出来ます。
@ -90,7 +90,7 @@ echo $form->field($model, 'items[]')->checkboxList(['a' => 'Item A', 'b' => 'Ite
フォームに HTML タグを追加するためには、素の HTML を使うか、または、上記の例の [[yii\helpers\Html::submitButton()|Html::submitButton()]] のように、[[yii\helpers\Html|Html]] ヘルパクラスのメソッドを使うことが出来ます。
> Tip|ヒント: あなたのアプリケーションで Twitter Bootstrap CSS を使っている場合は、[[yii\widgets\ActiveForm]] の代りに [[yii\bootstrap\ActiveForm]] を使うのが良いでしょう。
> これは ActiveForm クラスの拡張であり、bootstrap CSS フレームワークで使用するための追加のスタイルをサポートしています。
> 後者は前者の拡張であり、bootstrap CSS フレームワークで使用するための追加のスタイルをサポートしています。
> tip|ヒント: 必須フィールドをアスタリスク付きのスタイルにするために、次の CSS を使うことが出来ます。
>
@ -106,5 +106,5 @@ echo $form->field($model, 'items[]')->checkboxList(['a' => 'Item A', 'b' => 'Ite
フォームのもっと複雑な使用方法については、以下の節を読んで下さい。
- [表形式インプットのデータ収集](input-tabular-input.md) - 同じ種類の複数のモデルのデータを収集する。
- [複数のモデルを持つ複雑なフォーム](input-multiple-models.md) - 同じフォームの中で複数の異なるモデルを扱う。
- [ファイルをアップロードする](input-file-upload) - フォームを使ってファイルをアップロードする方法。
- [複数のモデルのデータを取得する](input-multiple-models.md) - 同じフォームの中で複数の異なるモデルを扱う。
- [ファイルをアップロードする](input-file-upload.md) - フォームを使ってファイルをアップロードする方法。

89
docs/guide-ja/input-multiple-models.md

@ -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';
> Note|注意: この節はまだ執筆中です。
>
> まだ内容がありません。
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;
$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` を使ってインプットフィールドをレンダリングすることになります。

31
docs/guide-ja/input-validation.md

@ -9,10 +9,12 @@
例えば、
```php
$model = new \app\models\ContactForm;
$model = new \app\models\ContactForm();
// モデルの属性にユーザ入力を投入する
$model->attributes = \Yii::$app->request->post('ContactForm');
$model->load(\Yii::$app->request->post());
// これは次と等価
// $model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// 全ての入力が有効
@ -440,6 +442,7 @@ class LoginForm extends Model
クライアント側の検証を完全に無効にしたい場合は、[[yii\widgets\ActiveForm::enableClientValidation]] プロパティを false に設定することが出来ます。
また、個々の入力フィールドごとにクライアント側の検証を無効にしたい場合には、入力フィールドの [[yii\widgets\ActiveField::enableClientValidation]] プロパティを false に設定することが出来ます。
`eanbleClientValidation` が入力フィールドのレベルとフォームのレベルの両方で構成されている場合は前者が優先されます。
### クライアント側の検証を実装する <span id="implementing-client-side-validation"></span>
@ -583,16 +586,32 @@ JS;
このような場合には、AJAX ベースの検証を使うことが出来ます。
AJAX 検証は、通常のクライアント側での検証と同じユーザ体験を保ちながら、入力値を検証するためにバックグラウンドで AJAX リクエストを発行します。
AJAX 検証をフォーム全体に対して有効にするためには、[[yii\widgets\ActiveForm::enableAjaxValidation]] プロパティを `true` に設定して、`id` にフォームを特定するユニークな ID を設定しなければなりません
単一のインプットフィールドに対して AJAX 検証を有効にするためには、そのフィールドの [[yii\widgets\ActiveField::enableAjaxValidation|enableAjaxValidation]] プロパティを true に設定し、フォームに一意の `id` を指定します
```php
<?php $form = yii\widgets\ActiveForm::begin([
use yii\widgets\ActiveForm;
$form = ActiveForm::begin([
'id' => 'registration-form',
]);
echo $form->field($model, 'username', ['enableAjaxValidation' => true]);
// ...
ActiveForm::end();
```
フォーム全体に対して AJAX 検証を有効にするためには、フォームのレベルで [[yii\widgets\ActiveForm::enableAjaxValidation|enableAjaxValidation]] を true に設定します。
```php
$form = ActiveForm::begin([
'id' => 'contact-form',
'enableAjaxValidation' => true,
]); ?>
]);
```
個別の入力フィールドについても、[[yii\widgets\ActiveField::enableAjaxValidation]] プロパティを設定して、AJAX 検証を有効にしたり無効にしたりすることが出来ます。
> Note|注意: `enableAjaxValidation` プロパティがインプットフィールドのレベルとフォームのレベルの両方で構成された場合は、前者が優先されます。
また、サーバ側では、AJAX 検証のリクエストを処理できるように準備しておく必要があります。
これは、コントローラのアクションにおいて、次のようなコード断片を使用することで達成できます。

6
docs/guide-ja/intro-upgrade-from-v1.md

@ -102,7 +102,7 @@ $object = Yii::createObject([
], [$param1, $param2]);
```
構成情報に関する詳細は、[オブジェクトの構成情報](concept-configurations.md) の節で見ることが出来ます。
構成情報に関する詳細は、[構成情報](concept-configurations.md) の節で見ることが出来ます。
イベント
@ -526,6 +526,10 @@ Yii 2 の URL 管理は 1.1 のそれと似たようなものです。
詳細については [ルーティングと URL 生成](runtime-routing.md) の節を参照してください。
ルートの命名規約における重要な変更は、コントローラとアクションのキャメルケースの名前が各単語をハイフンで分けた小文字の名前になるようになった、という点です。
例えば、`CamelCaseController` のコントローラ ID は `camel-case` となります。
詳細については、[コントローラ ID](structure-controllers.md#controller-ids) と [アクション ID](structure-controllers.md#action-ids) の節を参照してください。
Yii 1.1 と 2.x を一緒に使う
---------------------------

4
docs/guide-ja/intro-yii.md

@ -28,11 +28,11 @@ Yii を他のフレームワークと比べると
また、Yii の堅固なエクステンションアーキテクチャを利用して、再配布可能なエクステンションを使用したり開発したりすることも出来ます。
- 高性能であることは常に Yii の主たる目標です。
Yii はワンマンショーではありません。Yii は [強力なコア開発チーム][] および Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。
Yii はワンマンショーではありません。Yii は [強力なコア開発チーム][about_yii] および Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。
Yii 開発チームは、最新のウェブ開発の潮流と、他のフレームワークやプロジェクトに見出される最善のプラクティスと機能を、注意深く見守り続けています。
他のところで見出された最善のプラクティスと機能で最も適切なものは、定期的にコアフレームワークに組み込まれ、シンプルかつエレガントなインターフェイスを通じて公開されます。
[強力なコア開発チーム]: http://www.yiiframework.com/about/
[about_yii]: http://www.yiiframework.com/about/
Yii のバージョン
----------------

258
docs/guide-ja/output-data-providers.md

@ -1,150 +1,240 @@
データプロバイダ
================
> Note|注意: この節はまだ執筆中です。
[ページネーション](output-pagination.md) と [並べ替え](output-sorting.md) の節において、エンドユーザが特定のページのデータを選んで表示し、いずれかのカラムによってデータを並べ替えることが出来るようにする方法を説明しました。
データのページネーションと並べ替えは非常によくあるタスクですから、Yii はこれをカプセル化した一連の *データプロバイダ* を提供しています。
データプロバイダは、 [[yii\data\DataProviderInterface]] によってデータセットを抽象化し、ページネーションと並べ替えを処理します。
[グリッドやリストなどのデータウィジェット](output-data-widgets.md) で使用することが出来ます。
データプロバイダは [[yii\data\DataProviderInterface]] を実装するクラスであり、主として、ページ分割され並べ替えられたデータの取得をサポートするものです。
通常は、[データウィジェット](output-data-widgets.md) と共に使用して、エンドユーザが対話的にデータのページネーションと並べ替えをすることが出来るようにします。
Yii は三つのデータプロバイダを内蔵しています。すなわち、[[yii\data\ActiveDataProvider]]、[[yii\data\ArrayDataProvider]] そして [[yii\data\SqlDataProvider]] です。
Yii のリリースには次のデータプロバイダのクラスが含まれています。
アクティブデータプロバイダ
--------------------------
* [[yii\data\ActiveDataProvider]]: [[yii\db\Query]] または [[yii\db\ActiveQuery]] を使ってデータベースからデータを取得して、配列または [アクティブレコード](db-active-record.md) インスタンスの形式でデータを返します。
* [[yii\data\SqlDataProvider]]: SQL 文を実行して、データベースのデータを配列として返します。
* [[yii\data\ArrayDataProvider]]: 大きな配列を受け取り、ページネーションと並べ替えの指定に基づいて、一部分を切り出して返します。
`ActiveDataProvider` は [[yii\db\Query]] および [[yii\db\ActiveQuery]] を使って DB クエリを実行して、データを提供します。
次のコードは、これを使って、ActiveRecord のインスタンスを提供する例です。
これら全てのデータプロバイダの使用方法は、次の共通のパターンを持っています。
```php
$provider = new ActiveDataProvider([
'query' => Post::find(),
'pagination' => [
'pageSize' => 20,
],
// ページネーションと並べ替えのプロパティを構成してデータプロバイダを作成する
$provider = new XyzDataProvider([
'pagination' => [...],
'sort' => [...],
]);
// 現在のページの投稿を取得する
$posts = $provider->getModels();
// ページ分割されて並べ替えられたデータを取得する
$models = $provider->getModels();
// 現在のページにあるデータアイテムの数を取得する
$count = $provider->getCount();
// 全ページ分のデータアイテムの総数を取得する
$totalCount = $provider->getTotalCount();
```
そして次の例は、ActiveRecord なしで ActiveDataProvider を使う方法を示すものです。
データプロバイダのページネーションと並べ替えの振る舞いを指定するためには、その [[yii\data\BaseDataProvider::pagination|pagination]] と [[yii\data\BaseDataProvider::sort|sort]] のプロパティを構成します。
二つのプロパティは、それぞれ、[[yii\data\Pagination]] と [[yii\data\Sort]] の構成情報に対応します。
これらを false に設定して、ページネーションや並べ替えの機能を無効にすることも出来ます。
[データウィジェット](output-data-widgets.md)、例えば [[yii\grid\GridView]] は、`dataProvider` という名前のプロパティを持っており、これにデータプロバイダのインスタンスを受け取らせて、それが提供するデータを表示させることが出来ます。
例えば、
```php
$query = new Query();
$provider = new ActiveDataProvider([
'query' => $query->from('post'),
'sort' => [
// デフォルトのソートを name ASC, created_at DESC とする
'defaultOrder' => [
'name' => SORT_ASC,
'created_at' => SORT_DESC
]
],
'pagination' => [
'pageSize' => 20,
],
echo yii\grid\GridView::widget([
'dataProvider' => $dataProvider,
]);
// 現在のページの投稿を取得する
$posts = $provider->getModels();
```
配列データプロバイダ
--------------------
これらのデータプロバイダの主たる相異点は、データソースがどのように指定されるかという点にあります。
次に続く項において、各データプロバイダの詳細な使用方法を説明します。
ArrayDataProvider はデータの配列に基づいたデータプロバイダを実装するものです。
[[yii\data\ArrayDataProvider::$allModels]] プロパティが、並べ替えやページネーションの対象となるデータの全てのモデルを含みます。
ArrayDataProvider は、並べ替えとページネーションを実行した後に、データを提供します。
[[yii\data\ArrayDataProvider::$sort]] および [[yii\data\ArrayDataProvider::$pagination]] のプロパティを構成して、並べ替えとページネーションの動作をカスタマイズすることが出来ます。
## アクティブデータプロバイダ <span id="active-data-provider"></span>
[[yii\data\ArrayDataProvider::$allModels]] 配列の要素は、オブジェクト (例えば、モデルのオブジェクト) であるか、連想配列 (例えば、DAO のクエリ結果) であるかの、どちらかです。
[[yii\data\ArrayDataProvider::$key]] プロパティには、必ず、データレコードを一意的に特定出来るフィールドの名前をセットするか、そのようなフィールドがない場合は `false` をセットするかしなければなりません。
[[yii\data\ActiveDataProvider]] を使用するためには、その [[yii\data\ActiveDataProvider::query|query]] プロパティを構成しなければなりません。
これは、[[yii\db\Query]] または [[yii\db\ActiveQuery]] のオブジェクトを取ることが出来ます。
前者であれば、返されるデータは配列になります。
後者であれば、返されるデータは配列または [アクティブレコード](db-active-record.md) インスタンスとすることが出来ます。
例えば、
`ActiveDataProvider` と比較すると、`ArrayDataProvider` は、[[yii\data\ArrayDataProvider::$allModels]] を準備して持たなければならないため、効率が良くありません。
```php
use yii\data\ActiveDataProvider;
`ArrayDataProvider` は次のようにして使用することが出来ます。
$query = Post::find()->where(['status' => 1]);
```php
$query = new Query();
$provider = new ArrayDataProvider([
'allModels' => $query->from('post')->all(),
'sort' => [
'attributes' => ['id', 'username', 'email'],
],
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
'sort' => [
'defaultOrder' => [
'created_at' => SORT_DESC,
'title' => SORT_ASC,
]
],
]);
// 現在のページの投稿を取得する
// Post オブジェクトの配列を返す
$posts = $provider->getModels();
```
> Note|注意: 並べ替えの機能を使いたいときは、どのカラムがソート出来るかをプロバイダが知ることが出来るように、[[sort]] プロパティを構成しなければなりません。
上記の例における `$query` が次のコードによって作成される場合は、提供されるデータは生の配列になります。
```php
use yii\db\Query;
$query = (new Query())->from('post')->where(['status' => 1]);
```
> Note|注意: クエリが既に `orderBy` 句を指定しているものである場合、(`sort` の構成を通して) エンドユーザによって与えられる並べ替えの指定は、既存の `orderBy` 句に追加されます。
一方、`limit` と `offset` の句が存在している場合は、(`pagenation` の構成を通して) エンドユーザによって指定されるページネーションのリクエストによって上書きされます。
SQL データプロバイダ
--------------------
デフォルトでは、[[yii\data\ActiveDataProvider]] はデータベース接続として `db` アプリケーションコンポーネントを使用します。
[[yii\data\ActiveDataProvider::db]] プロパティを構成すれば、別のデータベース接続を使用することが出来ます。
SqlDataProvider は、素の SQL 文に基づいたデータプロバイダを実装するものです。
これは、各要素がクエリ結果の行を表す配列の形式でデータを提供します。
他のプロバイダ同様に、SqlDataProvider も、並べ替えとページネーションをサポートしています。
並べ替えとページネーションは、与えられた [[yii\data\SqlDataProvider::$sql]] 文を "ORDER BY" 句および "LIMIT" 句で修正することによって実行されます。
[[yii\data\SqlDataProvider::$sort]] および [[yii\data\SqlDataProvider::$pagination]] のプロパティを構成して、並べ替えとページネーションの動作をカスタマイズすることが出来ます。
## SQL データプロバイダ <span id="sql-data-provider"></span>
`SqlDataProvider` は次のようにして使用することが出来ます。
[[yii\data\SqlDataProvider]] は、生の SQL 文を使用して、必要なデータを取得します。
このデータプロバイダは、[[yii\data\SqlDataProvider::sort|sort]] と [[yii\data\SqlDataProvider::pagination|pagination]] の指定に基づいて、SQL 文の `ORDER BY``OFFSET/LIMIT` の句を修正し、指定された順序に並べ替えられたデータを要求されたページの分だけ取得します。
[[yii\data\SqlDataProvider]] を使用するためには、[[yii\data\SqlDataProvider::sql|sql]] プロパティだけでなく、[[yii\data\SqlDataProvider::totalCount|totalCount]] プロパティを指定しなければなりません。
例えば、
```php
use yii\data\SqlDataProvider;
$count = Yii::$app->db->createCommand('
SELECT COUNT(*) FROM user WHERE status=:status
SELECT COUNT(*) FROM post WHERE status=:status
', [':status' => 1])->queryScalar();
$dataProvider = new SqlDataProvider([
'sql' => 'SELECT * FROM user WHERE status=:status',
$provider = new SqlDataProvider([
'sql' => 'SELECT * FROM post WHERE status=:status',
'params' => [':status' => 1],
'totalCount' => $count,
'pagination' => [
'pageSize' => 10,
],
'sort' => [
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
'default' => SORT_DESC,
'label' => 'Name',
],
'title',
'view_count',
'created_at',
],
],
]);
// データ行の配列を返す
$models = $provider->getModels();
```
> Info|情報: [[yii\data\SqlDataProvider::totalCount|totalCount]] プロパティは、データにページネーションを適用しなければならない場合にだけ要求されます。
これは、[[yii\data\SqlDataProvider::sql|sql]] によって指定される SQL 文は、現在要求されているページのデータだけを返すように、データプロバイダによって修正されてしまうからです。
データプロバイダは、総ページ数を正しく計算するためには、データアイテムの総数を知る必要があります。
## 配列データプロバイダ <span id="array-data-provider"></span>
[[yii\data\ArrayDataProvider]] は、一つの大きな配列を扱う場合に最も適しています。
このデータプロバイダによって、一つまたは複数のカラムで並べ替えた配列データの 1 ページ分を返すことが出来ます。
[[yii\data\ArrayDataProvider]] を使用するためには、全体の大きな配列として [[yii\data\ArrayDataProvider::allModels|allModels]] プロパティを指定しなければなりません。
この大きな配列の要素は、連想配列 (例えば [DAO](db-dao.md) のクエリ結果) またはオブジェクト (例えば [アクティブレコード](db-active-record.md) インスタンス) とすることが出来ます。
例えば、
```php
use yii\data\ArrayDataProvider;
$data = [
['id' => 1, 'name' => 'name 1', ...],
['id' => 2, 'name' => 'name 2', ...],
...
['id' => 100, 'name' => 'name 100', ...],
];
$provider = new ArrayDataProvider([
'allModels' => $data,
'pagination' => [
'pageSize' => 20,
'pageSize' => 10,
],
'sort' => [
'attributes' => ['id', 'name'],
],
]);
// 現在のページの user のレコードを取得する
$models = $dataProvider->getModels();
// 現在リクエストされているページの行を返す
$rows = $provider->getModels();
```
> Note|注意: ページネーションの機能を使いたい場合は、[[yii\data\SqlDataProvider::$totalCount]] プロパティに (ページネーション無しの) 総行数を設定しなければなりません。
そして、並べ替えの機能を使いたい場合は、どのカラムがソート出来るかをプロバイダが知ることが出来るように、[[yii\data\SqlDataProvider::$sort]] プロパティを構成しなければなりません。
> Note|注意: [アクティブデータプロバイダ](#active-data-provider) および [SQL データプロバイダ](#sql-data-provider) と比較すると、配列データプロバイダは効率の面では劣ります。
何故なら、*全ての* データをメモリにロードしなければならないからです。
## データのキーを扱う <span id="working-with-keys"></span>
データプロバイダによって返されたデータアイテムを使用する場合、各データアイテムを一意のキーで特定しなければならないことがよくあります。
例えば、データアイテムが顧客情報を表す場合、顧客 ID を各顧客データのキーとして使用したいでしょう。
データプロバイダは、[[yii\data\DataProviderInterface::getModels()]] によって返されたデータアイテムに対応するそのようなキーのリストを返すことが出来ます。
例えば、
あなた自身のカスタムデータプロバイダを実装する
----------------------------------------------
```php
use yii\data\ActiveDataProvider;
Yii はあなた自身のカスタムデータプロバイダを導入することを許容しています。
そうするためには、下記の `protected` メソッドを実装する必要があります。
$query = Post::find()->where(['status' => 1]);
- `prepareModels` - 現在のページで利用できるデータモデルを準備して、それを配列として返します。
- `prepareKeys` - 現在利用できるデータモデルの配列を受け取って、それと関連付けられるキーの配列を返します。
- `prepareTotalCount` - データプロバイダにあるデータモデルの総数を示す値を返します。
$provider = new ActiveDataProvider([
'query' => Post::find(),
]);
// Post オブジェクトの配列を返す
$posts = $provider->getModels();
// $post に対応するプライマリキーの値を返す
$ids = $provider->getKeys();
```
上記の例では、[[yii\data\ActiveDataProvider]] に対して [[yii\db\ActiveQuery]] オブジェクトを供給していますから、キーとしてプライマリキーの値を返すのが理にかなっています。
キーの値の計算方法を明示的に指定するために、[[yii\data\ActiveDataProvider::key]] にカラム名を設定したり、キーの値を計算するコーラブルを設定したりすることも出来ます。
例えば、
```php
// "slug" カラムをキーの値として使用する
$provider = new ActiveDataProvider([
'query' => Post::find(),
'key' => 'slug',
]);
// md5(id) の結果をキーの値として使用する
$provider = new ActiveDataProvider([
'query' => Post::find(),
'key' => function ($model) {
return md5($model->id);
}
]);
```
## カスタムデータプロバイダを作成する <span id="custom-data-provider"></span>
あなた自身のカスタムデータプロバイダクラスを作成するためには、[[yii\data\DataProviderInterface]] を実装しなければなりません。
[[yii\data\BaseDataProvider]] を拡張するのが比較的簡単な方法です。
そうすれば、データプロバイダのコアのロジックに集中することが出来ます。
具体的に言えば、実装する必要があるのは、主として次のメソッドです。
- [[yii\data\BaseDataProvider::prepareModels()|prepareModels()]]: 現在のページで利用できるデータモデルを準備して、それを配列として返します。
- [[yii\data\BaseDataProvider::prepareKeys()|prepareKeys()]]: 現在利用できるデータモデルの配列を受け取って、それと関連付けられるキーの配列を返します。
- [[yii\data\BaseDataProvider::prepareTotalCount()|prepareTotalCount]]: データプロバイダにあるデータモデルの総数を示す値を返します。
下記は、CSV ファイルを効率的に読み出すデータプロバイダのサンプルです。
```php
<?php
class CsvDataProvider extends \yii\data\BaseDataProvider
use yii\data\BaseDataProvider;
class CsvDataProvider extends BaseDataProvider
{
/**
* @var string 読み出すファイルの名前
* @var string 読み出す CSV ファイルの名前
*/
public $filename;

237
docs/guide-ja/output-formatting.md

@ -1,115 +1,83 @@
データフォーマッタ
==================
データのフォーマット
====================
出力をフォーマットするために、Yii はフォーマッタクラスを提供して、データをユーザにとってより読みやすいものにします。
デフォルトでは、[[yii\i18n\Formatter]] というヘルパクラスが、`formatter` という名前の [アプリケーションコンポーネント](structure-application-components.md) として登録されます。
ユーザにとってより読みやすい形式でデータを表示するために、`formatter` [アプリケーションコンポーネント](structure-application-components.md) を使ってデータをフォーマットすることが出来ます。
デフォルトでは、フォーマッタは [[yii\i18n\Formatter]] によって実装されており、これが、日付/時刻、数字、通貨、その他のよく使われる形式にデータをフォーマットする一連のメソッドを提供します。
このフォーマッタは次のようにして使うことが出来ます。
このヘルパが、日付/時刻、数字、その他のよく使われる形式について、データをローカライズしてフォーマットするための一連のメソッドを提供します。
フォーマッタは、二つの異なる方法で使うことが出来ます。
1. フォーマットするメソッド (全て `as` という接頭辞を持つフォーマッタのメソッドです) を直接に使用する。
```php
$formatter = \Yii::$app->formatter;
```php
echo Yii::$app->formatter->asDate('2014-01-01', 'long'); // 出力: January 1, 2014
echo Yii::$app->formatter->asPercent(0.125, 2); // 出力: 12.50%
echo Yii::$app->formatter->asEmail('cebe@example.com'); // 出力: <a href="mailto:cebe@example.com">cebe@example.com</a>
echo Yii::$app->formatter->asBoolean(true); // 出力: Yes
// null 値の表示も処理します。
echo Yii::$app->formatter->asDate(null); // 出力: (Not set)
```
// 出力: January 1, 2014
echo $formatter->asDate('2014-01-01', 'long');
2. [[yii\i18n\Formatter::format()|format()]] メソッドとフォーマット名を使う。
[[yii\grid\GridView]] や [[yii\widgets\DetailView]] のようなウィジェットでは、構成情報でカラムのデータの書式を指定することが出来ますが、これらウィジェットでもこのメソッドが使われています。
// 出力: 12.50%
echo $formatter->asPercent(0.125, 2);
```php
echo Yii::$app->formatter->format('2014-01-01', 'date'); // 出力: January 1, 2014
// 配列を使って、フォーマットメソッドのパラメータを指定することも出来ます。
// `2` は asPercent() メソッドの $decimals パラメータの値です。
echo Yii::$app->formatter->format(0.125, ['percent', 2]); // 出力: 12.50%
```
// 出力: <a href="mailto:cebe@example.com">cebe@example.com</a>
echo $formatter->asEmail('cebe@example.com');
// 出力: Yes
echo $formatter->asBoolean(true);
// it also handles display of null values:
[PHP intl 拡張](http://php.net/manual/ja/book.intl.php) がインストールされているときは、フォーマッタの全ての出力がローカライズされます。
これのために [[yii\i18n\Formatter::locale|locale]] プロパティを構成することが出来ます。
[[yii\i18n\Formatter::locale|locale]] が構成されていないときは、アプリケーションの [[yii\base\Application::language|language]] がロケールとして用いられます。
詳細は [国際化](tutorial-i18n.md) の節を参照してください。
フォーマッタはロケールに従って、正しい日付や数字の形式を選択し、月や曜日の名称もカレントの言語に翻訳します。
日付の形式は [[yii\i18n\Formatter::timeZone|timeZone]] によっても左右されます。
[[yii\i18n\Formatter::timeZone|timeZone]] も、明示的に構成されていない場合は、アプリケーションの [[yii\base\Application::timeZone|timeZone]] から取られます。
// 出力: (Not set)
echo $formatter->asDate(null);
```
例えば、日付のフォーマットを呼ぶと、ロケールによってさまざまな結果を出力します。
ご覧のように、これらのメソッドは全て `asXyz()` という名前を付けられており、`Xyz` がサポートされている形式を表しています。
別の方法として、汎用メソッド [[yii\i18n\Formatter::format()|format()]] を使ってデータをフォーマットすることも出来ます。
この方法を使うと望む形式をプログラム的に制御することが可能になりますので、[[yii\grid\GridView]] や [[yii\widgets\DetailView]] などのウィジェットでは、こちらがよく使われています。
例えば、
```php
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: January 1, 2014
Yii::$app->formatter->locale = 'de-DE';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: 1. Januar 2014
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: 1 января 2014 г.
Yii::$app->formatter->locale = 'ja-JP';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: 2014/01/01
// 出力: January 1, 2014
echo Yii::$app->formatter->format('2014-01-01', 'date');
// 配列を使ってフォーマットメソッドのパラメータを指定することも出来ます。
// `2` は asPercent() メソッドの $decimals パラメータの値です。
// 出力: 12.50%
echo Yii::$app->formatter->format(0.125, ['percent', 2]);
```
> Note|注意: フォーマットの仕方は、PHP とともにコンパイルされた ICU ライブラリのバージョンの違いによって異なる可能性がありますし、[PHP intl 拡張](http://php.net/manual/ja/book.intl.php) がインストールされているか否かという事実によっても異なってきます。
> 従って、あなたのウェブサイトが全ての環境で同じ出力を表示することを保証するために、全ての環境に PHP intl 拡張をインストールして、ICU ライブラリのバージョンが同じであることを確認する事を推奨します。
> [PHP 環境を国際化のために設定する](tutorial-i18n.md#setup-environment) も参照してください。
>
> もう一つ注意してほしいのは、たとえ intl 拡張がインストールされていても、32-bit システムでは、2038 年以降および 1901 年以前の日付・時刻の書式は、ローカライズされた月と日の名前を提供しない PHP の実装にフォールバックする、ということです。
> これは 32-bit システムでは intl が 32-bit の UNIX タイムスタンプを内部的に使用するからです。
> 64-bit のシステムでは、インストールされていれば、全ての場合に intl フォーマッタが使用されます。
## フォーマッタを構成する <span id="configuring-formater"></span>
フォーマッタを構成する <span id="configuring-format"></span>
----------------------
[アプリケーションの構成情報](concept-configurations.md#application-configurations) の中で `formatter` コンポーネントを構成して、フォーマットの規則をカスタマイズすることが出来ます。
例えば、
フォーマットメソッドによって使われるデフォルトの書式は、[[yii\i18n\Formatter|フォーマッタクラス]] のプロパティを使って調整することが出来ます。
プロパティの値をアプリケーション全体にわたって調整するために、[アプリケーションの構成情報](concept-configurations.md#application-configurations) において、`formatter` コンポーネントを構成することが出来ます。
構成の例を下記に示します。
利用できるプロパティの詳細については、[[yii\i18n\Formatter|Formatter クラスの API ドキュメント]] と、後続の項を参照してください。
```php
'components' => [
return [
'components' => [
'formatter' => [
'dateFormat' => 'dd.MM.yyyy',
'decimalSeparator' => ',',
'thousandSeparator' => ' ',
'currencyCode' => 'EUR',
],
],
],
];
```
日時の値をフォーマットする <span id="date-and-time"></span>
--------------------------
フォーマッタクラスは日時の値をフォーマットするさまざまなメソッドを提供しています。すなわち、
構成可能なプロパティについては、[[yii\i18n\Formatter]] を参照してください。
- [[yii\i18n\Formatter::asDate()|date]] - 値は日付としてフォーマットされます。例えば `2014/01/01`
- [[yii\i18n\Formatter::asTime()|time]] - 値は時刻としてフォーマットされます。例えば `14:23`
- [[yii\i18n\Formatter::asDatetime()|datetime]] - 値は日付および時刻としてフォーマットされます。例えば `2014/01/01 14:23`
- [[yii\i18n\Formatter::asTimestamp()|timestamp]] - 値は [unix タイムスタンプ](http://en.wikipedia.org/wiki/Unix_time) としてフォーマットされます。例えば `1412609982`
- [[yii\i18n\Formatter::asRelativeTime()|relativeTime]] - 値は、その日時と現在との間隔として、人間に分かりやすい言葉でフォーマットされます。例えば `1 時間前`
[[yii\i18n\Formatter::asDate()|date]]、[[yii\i18n\Formatter::asTime()|time]]、[[yii\i18n\Formatter::asDatetime()|datetime]] メソッドの日時の書式は、フォーマッタのプロパティ [[yii\i18n\Formatter::$dateFormat|$dateFormat]]、[[yii\i18n\Formatter::$timeFormat|$timeFormat]]、[[yii\i18n\Formatter::$datetimeFormat|$datetimeFormat]] を構成することで、グローバルに指定することが出来ます。
## 日付と時刻の値をフォーマットする <span id="date-and-time"></span>
デフォルトでは、フォーマッタが使う書式は、ショートカット形式で指定します。
これは、日付と時刻をユーザの国と言語にとって一般的な形式でフォーマット出来るように、現在アクティブなロケールに従ってさまざまに解釈されるものです。
四つの異なるショートカット形式が利用できます。
フォーマッタは日付と時刻に関連した下記の出力形式をサポートしています。
- `short` は、`en_GB` ロケールでは、例えば、日付を `06/10/2014`、時刻を `15:58` と表示します。
- `medium` は、 `6 Oct 2014` および `15:58:42`
- `long` は、`6 October 2014` および `15:58:42 GMT`
- そして `full``Monday, 6 October 2014` および `15:58:42 GMT` を表示します。
- [[yii\i18n\Formatter::asDate()|date]] - 値は日付としてフォーマットされます。例えば `January 01, 2014`
- [[yii\i18n\Formatter::asTime()|time]] - 値は時刻としてフォーマットされます。例えば `14:23`
- [[yii\i18n\Formatter::asDatetime()|datetime]] - 値は日付および時刻としてフォーマットされます。例えば `January 01, 2014 14:23`
- [[yii\i18n\Formatter::asTimestamp()|timestamp]] - 値は [unix タイムスタンプ](http://en.wikipedia.org/wiki/Unix_time) としてフォーマットされます。例えば `1412609982`
- [[yii\i18n\Formatter::asRelativeTime()|relativeTime]] - 値は、その日時と現在との間隔として、人間に分かりやすい言葉でフォーマットされます。例えば `1 hour ago`
> Info:情報| `ja_JP` ロケールでは、次のようになります。
>
> - `short` ... `2014/10/06` および `15:58`
> - `medium` ... `2014/10/06` および `15:58:42`
> - `long` ... `2014年10月6日` および `15:58:42 JST`
> - `full` ... `2014年10月6日月曜日` および `15時58分42秒 日本標準時`
[[yii\i18n\Formatter::asDate()|date]]、[[yii\i18n\Formatter::asTime()|time]]、[[yii\i18n\Formatter::asDatetime()|datetime]] メソッドに使われるデフォルトの日時書式は、フォーマッタの [[yii\i18n\Formatter::$dateFormat|$dateFormat]]、[[yii\i18n\Formatter::$timeFormat|$timeFormat]]、[[yii\i18n\Formatter::$datetimeFormat|$datetimeFormat]] を構成することで、グローバルにカスタマイズすることが出来ます。
これに加えて、[ICU プロジェクト](http://site.icu-project.org/) によって定義された構文を使うカスタム書式を指定することが出来ます。
この構文を説明する ICU マニュアルが下記の URL にあります: <http://userguide.icu-project.org/formatparse/datetime>
別の選択肢として、`php:` という接頭辞を付けた文字列を使って、PHP の [date()](http://php.net/manual/ja/function.date.php) 関数が認識する構文を使うことも出来ます。
日付と時刻のフォーマットは、[ICU 構文](http://userguide.icu-project.org/formatparse/datetime) によって指定することが出来ます。
また、ICU 構文と区別するために `php:` という接頭辞を付けて、[PHP の date() 構文](http://php.net/manual/ja/function.date.php) を使うことも出来ます。
例えば、
```php
// ICU 形式
@ -118,35 +86,62 @@ echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // 2014-10-06
echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06
```
複数の言語をサポートする必要があるアプリケーションを扱う場合には、ロケールごとに異なる日付と時刻のフォーマットを指定しなければならないことがよくあります。
この仕事を単純化するためには、(`long`、`short` などの) フォーマットのショートカットを代りに使うことが出来ます。
フォーマッタは、現在アクティブな [[yii\i18n\Formatter::locale|locale]] に従って、フォーマットのショートカットを適切なフォーマットに変換します。
フォーマットのショートカットとして、次のものがサポートされています
(例は `en_GB` がアクティブなロケールであると仮定したものです)。
- `short`: 日付は `06/10/2014`、時刻は `15:58` を出力
- `medium`: `6 Oct 2014``15:58:42` を出力
- `long`: `6 October 2014``15:58:42 GMT` を出力
- `full`: `Monday, 6 October 2014``15:58:42 GMT` を出力
> Info|訳注: ja_JP ロケールでは、次のようになります。
>
> short: 2014/10/06 と 15:58
> medium: 2014/10/06 と 15:58:42
> long: 2014年10月6日 と 15:58:42 JST
> full: 2014年10月6日月曜日 と 15時58分42秒 日本標準時
### タイムゾーン <span id="time-zones"></span>
日時の値をフォーマットするときに、Yii はその値を [[yii\i18n\Formatter::timeZone|設定されたタイムゾーン]] に変換します。
従って、入力値は、タイムゾーンが明示的に指定されていなければ、UTC であると見なされます。
この理由により、全ての日時の値を UTC、それも、なるべくなら、定義によって UTC であることが保証されている UNIX タイムスタンプで保存することが推奨されます。
入力値が UTC とは異なるタイムゾーンに属する場合は、次の例のように、タイムゾーンを明示的に記述しなければなりません。
日時の値をフォーマットするときに、Yii はその値をターゲット [[yii\i18n\Formatter::timeZone|タイムゾーン]] に変換します。
フォーマットされる値は、タイムゾーンが明示的に指定されるか、[[yii\i18n\Formatter::defaultTimeZone]] が構成されるかしていない限り、UTC であると見なされます。
次の例では、ターゲット [[yii\i18n\Formatter::timeZone|タイムゾーン]] が `Europe/Berlin` に設定されているものとします
```php
// Yii::$app->timeZone は 'Asia/Tokyo' であるとします。
echo Yii::$app->formatter->asTime(1412599260); // 21:41:00
echo Yii::$app->formatter->asTime('2014-10-06 12:41:00'); // 21:41:00
echo Yii::$app->formatter->asTime('2014-10-06 21:41:00 JST'); // 21:41:00
// UNIX タイムスタンプを時刻としてフォーマット
echo Yii::$app->formatter->asTime(1412599260); // 14:41:00
// UTC の日付時刻文字列を時刻としてフォーマット
echo Yii::$app->formatter->asTime('2014-10-06 12:41:00'); // 14:41:00
// CEST の日付時刻文字列を時刻としてフォーマット
echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
```
バージョン 2.0.1 からは、上記のコードの二番目の例のようにタイムゾーン識別子を含まないタイムスタンプに対して適用されるタイムゾーンを設定することも可能になりました。
[[yii\i18n\Formatter::defaultTimeZone]] を設定して、データストレージに使用しているタイムゾーンに合わせることが出来ます。
> Info|訳注:
> ターゲット [[yii\i18n\Formatter::timeZone|タイムゾーン]] が `Asia/Tokyo` である場合は、次のようになります。
>
> ```php
> echo Yii::$app->formatter->asTime(1412599260); // 21:41:00
> echo Yii::$app->formatter->asTime('2014-10-06 12:41:00'); // 21:41:00
> echo Yii::$app->formatter->asTime('2014-10-06 21:41:00 JST'); // 21:41:00
> ```
> Note|注意: タイムゾーンは世界中のさまざまな政府によって作られる規則に従うものであり、頻繁に変更されるものであるため、あなたのシステムにインストールされたタイムゾーンのデータベースが最新の情報を持っていない可能性が大いにあります。
> タイムゾーンデータベースの更新についての詳細は、[ICU マニュアル](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data) で参照することが出来ます。
> [PHP 環境を国際化のために設定する](tutorial-i18n.md#setup-environment) も参照してください。
数値をフォーマットする <span id="numbers"></span>
----------------------
## 数値をフォーマットする <span id="numbers"></span>
数値をフォーマットするために、フォーマッタクラスは次のメソッドを提供しています。
フォーマッタは、数値に関連した下記の出力フォーマットをサポートしています。
- [[yii\i18n\Formatter::asInteger()|integer]] - 値は整数としてフォーマットされます。例えば `42`
- [[yii\i18n\Formatter::asDecimal()|decimal]] - 値は小数点と三桁ごとの区切りを使って十進数としてフォーマットされます。例えば `2,542.123` または `2.542,123`
- [[yii\i18n\Formatter::asDecimal()|decimal]] - 値は小数点と三桁ごとの区切りを考慮して十進数としてフォーマットされます。例えば `2,542.123` または `2.542,123`
- [[yii\i18n\Formatter::asPercent()|percent]] - 値は百分率としてフォーマットされます。例えば `42%`
- [[yii\i18n\Formatter::asScientific()|scientific]] - 値は科学記法による数値としてフォーマットされます。例えば `4.2E4`
- [[yii\i18n\Formatter::asCurrency()|currency]] - 値は通貨の値としてフォーマットされます。例えば `£420.00`
@ -168,14 +163,14 @@ echo Yii::$app->formatter->asTime('2014-10-06 21:41:00 JST'); // 21:41:00
]
```
その他のフォーマッタ <span id="other"></span>
--------------------
## その他のフォーマット <span id="other"></span>
日付、時刻、そして、数値の他にも、Yii はさまざまな状況で使える一連のフォーマッタを提供しています。
日付/時刻と数値のフォーマット以外にも、Yii はよく使われるフォーマットをサポートしています。
その中には、次のものが含まれます。
- [[yii\i18n\Formatter::asRaw()|raw]] - 値はそのまま出力されます。`null` 値が [[nullDisplay]] を使ってフォーマットされる以外は、何の効果もない擬似フォーマッタです。
- [[yii\i18n\Formatter::asText()|text]] - 値は HTML エンコードされます。
これは [GridView DataColumn](output-data-widgets.md#data-column) で使われるデフォルトの形式です。
これは [GridView DataColumn](output-data-widgets.md#data-column) で使われるデフォルトのフォーマットです。
- [[yii\i18n\Formatter::asNtext()|ntext]] - 値は HTML エンコードされ、改行文字が強制改行に変換された平文テキストとしてフォーマットされます。
- [[yii\i18n\Formatter::asParagraphs()|paragraphs]] - 値は HTML エンコードされ、`<p>` タグに囲まれた段落としてフォーマットされます。
- [[yii\i18n\Formatter::asHtml()|html]] - 値は XSS 攻撃を避けるために [[HtmlPurifier]] を使って浄化されます。
@ -185,12 +180,42 @@ echo Yii::$app->formatter->asTime('2014-10-06 21:41:00 JST'); // 21:41:00
- [[yii\i18n\Formatter::asUrl()|url]] - 値はハイパーリンクとしてフォーマットされます。
- [[yii\i18n\Formatter::asBoolean()|boolean]] - 値は真偽値としてフォーマットされます。
デフォルトでは、`true` は `Yes`、`false` は `No` とレンダリングされ、現在のアプリケーションの言語に翻訳されます。
この振る舞いは [[yii\i18n\Formatter::booleanFormat]] プロパティを構成して調整できます。
この動作は [[yii\i18n\Formatter::booleanFormat]] プロパティを構成して調整できます。
## `null`<span id="null-values"></span>
Null 値は特殊な方法でフォーマットされます。
空文字列を表示する代りに、フォーマッタは null 値を事前定義された文字列 (そのデフォルト値は `(not set)` です) に変換し、それを現在のアプリケーションの言語に翻訳します。
この文字列は [[yii\i18n\Formatter::nullDisplay|nullDisplay]] プロパティを構成してカスタマイズすることが出来ます。
`null`<span id="null-values"></span>
---------
## データのフォーマットをローカライズする <span id="localizing-data-format"></span>
PHP において `null` である値に対して、フォーマッタクラスは空文字ではなくプレースホルダを表示します。
`null` のプレースホルダは、デフォルトでは `(not set)` であり、それが現在のアプリケーションの言語に翻訳されます。
[[yii\i18n\Formatter::nullDisplay|nullDisplay]] プロパティを構成して、カスタムのプレースホルダを設定することが出来ます。
`null` 値の特別な扱いをしたくない場合は、[[yii\i18n\Formatter::nullDisplay|nullDisplay]] を `null` に設定することが出来ます。
既に述べたように、フォーマッタは現在のアクティブな [[yii\i18n\Formatter::locale|locale]] を使って、ターゲットの国/地域にふさわしい値のフォーマットを決定することが出来ます。
例えば、同じ日時の値でも、ロケールによって異なる書式にフォーマットされます。
```php
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: January 1, 2014
Yii::$app->formatter->locale = 'de-DE';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: 1. Januar 2014
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: 1 января 2014 г.
Yii::$app->formatter->locale = 'ja-JP';
echo Yii::$app->formatter->asDate('2014-01-01'); // 出力: 2014/01/01
```
デフォルトでは、現在のアクティブな [[yii\i18n\Formatter::locale|locale]] は [[yii\base\Application::language]] の値によって決定されます。
これは [[yii\i18n\Formatter::locale]] プロパティを明示的に指定することによってオーバーライドすることが出来ます。
> Note|注意: Yii のフォーマッタは、[PHP intl extension](http://php.net/manual/ja/book.intl.php) に依存してデータのフォーマットのローカライズをサポートしています。
> PHP にコンパイルされた ICU ライブラリのバージョンによってフォーマットの結果が異なる場合がありますので、あなたの全ての環境で、同じ ICU バージョンを使うことが推奨されます。
> 詳細については、[PHP 環境を国際化のために設定する](tutorial-i18n.md#setup-environment) を参照してください。
>
> intl 拡張がインストールされていない場合は、データはローカライズされません。
>
> 1901年より前、または、2038年より後の日時の値は、たとえ intl 拡張がインストールされていても、32-bit システムではローカライズされないことに注意してください。
> これは、この場合、ICU ライブラリが日時の値に対して 32-bit の UNIX タイムスタンプを使用しているのが原因です。

79
docs/guide-ja/output-pagination.md

@ -1,40 +1,73 @@
ページネーション
================
一つのページに一度に表示するにはデータ数が多すぎる場合に、それぞれ一定数のデータアイテムを含む部分にデータを分割して、一度に一つの部分だけを表示することがよく行われます。
このような部分はページと呼ばれますが、それがページネーションという名前の由来です。
一つのページに表示するにはデータの数が多すぎるという場合に、データを複数のページに分割して、それぞれのページでは一部分だけを表示する、という戦略がよく使われます。
この戦略が *ページネーション* として知られるものです。
あなたが [データウィジェット](output-data-widgets.md) の一つとともに [データプロバイダ](output-data-providers.md) を使っている場合は、ページネーションは既に自動的に設定されて、うまく動作するようになっています。
そうでない場合は、あなたが [[\yii\data\Pagination]] オブジェクトを作成し、[[\yii\data\Pagination::$totalCount|総アイテム数]]、[[\yii\data\Pagination::$pageSize|ページサイズ]]、[[\yii\data\Pagination::$page|現在のページ]] などのデータを代入して、クエリに適用し、そして [[\yii\widgets\LinkPager|リンクページャ]] に与えなければなりません。
Yii は [[yii\data\Pagination]] オブジェクトを使って、ページネーションのスキームに関する情報を表します。
具体的に言えば、
まず最初に、コントローラアクションの中でページネーションオブジェクトを作成し、データを代入します。
* [[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
function actionIndex()
{
$query = Article::find()->where(['status' => 1]);
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count()]);
$models = $query->offset($pages->offset)
use yii\data\Pagination;
// status = 1 である全ての記事を取得する DB クエリを構築する
$query = Article::find()->where(['status' => 1]);
// 記事の総数を取得する (ただし、記事のデータはまだ取得しない)
$count = $query->count();
// 記事の総数を使ってページネーションオブジェクトを作成する
$pagination = new Pagination(['totalCount' => $count]);
// ページネーションを使ってクエリの OFFSET と LIMIT を修正して記事を取得する
$articles = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('index', [
'models' => $models,
'pages' => $pages,
]);
}
```
次に、ビューにおいて、現在のページのモデルを出力し、リンクページャにページネーションオブジェクトを渡します。
上記の例で返される記事のページ番号はどうなるでしょう?
それは `page` という名前のクエリパラメータがリクエストに含まれるかどうかによって決ります。
デフォルトでは、ページネーションオブジェクトは [[yii\data\Pagination::$page|page]] に `page` パラメータの値をセットしようと試みます。
そして、このパラメータが提供されていない場合には、デフォルト値である 0 が使用されます。
ページネーションをサポートする UI 要素の構築を容易にするために、Yii はページボタンのリストを表示する [[yii\widgets\LinkPager]] ウィジェットを提供しています。
これは、ユーザがページボタンをクリックして、どのページを表示すべきかを指示することが出来るものです。
このウィジェットは、ページネーションオブジェクトを受け取って、現在のページ番号が何であるかを知り、何個のページボタンを表示すべきかを知ります。
例えば、
```php
foreach ($models as $model) {
// ここで $model を表示
}
use yii\widgets\LinkPager;
// ページネーションを表示
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]] プロパティを構成します。

89
docs/guide-ja/output-sorting.md

@ -1,54 +1,89 @@
並べ替え
========
表示するデータを一つまたはいくつかの属性に従って並べ替えなければならないことがあります。
あなたが [データウィジェット](output-data-widgets.md) の一つとともに [データプロバイダ](output-data-providers.md) を使っている場合は、並べ替えはあなたに代って自動的に処理されます。
そうでない場合は、[[\yii\data\Sort]] のインスタンスを作成して構成し、クエリに適用しなければなりません。
また、[[\yii\data\Sort]] のインスタンスをビューに渡して、属性による並べ替えのためのリンクを作成することが出来ます。
複数のデータ行を表示する際に、エンドユーザによって指定されるカラムに従ってデータを並べ替えなければならないことがよくあります。
Yii は [[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
function actionIndex()
{
$sort = new Sort([
use yii\data\Sort;
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
'default' => SORT_DESC,
'label' => 'Name',
'label' => '氏名',
],
],
]);
]);
$models = Article::find()
$articles = Article::find()
->where(['status' => 1])
->orderBy($sort->orders)
->all();
```
return $this->render('index', [
'models' => $models,
'sort' => $sort,
]);
}
上記の例では、[[yii\data\Sort|Sort]] オブジェクトに対して二つの属性が宣言されています。
すなわち、`age` と `name` です。
`age` 属性は `Article` アクティブレコードクラスの `age` 属性に対応する *単純な* 属性です。
これは、次の宣言と等価です。
```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');
foreach ($models as $model) {
// ここで $model を表示
}
// /index.php?r=article/index&sort=age を表示
echo $sort->createUrl('age');
```
上記においては、並べ替えをサポートする二つの属性、すなわち、`name` と `age` を宣言しています。
並べ替えの情報を Article クエリに渡して、クエリ結果が Sort オブジェクトで指定された順序に従って並べ替えられるようにしています。
ビューにおいては、二つのハイパーリンクを表示して、対応する属性によって並べ替えられたデータを表示するページへ移動できるようにしています。
[[yii\data\Sort|Sort]] クラスは、リクエストで渡されたパラメータを自動的に取得して、それに応じて並べ替えのオプションを調整します。
パラメータは [[yii\data\Sort::$params|$params]] プロパティを構成して調整することが出来ます。
[[yii\data\Sort]] は、リクエストの `sort` クエリパラメータをチェックして、どの属性による並べ替えがリクエストされたかを判断します。
このクエリパラメータが存在しない場合のデフォルトの並べ替え方法は [[yii\data\Sort::defaultOrder]] によって指定することが出来ます。
また、[[yii\data\Sort::sortParam|sortParam]] プロパティを構成して、このクエリパラメータの名前をカスタマイズすることも出来ます。

109
docs/guide-ja/output-theming.md

@ -1,91 +1,95 @@
テーマ
======
> Note|注意: この節はまだ執筆中です。
テーマは、元のビューレンダリングのコードに触れる必要なしに、[ビュー](structure-views.md) のセットを別のセットに置き換えるための方法です。
テーマを使うとアプリケーションのルックアンドフィールを体系的に変更することが出来ます。
テーマとは、あるディレクトリの下に集められたビューとレイアウトのファイルです。
テーマの各ファイルが、アプリケーションの対応するファイルをレンダリングの際にオーバーライドします。
一つのアプリケーションは複数のテーマを使用することが可能で、それぞれのテーマはまったく異なるユーザ体験を提供することが出来ます。
いつでも一つのテーマだけがアクティブになり得ます。
テーマを使うためには、`view` アプリケーションコンポーネントの [[yii\base\View::theme|theme]] プロパティを構成しなければなりません。
このプロパティが、ビューファイルが置換される方法を管理する [[yii\base\Theme]] オブジェクトを構成します。
指定しなければならない [[yii\base\Theme]] のプロパティは主として以下のものです。
> Note|注意: ビューはアプリケーションの固有性が強いものですので、通常は、テーマを再配布可能なものとして作ることはしません。
カスタマイズしたルックアンドフィールを再配布したい場合は、テーマの代りに、[アセットバンドル](structure-assets.md) の形で CSS と JavaScript のファイルを再配布することを検討してください。
- [[yii\base\Theme::basePath]]: テーマのリソース (CSS、JS、画像など) を含むベースディレクトリを指定します。
- [[yii\base\Theme::baseUrl]]: テーマのリソースのベース URL を指定します。
- [[yii\base\Theme::pathMap]]: ビューファイルの置換の規則を指定します。
詳細は後述する項で説明します。
テーマを構成する
----------------
テーマの構成情報は、アプリケーションの `view` コンポーネントを通じて指定します。
`basic application` のビューに対して働くテーマをセットアップするためには、アプリケーションの構成情報ファイルに以下のように記述しなければなりません。
例えば、`SiteController` で `$this->render('about')` を呼び出すと、ビューファイル `@app/views/site/about.php` をレンダリングすることになります。
しかし、下記のようにアプリケーション構成情報でテーマを有効にすると、代りに、ビューファイル `@app/themes/basic/site/about.php` がレンダリングされます。
```php
'components' => [
return [
'components' => [
'view' => [
'theme' => [
'pathMap' => ['@app/views' => '@app/themes/basic'],
'basePath' => '@app/themes/basic',
'baseUrl' => '@web/themes/basic',
'pathMap' => [
'@app/views' => '@app/themes/basic',
],
],
],
],
],
];
```
上記においては、`pathMap` が元のパスからテーマのパスへの割り付けを定義し、`baseUrl` がテーマのファイルによって参照されるリソースのベース URL を定義しています。
> Info|情報: テーマではパスエイリアスがサポートされています。
ビューの置換を行う際に、パスエイリアスは実際のファイルパスまたは URL に変換されます。
私たちの例では、`pathMap` は `['@app/views' => '@app/themes/basic']`す。
これは、`@app/views` の全てのビューは、最初に `@app/themes/basic` の下で探され、そのテーマのディレクトリにビューが存在していれば、それが元のビューの代りに使われる、ということを意味します。
[[yii\base\View::theme]] プロパティを通じて [[yii\base\Theme]] オブジェクトにアクセスすることが出来ます。
例えば、ビューファイルの中では `$this` がビューオブジェクトを指すので、次のようなコードを書くことが出来ます。
例えば、上記の構成においては、ビューファイル `@app/views/site/index.php` のテーマ版は `@app/themes/basic/site/index.php` になります。
基本的には、`@app/views/site/index.php` の `@app/views``@app/themes/basic` に置き換えるわけです。
```php
$theme = $this->theme;
ランタイムにおいてテーマを構成するためには、ビューをレンダリングする前に次のコードを使用することが出来ます。
典型的には、コントローラの中に次のコードを置きます。
// $theme->baseUrl . '/img/logo.gif' を返す
$url = $theme->getUrl('img/logo.gif');
```php
$this->getView()->theme = Yii::createObject([
'class' => '\yii\base\Theme',
'pathMap' => ['@app/views' => '@app/themes/basic'],
'baseUrl' => '@web/themes/basic',
]);
// $theme->basePath . '/img/logo.gif' を返す
$file = $theme->getPath('img/logo.gif');
```
### モジュールにテーマを適用する
[[yii\base\Theme::pathMap]] プロパティが、ビューファイルがどのように置換されるべきかを制御します。
このプロパティは「キー・値」ペアの配列を取ります。
キーは置き換えられる元のビューのパスであり、値は対応するテーマのビューのパスです。
置換は部分一致に基づいて行われます。
あるビューのパスが [[yii\base\Theme::pathMap|pathMap]] 配列のキーのどれかで始っていると、その一致している部分が対応する配列の値によって置き換えられます。
上記の構成例を使う場合、`@app/views/site/about.php` は `@app/views` というキーに部分一致するため、`@app/themes/basic/site/about.php` に置き換えられることになります。
### モジュールにテーマを適用する <span id="theming-modules"></span>
モジュールにテーマを適用するためには、`pathMap` を次のようなものにすることが出来ます。
モジュールにテーマを適用するためには、[[yii\base\Theme::pathMap]] を次のように構成します。
```php
'components' => [
'view' => [
'theme' => [
'pathMap' => [
'pathMap' => [
'@app/views' => '@app/themes/basic',
'@app/modules' => '@app/themes/basic/modules', // <-- !!!
],
],
],
],
```
これによって、`@app/modules/blog/views/comment/index.php` に `@app/themes/basic/modules/blog/views/comment/index.php` というテーマを適用することが出来ます。
### ウィジェットにテーマを適用する
`@app/widgets/currency/views/index.php` に配置されているウィジェットのビューにテーマを適用するためには、ビューコンポーネントのテーマに、次のような構成情報を設定する必要があります。
### ウィジェットにテーマを適用する <span id="theming-widgets"></span>
ウィジェットにテーマを適用するためには、[[yii\base\Theme::pathMap]] を次のように構成します。
```php
'components' => [
'view' => [
'theme' => [
'pathMap' => ['@app/widgets' => '@app/themes/basic/widgets'],
],
],
'pathMap' => [
'@app/views' => '@app/themes/basic',
'@app/widgets' => '@app/themes/basic/widgets', // <-- !!!
],
```
上記の構成によって、`@app/widgets/currency/index.php` ビューのテーマ版を `@app/themes/basic/widgets/currency/index.php` として作成することが出来るようになります。
これによって、`@app/widgets/currency/views/index.php` に `@app/themes/basic/widgets/currency/index.php` というテーマを適用することが出来ます。
複数のパスを使う
----------------
## テーマの継承 <span id="theme-inheritance"></span>
一つのパスを複数のテーマパスに割り付けることが出来ます。例えば、
場合によっては、基本的なルックアンドフィールを含むアプリケーションの基本テーマを定義しておいて、現在の祝日に基づいてルックアンドフィールを少し変更したい、ということがあるかもしれません。
テーマの継承を使ってこの目的を達することが出来ます。
テーマの継承は、一つのビューパスを複数のターゲットに割り付けることによって設定することが出来ます。
例えば、
```php
'pathMap' => [
@ -96,7 +100,6 @@ $this->getView()->theme = Yii::createObject([
]
```
この場合、最初に `@app/themes/christmas/site/index.php` というビューファイルが探され、それが見つからない場合は、次に `@app/themes/basic/site/index.php` が探されます。
そして、そこにもビューがない場合は、アプリケーションのビューが使用されます。
この機能は、いくつかのビューを一時的または条件的にオーバーライドしたい場合に、特に役立ちます。
この場合、ビュー `@app/views/site/index.php` には、どちらのテーマファイルが存在するかに従って、`@app/themes/christmas/site/index.php` か `@app/themes/basic/site/index.php` か、どちらかのテーマが適用されます。
テーマファイルが両方とも存在する場合は、最初のものが優先されます。
実際の場面では、ほとんどのテーマビューファイルを `@app/themes/basic` に保管し、その中のいくつかを `@app/themes/christmas` でカスタマイズすることになるでしょう。

18
docs/guide-ja/rest-authentication.md

@ -19,7 +19,7 @@ Yii は上記の全ての認証方法をサポートしています。新しい
あなたの API に対して認証を有効にするためには、次のステップを実行します。
1. `user` アプリケーションコンポーネントを構成します。
1. `user` [アプリケーションコンポーネント](structure-application-components.md) を構成します。
- [[yii\web\User::enableSession|enableSession]] プロパティを `false` に設定します。
- [[yii\web\User::loginUrl|loginUrl]] プロパティを `null` に設定し、ログインページにリダイレクトする代りに HTTP 403 エラーを表示します。
2. REST コントローラクラスにおいて、`authenticator` ビヘイビアを構成することによって、どの認証方法を使用するかを指定します。
@ -29,15 +29,15 @@ Yii は上記の全ての認証方法をサポートしています。新しい
[[yii\web\User::enableSession|enableSession]] が false である場合、ユーザの認証ステータスがセッションを使ってリクエストをまたいで存続することはありません。
その代りに、すべてのリクエストに対して認証が実行されます。このことは、ステップ 2 と 3 によって達成されます。
> Tip|情報: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーションコンポーネントの [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。
RESTful API をモジュールとして開発する場合は、次のように、モジュールの `init()` メソッドに一行を追加することが出来ます。
> Tip|情報: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーションコンポーネント(structure-application-components.md) の [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。
> RESTful API をモジュールとして開発する場合は、次のように、モジュールの `init()` メソッドに一行を追加することが出来ます。
> ```php
public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
}
```
> public function init()
> {
> parent::init();
> \Yii::$app->user->enableSession = false;
> }
> ```
例えば、HTTP Basic 認証を使う場合は、`authenticator` ビヘイビアを次のように構成することが出来ます。

2
docs/guide-ja/rest-error-handling.md

@ -74,7 +74,7 @@ return [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null && !empty(Yii::$app->request->get('suppress_response_code'))) {
if ($response->data !== null && Yii::$app->request->get('suppress_response_code')) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,

11
docs/guide-ja/rest-quick-start.md

@ -19,12 +19,12 @@ Yii は、RESTful ウェブサービス API を実装する仕事を簡単にす
以下においては、例を使って、どのようにして最小限のコーディング労力で一組の RESTful API を構築することが出来るかを説明します。
ユーザのデータを RESTful API によって公開したいと仮定しましょう。
ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [[yii\db\ActiveRecord|ActiveRecord]] クラス `app\models\User` が既に作成済みであるとします。
ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [アクティブレコード](db-active-record.md) クラス `app\models\User` が既に作成済みであるとします。
## コントローラを作成する <span id="creating-controller"></span>
最初に、コントローラクラス `app\controllers\UserController` を次のようにして作成します。
最初に、[コントローラ](structure-controllers.md) クラス `app\controllers\UserController` を次のようにして作成します。
```php
namespace app\controllers;
@ -37,8 +37,11 @@ class UserController extends ActiveController
}
```
このコントローラクラスは、[[yii\rest\ActiveController]] を拡張するものです。
このコントローラクラスは、よく使用される一揃いの RESTful アクションを実装した [[yii\rest\ActiveController]] を拡張するものです。
[[yii\rest\ActiveController::modelClass|modelClass]] を `app\models\User` と指定することによって、データの取得と操作にどのモデルが使用できるかをコントローラに教えてやります。
The controller class extends from [[yii\rest\ActiveController]], which implements a common set of RESTful actions.
By specifying [[yii\rest\ActiveController::modelClass|modelClass]]
as `app\models\User`, the controller knows which model can be used for fetching and manipulating data.
## URL 規則を構成する <span id="configuring-url-rules"></span>
@ -61,7 +64,7 @@ class UserController extends ActiveController
## JSON の入力を可能にする <span id="enabling-json-input"></span>
API が JSON 形式で入力データを受け取ることが出来るように、`request` アプリケーションコンポーネントの [[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。
API が JSON 形式で入力データを受け取ることが出来るように、`request` [アプリケーションコンポーネント](structure-application-components.md) の [[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。
```php
'request' => [

3
docs/guide-ja/rest-response-formatting.md

@ -8,8 +8,7 @@ RESTful API のリクエストを処理するとき、アプリケーション
2. リソースオブジェクトを配列に変換します。
[リソース](rest-resources.md) の節で説明したように、この作業は [[yii\rest\Serializer]] によって実行されます。
3. 配列をコンテントネゴシエーションのステップで決定された形式の文字列に変換します。
この作業は、[[yii\web\Response::formatters|response]] アプリケーションコンポーネントに登録された [[yii\web\ResponseFormatterInterface|レスポンスフォーマッタ]] によって実行されます。
この作業は、`response` [アプリケーションコンポーネント](structure-application-components.md) の [[yii\web\Response::formatters|formatters]] プロパティに登録された [[yii\web\ResponseFormatterInterface|レスポンスフォーマッタ]] によって実行されます。
## コンテントネゴシエーション <span id="content-negotiation"></span>

2
docs/guide-ja/rest-routing.md

@ -5,7 +5,7 @@
実際には、綺麗な URL を有効にして HTTP 動詞を利用したいというのが普通でしょう。
例えば、`POST /users` というリクエストが `user/create` アクションへのアクセスを意味するようにする訳です。
これは、アプリケーションの構成情報で `urlManager` アプリケーションコンポーネントを次のように構成することによって容易に達成することが出来ます。
これは、アプリケーションの構成情報で `urlManager` [アプリケーションコンポーネント](structure-application-components.md) を次のように構成することによって容易に達成することが出来ます。
```php
'urlManager' => [

4
docs/guide-ja/runtime-handling-errors.md

@ -1,11 +1,11 @@
エラー処理
==========
Yii は、エラー処理を従来よりはるかに快適な経験にしてくれる、内臓の [[yii\web\ErrorHandler|エラーハンドラ]] を持っています。
Yii が内蔵している [[yii\web\ErrorHandler|エラーハンドラ]] は、エラー処理を従来よりはるかに快適な経験にしてくれます。
具体的には、Yii のエラーハンドラはエラー処理をより良くするために、次のことを行います。
* 致命的でない全ての PHP エラー (警告や通知) は捕捉可能な例外に変換されます。
* 例外と致命的な PHP エラーは、デバッグモードでは、詳細なコールスタック情報とソースコード行とともに表示されます。
* 例外および致命的 PHP エラーは、デバッグモードでは、詳細なコールスタック情報とソースコード行とともに表示されます。
* エラーを表示するために専用の [コントローラアクション](structure-controllers.md#actions) を使うことがサポートされています。
* さまざまなエラーレスポンス形式をサポートしています。

10
docs/guide-ja/runtime-requests.md

@ -64,10 +64,10 @@ $param = $request->getBodyParam('id');
```php
$request = Yii::$app->request;
if ($request->isAjax) { // リクエストは AJAX リクエスト }
if ($request->isGet) { // リクエストメソッドは GET }
if ($request->isPost) { // リクエストメソッドは POST }
if ($request->isPut) { // リクエストメソッドは PUT }
if ($request->isAjax) { /* リクエストは AJAX リクエスト */ }
if ($request->isGet) { /* リクエストメソッドは GET */ }
if ($request->isPost) { /* リクエストメソッドは POST */ }
if ($request->isPut) { /* リクエストメソッドは PUT */ }
```
## リクエストの URL <span id="request-urls"></span>
@ -99,7 +99,7 @@ $headers = Yii::$app->request->headers;
// Accept ヘッダの値を返す
$accept = $headers->get('Accept');
if ($headers->has('User-Agent')) { // User-Agent ヘッダが在る }
if ($headers->has('User-Agent')) { /* User-Agent ヘッダが在る */ }
```
`request` コンポーネントは、よく使用されるいくつかのヘッダにすばやくアクセスする方法を提供しています。

8
docs/guide-ja/runtime-routing.md

@ -9,7 +9,7 @@ Yii のアプリケーションがリクエストされた URL の処理を開
これは、与えられたルートとそれに結び付けられたクエリパラメータから URL を生成するものです。
生成された URL が後でリクエストされたときには、ルーティングのプロセスがその URL を解決して元のルートとクエリパラメータに戻すことが出来ます。
ルーティングと URL 生成について主たる役割を果たすのが `urlManager` アプリケーションコンポーネントとして登録されている [[yii\web\UrlManager|URL マネージャ]] です。
ルーティングと URL 生成について主たる役割を果たすのが `urlManager` [アプリケーションコンポーネント](structure-application-components.md) として登録されている [[yii\web\UrlManager|URL マネージャ]] です。
[[yii\web\UrlManager|URL マネージャ]] は、入ってくるリクエストをルートとそれに結び付けられたクエリパラメータとして解析するための [[yii\web\UrlManager::parseRequest()|parseRequest()]] メソッドと、与えられたルートとそれに結び付けられたクエリパラメータから URL を生成するための [[yii\web\UrlManager::createUrl()|createUrl()]] メソッドを提供します。
アプリケーション構成情報の `urlManager` コンポーネントを構成することによって、既存のアプリケーションコードを修正することなく、任意の URL 形式をアプリケーションに認識させることが出来ます。
@ -50,7 +50,7 @@ $url = Url::to(['post/view', 'id' => 100]);
## ルーティング <span id="routing"></span>
ルーティングは二つのステップを含みます。最初のステップでは、入ってくるリクエストが解析されて、ルートとそれに結び付けられたクエリパラメータに分解されます。
そして、第二のステップでは、解析されたルートに対応する [コントローラアクション](structure-controllers.md) がリクエストを処理するために生成されます。
そして、第二のステップでは、解析されたルートに対応する [コントローラアクション](structure-controllers.md#actions) がリクエストを処理するために生成されます。
デフォルトの URL 形式を使っている場合は、リクエストからルートを解析することは、`r` という名前の `GET` クエリパラメータを取得するだけの簡単なことです。
@ -70,11 +70,11 @@ $url = Url::to(['post/view', 'id' => 100]);
3. 現在の ID がカレントモジュールの [[yii\base\Module::modules|modules]] プロパティのリストに挙げられたモジュールを指すものかどうかを調べます。
もしそうであれば、モジュールのリストで見つかった構成情報に従ってモジュールが生成されます。
そして、新しく生成されたモジュールのコンテキストのもとで、ステップ 2 に戻って、ルートの次の部分を処理します。
4. 現在の ID をコントローラ ID として扱ってコントローラオブジェクトを生成します。
4. 現在の ID を [コントローラ ID](structure-controllers.md#controller-ids) として扱ってコントローラオブジェクトを生成します。
そしてルートの残りの部分を持って次のステップに進みます。
5. コントローラは、[[yii\base\Controller::actions()|アクションマップ]] の中に現在の ID があるかどうかを調べます。
もし有れば、マップの中で見つかった構成情報に従ってアクションを生成します。
もし無ければ、現在の ID に対応するアクションメソッドで定義されるインラインアクションを生成しようと試みます。
もし無ければ、現在の [アクション ID](structure-controllers.md#action-ids) に対応するアクションメソッドで定義されるインラインアクションを生成しようと試みます。
上記のステップの中で、何かエラーが発生すると、[[yii\web\NotFoundHttpException]] が投げられて、ルーティングのプロセスが失敗したことが示されます。

9
docs/guide-ja/runtime-sessions-cookies.md

@ -218,6 +218,15 @@ $alerts = $session->getFlash('alerts');
これは、後者のメソッドが、同じ名前のフラッシュデータを追加できるように、フラッシュデータを自動的に配列に変換するからです。
その結果、[[yii\web\Session::getFlash()]] を呼び出したとき、この二つのメソッドの呼び出し順によって、あるときは配列を受け取り、あるときは文字列を受け取るということになってしまいます。
> Tip|ヒント: フラッシュメッセージを表示するためには、[[yii\bootstrap\Alert|bootstrap Alert]] ウィジェットを次のように使用することが出来ます。
>
> ```php
> echo Alert::widget([
> 'options' => ['class' => 'alert-info'],
> 'body' => Yii::$app->session->getFlash('postDeleted'),
> ]);
> ```
## クッキー <span id="cookies"></span>

377
docs/guide-ja/security-auth-clients.md

@ -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 の標準を厳格に遵守せず、標準と異なる仕様を導入しているものもあります。
そのようなものに対してクライアントを実装するためには、追加の労力が必要になることがあります。

147
docs/guide-ja/security-authentication.md

@ -1,23 +1,64 @@
認証
====
> Note|注意: この節はまだ執筆中です。
認証は、ユーザが誰であるかを確認するプロセスです。
通常は、識別子 (ユーザ名やメールアドレスなど) と秘密のトークン (パスワードやアクセストークンなど) を使って、ユーザがそうであると主張する通りのユーザであるか否かを判断します。
認証がログイン機能の基礎となります。
認証はユーザが誰であるかを確認する行為であり、ログインプロセスの基礎となるものです。
典型的には、認証は、識別子 (ユーザ名またはメールアドレス) とパスワードの組み合わせを使用します。
ユーザはこれらの値をフォームを通じて送信し、アプリケーションは送信された情報を以前に (例えば、ユーザ登録時に) 保存された情報と比較します。
Yii はさまざまなコンポーネントを結び付けてログインをサポートする認証フレームワークを提供しています。
このフレームワークを使用するために、あなたは主として次の仕事をする必要があります。
Yii では、このプロセス全体が半自動的に実行されます。
開発者に残されているのは、認証システムにおいて最も重要なクラスである [[yii\web\IdentityInterface]] を実装することだけです。
典型的には、`IdentityInterface` の実装は `User` モデルを使って達成されます。
* [[yii\web\User|user]] アプリケーションコンポーネントを構成する。
* [[yii\web\IdentityInterface]] インタフェイスを実装するクラスを作成する。
十分な機能を有する認証の実例を [アドバンストプロジェクトテンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) の中に見出すことが出来ます。
下記にインターフェイスのメソッドだけをリストします。
## [[yii\web\User]] を構成する <span id="configuring-user"></span>
[[yii\web\User|user]] アプリケーションコンポーネントがユーザの認証状態を管理します。
実際の認証ロジックを含む [[yii\web\User::identityClass|ユーザ識別情報クラス]] は、あなたが指定しなければなりません。
下記のアプリケーション構成情報においては、[[yii\web\User|user]] の [[yii\web\User::identityClass|ユーザ識別情報クラス]] は `app\models\User` であると構成されています。
`app\models\User` の実装については、次の項で説明します。
```php
return [
'components' => [
'user' => [
'identityClass' => 'app\models\User',
],
],
];
```
## [[yii\web\IdentityInterface]] を実装する <span id="implementing-identity"></span>
[[yii\web\User::identityClass|ユーザ識別情報クラス]] が実装しなければならない [[yii\web\IdentityInterface]] は次のメソッドを含んでいます。
* [[yii\web\IdentityInterface::findIdentity()|findIdentity()]]: 指定されたユーザ ID を使ってユーザ識別情報クラスのインスタンスを探します。
セッションを通じてログイン状態を保持する必要がある場合に、このメソッドが使用されます。
* [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]]: 指定されたアクセストークンを使ってユーザ識別情報クラスのインスタンスを探します。
単一の秘密のトークンでユーザを認証する必要がある場合 (ステートレスな RESTful アプリケーションなどの場合) に、このメソッドが使用されます。
* [[yii\web\IdentityInterface::getId()|getId()]]: ユーザ識別情報クラスのインスタンスによって表されるユーザの ID を返します。
* [[yii\web\IdentityInterface::getAuthKey()|getAuthKey()]]: クッキーベースのログインを検証するのに使用されるキーを返します。
このキーがログインクッキーに保存され、後でサーバ側のキーと比較されて、ログインクッキーが有効であることが確認されます。
* [[yii\web\IdentityInterface::validateAuthKey()|validateAuthKey()]]: クッキーベースのログインキーを検証するロジックを実装します。
特定のメソッドが必要でない場合は、中身を空にして実装しても構いません。
例えば、あなたのアプリケーションが純粋なステートレス RESTful アプリケーションであるなら、実装する必要があるのは [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]] と [[yii\web\IdentityInterface::getId()|getId()]] だけであり、他のメソッドは全て中身を空にしておくことが出来ます。
次の例では、[[yii\web\User::identityClass|ユーザ識別情報クラス]] は、`user` データベーステーブルと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されています。
```php
<?php
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
// ...
public static function tableName()
{
return 'user';
}
/**
* 与えられた ID によってユーザ識別情報を探す
@ -68,25 +109,91 @@ class User extends ActiveRecord implements IdentityInterface
}
```
概要を述べたメソッドのうち、二つは単純なものです。
`findIdentity` は ID の値を受け取って、その ID と関連付けられたモデルのインスタンスを返します。
`getId` メソッドは ID そのものを返します。
その他のメソッドのうち、二つのもの - `getAuthKey``validateAuthKey` - は、「次回から自動ログイン ("remember me")」のクッキーに対して追加のセキュリティを提供するために使われます。
`getAuthKey` メソッドは全てのユーザに対してユニークな文字列を返さなければなりません。
`Yii::$app->getSecurity()->generateRandomString()` を使うと、信頼性の高い方法でユニークな文字列を生成することが出来ます。
これをユーザのレコードの一部として保存しておくのは良いアイデアです。
前述のように、`getAuthKey()` と `validateAuthKey()` は、あなたのアプリケーションがクッキーベースのログイン機能を使用する場合にのみ実装する必要があります。
この場合、次のコードを使って、各ユーザに対して認証キーを生成して、`user` テーブルに保存しておくことが出来ます。
```php
public function beforeSave($insert)
class User extends ActiveRecord implements IdentityInterface
{
......
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($this->isNewRecord) {
$this->auth_key = Yii::$app->getSecurity()->generateRandomString();
$this->auth_key = \Yii::$app->security->generateRandomString();
}
return true;
}
return false;
}
}
```
`validateAuthKey` メソッドでは、パラメータとして渡された `$authKey` 変数 (これ自体はクッキーから読み出されます) をデータベースから読み出された値と比較する必要があるだけです。
> Note|注意: ユーザ識別情報クラスである `User` と [[yii\web\User]] を混同してはいけません。
前者は認証のロジックを実装するクラスであり、普通は、ユーザの認証情報を保存する何らかの持続的ストレージと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されます。
後者はユーザの認証状態の管理に責任を持つアプリケーションコンポーネントです。
## [[yii\web\User]] を使う <span id="using-user"></span>
[[yii\web\User]] は、主として、`user` アプリケーションコンポーネントの形で使います。
現在のユーザの識別情報は、`Yii::$app->user->identity` という式を使って取得することが出来ます。
これは、現在ログインしているユーザの [[yii\web\User::identityClass|ユーザ識別情報クラス]] のインスタンスを返すか、現在のユーザが認証されていない (つまりゲストである) 場合は null を返します。
次のコードは、[[yii\web\User]] からその他の認証関連の情報を取得する方法を示すものです。
```php
// 現在のユーザの識別情報。ユーザが認証されていない場合は null
$identity = Yii::$app->user->identity;
// 現在のユーザの ID。ユーザが認証されていない場合は null
$id = Yii::$app->user->id;
// 現在のユーザがゲストである (認証されていない) かどうか
$isGuest = Yii::$app->user->isGuest;
```
ユーザをログインさせるためには、次のコードを使うことが出来ます。
```php
// 指定された username を持つユーザ識別情報を探す
// 必要ならパスワードをチェックしてもよいことに注意
$identity = User::findOne(['username' => $username]);
// ユーザをログインさせる
Yii::$app->user->login($identity);
```
[[yii\web\User::login()]] メソッドは現在のユーザの識別情報を [[yii\web\User]] にセットします。
セッションが [[yii\web\User::enableSession|有効]] にされている場合は、ユーザの認証状態がセッション全体を通じて保持されるように、ユーザ識別情報がセッションに保管されます。
クッキーベースのログイン (つまり "remember me"、「次回は自動ログイン」) が [[yii\web\User::enableAutoLogin|有効]] にされている場合は、ユーザ識別情報をクッキーにも保存して、クッキーが有効である限りは、ユーザの認証状態をクッキーから復元することが可能になります。
クッキーベースのログインを有効にするためには、アプリケーションの構成情報で [[yii\web\User::enableAutoLogin]] を true に構成する必要があります。
また、[[yii\web\User::login()]] メソッドを呼ぶときには、有効期間のパラメータを与える必要があります。
ユーザをログアウトさせるためには、単に次のように `logout()` を呼びます。
```php
Yii::$app->user->logout();
```
ユーザのログアウトはセッションが有効にされている場合にだけ意味があることに注意してください。
`logout()` メソッドは、ユーザ認証状態をメモリとセッションの両方から消去します。
そして、デフォルトでは、ユーザのセッションデータの *全て* を破壊します。
セッションデータを保持したい場合は、代りに、`Yii::$app->user->logout(false)` を呼ばなければなりません。
## 認証のイベント <span id="auth-events"></span>
[[yii\web\User]] クラスは、ログインとログアウトのプロセスで、いくつかのイベントを発生させます。
* [[yii\web\User::EVENT_BEFORE_LOGIN|EVENT_BEFORE_LOGIN]]: [[yii\web\User::login()]] の開始時に発生します。
イベントハンドラがイベントの [[yii\web\UserEvent::isValid|isValid]] プロパティを false にセットした場合は、ログインのプロセスがキャンセルされます。
* [[yii\web\User::EVENT_AFTER_LOGIN|EVENT_AFTER_LOGIN]]: ログインが成功した時に発生します。
* [[yii\web\User::EVENT_BEFORE_LOGOUT|EVENT_BEFORE_LOGOUT]]: [[yii\web\User::logout()]] の開始時に発生します。
イベントハンドラがイベントの [[yii\web\UserEvent::isValid|isValid]] プロパティを false にセットした場合は、ログアウトのプロセスがキャンセルされます。
* [[yii\web\User::EVENT_AFTER_LOGOUT|EVENT_AFTER_LOGOUT]]: ログアウトが成功した時に発生します。
これらのイベントに反応して、ログイン監査、オンラインユーザ統計などの機能を実装することが出来ます。
例えば、[[yii\web\User::EVENT_AFTER_LOGIN|EVENT_AFTER_LOGIN]] のハンドラの中で、`user` テーブルにログインの日時と IP アドレスを記録することが出来ます。

51
docs/guide-ja/security-authorization.md

@ -1,8 +1,6 @@
権限付与
========
> Note|注意: この節はまだ執筆中です。
権限付与は、ユーザが何かをするのに十分な許可を有しているか否かを確認するプロセスです。
Yii は二つの権限付与の方法を提供しています。すなわち、アクセス制御フィルタ (ACF) と、ロールベースアクセス制御 (RBAC) です。
@ -10,13 +8,14 @@ Yii は二つの権限付与の方法を提供しています。すなわち、
アクセス制御フィルタ (ACF)
--------------------------
アクセス制御フィルタ (ACF) は、何らかの単純なアクセス制御だけを必要とするアプリケーションで使うのに最も適した、単純な権限付与の方法です。
その名前が示すように、ACF は、コントローラまたはモジュールにビヘイビアとしてアタッチすることが出来るアクションフィルタです。
ACF は一連の [[yii\filters\AccessControl::rules|アクセス規則]] をチェックして、現在のユーザがリクエストしたアクションにアクセスすることが出来るかどうかを確認します。
アクセス制御フィルタ (ACF) は、[[yii\filters\AccessControl]] として実装される単純な権限付与の方法であり、何らかの単純なアクセス制御だけを必要とするアプリケーションで使うのに最も適したものです。
その名前が示すように、ACF は、コントローラまたはモジュールで使用することが出来るアクション [フィルタ](structure-filters.md) です。
ACF は、ユーザがアクションの実行をリクエストしたときに、一連の [[yii\filters\AccessControl::rules|アクセス規則]] をチェックして、現在のユーザがそのアクションにアクセスする許可を持つかどうかを決定します。
下記のコードは、[[yii\filters\AccessControl]] として実装された ACF の使い方を示すものです。
下記のコードは、`site` コントローラで ACF を使う方法を示すものです。
```php
use yii\web\Controller;
use yii\filters\AccessControl;
class SiteController extends Controller
@ -49,28 +48,29 @@ class SiteController extends Controller
上記のコードにおいて、ACF は `site` コントローラにビヘイビアとしてアタッチされています。
これがアクションフィルタを使用する典型的な方法です。
`only` オプションは、ACF が `login`、`logout`、`signup` のアクションにのみ適用されるべきであることを指定しています。
`site` コントローラの他の全てのアクションには ACF の影響は及びません。
`rules` オプションは [[yii\filters\AccessRule|アクセス規則]] を指定するものであり、以下のように読むことが出来ます。
- 全てのゲストユーザ (まだ認証されていないユーザ) に、'login' と 'singup' のアクションにアクセスすることを許可します。
`roles` オプションに疑問符 `?` が含まれていますが、これは「ゲスト」として認識される特殊なトークンです。
`roles` オプションに疑問符 `?` が含まれていますが、これは「ゲスト」を表す特殊なトークンです。
- 認証されたユーザに、'logout' アクションにアクセスすることを許可します。
`@` という文字はもう一つの特殊なトークンで、認証されたユーザとして認識されるものです。
`@` という文字はもう一つの特殊なトークンで、「認証されたユーザ」を表すものです。
ACF が権限のチェックを実行するときには、規則を一つずつ上から下へ、適用されるものを見つけるまで調べます。
そして、適用される規則の `allow` の値が、ユーザが権限を有するか否かを判断するのに使われます。
適用される規則が一つもなかった場合は、ユーザが権限をもたないことを意味し、ACF はアクションの継続を中止します。
デフォルトでは、ユーザが現在のアクションにアクセスする権限を持っていないと判定した場合は、ACF は以下のことだけを行います。
ユーザが現在のアクションにアクセスする権限を持っていないと判定した場合は、デフォルトでは、ACF は以下の手段を取ります。
* ユーザがゲストである場合は、[[yii\web\User::loginRequired()]] を呼び出します。
このメソッドで、ブラウザをログインページにリダイレクトすることが出来ます。
* ユーザがゲストである場合は、[[yii\web\User::loginRequired()]] を呼び出して、ユーザのブラウザをログインページにリダイレクトします。
* ユーザが既に認証されている場合は、[[yii\web\ForbiddenHttpException]] を投げます。
この動作は、[[yii\filters\AccessControl::denyCallback]] プロパティを構成することによって、カスタマイズすることが出来ます。
この動作は、次のように、[[yii\filters\AccessControl::denyCallback]] プロパティを構成することによって、カスタマイズすることが出来ます。
```php
[
'class' => AccessControl::className(),
...
'denyCallback' => function ($rule, $action) {
throw new \Exception('このページにアクセスする権限がありません。');
}
@ -100,7 +100,7 @@ ACF が権限のチェックを実行するときには、規則を一つずつ
- `?`: ゲストユーザ (まだ認証されていないユーザ) を意味します。
- `@`: 認証されたユーザを意味します。
その他のロール名を使う場合には、RBAC (次の節で説明します) が必要とされ、判断のために [[yii\web\User::can()]] が呼び出されます。
その他のロール名を使うと、[[yii\web\User::can()]] の呼び出しが惹起されますが、そのためには、RBAC (次の節で説明します) を有効にする必要があります。
このオプションが空であるか指定されていない場合は、規則が全てのロールに適用されることを意味します。
* [[yii\filters\AccessRule::ips|ips]]: どの [[yii\web\Request::userIP|クライアントの IP アドレス]] にこの規則が適用されるかを指定します。
@ -151,8 +151,7 @@ class SiteController extends Controller
```
ロールベースアクセス制御 (RBAC)
---------------------------------------
## ロールベースアクセス制御 (RBAC) <span id="rbac"></span>
ロールベースアクセス制御 (RBAC) は、単純でありながら強力な集中型のアクセス制御を提供します。
RBAC と他のもっと伝統的なアクセス制御スキーマとの比較に関する詳細については、[Wiki 記事](http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1) を参照してください。
@ -166,7 +165,7 @@ RBAC を使用することには、二つの作業が含まれます。
説明を容易にするために、まず、いくつかの基本的な RBAC の概念を導入します。
### 基本的な概念
### 基本的な概念 <span id="basic-concepts"></span>
ロール (役割) は、*許可* (例えば、記事を作成する、記事を更新するなど) のコレクションです。
一つのロールを一人または複数のユーザに割り当てることが出来ます。
@ -183,14 +182,14 @@ Yii は、一般的な *半順序* 階層を実装していますが、これは
ロールは許可を含むことが出来ますが、許可はロールを含むことが出来ません。
### RBAC マネージャを構成する
### RBAC を構成する <span id="configuring-rbac"></span>
権限付与データを定義してアクセスチェックを実行する前に、[[yii\base\Application::authManager|authManager]] アプリケーションコンポーネントを構成する必要があります。
Yii は二種類の権限付与マネージャを提供しています。すなわち、[[yii\rbac\PhpManager]] と [[yii\rbac\DbManager]] です。
前者は権限付与データを保存するのに PHP スクリプトファイルを使いますが、後者は権限付与データをデータベースに保存します。
あなたのアプリケーションが非常に動的なロールと許可の管理を必要とするのでなければ、前者を使うことを考慮するのが良いでしょう。
#### authManager を `PhpManager` で構成する
#### `PhpManager` を使用する <span id="using-php-manager"></span>
次のコードは、アプリケーションの構成情報で [[yii\rbac\PhpManager]] クラスを使って `authManager` を構成する方法を示すものです。
@ -208,10 +207,10 @@ return [
これで `authManager``\Yii::$app->authManager` によってアクセスすることが出来るようになります。
> Tip|ヒント: デフォルトでは、[[yii\rbac\PhpManager]] は RBAC データを `@app/rbac/` ディレクトリの下のファイルに保存します。
権限の階層をオンラインで変更する必要がある場合は、必ず、ウェブサーバのプロセスがこのディレクトリとその中の全てのファイルに対する書き込み権限を有するようにしてください。
デフォルトでは、[[yii\rbac\PhpManager]] は RBAC データを `@app/rbac/` ディレクトリの下のファイルに保存します。
権限の階層をオンラインで変更する必要がある場合は、必ず、ウェブサーバのプロセスがこのディレクトリとその中の全てのファイルに対する書き込み権限を有するようにしてください。
#### authManager を `DbManager` で構成する
#### `DbManager` を使用する <span id="using-db-manager"></span>
次のコードは、アプリケーションの構成情報で [[yii\rbac\DbManager]] クラスを使って `authManager` を構成する方法を示すものです。
@ -243,7 +242,7 @@ return [
これで `authManager``\Yii::$app->authManager` によってアクセスすることが出来るようになります。
### 権限付与データを構築する
### 権限付与データを構築する <span id="generating-rbac-data"></span>
権限付与データを構築する作業は、つまるところ、以下のタスクに他なりません。
@ -335,7 +334,7 @@ public function signup()
動的に更新される権限付与データを持つ複雑なアクセス制御を必要とするアプリケーションについては、`authManager` が提供する API を使って、特別なユーザインタフェイス (つまり、管理パネル) を開発する必要があるでしょう。
### 規則を使う
### 規則を使う <span id="using-rules"></span>
既に述べたように、規則がロールと許可に制約を追加します。
規則は [[yii\rbac\Rule]] を拡張したクラスであり、[[yii\rbac\Rule::execute()|execute()]] メソッドを実装しなければなりません。
@ -394,7 +393,7 @@ $auth->addChild($author, $updateOwnPost);
![規則を持つ RBAC 階層](images/rbac-hierarchy-2.png "規則を持つ RBAC 階層")
### アクセスチェック
### アクセスチェック <span id="access-check"></span>
権限付与データが準備できてしまえば、アクセスチェックは [[yii\rbac\ManagerInterface::checkAccess()]] メソッドを呼ぶだけの簡単な仕事です。
たいていのアクセスチェックは現在のユーザに関するものですから、Yii は、便利なように、[[yii\web\User::can()]] というショートカットメソッドを提供しています。
@ -406,7 +405,7 @@ if (\Yii::$app->user->can('createPost')) {
}
```
現在のユーザが ID=1 である Jane であるとすると、`createPost` からスタートして `Jane` まで到達しようと試みます。
現在のユーザが `ID=1` である Jane であるとすると、`createPost` からスタートして `Jane` まで到達しようと試みます。
![アクセスチェック](images/rbac-access-check-1.png "アクセスチェック")
@ -431,7 +430,7 @@ Jane の場合は、彼女が管理者であるため、少し簡単になりま
![アクセスチェック](images/rbac-access-check-3.png "アクセスチェック")
### デフォルトロールを使う
### デフォルトロールを使う <span id="using-default-roles"></span>
デフォルトロールというのは、*全て* のユーザに *黙示的* に割り当てられるロールです。
[[yii\rbac\ManagerInterface::assign()]] を呼び出す必要はなく、権限付与データはその割り当て情報を含みません。

14
docs/guide-ja/security-best-practices.md

@ -136,12 +136,18 @@ CSRF は、クロスサイトリクエストフォージェリ (cross-site reque
例えば、`an.example.com` というウェブサイトが `/logout` という URL を持っており、この URL を単純な GET でアクセスするとユーザをログアウトさせるようになっているとします。
ユーザ自身によってこの URL がリクエストされる限りは何も問題はありませんが、ある日、悪い奴が、ユーザが頻繁に訪れるフォーラムに `<img src="http://an.example.com/logout">` というリンクを含むコンテントを何とかして投稿することに成功します。
ブラウザは画像のリクエストとページのリクエストの間に何ら区別を付けませんので、ユーザがそのような `img` タグを含むページを開くと `an.example.com` からログアウトされてしまうことになる訳です。
ブラウザは画像のリクエストとページのリクエストの間に何ら区別を付けませんので、ユーザがそのような `img` タグを含むページを開くとブラウザはその URL に対して GET リクエストを送信します。
そして、ユーザが `an.example.com` からログアウトされてしまうことになる訳です。
これは基本的な考え方です。ユーザがログアウトされるぐらいは大したことではない、と言うことも出来るでしょう。
しかし、POST を送信することも、それほど難しくはありません。
CSRF を回避するためには、次のことを守らなければなりません。
しかし、悪い奴は、この考え方を使って、もっとひどいことをすることも出来ます。
例えば、`http://an.example.com/purse/transfer?to=anotherUser&amout=2000` という URL を持つウェブサイトがあると考えて見てください。
この URL に GET リクエストを使ってアクセスすると、権限を持つユーザアカウントから `anotherUser` に $2000 が送金されるのです。
私たちは、ブラウザは画像をロードするのに常に GET リクエストを使う、ということを知っていますから、この URL が POST リクエストだけを受け入れるようにコードを修正することは出来ます。
しかし残念なことに、それで問題が解決する訳ではありません。
攻撃者は `<img>` タグの代りに何らかの JavaScript コードを書いて、その URL に対する POST リクエストの送信を可能にすることが出来ます。
CSRF を回避するためには、常に次のことを守らなければなりません。
1. HTTP の規格、すなわち、GET はアプリケーションの状態を変更すべきではない、という規則に従うこと。
2. Yii の CSRF 保護を有効にしておくこと。

4
docs/guide-ja/security-passwords.md

@ -1,5 +1,5 @@
セキュリティ
============
パスワードを扱う
================
> Note|注意: この節はまだ執筆中です。

2
docs/guide-ja/start-databases.md

@ -248,6 +248,6 @@ http://hostname/index.php?r=country/index&page=2
この節では、データベースを扱う方法を学びました。
また、[[yii\data\Pagination]] と [[yii\widgets\LinkPager]] の助けを借りて、ページ付けされたデータを取得し表示する方法も学びました。
次の節では、[Gii](tool-gii.md) と呼ばれる強力なコード生成ツールを使う方法を学びます。
次の節では、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) と呼ばれる強力なコード生成ツールを使う方法を学びます。
このツールは、データベーステーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、通常必要とされることが多いいくつかの機能の迅速な実装を手助けしてくれるものです。
実際のところ、あなたがたった今書いたばかりのコードは、Gii ツールを使えば、全部、Yii が自動的に生成してくれるものです。

5
docs/guide-ja/start-forms.md

@ -25,6 +25,7 @@
namespace app\models;
use Yii;
use yii\base\Model;
class EntryForm extends Model
@ -53,7 +54,7 @@ class EntryForm extends Model
上記で宣言されている検証規則は次のことを述べています。
* `name``email` は、ともに値を要求される
* `email` のデータは構文的に正当なメールアドレスでなければならない
* `email` のデータは構文的に有効なメールアドレスでなければならない
ユーザによって入力されたデータを `EntryForm` オブジェクトに投入した後、[[yii\base\Model::validate()|validate()]] を呼んでデータ検証ルーチンを始動することが出来ます。
データ検証が失敗すると [[yii\base\Model::hasErrors|hasErrors]] プロパティが true に設定されます。
@ -177,7 +178,7 @@ use yii\widgets\ActiveForm;
試してみる <span id="trying-it-out"></span>
----------
どのように動作するかを見るために、ブラウザで下記の URL アクセスしてください。
どのように動作するかを見るために、ブラウザで下記の URL アクセスしてください。
```
http://hostname/index.php?r=site/entry

10
docs/guide-ja/start-gii.md

@ -1,7 +1,7 @@
Gii でコードを生成する
======================
この節では、[Gii](tool-gii.md) を使って、ウェブサイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。
この節では、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) を使って、ウェブサイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。
Gii を使ってコードを自動生成することは、Gii のウェブページに表示される指示に対して正しい情報を入力するだけのことです。
このチュートリアルを通じて、次のことを学びます。
@ -15,7 +15,7 @@ Gii を使ってコードを自動生成することは、Gii のウェブペー
Gii を開始する <span id="starting-gii"></span>
--------------
[Gii](tool-gii.md) は Yii の [モジュール](structure-modules.md) として提供されています。
[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) は Yii の [モジュール](structure-modules.md) として提供されています。
Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。
アプリケーションを生成した仕方にもよりますが、`config/web.php` の構成情報ファイルの中に、多分、下記のコードが既に提供されているでしょう。
@ -24,7 +24,9 @@ $config = [ ... ];
if (YII_ENV_DEV) {
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
```
@ -134,7 +136,7 @@ http://hostname/index.php?r=country/index
> Info|情報: Gii は非常にカスタマイズしやすく拡張しやすいコード生成ツールとして設計されています。
これを賢く使うと、アプリケーションの開発速度を大いに高めることが出来ます。
詳細については、[Gii](tool-gii.md) の節を参照してください。
詳細については、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) の節を参照してください。
まとめ <span id="summary"></span>

2
docs/guide-ja/start-hello.md

@ -9,7 +9,7 @@
このチュートリアルを通じて、三つのことを学びます。
1. リクエストに応える [アクション](structure-controllers.md) を作成する方法
1. リクエストに応える [アクション](structure-controllers.md#creating-actions) を作成する方法
2. レスポンスのコンテントを作成する [ビュー](structure-views.md) を作成する方法
3. アプリケーションがリクエストを [アクション](structure-controllers.md#creating-actions) に送付する仕組み

8
docs/guide-ja/start-installation.md

@ -1,7 +1,7 @@
Yii をインストールする
======================
Yii は二つの方法でインストールすることが出来ます。すなわち、[Composer](http://getcomposer.org/) を使うか、アーカイブファイルをダウンロードするかです。
Yii は二つの方法でインストールすることが出来ます。すなわち、[Composer](https://getcomposer.org/) を使うか、アーカイブファイルをダウンロードするかです。
前者がお薦めの方法です。と言うのは、一つのコマンドを走らせるだけで、新しい [エクステンション](structure-extensions.md) をインストールしたり、Yii をアップデートしたりすることが出来るからです。
Yii の標準的なインストールを実行すると、フレームワークとプロジェクトテンプレートの両方がダウンロードされてインストールされます。
@ -24,7 +24,7 @@ Composer によるインストール <span id="installing-via-composer"></span>
まだ Composer をインストールしていない場合は、[getcomposer.org](https://getcomposer.org/download/) の指示に従ってインストールすることが出来ます。
Linux や Mac OS X では、次のコマンドを実行します。
curl -s http://getcomposer.org/installer | php
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Windows では、[Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe) をダウンロードして実行します。
@ -36,7 +36,7 @@ Composer は `composer self-update` コマンドを実行してアップデー
Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます。
composer global require "fxp/composer-asset-plugin:1.0.0"
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
最初のコマンドは [composer アセットプラグイン](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。
@ -89,7 +89,7 @@ Composer がインストールされたら、ウェブからアクセスでき
インストールを検証する <span id="verifying-installation"></span>
----------------------
インストール完了後、インストールされた Yii アプリケーションにブラウザを使って下記の URL でアクセスすることが出来ます。
インストール完了後、下記の URL によって、インストールされた Yii アプリケーションにブラウザを使ってアクセスすることが出来ます。
```
http://localhost/basic/web/index.php

2
docs/guide-ja/start-looking-ahead.md

@ -3,7 +3,7 @@
「はじめよう」の章全体を読み通したなら、いまやあなたは、完全な Yii のアプリケーションを作成したことがある、ということになります。
その過程で、あなたは必要とされることが多いいくつかの機能、例えば、HTML フォームを通じてユーザからデータを取得することや、データベースからデータを取得すること、また、ページ付けをしてデータを表示することなどを実装する方法を学びました。
また、[Gii](tool-gii.md) を使ってコードを自動的に生成する方法も学びました。
また、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) を使ってコードを自動的に生成する方法も学びました。
Gii をコード生成に使うと、ウェブ開発のプロセスの大部分が、いくつかのフォームに入力していくだけの簡単な仕事になります。
この節では、Yii フレームワークを使うときの生産性を更に高めるために利用できるリソースについてまとめます。

2
docs/guide-ja/start-workflow.md

@ -29,7 +29,7 @@ Yii のインストールが終ると、実際に動く Yii のアプリケー
ヘッダには、異なるページ間を行き来することを可能にするメインメニューバーがあります。
ブラウザのウィンドウの下部にツールバーがあることにも気がつくはずです。
これは Yii によって提供される便利な [デバッグツールバー](tool-debugger.md) であり、たくさんのデバッグ情報、例えば、ログメッセージ、レスポンスのステータス、実行されたデータベースクエリなどを記録して表示するものです。
これは Yii によって提供される便利な [デバッグツールバー](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) であり、たくさんのデバッグ情報、例えば、ログメッセージ、レスポンスのステータス、実行されたデータベースクエリなどを記録して表示するものです。
ウェブアプリケーションに加えて、`yii` というコンソールスクリプトがアプリケーションのベースディレクトリにあります。
このスクリプトをバックグラウンドのタスクまたはメンテナンスのタスクを実行するために使用することが出来ます。

21
docs/guide-ja/structure-applications.md

@ -2,7 +2,8 @@
================
アプリケーションは Yii アプリケーションシステム全体の構造とライフサイクルを統制するオブジェクトです。
全ての Yii アプリケーションシステムは、それぞれ、[エントリスクリプト](structure-entry-scripts.md) において作成され、`\Yii::$app` という式でグローバルにアクセス可能な、単一のアプリケーションオブジェクトを持ちます。
全ての Yii アプリケーションシステムは、それぞれ、単一のアプリケーションオブジェクトを持ちます。
アプリケーションオブジェクトは、[エントリスクリプト](structure-entry-scripts.md) において作成され、`\Yii::$app` という式でグローバルにアクセスすることが出来るオブジェクトです。
> Info|情報: ガイドの中で「アプリケーション」という言葉は、文脈に応じて、アプリケーションオブジェクトを意味したり、アプリケーションシステムを意味したりします。
@ -96,13 +97,13 @@ $config = require(__DIR__ . '/../config/web.php');
これによって、アプリケーションの [[yii\base\Application::bootstrap()|ブートストラップの過程]] において走らせるべきコンポーネントを配列として指定することが出来ます。
例えば、ある [モジュール](structure-modules.md) に [URL 規則](runtime-routing.md) をカスタマイズさせたいときに、モジュールの ID をこのプロパティの要素として挙げることが出来ます。
このプロパティに挙げるコンポーネントは、それぞれ、以下の形式のいずれかによって指定することが出来ます。
このプロパティにリストする各コンポーネントは、以下の形式のいずれかによって指定することが出来ます。
- [components](#components) によって指定されているアプリケーションコンポーネントの ID
- [modules](#modules) によって指定されているモジュールの ID
- クラス名
- 構成情報の配列
- コンポーネントを作成して返す無名関数
- [components](#components) によって指定されているアプリケーションコンポーネントの ID
- [modules](#modules) によって指定されているモジュールの ID
- クラス名
- 構成情報の配列
- コンポーネントを作成して返す無名関数
例えば、
@ -206,7 +207,7 @@ if (YII_ENV_DEV) {
キーはコンポーネントの ID を示し、値はコンポーネントのクラス名または [構成情報](concept-configurations.md) を示します。
どのようなコンポーネントでもアプリケーションに登録することが出来ます。
そして登録されたコンポーネントは、後で、`\Yii::$app->ComponentID` という式を使ってグローバルにアクセスすることが出来ます。
そして登録されたコンポーネントは、後で、`\Yii::$app->componentID` という式を使ってグローバルにアクセスすることが出来ます。
詳細は [アプリケーションコンポーネント](structure-application-components.md) の節を読んでください。
@ -384,7 +385,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
このプロパティは、アプリケーションにインストールされて使われている [エクステンション](structure-extensions.md) のリストを指定するものです。
デフォルトでは、`@vendor/yiisoft/extensions.php` というファイルによって返される配列を取ります。
`extensions.php` は、[Composer](http://getcomposer.org) を使ってエクステンションをインストールすると、自動的に生成され保守されます。
`extensions.php` は、[Composer](https://getcomposer.org) を使ってエクステンションをインストールすると、自動的に生成され保守されます。
ですから、たいていの場合、このプロパティをあなたが構成する必要はありません。
エクステンションを手作業で保守したいという特殊なケースにおいては、次のようにしてこのプロパティを構成することが出来ます。
@ -453,7 +454,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
#### [[yii\base\Application::vendorPath|vendorPath]] <span id="vendorPath"></span>
このプロパティは、[Composer](http://getcomposer.org) によって管理される vendor ディレクトリを指定するものです。
このプロパティは、[Composer](https://getcomposer.org) によって管理される vendor ディレクトリを指定するものです。
Yii フレームワークを含めて、あなたのアプリケーションによって使われる全てのサードパーティライブラリを格納するディレクトリです。
デフォルト値は、`@app/vendor` というエイリアスで表現されるディレクトリです。

17
docs/guide-ja/structure-assets.md

@ -171,20 +171,17 @@ class FontAwesomeAsset extends AssetBundle
public $css = [
'css/font-awesome.min.css',
];
public function init()
{
parent::init();
$this->publishOptions['beforeCopy'] = function ($from, $to) {
$dirname = basename(dirname($from));
return $dirname === 'fonts' || $dirname === 'css';
};
}
public $publishOptions = [
'only' => [
'fonts/',
'css/',
]
],
}
```
上記の例は、["fontawesome" パッケージ](http://fontawesome.io/) のためのアセットバンドルを定義するものです。
`beforeCopy` という発行オプションを指定して、`fonts` と `css` サブディレクトリだけが発行されるようにしています。
発行オプション `only` を指定して、`fonts` と `css` サブディレクトリだけが発行されるようにしています。
### Bower と NPM のアセット <span id="bower-npm-assets"></span>

44
docs/guide-ja/structure-controllers.md

@ -66,8 +66,8 @@ class PostController extends Controller
ルートは、次の部分からなる文字列です。
* モジュール ID: この部分は、コントローラがアプリケーションではない [モジュール](structure-modules.md) に属する場合にのみ存在します。
* コントローラ ID: 同じアプリケーション (または、コントローラがモジュールに属する場合は、同じモジュール) に属する全てのコントローラの中から、コントローラを一意に特定する文字列。
* アクション ID: 同じコントローラに属する全てのアクションの中から、アクションを一意に特定する文字列。
* [コントローラ ID]((#controller-ids): 同じアプリケーション (または、コントローラがモジュールに属する場合は、同じモジュール) に属する全てのコントローラの中から、コントローラを一意に特定する文字列。
* [アクション ID](#action-ids): 同じコントローラに属する全てのアクションの中から、アクションを一意に特定する文字列。
ルートは次の形式を取ります。
@ -119,26 +119,26 @@ class SiteController extends Controller
### コントローラクラスの命名規則 <span id="controller-class-naming"></span>
コントローラクラスの名前は下記の規則に従ってコントローラ ID から導出することが出来ます。
コントローラクラスの名前は下記の手順に従ってコントローラ ID から導出することが出来ます。
* ダッシュで区切られた各単語の最初の文字を大文字に変える。
1. ハイフンで区切られた各単語の最初の文字を大文字に変える。
コントローラ ID がスラッシュを含む場合、この規則は ID の最後のスラッシュの後ろの部分にのみ適用されることに注意。
* ダッシュを削除し、フォワードスラッシュを全てバックワードスラッシュに置き換える。
* 接尾辞 `Controller` を追加する。
* そして、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] を頭に付ける。
2. ハイフンを削除し、フォワードスラッシュを全てバックワードスラッシュに置き換える。
3. 接尾辞 `Controller` を追加する。
4. [[yii\base\Application::controllerNamespace|コントローラ名前空間]] を頭に付ける。
以下は、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] がデフォルト値 `app\controllers` を取っていると仮定したときの、いくつかの例です。
* `article` から `app\controllers\ArticleController` が導出される。
* `post-comment` から `app\controllers\PostCommentController` が導出される。
* `admin/post-comment` から `app\controllers\admin\PostCommentController` が導出される。
* `adminPanels/post-comment` から `app\controllers\adminPanels\PostCommentController` が導出される。
* `article` `app\controllers\ArticleController` になる。
* `post-comment` `app\controllers\PostCommentController` になる。
* `admin/post-comment` `app\controllers\admin\PostCommentController` になる。
* `adminPanels/post-comment` `app\controllers\adminPanels\PostCommentController` になる。
コントローラクラスは [オートロード可能](concept-autoloading.md) でなければなりません。
この理由により、上記の例の `aritcle` コントローラクラスは [エイリアス](concept-aliases.md) が `@app/controllers/ArticleController.php` であるファイルに保存されるべきものとなります。
一方、`admin/post2-comment` コントローラは `@app/controllers/admin/Post2CommentController.php` というエイリアスのファイルに保存されるべきものとなります。
一方、`admin/post-comment` コントローラは `@app/controllers/admin/PostCommentController.php` というエイリアスのファイルに保存されるべきものとなります。
> Info|情報: 最後の例である `admin/post2-comment` は、どうすれば [[yii\base\Application::controllerNamespace|コントローラ名前空間]] のサブディレクトリにコントローラを置くことが出来るかを示しています。
> Info|情報: 最後の例である `admin/post-comment` は、どうすれば [[yii\base\Application::controllerNamespace|コントローラ名前空間]] のサブディレクトリにコントローラを置くことが出来るかを示しています。
この方法は、コントローラをいくつかのカテゴリに分けて編成したい、けれども [モジュール](structure-modules.md) は使いたくない、という場合に役立ちます。
@ -213,8 +213,8 @@ class SiteController extends Controller
アクションは、たいてい、あるリソースについて特定の操作を実行するように設計されます。
この理由により、アクション ID は、通常、`view`、`update` などのような動詞になります。
デフォルトでは、アクション ID は、小文字の英字、数字、アンダースコア、そして、ダッシュのみを含むべきものです。
アクション ID の中のダッシュは単語を分けるために使われます。
デフォルトでは、アクション ID は、小文字の英字、数字、アンダースコア、そして、ハイフンのみを含むべきものです。
アクション ID の中のハイフンは単語を分けるために使われます。
例えば、`view`、`update2`、`comment-post` は全て有効なアクション ID ですが、`view?`、`Update` はそうではありません。
アクションは二つの方法、すなわち、インラインアクションまたはスタンドアロンアクションとして作成することが出来ます。
@ -227,11 +227,11 @@ class SiteController extends Controller
インラインアクションは、たった今説明したように、アクションメソッドの形で定義されるアクションを指します。
アクションメソッドの名前は、次の基準に従って、アクション ID から導出されます。
アクションメソッドの名前は、次の手順に従って、アクション ID から導出されます。
* アクション ID に含まれる各単語の最初の文字を大文字に変換する。
* ダッシュを削除する。
* 接頭辞 `action` を付ける。
1. アクション ID に含まれる各単語の最初の文字を大文字に変換する。
2. ハイフンを削除する。
3. 接頭辞 `action` を付ける。
例えば、`index` は `actionIndex` となり、`hello-world` は `actionHelloWorld` となります。
@ -397,10 +397,10 @@ class SiteController extends Controller
* アクション ID に合致するアクションメソッドが見つかった場合は、インラインアクションが作成される。
* 上記以外の場合は、[[yii\base\InvalidRouteException]] 例外が投げられる。
3. コントローラは、アプリケーション、(コントローラがモジュールに属する場合は) モジュール、そしてコントローラの `beforeAction()` メソッドをこの順で呼び出す。
* どれか一つの呼び出しが false を返した場合は、残りのまだ呼ばれていない `beforeAction()` はスキップされ、アクションの実行はキャンセルされる。
* どれか一つの呼び出しが false を返した場合は、残りのまだ呼ばれていない `beforeAction()` メソッドはスキップされ、アクションの実行はキャンセルされる。
* デフォルトでは、それぞれの `beforeAction()` メソッドは、ハンドラをアタッチすることが可能な `beforeAction` イベントをトリガする。
4. コントローラがアクションを実行する。
* リクエストデータが解析されて、アクションパラメータにデータが投入される。
* アクションパラメータが解析されて、リクエストデータからデータが投入される。
5. コントローラは、コントローラ、(コントローラがモジュールに属する場合は) モジュール、そしてアプリケーションの `afterAction()` メソッドをこの順で呼び出す。
* デフォルトでは、それぞれの `afterAction()` メソッドは、ハンドラをアタッチすることが可能な `afterAction` イベントをトリガする。
6. アプリケーションはアクションの結果を受け取り、それを [レスポンス](runtime-responses.md) に割り当てる。
@ -411,7 +411,7 @@ class SiteController extends Controller
良く設計されたアプリケーションでは、コントローラはたいてい非常に軽いものになり、それぞれのアクションは数行のコードしか含まないものになります。
あなたのコントローラが少々複雑になっている場合、そのことは、通常、コントローラをリファクタして、コードの一部を他のクラスに移動すべきことを示すものです。
要約すると、コントローラは、
いくつかのベストプラクティスを特に挙げるなら、コントローラは、
* [リクエスト](runtime-requests.md) データにアクセスすることが出来ます。
* リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来ます。

8
docs/guide-ja/structure-entry-scripts.md

@ -1,7 +1,7 @@
エントリスクリプト
==================
エントリスクリプトは、アプリケーションのブートストラップ過程のチェーンにおける最初の環です。
エントリスクリプトは、アプリケーションのブートストラップの過程における最初のステップです。
アプリケーションは (ウェブアプリケーションであれ、コンソールアプリケーションであれ)単一のエントリスクリプトを持ちます。
エンドユーザはエントリスクリプトに対してリクエストを発行し、エントリスクリプトはアプリケーションのインスタンスを作成して、それにリクエストを送付します。
@ -14,7 +14,7 @@
エントリスクリプトは主として次の仕事をします。
* グローバルな定数を定義する。
* [Composer のオートローダ](http://getcomposer.org/doc/01-basic-usage.md#autoloading) を登録する。
* [Composer のオートローダ](https://getcomposer.org/doc/01-basic-usage.md#autoloading) を登録する。
* [[Yii]] クラスファイルをインクルードする。
* アプリケーションの構成情報を読み出す。
* [アプリケーション](structure-applications.md) のインスタンスを生成して構成する。
@ -62,10 +62,6 @@ $config = require(__DIR__ . '/../config/web.php');
defined('YII_DEBUG') or define('YII_DEBUG', true);
// デフォルトでは fcgi が STDIN と STDOUT を定義していないので
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
// Composer のオートローダを登録
require(__DIR__ . '/vendor/autoload.php');

4
docs/guide-ja/structure-models.md

@ -5,7 +5,7 @@
これは、ビジネスのデータ、規則、ロジックを表現するオブジェクトです。
モデルクラスは、[[yii\base\Model]] またはその子クラスを拡張することによって作成することが出来ます。
基底クラス [[yii\base\Model]] は、次のように、数多くの有用な機能をサポートしています。
基底クラス [[yii\base\Model]] は、次のよう数多くの有用な機能をサポートしています。
* [属性](#attributes): ビジネスデータを表現します。通常のオブジェクトプロパティや配列要素のようにしてアクセスすることが出来ます。
* [属性のラベル](#attribute-labels): 属性の表示ラベルを指定します。
@ -16,7 +16,7 @@
`Model` クラスは、[アクティブレコード](db-active-record.md) のような、更に高度なモデルの基底クラスでもあります。
それらの高度なモデルについての詳細は、関連するドキュメントを参照してください。
> Info|情報: あなたのモデルクラスの基底として [[yii\base\Model]] を使うことが要求されている訳ではありません。
> Info|情報: あなたのモデルクラスの基底クラスとして [[yii\base\Model]] を使うことが要求されている訳ではありません。
しかしながら、Yii のコンポーネントの多くが [[yii\base\Model]] をサポートするように作られていますので、通常は [[yii\base\Model]] がモデルの基底クラスとして推奨されます。

2
docs/guide-ja/structure-modules.md

@ -134,7 +134,7 @@ class PostController extends Controller
### ルート <span id="routes"></span>
アプリケーションの中のコントローラをアクセスするのと同じように、[ルート](structure-controllers.md#routes) がモジュールの中のコントローラを指し示すために使われます。
モジュール内のコントローラのルートは、モジュール ID で始まり、コントローラ ID、アクション ID と続くものでなければなりません。
モジュール内のコントローラのルートは、モジュール ID で始まり、[コントローラ ID](structure-controllers.md#controller-ids)[アクション ID](structure-controllers.md#action-ids) と続くものでなければなりません。
例えば、アプリケーションが `forum` という名前のモジュールを使用している場合、`forum/post/index` というルートは、`forum` モジュール内の `post` コントローラの `index` アクションを表します。
ルートがモジュール ID だけを含む場合は、[[yii\base\Module::defaultRoute]] プロパティ (デフォルト値は `default` です) が、どのコントローラ/アクションが使用されるべきかを決定します。
これは、`forum` というルートは `forum` モジュール内の `default` コントローラを表すという意味です。

17
docs/guide-ja/test-environment-setup.md

@ -12,7 +12,17 @@ Yii2 は [`Codeception`](https://github.com/Codeception/Codeception) テスト
これら三つのタイプのテスト全てについて、Yii は、[`yii2-basic`](https://github.com/yiisoft/yii2-app-basic) と [`yii2-advanced`](https://github.com/yiisoft/yii2-app-advanced) の両方のプロジェクトテンプレートで、そのまま使えるテストセットを提供しています。
テストを走らせるためには、[Codeception](https://github.com/Codeception/Codeception) をインストールする必要があります。
インストールするのに良い方法は次のとおりです。
Codeception は、特定のプロジェクトのためだけにローカルにインストールするか、開発マシンのためにグローバルにインストールするかを選ぶことが出来ます。
ローカルのインストールのためには、次のコマンドを使います。
```
composer require "codeception/codeception=2.0.*"
composer require "codeception/specify=*"
composer require "codeception/verify=*"
```
グローバルのインストールのためには、`global` 命令を使う必要があります。
```
composer global require "codeception/codeception=2.0.*"
@ -29,3 +39,8 @@ Changed current directory to <directory>
そうしたら、`<directory>/vendor/bin` をあなたの `PATH` 環境変数に追加してください。
これでコマンドラインから `codecept` をグローバルに使うことが出来ます。
> Note|注意: グローバルにインストールすると、あなたの開発環境で扱っている全てのプロジェクトに対して Codeception を使うことが出来るようになります。
パスを指定せずに `codecept` シェルコマンドをグローバルに走らせることが可能になります。
しかしながら、例えば、二つのプロジェクトが異なるバージョンの Codeception のインストールを要求している場合など、この方法が不適切なこともあり得ます。
話を単純にするために、このガイドで実行しているテストに関するシェルコマンドは、全て、Codeception がグローバルにインストールされていることを前提にしています。

2
docs/guide-ja/test-fixtures.md

@ -373,4 +373,4 @@ Auto-generating fixtures
Yii also can auto-generate fixtures for you based on some template. You can generate your fixtures with different data on different languages and formats.
These feature is done by [Faker](https://github.com/fzaninotto/Faker) library and `yii2-faker` extension.
See extension [guide](https://github.com/yiisoft/yii2/tree/master/extensions/faker) for more docs.
See extension [guide](https://github.com/yiisoft/yii2-faker) for more docs.

2
docs/guide-ja/test-overview.md

@ -4,7 +4,7 @@
テストはソフトウェア開発の重要な部分です。
気付いているか否かにかかわらず、私たちは継続的にテストをしています。
例えば、PHP でクラスを書くとき、私たちはステップごとにデバッグしたり、または単純に echo 文や die 文を使ったりして、実装が最初の計画通りに動作することを検証します。
ウェブアプリケーションの場合は、何らかのテストデータをフォームに入力して、ページがユーザと期待通りの相互作用をすることを確認します。
ウェブアプリケーションの場合は、何らかのテストデータをフォームに入力して、ページが期待通りにユーザと相互作用をすることを確認します。
テストを実行するプロセスを自動化して、何かを検証する必要があるときは、いつでも、それを代行してくれるコードを呼び出すだけでよいようにすることが出来ます。
結果が計画したものと合致することを検証するコードがテストと呼ばれ、それを作成して更に実行するプロセスがテスト自動化として知られています。

199
docs/guide-ja/tool-debugger.md

@ -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'],
],
];
// ...
```
以上です。これで、たいしてコードを書くこともなく、もう一つの便利なパネルを手に入れました。

268
docs/guide-ja/tool-gii.md

@ -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 モジュールを開くと、新しいジェネレータがその中に出現します。

262
docs/guide-ja/tutorial-advanced-app.md

@ -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(...);
```

16
docs/guide-ja/tutorial-console.md

@ -17,16 +17,16 @@
スクリーンショットに表示されているように、デフォルトで利用できる一連のコマンドが Yii によって既に定義されています。
- [yii\console\controllers\AssetController|AssetController] - JavaScript と CSS ファイルを結合して圧縮することが出来ます。
- [[yii\console\controllers\AssetController|AssetController]] - JavaScript と CSS ファイルを結合して圧縮することが出来ます。
このコマンドについては、[アセットの節](structure-assets.md#using-the-asset-command) でさらに学習することが出来ます。
- [yii\console\controllers\CacheController|CacheController] - アプリケーションのキャッシュをフラッシュすることが出来ます。
- [yii\console\controllers\FixtureController|FixtureController] - テストのために、フィクスチャデータのロードとアンロードを管理します。
- [[yii\console\controllers\CacheController|CacheController]] - アプリケーションのキャッシュをフラッシュすることが出来ます。
- [[yii\console\controllers\FixtureController|FixtureController]] - テストのために、フィクスチャデータのロードとアンロードを管理します。
このコマンドについては [テストのフィクスチャの節](test-fixtures.md#managing-fixtures) で詳細に説明されています。
- [yii\console\controllers\HelpController|HelpController] - コンソールコマンドについてのヘルプ情報を提供します。
- [[yii\console\controllers\HelpController|HelpController]] - コンソールコマンドについてのヘルプ情報を提供します。
これがデフォルトのコマンドであり、上のスクリーンショットで見た出力を表示するものです。
- [yii\console\controllers\MessageController|MessageController] - ソースファイルから翻訳すべきメッセージを抽出します。
- [[yii\console\controllers\MessageController|MessageController]] - ソースファイルから翻訳すべきメッセージを抽出します。
このコマンドについてさらに学習するためには、[国際化の節](tutorial-i18n.md#message-command) を参照してください。
- [yii\console\controllers\MigrateController|MigrateController] - アプリケーションのマイグレーションを管理します。
- [[yii\console\controllers\MigrateController|MigrateController]] - アプリケーションのマイグレーションを管理します。
データベースのマイグレーションについては、[データベースのマイグレーションの節](db-migrations.md) で詳しく説明されています。
@ -67,10 +67,6 @@ yii migrate/up 5 --migrationTable=migrations
defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi では、デフォルトでは、STDIN と STDOUT が定義されていない
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');

49
docs/guide-ja/tutorial-core-validators.md

@ -97,20 +97,29 @@ public function rules()
```
このバリデータは、入力値が正しい書式の date、time、または datetime であるかどうかをチェックします。
オプションとして、入力値を UNIX タイムスタンプに変換して、[[yii\validators\DateValidator::timestampAttribute|timestampAttribute]] によって指定された属性に保存することも出来ます。
オプションとして、入力値を UNIX タイムスタンプ (または、その他、機械による読み取りが可能な形式) に変換して、[[yii\validators\DateValidator::timestampAttribute|timestampAttribute]] によって指定された属性に保存することも出来ます。
- `format`: 検証される値が従っているべき日付/時刻の書式。
これには [ICU manual](http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax) で記述されている日付/時刻のパターンを使うことが出来ます。
あるいは、PHP の `Datetime` クラスによって認識される書式に接頭辞 `php:` を付けた文字列でも構いません。
サポートされている書式については、<http://php.net/manual/ja/datetime.createfromformat.php> を参照してください。
このプロパティが設定されていないときは、`Yii::$app->formatter->dateFormat` の値を取ります。
- `timestampAttribute`: このバリデータが入力された日付/時刻から変換した UNIX タイムスタンプを代入することが出来る属性の名前。
- `timestampAttribute`: このバリデータが、入力された日付/時刻から変換した UNIX タイムスタンプを代入することが出来る属性の名前。
これは、検証される属性と同じ属性であってもかまいません。
その場合は、元の値は検証実行後にタイムスタンプで上書きされます。
[DatePicker で日付の入力を扱う](https://github.com/yiisoft/yii2-jui/blob/master/docs/guide-ja/topics-date-picker.md) に使用例がありますので、参照してください。
バージョン 2.0.4 以降では、[[yii\validators\DateValidator::$timestampAttributeFormat|$timestampAttributeFormat]] と [[yii\validators\DateValidator::$timestampAttributeTimeZone|$timestampAttributeTimeZone]] を使って、この属性に対するフォーマットとタイムゾーンを指定することが出来ます。
- バージョン 2.0.4 以降では、タイムスタンプの [[yii\validators\DateValidator::$min|最小値]] または [[yii\validators\DateValidator::$max|最大値]] を指定することも出来ます。
入力が必須でない場合には、date バリデータに加えて、default バリデータ (デフォルト値フィルタ) を追加すれば、空の入力値が `NULL` として保存されることを保証することが出来ます。
そうしないと、データベースに `0000-00-00` という日付が保存されたり、デートピッカーの入力フィールドが `1970-01-01` になったりしてしまいます。
```php
[['from_date', 'to_date'], 'default', 'value' => null],
[['from_date', 'to_date'], 'default', 'value' => null],
[['from_date', 'to_date'], 'date'],
```
## [[yii\validators\DefaultValueValidator|default]] <span id="default"></span>
@ -165,6 +174,30 @@ function foo($model, $attribute) {
設定されていない場合は、バリデータが下限値をチェックしないことを意味します。
## [[yii\validators\EachValidator|each]] <span id="each"></span>
> Info|情報: このバリデータは、バージョン 2.0.4 以降で利用できます。
```php
[
// 全てのカテゴリ ID が整数であるかどうかチェックする
['categoryIDs', 'each', 'rule' => ['integer']],
]
```
このバリデータは配列の属性に対してのみ働きます。
これは、配列の *全ての* 要素が指定された検証規則による検証に成功するかどうかを調べるものです。
上の例では、`categoryIDs` 属性は配列を値として取らなければならず、配列の各要素は `integer` の検証規則によって検証されることになります。
- `rule`: 検証規則を指定する配列。
配列の最初の要素がバリデータのクラス名かエイリアスを指定します。
配列の残りの「名前・値」のペアが、バリデータオブジェクトを構成するのに使われます。
- `allowMessageFromRule`: 埋め込まれた検証規則によって返されるエラーメッセージを使うかどうか。
デフォルト値は true です。これが false の場合は、`message` をエラーメッセージとして使います。
> Note|注意: 属性が配列でない場合は、検証が失敗したと見なされ、`message` がエラーメッセージとして返されます。
## [[yii\validators\EmailValidator|email]] <span id="email"></span>
```php
@ -213,9 +246,12 @@ function foo($model, $attribute) {
]
```
このバリデータは、入力値がテーブルのカラムに存在するかどうかをチェックします。
[アクティブレコード](db-active-record.md) モデルの属性に対してのみ働きます。
一つのカラムに対するバリデーションか、複数のカラムに対するバリデーションか、どちらかをサポートします。
このバリデータは、入力値が [アクティブレコード](db-active-record.md) の属性によって表されるテーブルのカラムに存在するかどうかをチェックします。
`targetAttribute` を使って [アクティブレコード](db-active-record.md) の属性を指定し、`targetClass` によって対応するクラスを指定することが出来ます。
これらを指定しない場合は、検証されるモデルの属性とクラスの値が使用されます。
このバリデータは、一つまたは複数のカラムに対する検証に使用することが出来ます
(複数のカラムに対する検証の場合は、それらの属性の組み合せが存在しなければならないことを意味します)。
- `targetClass`: 検証される入力値を探すために使用される [アクティブレコード](db-active-record.md) クラスの名前。
設定されていない場合は、現在検証されているモデルのクラスが使用されます。
@ -255,6 +291,7 @@ function foo($model, $attribute) {
リストは、配列、または、空白かカンマで区切られたファイルの MIME タイプからなる文字列 (例えば、"image/jpeg, image/png") で指定することが出来ます。
MIME タイプ名は大文字と小文字を区別しません。
デフォルト値は null であり、すべての MIME タイプが許可されることを意味します。
MIME タイプの詳細については、[一般的なメディアタイプ](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types) を参照してください。
- `minSize`: アップロードされるファイルに要求される最小限のバイト数。
デフォルト値は null であり、下限値が無いことを意味します。
- `maxSize`: アップロードされるファイルに許可される最大限のバイト数。

31
docs/guide-ja/tutorial-i18n.md

@ -517,7 +517,8 @@ use yii\i18n\MissingTranslationEvent;
class TranslationEventHandler
{
public static function handleMissingTranslation(MissingTranslationEvent $event) {
public static function handleMissingTranslation(MissingTranslationEvent $event)
{
$event->translatedMessage = "@MISSING: {$event->category}.{$event->message} FOR LANGUAGE {$event->language} @";
}
}
@ -530,7 +531,33 @@ class TranslationEventHandler
### `message` コマンドを使う <a name="message-command"></a>
TBD
翻訳は [[yii\i18n\PhpMessageSource|php ファイル]]、[[yii\i18n\GettextMessageSource|.po ファイル]、または [[yii\i18n\DbMessageSource|database]] に保存することが出来ます。
追加のオプションについてはそれぞれのクラスを参照してください。
まず最初に、構成情報ファイルを作成する必要があります。
どこに保存したいかを決めて、次のコマンドを発行してください。
```bash
./yii message/config path/to/config.php
```
作成されたファイルを開いて、あなたの要求に合わせてパラメータを修正します。
特に、下記の項目に注意を払ってください。
* `languages`: あなたのアプリケーションが翻訳されるべき言語を表す配列。
* `messagePath`: メッセージファイルを保存するパス。
これは、アプリケーションの構成情報で記述されている `i18n``basePath` と合致しなければなりません。
> エイリアスがここではサポートされていないことに注意してください。
構成情報ファイルの位置からの相対パスで記述しなければなりません。
構成情報ファイルの編集が完了すれば、ついに、下記のコマンドを使ってメッセージを抽出することが出来ます。
```bash
./yii message path/to/config.php
```
これで、(あなたがファイルベースの翻訳を選択していた場合は) `messagePath` ディレクトリにファイルが出現します。
ビュー

4
docs/guide-ja/tutorial-mailing.md

@ -4,7 +4,7 @@
> Note|注意: この節はまだ執筆中です。
Yii は電子メールの作成と送信をサポートしています。
ただし、フレームワークのコアはコンテント作成の機能と基本的なインタフェイスだけを提供します。
ただし、フレームワークのコアが提供するのコンテント作成の機能と基本的なインタフェイスだけす。
実際のメール送信メカニズムはエクステンションによって提供されなければなりません。
と言うのは、メール送信はプロジェクトが異なるごとに異なる実装が必要とされるでしょうし、通常、外部のサービスやライブラリに依存するものだからです。
@ -76,7 +76,7 @@ foreach ($users as $user) {
Yii::$app->mailer->sendMultiple($messages);
```
芸の細かいメールエクステンションであれば、単一のネットワークメッセージを使うなどして、この手法の恩恵を享受することが出来るでしょう。
メールエクステンションの中には、単一のネットワークメッセージを使うなどして、この手法の恩恵を享受することが出来るものもいくつかあるでしょう。
メールのコンテントを作成する

233
docs/guide-ja/tutorial-performance-tuning.md

@ -1,57 +1,60 @@
パフォーマンスチューニング
==========================
> Note|注意: この節はまだ執筆中です。
あなたのウェブアプリケーションのパフォーマンスに影響を及ぼす要因は数多くあります。
環境の要因もありますし、あなたのコードに関係する要因もあります。
また、Yii そのものに関係する要因もあります。
この節では要因のほとんどを列挙して、どのようにそれらを修正すればあなたのアプリケーションのパフォーマンスを向上させることが出来るかを説明します。
あなたのウェブアプリケーションのパフォーマンスは二つの部分に基づいています。
一つはフレームワークのパフォーマンスであり、もう一つはアプリケーションそのものです。
Yii は、そのままの状態でも、あなたのアプリケーションのパフォーマンスを劣化させる影響がかなり小さいものですが、本番環境のためには、さらに微調整することが可能です。
アプリケーションに関しては、ベストプラクティスのいくつかを提供すると共に、それを Yii に適用する方法を例示します。
## PHP 環境を最適化する <span id="optimizing-php"></span>
環境を準備する
--------------
PHP アプリケーションを走らせるための環境を正しく構成することは本当に重要です。
PHP 環境を正しく構成することは非常に重要です。
最大のパフォーマンスを得るためには、
- 常に最新の安定した PHP バージョンを使うこと。
PHP は、メジャーリリースのたびに、顕著なパフォーマンスの改善とメモリ使用の削減がなされています。
- PHP 5.4 以下には [APC](http://ru2.php.net/apc)、または、PHP 5.5 以上には [Opcache](http://php.net/opcache) を使うこと。
このことは、非常に良いパフォーマンス強化をもたらします。
- 最新の安定した PHP バージョンを使うこと。
使用する PHP のメジャーリリースを上げると、顕著なパフォーマンスの改善がもたらされることがあります。
- [Opcache](http://php.net/opcache) (PHP 5.5 以降) または [APC](http://ru2.php.net/apc) (PHP 5.4 以前) を使って、バイトコードキャッシュを有効にすること。
バイトコードキャッシュによって、リクエストが入ってくるたびに PHP スクリプトを解析してインクルードする時間の浪費を避けることが出来ます。
フレームワークを本番用に準備する
--------------------------------
## デバッグモードを無効にする <span id="disable-debug"></span>
### デバッグモードを無効化する
本番環境でアプリケーションを実行するときには、デバッグモードを無効にしなければなりません。
Yii は、`YII_DEBUG` という名前の定数の値を使って、デバッグモードを有効にすべきか否かを示します。
デバッグモードが有効になっているときは、Yii はデバッグ情報の生成と記録のために時間を余計に費やします。
アプリケーションを本番環境に配備する前に行うべき最初のことは、デバッグモードの無効化です。
Yii のアプリケーションは、`index.php` において定数 `YII_DEBUG``true` と定義されていると、デバッグモードで走ります。
従って、デバッグモードを無効にするために、以下のコードが `index.php` になければなりません。
[エントリスクリプト](structure-entry-scripts.md) の冒頭に次のコード行を置くことによってデバッグモードを無効にすることが出来ます。
```php
defined('YII_DEBUG') or define('YII_DEBUG', false);
```
デバッグモードは開発段階において非常に役に立ちますが、いくつかのコンポーネントがデバッグモードにおいて追加の負荷を発生させるため、パフォーマンスを劣化させます。
例えば、メッセージロガーは、ログに記録されるすべてのメッセージについて、追加のデバッグ情報を記録します。
> Info|情報: `YII_DEBUG` のデフォルト値は false です。
従って、アプリケーションコードの他のどこかでこのデフォルト値を変更していないと確信できるなら、単に上記の行を削除してデバッグモードを無効にしても構いません。
## キャッシュのテクニックを使う <span id="using-caching"></span>
### PHP opcode キャッシュを有効にする
さまざまなキャッシュのテクニックを使うと、あなたのアプリケーションのパフォーマンスを目に見えて改善することが出来ます。
たとえば、あなたのアプリケーションが Markdown 形式のテキスト入力をユーザに許可している場合、解析済みの Markdown のコンテントをキャッシュすることを考慮してください。
そうすれば、リクエストごとに毎回同じ Markdown テキストの解析を繰り返すことを回避できるでしょう。
Yii によって提供されているキャッシュのサポートについて学ぶためには [キャッシュ](caching-overview.md) の節を参照してください。
PHP opcode キャッシュを有効にすると、すべての PHP アプリケーションで、顕著にパフォーマンスが向上し、メモリ使用量が削減されます。
Yii も例外ではありません。
Yii は [PHP 5.5 OPcache](http://php.net/manual/ja/book.opcache.php) と [APC PHP 拡張](http://php.net/manual/ja/book.apc.php) の両方でテストされています。
どちらのキャッシュも、PHP 中間コードを最適化して、入ってくるリクエストごとに PHP スクリプトを解析するために時間を消費することを回避します。
## スキーマキャッシュを有効にする <span id="enable-schema-caching"></span>
### ActiveRecord のデータベーススキーマキャッシュを有効にする
スキーマキャッシュは、[アクティブレコード](db-active-record.md) を使おうとする場合には、いつでも有効にすべき特別なキャッシュ機能です。
ご存じのように、アクティブレコードは、賢いことに、あなたがわざわざ記述しなくても、DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。
アクティブレコードはこの情報を取得するために追加の SQL クエリを実行しています。
スキーマキャッシュを有効にすると、取得されたスキーマ情報はキャッシュに保存されて将来のクエリで再利用されるようになります。
アプリケーションがアクティブレコードを使用している場合は、スキーマキャッシュを有効にして、データベーススキーマを解析するための時間を節約すべきです。
そうするためには、アプリケーションの構成情報 `config/web.php` において、`Connection::enableSchemaCache` プロパティを `true` に設定します。
スキーマキャッシュを有効にするためには、[アプリケーションの構成情報](concept-configurations.md) の中で、`cache` [アプリケーションコンポーネント](structure-application-components.md) にスキーマ情報を保存するように構成し、[[yii\db\Connection::enableSchemaCache]] を `true` に設定します。
```php
return [
// ...
'components' => [
// ...
'cache' => [
'class' => 'yii\caching\FileCache',
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=mydatabase',
@ -60,32 +63,29 @@ return [
'enableSchemaCache' => true,
// スキーマキャッシュの持続時間
// 'schemaCacheDuration' => 3600,
'schemaCacheDuration' => 3600,
// 使用されるキャッシュコンポーネントの名前。デフォルトは 'cache'。
//'schemaCache' => 'cache',
],
'cache' => [
'class' => 'yii\caching\FileCache',
// スキーマ情報を保存するのし使用されるキャッシュコンポーネントの名前
'schemaCache' => 'cache',
],
],
];
```
`cache` [アプリケーションコンポーネント](structure-application-components.md) が構成されていなければならないことに注意してください。
## アセットを結合して最小化する <span id="optimizing-assets"></span>
### アセットを結合して最小化する
複雑なウェブページでは、多数の CSS や JavaScript のアセットファイルをインクルードすることがよくあります。
HTTP リクエストの回数、および、これらのアセットの全体としてのダウンロードサイズを削減するために、アセットを単一のファイルに結合して、それを圧縮することを考慮すべきです。
これによって、ページのロードにかかる時間とサーバの負荷を大きく削減することが出来ます。
詳細については、[アセット](structure-assets.md) の節を参照してください。
アセットは、典型的には JavaScript と CSS ですが、結合して圧縮することが出来ます。
これにより、ページの読み込みにかかる時間をわずかながら削減して、アプリケーションのエンドユーザにより良いユーザ体験をもたらすことが出来ます。
## セッションのストレージを最適化する <span id="optimizing-session"></span>
これをどのようにすれば達成できるかについて学ぶためには、ガイドの [アセット](structure-assets.md) の節を参照してください。
### セッションのためにより良いストレージを使用する
デフォルトでは、PHP はセッションを処理するためにファイルを使います。
開発と小さなプロジェクトではそれでも構いませんが、リクエストを並列処理するとなると、データベースのような別のストレージに変更する方が良いでしょう。
そうするためには、`config/web.php` によってアプリケーションを構成します。
デフォルトでは、セッションのデータはファイルに保存されます。
開発と小さなプロジェクトではそれでも構いません。
しかし、大量のリクエストを並列処理するとなると、データベースのような、もっと洗練されたストレージを使う方が良いでしょう。
Yii はさまざまなセッションストレージのサポートを内蔵しています。
これらのストレージは、[アプリケーションの構成情報](concept-configurations.md) の中で `session` コンポーネントを次のように構成することによって使用することが出来ます。
```php
return [
@ -106,129 +106,94 @@ return [
];
```
`CacheSession` を使って、セッションをキャッシュに保存することが出来ます。
キャッシュストレージの中には、memcached のように、セッションデータが失われないことを保証しないものもあり、予期せぬログアウトを引き起こす場合があることに注意してください。
サーバに [Redis](http://redis.io/) がある場合は、それをセッションのストレージに使用することを強く推奨します。
アプリケーションを改善する
--------------------------
### サーバ側のキャッシュテクニックを使う
キャッシュの節で説明されているように、Yii はウェブアプリケーションのパフォーマンスを著しく改善することが出来るキャッシュのソリューションをいくつか提供しています。
データの生成に長い時間を要するものがある場合は、データキャッシュの手法を使用して、データを生成する頻度を削減することが出来ます。
ページのある部分が比較的静的なものであり続ける場合は、フラグメントキャッシュの手法を使用して、その部分のレンダリングの頻度を削減することが出来ます。
あるページ全体が比較的静的なものであり続ける場合は、ページキャッシュの手法を使用して、ページ全体のレンダリングのコストを節約することが出来ます。
### HTTP キャッシュを利用して、処理時間と帯域を節約する
上記の構成は、セッションデータの保存にデータベーステーブルを使用するものです。
デフォルトでは、`db` アプリケーションコンポーネントをデータベース接続として使用し、セッションデータを `session` テーブルに保存します。
ただし、前もって `session` テーブルを次のように作っておく必要があります。
HTTP キャッシュを利用すると、処理時間および帯域やリソースを著しく節約することが出来ます。
HTTP キャッシュは、`ETag` または `Last-Modified` ヘッダをアプリケーションのレスポンスで送信することによって実装することが出来ます。
ブラウザが HTTP の仕様に従って実装されていれば (ほとんどのブラウザがそうです)、コンテントは以前の状態と異なる場合にだけ取得されます。
正しいヘッダを作成することは手間のかかる仕事ですので、Yii は [[yii\filters\HttpCache]] というコントローラフィルタの形でショートカットを提供しています。
これを使うことはとても簡単です。
コントローラの中で `behaviors` メソッドを以下のように実装することが必要です。
```php
public function behaviors()
{
return [
'httpCache' => [
'class' => \yii\filters\HttpCache::className(),
'only' => ['list'],
'lastModified' => function ($action, $params) {
$q = new Query();
return strtotime($q->from('users')->max('updated_timestamp'));
},
// 'etagSeed' => function ($action, $params) {
// return // egat のシードをここで生成
//}
],
];
}
```sql
CREATE TABLE session (
id CHAR(40) NOT NULL PRIMARY KEY,
expire INTEGER,
data BLOB
)
```
上記のコードでは、`etagSeed` または `lastModified` のどちらかを使うことが出来ます。
両方を実装する必要はありません。
目的は、コンテントを取得してレンダリングするよりも安価な方法を使って、コンテントが修正されたかどうかを判断することです。
`lastModified` はコンテントが最後に修正されたときの UNIX タイムスタンプを返さなければなりません。
一方 `etagSeed``ETag` ヘッダの値を生成するために使われる文字列を返さなければなりません。
[[yii\web\CacheSession]] を使って、セッションをキャッシュに保存することも出来ます。
理論上、サポートされている [キャッシュストレージ](caching-data.md#supported-cache-storage) のどれでも使うことが出来ます。
ただし、キャッシュストレージの中には、容量の上限に達したときにキャッシュされたデータをフラッシュするものがあることに注意してください。
この理由により、主として容量の上限が無い種類のキャッシュストレージを使用すべきです。
あなたのサーバに [Redis](http://redis.io/) がある場合は、[[yii\redis\Session]] によって redis をセッションストレージとして使用することを強く推奨します。
### データベースの最適化
データベースからのデータ取得がウェブアプリケーションのパフォーマンスの主たるボトルネックになることがよくあります。
[キャッシュ](caching.md#Query-Caching) の使用によってパフォーマンスの劣化を緩和することは出来ますが、問題を完全に解決することは出来ません。
データベースが膨大なデータを抱えている場合、キャッシュされたデータが無効化されたときに最新のデータを取得するためのコストは、データベースとクエリが適切に設計されていないと、法外なものになり得ます。
データベースのインデックスを上手に設計しましょう。
インデックスを付けると SELECT クエリを非常に速くすることが出来ます。ただし、INSERT、UPDATE、または DELTE のクエリは遅くなることがあります。
## データベースを最適化する <span id="optimizing-databases"></span>
複雑なクエリに対しては、PHP コードの中からクエリを発行して DBMS にクエリを解析するように繰り返して求める代わりに、データベースビューを作成することを推奨します。
DB クエリの実行とデータベースからのデータ取得がウェブアプリケーションのパフォーマンスの主たるボトルネックになることがよくあります。
[データキャッシュ](caching-data.md) の使用によってパフォーマンスの劣化を緩和することは出来ますが、問題を完全に解決することは出来ません。
データベースが膨大なデータを抱えている場合、キャッシュされたデータが無効化されたときに最新のデータを取得するためのコストは、データベースとクエリが適切に設計されていないと、法外なものになり得ます。
アクティブレコードを使い過ぎないでください。
アクティブレコード は OOP 流にデータをモデリングするには便利ですが、クエリ結果の各行を表すために一つまたは複数のオブジェクトを作る必要があるため、パフォーマンスを現実に低下させます。
膨大なデータを扱うアプリケーションでは、より低レベルの DAO や データベース API を使うのが良い選択でしょう
DB クエリのパフォーマンスを向上させるための一般的なテクニックは、フィルタの対象になるテーブルカラムにインデックスを作成することです。
例えば、`username` によってユーザのレコードを検索する必要があるなら、`username` に対してインデックスを作成するべきです。
ただし、インデックスを付けると SELECT クエリを非常に速くすることが出来る代りに、INSERT、UPDATE、または DELTE のクエリが遅くなることに注意してください。
最後にもう一つ大事なことですが、SELECT クエリで LIMIT を使ってください。
こうすることで、大量のデータが返されて、PHP のために確保されたメモリを使い尽くすということがなくなります。
### asArray を使う
## プレーンな配列を使う <span id="using-arrays"></span>
読み出し専用のページにおいて、メモリと処理時間を節約する良い方法に、アクティブレコードの `asArray` メソッドを使うという方法があります。
[アクティブレコード](db-active-record.md) は非常に使い勝手のよいものですが、データベースから大量のデータを取得する必要がある場合は、プレーンな配列を使うほどには効率的ではありません。
そういう場合は、アクティブレコードを使ってデータを取得する際に `asArray()` を呼んで、取得したデータがかさばるアクティブレコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。
例えば、
```php
class PostController extends Controller
{
public function actionIndex()
{
$posts = Post::find()->orderBy('id DESC')->limit(100)->asArray()->all();
$posts = Post::find()->limit(100)->asArray()->all();
return $this->render('index', ['posts' => $posts]);
}
}
```
ビューにおいては、`$posts` の個々のレコードのフィールドを配列としてアクセスしなければなりません。
上記において、`$posts` は、テーブル行の配列としてデータを代入されることになります。
各行はプレーンな配列になります。
`$i` 番目の行の `title` カラムにアクセスするためには、`$posts[$i]['title']` という式を使うことが出来ます。
クエリを構築するのに [DAO](db-dao.md) を使って、データをプレーンな配列に取得することも出来ます。
```php
foreach ($posts as $post) {
echo $post['title'] . "<br>";
}
```
`asArray` が指定されていなくても配列記法を使用してフィールドにアクセスすることが出来ますが、その場合は AR オブジェクトを扱っていることに注意してください。
## Composer オートローダを最適化する <span id="optimizing-autoloader"></span>
### Composer オートローダを最適化する
Composer のオートローダは、ほとんどのサードパーティのクラスファイルをインクルードするのに使われますので、次のコマンドを実行して Composer のオートローダを最適化することを考慮すべきです。
全体としてのパフォーマンスを改善するために、`composer dumpautoload -o` を実行して、Composer のオートローダを最適化することが出来ます。
```
composer dumpautoload -o
```
### バックグラウンドでデータを処理する
## オフラインでデータを処理する <span id="processing-data-offline"></span>
ユーザのリクエストに素早く応答したい場合、リクエストの重い部分は、それについて即座にレスポンスを返す必要がなければ、後から処理することが出来ます。
リクエストが何らかのリソース集約的な操作を必要とするものである場合は、そういう操作が終るまでユーザを待たせずに、オフラインモードで操作を実行する方策を考えるべきです。
これを達成する一般的な方法が二つあります。クロンジョブによる処理と、専用のキューです。
オフラインでデータを処理するための方法が二つあります。
すなわち、プルとプッシュです。
最初のケースでは、後から処理したいデータを、データベースなどの持続的ストレージに保存する必要があります。
そして、クロンジョブによって定期的に実行される [コンソールコマンド](tutorial-console.md) がデータベースを検索して、データがあれば処理します。
プルの方法では、リクエストが何らかの複雑な操作を必要とするたびに、タスクを作成してデータベースなどの持続的ストレージに保存します。
そうしておいて、別の独立したプロセス (例えばクロンジョブ) を使い、タスクを引き出して処理します。
この方法は、実装は容易ですが、いくつかの欠点があります。
例えば、タスクのプロセスはストレージから定期的にタスクを引き出さなければなりません。
引き出す間隔が長すぎると、タスクの処理に大きな遅延が生じます。しかし、間隔が短すぎると、オーバーヘッドが大きくなります。
このソリューションでたいていの場合は OK ですが、一つ大きな欠点があります。
データベースを検索するまでは処理すべきデータの有無を知ることが出来ません。
そのため、データベースをかなり頻繁に検索するか、または、各処理の間に若干の遅延を生じさせるかのどちらかになります。
プッシュの方法では、タスクを管理するのにメッセージキュー (例えば、RabbitMQ、ActiveMQ、Amazon SQS など) を使用します。
新しいタスクがキューに入れられるたびに、タスクを処理するプロセスが起動されたり通知を受けたりして、タスク処理がトリガされます。
この問題は、キューやジョブサーバ (RabbitMQ、ActiveMQ、Amazon SQS、その他いろいろ) によって解決することが出来ます。
この場合は、持続的ストレージにデータを書き込む代りに、キューやジョブサーバによって提供される API を通じてデータをキューに入れます。
処理はたいていはジョブハンドラのクラスに渡されます。
キューに入れられたジョブは、先行するジョブが全て完了した直後に実行されます。
### 何をしても効果がない場合
## パフォーマンスプロファイリング <span id="performance-profiling"></span>
何をしても効果がない場合は、何がパフォーマンスの問題を解決するかについての思い込みを排することです。
代りに、いつでも、何かを変更する前にはコードをプロファイルしてください。
次のツールが役に立つでしょう。
あなたは、あなたのコードをプロファイルして、パフォーマンスのボトルネックを発見し、それに応じた適切な手段を講じるべきです。
次のプロファイリングツールが役に立つでしょう。
- [Yii のデバッグツールバーとデバッガ](tool-debugger.md)
- [Yii のデバッグツールバーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md)
- [XDebug プロファイラ](http://xdebug.org/docs/profiler)
- [XHProf](http://www.php.net/manual/en/book.xhprof.php)
- [XHProf](http://www.php.net/manual/ja/book.xhprof.php)

2
docs/guide-ja/tutorial-start-from-scratch.md

@ -54,6 +54,6 @@ Yii の新しいプロジェクトテンプレートを作成するのに必要
これで、あなたのテンプレートを使ってプロジェクトを作成することが出来ます。
```
composer global require "fxp/composer-asset-plugin:1.0.0"
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project
```

409
docs/guide-ja/tutorial-template-engines.md

@ -1,8 +1,6 @@
テンプレートエンジンを使う
==========================
> Note|注意: この節はまだ執筆中です。
デフォルトでは、Yii は PHP をテンプレート言語として使いますが、[Twig](http://twig.sensiolabs.org/) や [Smarty](http://www.smarty.net/) などの他のレンダリングエンジンをサポートするように Yii を構成することが出来ます。
`view` コンポーネントがビューのレンダリングに責任を持っています。
@ -46,409 +44,8 @@
上のコードを `composer.json``require` セクションに追加します。
変更をファイルに保存した後、コマンドラインで `composer update --prefer-dist` を実行することによってエクステンションをインストールすることが出来ます。
Twig
----
Twig を使うためには、`.twig` という拡張子を持つファイルにテンプレートを作成しなければなりません
(別のファイル拡張子を使っても構いませんが、それに対応してコンポーネントの構成を変更しなければなりません)。
通常のビューファイルと違って、Twig を使うときは、コントローラで `$this->render()` を呼ぶときに拡張子を含めなければなりません。
```php
return $this->render('renderer.twig', ['username' => 'Alex']);
```
### テンプレートの構文
Twig の基礎を学ぶための最善のリソースは、[twig.sensiolabs.org](http://twig.sensiolabs.org/documentation) にある公式ドキュメントです。
それに追加して、下記に説明する Yii 固有の拡張構文があります。
#### メソッドとファンクションの呼び出し
結果が必要な場合は、次の構文を使ってメソッドや関数を呼び出すことが出来ます。
```
{% set result = my_function({'a' : 'b'}) %}
{% set result = myObject.my_function({'a' : 'b'}) %}
```
結果を変数に代入する代りに echo したい場合は、こうします。
```
{{ my_function({'a' : 'b'}) }}
{{ myObject.my_function({'a' : 'b'}) }}
```
結果を必要としない場合は、`void` ラッパーを使わなければなりません。
```
{{ void(my_function({'a' : 'b'})) }}
{{ void(myObject.my_function({'a' : 'b'})) }}
```
#### オブジェクトのプロパティを設定する
`set` と呼ばれる特別な関数を使って、オブジェクトのプロパティを設定することが出来ます。
例えば、テンプレート中の下記のコードはページタイトルを変更します。
```
{{ set(this, 'title', 'New title') }}
```
具体的にテンプレートエンジンを使用する方法については、それぞれのドキュメントで詳細を参照してください。
#### 名前空間とクラスをインポートする
- [Twig ガイド](https://github.com/yiisoft/yii2-twig/tree/master/docs/guide-ja)
- [Smarty ガイド](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide-ja)
追加のクラスと名前空間をテンプレートの中でインポートすることが出来ます。
```
名前空間のインポート:
{{ use('/app/widgets') }}
クラスのインポート:
{{ use('/yii/widgets/ActiveForm') }}
エイリアス化してクラスをインポート:
{{ use({'alias' : '/app/widgets/MyWidget'}) }}
```
#### 他のテンプレートを参照する
`include``extends` 文によるテンプレートの参照には二つの方法があります。
```
{% include "comment.twig" %}
{% extends "post.twig" %}
{% include "@app/views/snippets/avatar.twig" %}
{% extends "@app/views/layouts/2columns.twig" %}
```
最初の場合では、現在のテンプレートのパスからの相対的なパスでビューを探します。
`comment.twig``post.twig` は、現在レンダリングされているテンプレートと同じディレクトリで探されます。
第二の場合では、パスエイリアスを使います。
`@app` のような全ての Yii のエイリアスがデフォルトで利用できます。
#### ウィジェット
このエクステンションは、ウィジェットを簡単に使えるように、ウィジェットの構文を関数呼び出しに変換します。
```
{{ use('yii/bootstrap') }}
{{ nav_bar_begin({
'brandLabel': 'My Company',
}) }}
{{ nav_widget({
'options': {
'class': 'navbar-nav navbar-right',
},
'items': [{
'label': 'Home',
'url': '/site/index',
}]
}) }}
{{ nav_bar_end() }}
```
上記のテンプレートでは、`nav_bar_begin`、`nav_bar_end` また `nav_widget` は、二つの部分から構成されます。
最初の部分は、小文字とアンダースコアに変換されたウィジェットの名前です。
`NavBar``nav_bar`、`Nav` は `nav` に変換されます。
第二の部分の `_begin`、`_end` および `_widget` は、ウィジェットのメソッド `::begin()`、`::end()` および `::widget()` と同じものです。
もっと汎用的な `Widget::end()` を実行する `widget_end()` も使うことが出来ます。
#### アセット
アセットは次の方法で登録することが出来ます。
```
{{ use('yii/web/JqueryAsset') }}
{{ register_jquery_asset() }}
```
上記のコードで、`register` は、アセットを扱うことを指定し、`jquery_asset` は、既に `use` でインポート済みの `JqueryAsset` クラスに翻訳されます。
#### フォーム
フォームは次のようにして構築することが出来ます。
```
{{ use('yii/widgets/ActiveForm') }}
{% set form = active_form_begin({
'id' : 'login-form',
'options' : {'class' : 'form-horizontal'},
}) %}
{{ form.field(model, 'username') | raw }}
{{ form.field(model, 'password').passwordInput() | raw }}
<div class="form-group">
<input type="submit" value="ログイン" class="btn btn-primary" />
</div>
{{ active_form_end() }}
```
#### URL
URL を構築するのに使える二つの関数があります。
```php
<a href="{{ path('blog/view', {'alias' : post.alias}) }}">{{ post.title }}</a>
<a href="{{ url('blog/view', {'alias' : post.alias}) }}">{{ post.title }}</a>
```
`path` は相対的な URL を生成し、`url` は絶対的な URL を生成します。
内部的には、両者とも、[[\yii\helpers\Url]] を使っています。
#### 追加の変数
Twig のテンプレート内では、次の変数が常に定義されています。
- `app` - `\Yii::$app` オブジェクト
- `this` - 現在の `View` オブジェクト
### 追加の構成
Yii Twig エクステンションは、あなた自身の構文を定義して、通常のヘルパクラスをテンプレートに導入することを可能にしています。
構成のオプションを見ていきましょう。
#### グローバル
アプリケーション構成の `globals` 変数によって、グローバルなヘルパや変数を追加することが出来ます。
Yii のヘルパとあなた自身の変数を定義することが出来ます。
```php
'globals' => [
'html' => '\yii\helpers\Html',
'name' => 'Carsten',
'GridView' => '\yii\grid\GridView',
],
```
いったん構成してしまえば、テンプレートの中で以下のようにグローバルを使用することが出来ます。
```
Hello, {{name}}! {{ html.a('ログインしてください', 'site/login') | raw }}.
{{ GridView.widget({'dataProvider' : provider}) | raw }}
```
#### 関数
追加の関数を次のようにして定義することが出来ます。
```php
'functions' => [
'rot13' => 'str_rot13',
'truncate' => '\yii\helpers\StringHelper::truncate',
],
```
テンプレートでは、次のようにして使うことが出来ます。
```
`{{ rot13('test') }}`
`{{ truncate(post.text, 100) }}`
```
#### フィルタ
追加のフィルタをアプリケーション構成の `filters` オプションによって追加することが出来ます。
```php
'filters' => [
'jsonEncode' => '\yii\helpers\Json::encode',
],
```
テンプレートの中では、次の構文を使ってフィルタを適用することが出来ます。
```
{{ model|jsonEncode }}
```
Smarty
------
Smarty を使うためには、`.tpl` という拡張子を持つファイルにテンプレートを作成しなければなりません
(別のファイル拡張子を使っても構いませんが、それに対応してコンポーネントの構成を変更しなければなりません)。
通常のビューファイルと違って、Smarty を使うときは、コントローラで `$this->render()` を呼ぶときに拡張子を含めなければなりません。
```php
return $this->render('renderer.tpl', ['username' => 'Alex']);
```
### テンプレートの構文
Smarty のテンプレートの構文を学ぶための最善のリソースは、[www.smarty.net](http://www.smarty.net/docs/ja/) にある公式ドキュメントです。
それに追加して、下記に説明する Yii 固有の拡張構文があります。
#### オブジェクトのプロパティを設定する
`set` と呼ばれる特別な関数を使って、ビューとコントローラの一般的なプロパティを設定することが出来ます。
現在サポートされているプロパティは、`title`、`theme` および `layout` です。
```
{set title="My Page"}
{set theme="frontend"}
{set layout="main.tpl"}
```
タイトルについては、専用のブロックもあります。
```
{title}My Page{/title}
```
#### メタタグを設定する
メタタグは次のようにして設定することが出来ます。
```
{meta keywords="Yii,PHP,Smarty,framework"}
```
`description` のためには専用のブロックもあります。
```
{description}Smarty エクステンションについて説明するページです{/description}
```
#### オブジェクトのメソッドを呼び出す
場合によっては、オブジェクトのメソッドを呼び出す必要があるでしょう。
#### スタティックなクラスをインポートし、ウィジェットを関数およびブロックとして使用する
追加のスタティックなクラスをテンプレートの中でインポートすることが出来ます。
```
{use class="yii\helpers\Html"}
{Html::mailto('eugenia@example.com')}
```
必要であれば、カスタムエイリアスを設定することも出来ます。
```
{use class="yii\helpers\Html" as="Markup"}
{Markup::mailto('eugenia@example.com')}
```
このエクステンションは、ウィジェットを簡単に使えるように、ウィジェットの構文を関数呼び出しまたはブロックに変換します。
通常のウィジェットについては、次のように関数を使うことが出来ます。
```
{use class='@yii\grid\GridView' type='function'}
{GridView dataProvider=$provider}
```
ActiveForm のように `begin` および `end` メソッドを持つウィジェットについては、ブロックを使うほうが良いでしょう。
```
{use class='yii\widgets\ActiveForm' type='block'}
{ActiveForm assign='form' id='login-form' action='/form-handler' options=['class' => 'form-horizontal']}
{$form->field($model, 'firstName')}
<div class="form-group">
<div class="col-lg-offset-1 col-lg-11">
<input type="submit" value="ログイン" class="btn btn-primary" />
</div>
</div>
{/ActiveForm}
```
特定のウィジェットを多用する場合は、それをアプリケーション構成の中で宣言して、テンプレートから `{use class` の呼び出しを削除するのが良いアイデアです。
```php
'components' => [
'view' => [
// ...
'renderers' => [
'tpl' => [
'class' => 'yii\smarty\ViewRenderer',
'widgets' => [
'blocks' => [
'ActiveForm' => '\yii\widgets\ActiveForm',
],
],
],
],
],
],
```
#### 他のテンプレートを参照する
`include``extends` 文によるテンプレートの参照には、主として二つの方法があります。
```
{include 'comment.tpl'}
{extends 'post.tpl'}
{include '@app/views/snippets/avatar.tpl'}
{extends '@app/views/layouts/2columns.tpl'}
```
最初の場合では、現在のテンプレートのパスからの相対的なパスでビューを探します。
`comment.tpl``post.tpl` は、現在レンダリングされているテンプレートと同じディレクトリで探されます。
第二の場合では、パスエイリアスを使います。
`@app` のような全ての Yii のエイリアスがデフォルトで利用できます。
#### CSS、JavaScript およびアセットバンドル
JavaScript と CSS のファイルを登録するためには、次の構文を使うことが出来ます。
```
{registerJsFile url='http://maps.google.com/maps/api/js?sensor=false' position='POS_END'}
{registerCssFile url='@assets/css/normalizer.css'}
```
JavaScript と CSS をテンプレートに直接書きたい場合は、便利なブロックがあります。
```
{registerJs key='show' position='POS_LOAD'}
$("span.show").replaceWith('<div class="show">');
{/registerJs}
{registerCss}
div.header {
background-color: #3366bd;
color: white;
}
{/registerCss}
```
アセットバンドルは次のようにして登録することが出来ます。
```
{use class="yii\web\JqueryAsset"}
{JqueryAsset::register($this)|void}
```
ここではメソッド呼び出しの結果が必要ないので `void` 修飾子を使っています。
#### URL
URL を構築するのに使える二つの関数があります。
```php
<a href="{path route='blog/view' alias=$post.alias}">{$post.title}</a>
<a href="{url route='blog/view' alias=$post.alias}">{$post.title}</a>
```
`path` は相対的な URL を生成し、`url` は絶対的な URL を生成します。
内部的には、両者とも、[[\yii\helpers\Url]] を使っています。
#### 追加の変数
Smarty のテンプレート内では、次の変数が常に定義されています。
- `app` - `\Yii::$app` オブジェクト
- `this` - 現在の `View` オブジェクト
#### 構成情報のパラメータにアクセスする
アプリケーションにおいて `Yii::$app->params->something` によって取得できるパラメータは、次のようにして使用することが出来ます。
```
`{#something#}`
```

2
docs/guide-ja/tutorial-yii-integration.md

@ -77,7 +77,7 @@ Yii は数多くの優れた機能を提供していますので、サードパ
サードパーティのシステムが Composer を使って依存を管理している場合は、単に下記のコマンドを実行すれば Yii をインストールすることが出来ます。
composer global require "fxp/composer-asset-plugin:1.0.0"
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer require yiisoft/yii2
composer install

68
docs/guide-ja/widget-bootstrap.md

@ -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' => [],
]
]
]
```

46
docs/guide-ja/widget-jui.md

@ -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]]

138
docs/guide-pl/README.md

@ -1,5 +1,5 @@
Przewodnik po Yii 2.0
===============================
=====================
Ten poradnik udostępniony jest na [Warunkach dokumentacji Yii](http://www.yiiframework.com/doc/terms/).
@ -9,14 +9,14 @@ Wszelkie prawa zastrzeżone.
Wstęp
------------
-----
* [O Yii](intro-yii.md)
* [Aktualizacja z wersji 1.1](intro-upgrade-from-v1.md)
Pierwsze kroki
---------------
--------------
* [Instalacja Yii](start-installation.md)
* [Uruchamianie aplikacji](start-workflow.md)
@ -28,10 +28,10 @@ Pierwsze kroki
Struktura aplikacji
---------------------
-------------------
* [Przegląd](structure-overview.md)
* [Entry Scripts](structure-entry-scripts.md)
* [Skrypty wejściowe](structure-entry-scripts.md)
* [Aplikacje](structure-applications.md)
* [Komponenty aplikacji](structure-application-components.md)
* [Kontrolery](structure-controllers.md)
@ -40,93 +40,95 @@ Struktura aplikacji
* [Moduły](structure-modules.md)
* [Filtry](structure-filters.md)
* [Widżety](structure-widgets.md)
* [Zasoby(Assets)](structure-assets.md)
* [Zasoby (Assets)](structure-assets.md)
* [Rozszerzenia](structure-extensions.md)
Handling Requests
-----------------
Obsługa żądań
-------------
* **TBD** [Bootstrapping](runtime-bootstrapping.md)
* **TBD** [Routing](runtime-routing.md)
* **TBD** [Request](runtime-requests.md)
* **TBD** [Response](runtime-responses.md)
* **TBD** [Sesje i ciastka(cookies)](runtime-sessions-cookies.md)
* [Przegląd](runtime-overview.md)
* [Bootstrapping](runtime-bootstrapping.md)
* [Parsowanie i generowanie adresów URL](runtime-url-handling.md)
* [Żądania](runtime-requests.md)
* [Odpowiedzi](runtime-responses.md)
* [Sesje i ciasteczka](runtime-sessions-cookies.md)
* [Obsługa błędów](runtime-handling-errors.md)
* [Zapis logów](runtime-logging.md)
* [Logowanie](runtime-logging.md)
Kluczowe koncepcje
------------
------------------
* [Komponenty](concept-components.md)
* [Właściwości](concept-properties.md)
* [Zdarzenia(Events)](concept-events.md)
* [Zachowania(Behaviors)](concept-behaviors.md)
* [Zdarzenia (Events)](concept-events.md)
* [Zachowania (Behaviors)](concept-behaviors.md)
* [Konfiguracje](concept-configurations.md)
* [Aliasy](concept-aliases.md)
* [Autoładowanie klas](concept-autoloading.md)
* [Lokator usług](concept-service-locator.md)
* [Kontener wstrzykiwania zależoności(DI Container)](concept-di-container.md)
* [Kontener wstrzykiwania zależności (DI Container)](concept-di-container.md)
Praca z bazami danych
----------------------
---------------------
* [Obiekt dostępu bazy danych(DAO)](db-dao.md): Łączenie z bazą, podstawowe zapytania, transakcje i manipulacja schematem.
* [Budowniczy zapytań](db-query-builder.md): Zapytania do bazy danych z użyciem warstwy abstrakcyjnej.
* [Obiekt dostępu do danych (DAO)](db-dao.md): Łączenie z bazą, podstawowe zapytania, transakcje i manipulacja schematem.
* [Konstruktor kwerend](db-query-builder.md): Zapytania do bazy danych z użyciem warstwy abstrakcyjnej.
* [Rekord aktywny](db-active-record.md): ORM Rekordu aktywnego, otrzymywanie i manipulacja rekordami oraz definiowanie relacji.
* [Migracje](db-migrations.md): Użycie systemu kontroli wersji na twoich bazach danych podczas tworzenia aplikacji w grupie.
* **TBD** [Sphinx](db-sphinx.md)
* **TBD** [Redis](db-redis.md)
* **TBD** [MongoDB](db-mongodb.md)
* **TBD** [ElasticSearch](db-elastic-search.md)
* [Sphinx](db-sphinx.md)
* [Redis](db-redis.md)
* [MongoDB](db-mongodb.md)
* [ElasticSearch](db-elastic-search.md)
Otrzymywanie danych od użytkowników
-----------------------
Odbieranie danych od użytkowników
---------------------------------
* [Tworzenie formularzy](input-forms.md)
* [Walidacja danych wejściowych](input-validation.md)
* **TBD** [Wysyłanie plików](input-file-upload.md)
* **TBD** [Otrzymywanie danych z wielu modeli](input-multiple-models.md)
* [Wysyłanie plików](input-file-upload.md)
* [Odczytywanie tablicowych danych wejściowych](input-tabular-input.md)
* [Odbieranie danych z wielu modeli](input-multiple-models.md)
Wyświetlanie danych
---------------
-------------------
* **TBD** [Formatowanie danych](output-formatting.md)
* **TBD** [Stronicowanie](output-pagination.md)
* **TBD** [Sortowanie](output-sorting.md)
* [Formatowanie danych](output-formatting.md)
* [Stronicowanie](output-pagination.md)
* [Sortowanie](output-sorting.md)
* [Dostawcy danych](output-data-providers.md)
* [Widżety danych](output-data-widgets.md)
* [Working with Client Scripts](output-client-scripts.md)
* [Tematy](output-theming.md)
* [Praca ze skryptami po stronie klienta](output-client-scripts.md)
* [Skórki i motywy (Theming)](output-theming.md)
Bezpieczeństwo
--------
--------------
* [Uwierzytelnianie](security-authentication.md)
* [Autoryzacja](security-authorization.md)
* [Praca z hasłami](security-passwords.md)
* **TBD** [Auth Clients](security-auth-clients.md)
* **TBD** [Najlepsze praktyki](security-best-practices.md)
* [Klienty autoryzacji](security-auth-clients.md)
* [Najlepsze praktyki](security-best-practices.md)
Cache'owanie
-------
Pamięć podręczna
----------------
* [Przegląd](caching-overview.md)
* [Cache'owanie danych](caching-data.md)
* [Cache'owanie fragmentów](caching-fragment.md)
* [Cache'owanie stron](caching-page.md)
* [Cache'owanie HTTP](caching-http.md)
* [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)
Webserwisy z wykorzystaniem REST
--------------------
--------------------------------
* [Szybki start](rest-quick-start.md)
* [Zasoby](rest-resources.md)
@ -140,15 +142,15 @@ Webserwisy z wykorzystaniem REST
Narzędzia wspomagające tworzenie aplikacji
-----------------
------------------------------------------
* [Pasek debugowania i debuger](tool-debugger.md)
* [Generowanie kody przy użyciu Gii](tool-gii.md)
* [Generowanie kodu przy użyciu Gii](tool-gii.md)
* **TBD** [Generowanie dokumentacji API](tool-api-doc.md)
Testowanie
-------
----------
* [Przegląd](test-overview.md)
* [Ustawienia środowiska testowego](test-endvironment-setup.md)
@ -159,16 +161,16 @@ Testowanie
Tematy specjalne
--------------
----------------
* [Szablon zaawansowanej aplikacji](tutorial-advanced-app.md)
* [Tworzenie aplikacji od podstaw](tutorial-start-from-scratch.md)
* [Komendy konsolowe](tutorial-console.md)
* [Podstawowe walidatory](tutorial-core-validators.md)
* [Internacjonalizacja](tutorial-i18n.md)
* [Mailing](tutorial-mailing.md)
* [Wysyłanie poczty](tutorial-mailing.md)
* [Poprawianie wydajności](tutorial-performance-tuning.md)
* **TBD** [Shared Hosting Environment](tutorial-shared-hosting.md)
* [Współdzielone środowisko hostujące](tutorial-shared-hosting.md)
* [Silniki szablonów](tutorial-template-engines.md)
* [Praca z kodem zewnętrznym](tutorial-yii-integration.md)
@ -176,24 +178,32 @@ Tematy specjalne
Widżety
-------
* GridView: link to demo page
* ListView: link to demo page
* DetailView: link to demo page
* ActiveForm: link to demo page
* Pjax: link to demo page
* Menu: link to demo page
* LinkPager: link to demo page
* LinkSorter: link to demo page
* GridView: **TBD** link to demo page
* ListView: **TBD** link to demo page
* DetailView: **TBD** link to demo page
* ActiveForm: **TBD** link to demo page
* Pjax: **TBD** link to demo page
* Menu: **TBD** link to demo page
* LinkPager: **TBD** link to demo page
* LinkSorter: **TBD** link to demo page
* [Bootstrap Widgets](widget-bootstrap.md)
* [Jquery UI Widgets](widget-jui.md)
Klasy pomocnicze
-------
----------------
* [Przegląd](helper-overview.md)
* **TBD** [ArrayHelper](helper-array.md)
* **TBD** [Html](helper-html.md)
* **TBD** [Url](helper-url.md)
* **TBD** [Security](helper-security.md)
* [ArrayHelper](helper-array.md)
* [Html](helper-html.md)
* [Url](helper-url.md)
Uwagi do polskiego tłumaczenia przewodnika
------------------------------------------
Niektóre z użytych w tym przewodniku programistycznych nazw zostały celowo spolszczone, w przypadku, gdy
w literaturze popularnej nie występują ich polskie odpowiedniki. Mam nadzieję, że czytelnik wybaczy mi okazjonalne
"settery", "gettery" i "traity", które umieszczam tutaj licząc na powszechne zrozumienie tych terminów w polskiej
społeczności programistycznej. Jednocześnie spolszczenia/tłumaczenia niektórych terminów, jak "Fixtures", odmawiam na razie
całkowicie, licząc na to, że język polski w końcu nadgoni lub wchłonie, w ten, czy inny sposób, techniczne nowości.

18
docs/guide-pl/caching-overview.md

@ -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)

41
docs/guide-pl/caching-page.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…
Cancel
Save