cuileon
8 years ago
1205 changed files with 62425 additions and 11610 deletions
@ -0,0 +1,24 @@
|
||||
engines: |
||||
duplication: |
||||
enabled: true |
||||
config: |
||||
languages: |
||||
- javascript |
||||
- php |
||||
eslint: |
||||
enabled: true |
||||
fixme: |
||||
enabled: true |
||||
phpmd: |
||||
enabled: true |
||||
config: |
||||
rulesets: "codesize,design,unusedcode,tests/data/codeclimate/phpmd_ruleset.xml" |
||||
ratings: |
||||
paths: |
||||
- "**.js" |
||||
- "**.php" |
||||
exclude_paths: |
||||
- tests/ |
||||
- build/ |
||||
- docs/ |
||||
- framework/messages/ |
@ -0,0 +1,213 @@
|
||||
ecmaFeatures: |
||||
modules: true |
||||
jsx: true |
||||
|
||||
env: |
||||
amd: true |
||||
browser: true |
||||
es6: true |
||||
jquery: true |
||||
node: true |
||||
|
||||
# http://eslint.org/docs/rules/ |
||||
rules: |
||||
# Possible Errors |
||||
comma-dangle: [2, never] |
||||
no-cond-assign: 2 |
||||
no-console: 0 |
||||
no-constant-condition: 2 |
||||
no-control-regex: 2 |
||||
no-debugger: 2 |
||||
no-dupe-args: 2 |
||||
no-dupe-keys: 2 |
||||
no-duplicate-case: 2 |
||||
no-empty: 2 |
||||
no-empty-character-class: 2 |
||||
no-ex-assign: 2 |
||||
no-extra-boolean-cast: 2 |
||||
no-extra-parens: 0 |
||||
no-extra-semi: 2 |
||||
no-func-assign: 2 |
||||
no-inner-declarations: [2, functions] |
||||
no-invalid-regexp: 2 |
||||
no-irregular-whitespace: 2 |
||||
no-negated-in-lhs: 2 |
||||
no-obj-calls: 2 |
||||
no-regex-spaces: 2 |
||||
no-sparse-arrays: 2 |
||||
no-unexpected-multiline: 2 |
||||
no-unreachable: 2 |
||||
use-isnan: 2 |
||||
valid-jsdoc: 0 |
||||
valid-typeof: 2 |
||||
|
||||
# Best Practices |
||||
accessor-pairs: 2 |
||||
block-scoped-var: 0 |
||||
complexity: [2, 6] |
||||
consistent-return: 0 |
||||
curly: 0 |
||||
default-case: 0 |
||||
dot-location: 0 |
||||
dot-notation: 0 |
||||
eqeqeq: 2 |
||||
guard-for-in: 2 |
||||
no-alert: 2 |
||||
no-caller: 2 |
||||
no-case-declarations: 2 |
||||
no-div-regex: 2 |
||||
no-else-return: 0 |
||||
no-empty-label: 2 |
||||
no-empty-pattern: 2 |
||||
no-eq-null: 2 |
||||
no-eval: 2 |
||||
no-extend-native: 2 |
||||
no-extra-bind: 2 |
||||
no-fallthrough: 2 |
||||
no-floating-decimal: 0 |
||||
no-implicit-coercion: 0 |
||||
no-implied-eval: 2 |
||||
no-invalid-this: 0 |
||||
no-iterator: 2 |
||||
no-labels: 0 |
||||
no-lone-blocks: 2 |
||||
no-loop-func: 2 |
||||
no-magic-number: 0 |
||||
no-multi-spaces: 0 |
||||
no-multi-str: 0 |
||||
no-native-reassign: 2 |
||||
no-new-func: 2 |
||||
no-new-wrappers: 2 |
||||
no-new: 2 |
||||
no-octal-escape: 2 |
||||
no-octal: 2 |
||||
no-proto: 2 |
||||
no-redeclare: 2 |
||||
no-return-assign: 2 |
||||
no-script-url: 2 |
||||
no-self-compare: 2 |
||||
no-sequences: 0 |
||||
no-throw-literal: 0 |
||||
no-unused-expressions: 2 |
||||
no-useless-call: 2 |
||||
no-useless-concat: 2 |
||||
no-void: 2 |
||||
no-warning-comments: 0 |
||||
no-with: 2 |
||||
radix: 2 |
||||
vars-on-top: 0 |
||||
wrap-iife: 2 |
||||
yoda: 0 |
||||
|
||||
# Strict |
||||
strict: 0 |
||||
|
||||
# Variables |
||||
init-declarations: 0 |
||||
no-catch-shadow: 2 |
||||
no-delete-var: 2 |
||||
no-label-var: 2 |
||||
no-shadow-restricted-names: 2 |
||||
no-shadow: 0 |
||||
no-undef-init: 2 |
||||
no-undef: 0 |
||||
no-undefined: 0 |
||||
no-unused-vars: 0 |
||||
no-use-before-define: 0 |
||||
|
||||
# Node.js and CommonJS |
||||
callback-return: 2 |
||||
global-require: 2 |
||||
handle-callback-err: 2 |
||||
no-mixed-requires: 0 |
||||
no-new-require: 0 |
||||
no-path-concat: 2 |
||||
no-process-exit: 2 |
||||
no-restricted-modules: 0 |
||||
no-sync: 0 |
||||
|
||||
# Stylistic Issues |
||||
array-bracket-spacing: 0 |
||||
block-spacing: 0 |
||||
brace-style: 0 |
||||
camelcase: 0 |
||||
comma-spacing: 0 |
||||
comma-style: 0 |
||||
computed-property-spacing: 0 |
||||
consistent-this: 0 |
||||
eol-last: 0 |
||||
func-names: 0 |
||||
func-style: 0 |
||||
id-length: 0 |
||||
id-match: 0 |
||||
indent: 0 |
||||
jsx-quotes: 0 |
||||
key-spacing: 0 |
||||
linebreak-style: 0 |
||||
lines-around-comment: 0 |
||||
max-depth: 0 |
||||
max-len: 0 |
||||
max-nested-callbacks: 0 |
||||
max-params: 0 |
||||
max-statements: [2, 30] |
||||
new-cap: 0 |
||||
new-parens: 0 |
||||
newline-after-var: 0 |
||||
no-array-constructor: 0 |
||||
no-bitwise: 0 |
||||
no-continue: 0 |
||||
no-inline-comments: 0 |
||||
no-lonely-if: 0 |
||||
no-mixed-spaces-and-tabs: 0 |
||||
no-multiple-empty-lines: 0 |
||||
no-negated-condition: 0 |
||||
no-nested-ternary: 0 |
||||
no-new-object: 0 |
||||
no-plusplus: 0 |
||||
no-restricted-syntax: 0 |
||||
no-spaced-func: 0 |
||||
no-ternary: 0 |
||||
no-trailing-spaces: 0 |
||||
no-underscore-dangle: 0 |
||||
no-unneeded-ternary: 0 |
||||
object-curly-spacing: 0 |
||||
one-var: 0 |
||||
operator-assignment: 0 |
||||
operator-linebreak: 0 |
||||
padded-blocks: 0 |
||||
quote-props: 0 |
||||
quotes: 0 |
||||
require-jsdoc: 0 |
||||
semi-spacing: 0 |
||||
semi: 0 |
||||
sort-vars: 0 |
||||
space-after-keywords: 0 |
||||
space-before-blocks: 0 |
||||
space-before-function-paren: 0 |
||||
space-before-keywords: 0 |
||||
space-in-parens: 0 |
||||
space-infix-ops: 0 |
||||
space-return-throw-case: 0 |
||||
space-unary-ops: 0 |
||||
spaced-comment: 0 |
||||
wrap-regex: 0 |
||||
|
||||
# ECMAScript 6 |
||||
arrow-body-style: 0 |
||||
arrow-parens: 0 |
||||
arrow-spacing: 0 |
||||
constructor-super: 0 |
||||
generator-star-spacing: 0 |
||||
no-arrow-condition: 0 |
||||
no-class-assign: 0 |
||||
no-const-assign: 0 |
||||
no-dupe-class-members: 0 |
||||
no-this-before-super: 0 |
||||
no-var: 0 |
||||
object-shorthand: 0 |
||||
prefer-arrow-callback: 0 |
||||
prefer-const: 0 |
||||
prefer-reflect: 0 |
||||
prefer-spread: 0 |
||||
prefer-template: 0 |
||||
require-yield: 0 |
@ -0,0 +1,118 @@
|
||||
before_script: |
||||
# set stack isolation |
||||
- export ISOLATION=buildpipeline${CI_PIPELINE_ID}${CI_BUILD_NAME} |
||||
- export COMPOSE_PROJECT_NAME=${ISOLATION} |
||||
- export TUPLE_C=$(expr ${CI_BUILD_ID} % 99) |
||||
- echo ${TUPLE_C} |
||||
# run docker-compose commands from tests environment |
||||
- cd tests |
||||
- cp .env-dist .env |
||||
- docker-compose config |
||||
|
||||
after_script: |
||||
- export ISOLATION=buildpipeline${CI_PIPELINE_ID}${CI_BUILD_NAME} |
||||
- export COMPOSE_PROJECT_NAME=${ISOLATION} |
||||
# run docker-compose commands from tests environment |
||||
- cd tests |
||||
- cp .env-dist .env |
||||
- docker-compose down -v --remove-orphans |
||||
- docker ps -f name=${ISOLATION} |
||||
|
||||
stages: |
||||
- travis |
||||
- test |
||||
- cleanup |
||||
|
||||
test: |
||||
stage: test |
||||
script: |
||||
- docker-compose up --build -d |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --exclude caching,db,data --log-junit tests/_junit/test.xml |
||||
|
||||
caching: |
||||
stage: test |
||||
only: |
||||
- tests/caching |
||||
- tests/full |
||||
script: |
||||
- export COMPOSE_FILE=docker-compose.yml:docker-compose.${CI_BUILD_NAME}.yml |
||||
- docker-compose up --build -d |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --group caching --exclude db |
||||
|
||||
db: |
||||
stage: test |
||||
only: |
||||
- tests/mysql |
||||
- tests/full |
||||
script: |
||||
- docker-compose up --build -d |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --group db --exclude caching,mysql,pgsql,mssql,cubrid,oci |
||||
|
||||
|
||||
mysql: |
||||
stage: test |
||||
only: |
||||
- tests/mysql |
||||
- tests/full |
||||
script: |
||||
- export COMPOSE_FILE=docker-compose.yml:docker-compose.${CI_BUILD_NAME}.yml |
||||
- docker-compose up --build -d |
||||
# wait for db (retry X times) |
||||
- docker-compose run --rm php bash -c "while ! curl mysql:3306; do ((c++)) && ((c==30)) && break; sleep 2; done" |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --group mysql |
||||
|
||||
|
||||
pgsql: |
||||
stage: test |
||||
only: |
||||
- tests/pgsql |
||||
- tests/full |
||||
script: |
||||
- export COMPOSE_FILE=docker-compose.yml:docker-compose.${CI_BUILD_NAME}.yml |
||||
- docker-compose up --build -d |
||||
# wait for db (retry X times) |
||||
- docker-compose run --rm php bash -c 'while [ true ]; do curl postgres:5432; if [ $? == 52 ]; then break; fi; ((c++)) && ((c==25)) && break; sleep 2; done' |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --group pgsql |
||||
|
||||
|
||||
cubrid: |
||||
stage: test |
||||
only: |
||||
- tests/cubrid |
||||
- tests/extra |
||||
script: |
||||
- cd cubrid |
||||
- docker-compose up --build -d |
||||
# wait for db (retry X times) |
||||
- docker-compose run --rm php bash -c 'while [ true ]; do curl cubrid:1523; if [ $? == 56 ]; then break; fi; ((c++)) && ((c==20)) && break; sleep 3; done' |
||||
- sleep 5 |
||||
- docker-compose run --rm php /project/vendor/bin/phpunit -v --group cubrid |
||||
|
||||
|
||||
mssql: |
||||
stage: test |
||||
only: |
||||
- tests/mssql |
||||
- tests/extra |
||||
script: |
||||
- cd mssql |
||||
- docker-compose up --build -d |
||||
# wait for db (retry X times) |
||||
- docker-compose run --rm php bash -c 'while [ true ]; do curl mssql:1433; if [ $? == 52 ]; then break; fi; ((c++)) && ((c==15)) && break; sleep 5; done' |
||||
- sleep 3 |
||||
# Note: Password has to be the last parameter |
||||
- docker-compose run --rm sqlcmd sh -c 'sqlcmd -S mssql -U sa -Q "CREATE DATABASE yii2test" -P Microsoft-12345' |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --group mssql |
||||
|
||||
|
||||
travis: |
||||
stage: travis |
||||
only: |
||||
- travis |
||||
script: |
||||
- export COMPOSE_FILE=docker-compose.yml:docker-compose.mysql.yml:docker-compose.pgsql.yml |
||||
- docker-compose up --build -d |
||||
# wait for dbs ... |
||||
- sleep 10 |
||||
- docker-compose run --rm php vendor/bin/phpunit -v --exclude mssql,cubrid,oci,wincache,xcache,zenddata,cubrid |
||||
|
@ -0,0 +1,8 @@
|
||||
FROM dmstr/php-yii2:7.0-fpm-1.9-beta2-alpine-nginx |
||||
|
||||
# Project source-code |
||||
WORKDIR /project |
||||
ADD composer.* /project/ |
||||
RUN /usr/local/bin/composer install --prefer-dist |
||||
ADD ./ /project |
||||
ENV PATH /project/vendor/bin:${PATH} |
@ -0,0 +1,130 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\build\controllers; |
||||
|
||||
use yii\console\Controller; |
||||
use yii\helpers\Console; |
||||
use yii\helpers\FileHelper; |
||||
|
||||
/** |
||||
* Check files for broken UTF8 and non-printable characters. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
*/ |
||||
class Utf8Controller extends Controller |
||||
{ |
||||
public $defaultAction = 'check-guide'; |
||||
|
||||
/** |
||||
* Check guide for non-printable characters that may break docs generation. |
||||
* |
||||
* @param string $directory the directory to check. If not specified, the default |
||||
* guide directory will be checked. |
||||
*/ |
||||
public function actionCheckGuide($directory = null) |
||||
{ |
||||
if ($directory === null) { |
||||
$directory = dirname(dirname(__DIR__)) . '/docs'; |
||||
} |
||||
if (is_file($directory)) { |
||||
$files = [$directory]; |
||||
} else { |
||||
$files = FileHelper::findFiles($directory, [ |
||||
'only' => ['*.md'], |
||||
]); |
||||
} |
||||
|
||||
foreach ($files as $file) { |
||||
|
||||
$content = file_get_contents($file); |
||||
$chars = preg_split('//u', $content, null, PREG_SPLIT_NO_EMPTY); |
||||
|
||||
$line = 1; |
||||
$pos = 0; |
||||
foreach ($chars as $c) { |
||||
|
||||
$ord = $this->unicodeOrd($c); |
||||
|
||||
$pos++; |
||||
if ($ord == 0x000A) { |
||||
$line++; |
||||
$pos = 0; |
||||
} |
||||
|
||||
if ($ord === false) { |
||||
$this->found("BROKEN UTF8", $c, $line, $pos, $file); |
||||
continue; |
||||
} |
||||
|
||||
// http://unicode-table.com/en/blocks/general-punctuation/ |
||||
if (0x2000 <= $ord && $ord <= 0x200F |
||||
|| 0x2028 <= $ord && $ord <= 0x202E |
||||
|| 0x205f <= $ord && $ord <= 0x206F |
||||
) { |
||||
$this->found("UNSUPPORTED SPACE CHARACTER", $c, $line, $pos, $file); |
||||
continue; |
||||
} |
||||
if ($ord < 0x0020 && $ord != 0x000A && $ord != 0x0009 || |
||||
0x0080 <= $ord && $ord < 0x009F) { |
||||
$this->found("CONTROL CHARARCTER", $c, $line, $pos, $file); |
||||
continue; |
||||
} |
||||
// if ($ord > 0x009F) { |
||||
// $this->found("NON ASCII CHARARCTER", $c, $line, $pos, $file); |
||||
// continue; |
||||
// } |
||||
|
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
private $_foundFiles = []; |
||||
|
||||
private function found($what, $char, $line, $pos, $file) |
||||
{ |
||||
if (!isset($this->_foundFiles[$file])) { |
||||
$this->stdout("$file: \n", Console::BOLD); |
||||
$this->_foundFiles[$file] = $file; |
||||
} |
||||
|
||||
$hexcode = dechex($this->unicodeOrd($char)); |
||||
$hexcode = str_repeat('0', max(4 - strlen($hexcode), 0)) . $hexcode; |
||||
|
||||
$this->stdout(" at $line:$pos FOUND $what: 0x$hexcode '$char' http://unicode-table.com/en/$hexcode/\n"); |
||||
} |
||||
|
||||
/** |
||||
* Equvalent for ord() just for unicode |
||||
* |
||||
* http://stackoverflow.com/a/10333324/1106908 |
||||
* |
||||
* @param $c |
||||
* @return bool|int |
||||
*/ |
||||
private function unicodeOrd($c) |
||||
{ |
||||
$h = ord($c{0}); |
||||
if ($h <= 0x7F) { |
||||
return $h; |
||||
} else if ($h < 0xC2) { |
||||
return false; |
||||
} else if ($h <= 0xDF) { |
||||
return ($h & 0x1F) << 6 | (ord($c{1}) & 0x3F); |
||||
} else if ($h <= 0xEF) { |
||||
return ($h & 0x0F) << 12 | (ord($c{1}) & 0x3F) << 6 |
||||
| (ord($c{2}) & 0x3F); |
||||
} else if ($h <= 0xF4) { |
||||
return ($h & 0x0F) << 18 | (ord($c{1}) & 0x3F) << 12 |
||||
| (ord($c{2}) & 0x3F) << 6 |
||||
| (ord($c{3}) & 0x3F); |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
} |
@ -1,45 +1,68 @@
|
||||
Yii Contributor Code of Conduct |
||||
======================= |
||||
|
||||
## Our Pledge |
||||
|
||||
As contributors and maintainers of this project, and in order to keep Yii community open and welcoming, we ask to respect all community members. |
||||
|
||||
We are committed to making participation in this project a good experience for everyone. |
||||
## Our Standards |
||||
|
||||
Examples of behavior that contributes to creating a positive environment include: |
||||
|
||||
* Using welcoming and inclusive language |
||||
* Being respectful of differing viewpoints and experiences |
||||
* Gracefully accepting constructive criticism |
||||
* Focusing on what is best for the community |
||||
* Showing empathy towards other community members |
||||
|
||||
Examples of unacceptable behavior by participants include: |
||||
|
||||
* The use of sexualized language or imagery |
||||
* The use of sexualized language or imagery and unwelcome sexual attention or |
||||
advances |
||||
* Personal attacks |
||||
* Trolling or insulting/derogatory comments |
||||
* Trolling or insulting/derogatory comments, and personal or political attacks |
||||
* Public or private harassment |
||||
* Publishing other's private information, such as physical or electronic |
||||
addresses, without explicit permission |
||||
* Other unethical or unprofessional conduct |
||||
* Other conduct which could reasonably be considered inappropriate in |
||||
a professional setting |
||||
|
||||
## Our Responsibilities |
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable |
||||
behavior and are expected to take appropriate and fair corrective action in response |
||||
to any instances of unacceptable behavior. |
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, |
||||
commits, code, wiki edits, issues, and other contributions that are not aligned to this |
||||
Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors |
||||
that they deem inappropriate, threatening, offensive, or harmful. |
||||
|
||||
## Scope |
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or |
||||
reject comments, commits, code, wiki edits, issues, and other contributions |
||||
that are not aligned to this Code of Conduct, or to ban temporarily or |
||||
permanently any contributor for other behaviors that they deem inappropriate, |
||||
threatening, offensive, or harmful. |
||||
This Code of Conduct applies both within project spaces and in public spaces when |
||||
an individual is representing the project or its community. Examples of representing |
||||
a project or community include posting via an official social media account, |
||||
within project GitHub, official forum or acting as an appointed representative at |
||||
an online or offline event. |
||||
|
||||
By adopting this Code of Conduct, project maintainers commit themselves to |
||||
fairly and consistently applying these principles to every aspect of managing |
||||
this project. Project maintainers who do not follow or enforce the Code of |
||||
Conduct may be permanently removed from the project team. |
||||
## Enforcement |
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces |
||||
when an individual is representing the project or its community. |
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported |
||||
by contacting core team members. All complaints will be reviewed and investigated |
||||
and will result in a response that is deemed necessary and appropriate to the circumstances. |
||||
The project team is obligated to maintain confidentiality with regard to the reporter of |
||||
an incident. Further details of specific enforcement policies may be posted separately. |
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be |
||||
reported by contacting core team members. All |
||||
complaints will be reviewed and investigated and will result in a response that |
||||
is deemed necessary and appropriate to the circumstances. Maintainers are |
||||
obligated to maintain confidentiality with regard to the reporter of an |
||||
incident. |
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith |
||||
may face temporary or permanent repercussions as determined by other members of |
||||
the project's leadership. |
||||
|
||||
## Attribution |
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], |
||||
version 1.3.0, available at |
||||
[http://contributor-covenant.org/version/1/3/0/][version] |
||||
version 1.4.0, available at |
||||
[http://contributor-covenant.org/version/1/4/][version] |
||||
|
||||
[homepage]: http://contributor-covenant.org |
||||
[version]: http://contributor-covenant.org/version/1/3/0/ |
||||
[version]: http://contributor-covenant.org/version/1/4/ |
||||
|
@ -0,0 +1,58 @@
|
||||
# This file implements bash completion for the ./yii command file. |
||||
# It completes the commands available by the ./yii command. |
||||
# See also: |
||||
# - https://debian-administration.org/article/317/An_introduction_to_bash_completion_part_2 on how this works. |
||||
# - https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html |
||||
# - http://www.yiiframework.com/doc-2.0/guide-tutorial-console.html#bash-completion |
||||
# |
||||
# Usage: |
||||
# Temporarily you can source this file in you bash by typing: source yii |
||||
# For permanent availability, copy or link this file to /etc/bash_completion.d/ |
||||
# |
||||
|
||||
_yii() |
||||
{ |
||||
local cur opts yii command |
||||
COMPREPLY=() |
||||
cur="${COMP_WORDS[COMP_CWORD]}" |
||||
yii="${COMP_WORDS[0]}" |
||||
|
||||
# exit if ./yii does not exist |
||||
test -f $yii || return 0 |
||||
|
||||
# lookup for command |
||||
for word in ${COMP_WORDS[@]:1}; do |
||||
if [[ $word != -* ]]; then |
||||
command=$word |
||||
break |
||||
fi |
||||
done |
||||
|
||||
[[ $cur == $command ]] && state="command" |
||||
[[ $cur != $command ]] && state="option" |
||||
[[ $cur = *=* ]] && state="value" |
||||
|
||||
case $state in |
||||
command) |
||||
# complete command/route if not given |
||||
# fetch available commands from ./yii help/list command |
||||
opts=$($yii help/list 2> /dev/null) |
||||
;; |
||||
option) |
||||
# fetch available options from ./yii help/list-action-options command |
||||
opts=$($yii help/list-action-options $command 2> /dev/null | grep -o '^--[a-zA-Z0-9]*') |
||||
;; |
||||
value) |
||||
# TODO allow normal file completion after an option, e.g. --migrationPath=... |
||||
;; |
||||
esac |
||||
|
||||
# generate completion suggestions |
||||
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) |
||||
return 0 |
||||
|
||||
} |
||||
|
||||
# register completion for the ./yii command |
||||
# you may adjust this line if your command file is named differently |
||||
complete -F _yii ./yii yii |
@ -0,0 +1,38 @@
|
||||
#compdef yii |
||||
|
||||
_yii() { |
||||
local state command lastArgument commands options executive |
||||
lastArgument=${words[${#words[@]}]} |
||||
executive=$words[1] |
||||
|
||||
# lookup for command |
||||
for word in ${words[@]:1}; do |
||||
if [[ $word != -* ]]; then |
||||
command=$word |
||||
break |
||||
fi |
||||
done |
||||
|
||||
|
||||
[[ $lastArgument == $command ]] && state="command" |
||||
[[ $lastArgument != $command ]] && state="option" |
||||
|
||||
case $state in |
||||
command) |
||||
commands=("${(@f)$(${executive} help/list 2>/dev/null)}") |
||||
_describe 'command' commands |
||||
;; |
||||
option) |
||||
options=("${(@f)$(${executive} help/usage ${command} 2>/dev/null)}") |
||||
_message -r "$options" |
||||
|
||||
suboptions=("${(@f)$(${executive} help/list-action-options ${command} 2>/dev/null)}") |
||||
_describe -V -o -t suboption 'action options' suboptions |
||||
;; |
||||
*) |
||||
esac |
||||
|
||||
} |
||||
|
||||
compdef _yii yii |
||||
|
@ -0,0 +1,85 @@
|
||||
Obtención de datos para los modelos de múltiples |
||||
================================ |
||||
|
||||
Cuando se trata de algunos datos complejos, es posible que puede que tenga que utilizar varios modelos diferentes para recopilar |
||||
la entrada del usuario. Por ejemplo, suponiendo que la información de inicio de sesión del usuario se almacena en la tabla `user`, |
||||
mientras que el perfil de usuario la información se almacena en la tabla `Profile`, es posible que desee para recoger los datos |
||||
de entrada sobre un usuario a través de un modelo `User` y un modelo `Profile`. Con el modelo de Yii y apoyo formulario, |
||||
puede solucionar este problema de una manera que no es mucho diferente de la manipulación de un solo modelo. |
||||
|
||||
En lo que sigue, vamos a mostrar cómo se puede crear un formulario que permitirá recoger datos tanto para los modelos `User` y |
||||
`Profile`. |
||||
|
||||
En primer lugar, la acción del controlador para la recogida de los datos del usuario y del perfil se puede escribir de la |
||||
siguiente manera, |
||||
|
||||
```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; |
||||
|
||||
class UserController extends Controller |
||||
{ |
||||
public function actionUpdate($id) |
||||
{ |
||||
$user = User::findOne($id); |
||||
if (!$user) { |
||||
throw new NotFoundHttpException("The user was not found."); |
||||
} |
||||
|
||||
$profile = Profile::findOne($user->profile_id); |
||||
|
||||
if (!$profile) { |
||||
throw new NotFoundHttpException("The user has no profile."); |
||||
} |
||||
|
||||
$user->scenario = 'update'; |
||||
$profile->scenario = 'update'; |
||||
|
||||
if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) { |
||||
$isValid = $user->validate(); |
||||
$isValid = $profile->validate() && $isValid; |
||||
if ($isValid) { |
||||
$user->save(false); |
||||
$profile->save(false); |
||||
return $this->redirect(['user/view', 'id' => $id]); |
||||
} |
||||
} |
||||
|
||||
return $this->render('update', [ |
||||
'user' => $user, |
||||
'profile' => $profile, |
||||
]); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
En la acción `update`, primero cargamos los modelos `User` y `Profile` que se actualicen desde la base de datos. Luego llamamos |
||||
[[yii\base\Model::load()]] para llenar estos dos modelos con la entrada del usuario. Si tiene éxito, se validará |
||||
los dos modelos y guardarlos. De lo contrario vamos a renderizar la vista `update` que tiene el siguiente contenido: |
||||
|
||||
```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('Update', ['class' => 'btn btn-primary']) ?> |
||||
<?php ActiveForm::end() ?> |
||||
``` |
||||
|
||||
Como se puede ver, en el `update` vista que haría que los campos de entrada utilizando dos modelos `User` y `Profile`. |
@ -0,0 +1,6 @@
|
||||
[ |
||||
"Antonio Ramirez", |
||||
"Daniel Gómez Pan", |
||||
"'larnu'", |
||||
"Luciano Baraglia" |
||||
] |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,527 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> |
||||
<!--Created by yEd 3.13--> |
||||
<key attr.name="Description" attr.type="string" for="graph" id="d0"/> |
||||
<key for="port" id="d1" yfiles.type="portgraphics"/> |
||||
<key for="port" id="d2" yfiles.type="portgeometry"/> |
||||
<key for="port" id="d3" yfiles.type="portuserdata"/> |
||||
<key attr.name="url" attr.type="string" for="node" id="d4"/> |
||||
<key attr.name="description" attr.type="string" for="node" id="d5"/> |
||||
<key for="node" id="d6" yfiles.type="nodegraphics"/> |
||||
<key for="graphml" id="d7" yfiles.type="resources"/> |
||||
<key attr.name="url" attr.type="string" for="edge" id="d8"/> |
||||
<key attr.name="description" attr.type="string" for="edge" id="d9"/> |
||||
<key for="edge" id="d10" yfiles.type="edgegraphics"/> |
||||
<graph edgedefault="directed" id="G"> |
||||
<data key="d0"/> |
||||
<node id="n0" yfiles.foldertype="group"> |
||||
<data key="d4"/> |
||||
<data key="d6"> |
||||
<y:ProxyAutoBoundsNode> |
||||
<y:Realizers active="0"> |
||||
<y:GroupNode> |
||||
<y:Geometry height="571.4472707112631" width="763.2772213171534" x="-1269.9373595143054" y="-207.17439524332679"/> |
||||
<y:Fill color="#FFCC0024" transparent="false"/> |
||||
<y:BorderStyle hasColor="false" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FFCC00" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="763.2772213171534" x="0.0" y="0.0">Entry script (index.php or yii)</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
<y:GroupNode> |
||||
<y:Geometry height="50.0" width="50.0" x="313.2978515625" y="225.33495140075684"/> |
||||
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 4</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> |
||||
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
</y:Realizers> |
||||
</y:ProxyAutoBoundsNode> |
||||
</data> |
||||
<graph edgedefault="directed" id="n0:"> |
||||
<node id="n0::n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="324.9258883570935" x="-1249.511914911339" y="-169.79793039957679"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="126.759765625" x="99.08306136604676" y="5.6494140625">Load application config<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n1" yfiles.foldertype="group"> |
||||
<data key="d4"/> |
||||
<data key="d5"/> |
||||
<data key="d6"> |
||||
<y:ProxyAutoBoundsNode> |
||||
<y:Realizers active="0"> |
||||
<y:GroupNode> |
||||
<y:Geometry height="309.37646484374994" width="330.35133296005984" x="-1254.9373595143054" y="35.272875467936274"/> |
||||
<y:Fill color="#FFEFD6" transparent="false"/> |
||||
<y:BorderStyle hasColor="false" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="330.35133296005984" x="0.0" y="0.0">Create application instance</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
<y:BorderInsets bottom="19" bottomF="19.15489692687993" left="5" leftF="5.425444602966309" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
<y:GroupNode> |
||||
<y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> |
||||
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 5</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> |
||||
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
</y:Realizers> |
||||
</y:ProxyAutoBoundsNode> |
||||
</data> |
||||
<graph edgedefault="directed" id="n0::n1:"> |
||||
<node id="n0::n1::n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="72.64934031168627"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="45.34375" x="124.79106917854676" y="5.6494140625">preInit()<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n1::n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="122.64524027506516"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="120.71875" x="87.10356917854676" y="5.6494140625">Register error handler<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n1::n2"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="174.96110788981125"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="173.435546875" x="60.74517074104676" y="5.6494140625">Configure application properties<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n1::n3"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.92588835709347" x="-1234.511914911339" y="226.56779181162517"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="27.33203125" x="133.79692855354676" y="5.6494140625">init()<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n1::n4"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.9258883570935" x="-1234.511914911339" y="280.4944433848063"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="62.025390625" x="116.45024886604676" y="5.6494140625">bootstrap()<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
</graph> |
||||
</node> |
||||
<node id="n0::n2" yfiles.foldertype="group"> |
||||
<data key="d4"/> |
||||
<data key="d5"/> |
||||
<data key="d6"> |
||||
<y:ProxyAutoBoundsNode> |
||||
<y:Realizers active="0"> |
||||
<y:GroupNode> |
||||
<y:Geometry height="411.6943410237631" width="324.9258883570935" x="-846.5860265542456" y="-169.79793039957679"/> |
||||
<y:Fill color="#FFEFD6" transparent="false"/> |
||||
<y:BorderStyle hasColor="false" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="324.9258883570935" x="0.0" y="0.0">Run application</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="1.1368683772161603E-13"/> |
||||
</y:GroupNode> |
||||
<y:GroupNode> |
||||
<y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> |
||||
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 3</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> |
||||
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
</y:Realizers> |
||||
</y:ProxyAutoBoundsNode> |
||||
</data> |
||||
<graph edgedefault="directed" id="n0::n2:"> |
||||
<node id="n0::n2::n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.9258883570935" x="-831.5860265542456" y="-132.42146555582667"/> |
||||
<y:Fill color="#99CC00" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="164.705078125" x="65.11040511604676" y="5.6494140625">EVENT_BEFORE_REQUEST<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n2::n1" yfiles.foldertype="group"> |
||||
<data key="d4"/> |
||||
<data key="d5"/> |
||||
<data key="d6"> |
||||
<y:ProxyAutoBoundsNode> |
||||
<y:Realizers active="0"> |
||||
<y:GroupNode> |
||||
<y:Geometry height="204.37646484375" width="294.9258883570935" x="-831.5860265542456" y="-78.79793039957679"/> |
||||
<y:Fill color="#99336635" transparent="false"/> |
||||
<y:BorderStyle hasColor="false" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#993366" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#FFFFFF" visible="true" width="294.9258883570935" x="0.0" y="0.0">Handle request</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> |
||||
<y:BorderInsets bottom="8" bottomF="7.929194132486941" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
<y:GroupNode> |
||||
<y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> |
||||
<y:Fill color="#F5F5F5" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="dashed" width="1.0"/> |
||||
<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 4</y:NodeLabel> |
||||
<y:Shape type="roundrectangle"/> |
||||
<y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> |
||||
<y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> |
||||
<y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/> |
||||
</y:GroupNode> |
||||
</y:Realizers> |
||||
</y:ProxyAutoBoundsNode> |
||||
</data> |
||||
<graph edgedefault="directed" id="n0::n2::n1:"> |
||||
<node id="n0::n2::n1::n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="264.9258883570935" x="-816.5860265542456" y="-41.421465555826785"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="231.4609375" x="16.732475428546763" y="5.6494140625">Resolve request into route and parameters<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n2::n1::n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="264.9258883570935" x="-816.5860265542456" y="18.578534444173215"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="197.44140625" x="33.74224105354676" y="5.6494140625">Create module, controller and action<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n2::n1::n2"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="264.9258883570935" x="-816.5860265542456" y="72.64934031168627"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="61.369140625" x="101.77837386604676" y="5.649414062500057">Run action<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
</graph> |
||||
</node> |
||||
<node id="n0::n2::n2"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.9258883570935" x="-831.5860265542456" y="149.20206960042316"/> |
||||
<y:Fill color="#99CC00" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="154.697265625" x="70.11431136604676" y="5.6494140625">EVENT_AFTER_REQUEST<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n0::n2::n3"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="294.92588835709347" x="-831.5860265542456" y="196.89641062418633"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="148.099609375" x="73.41313949104676" y="5.6494140625">Send response to end user<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
</graph> |
||||
</node> |
||||
<node id="n0::n3"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="30.0" width="324.9258883570935" x="-846.5860265542456" y="319.2728754679363"/> |
||||
<y:Fill color="#FFFFFF" transparent="false"/> |
||||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
||||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="160.08203125" x="82.42192855354676" y="5.6494140625">Complete request processing<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:Shape type="rectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
</graph> |
||||
</node> |
||||
<edge id="e0" source="n0" target="n0::n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="-179.83580569315376" sy="-180.3944529152355" tx="-13.869777491410105" ty="-154.8008369539754"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::e0" source="n0::n0" target="n0::n1"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:EdgeLabel alignment="center" backgroundColor="#99CCFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="106.052734375" x="-130.76131968438426" y="78.18481445312506">Configuration array<y:LabelModel> |
||||
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="77.04379339868619" distanceToCenter="true" position="right" ratio="0.5" segment="0"/> |
||||
</y:ModelParameter> |
||||
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> |
||||
</y:EdgeLabel> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n1::e0" source="n0::n1::n0" target="n0::n1::n1"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n1::e1" source="n0::n1::n1" target="n0::n1::n2"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n1::e2" source="n0::n1::n2" target="n0::n1::n3"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n1::e3" source="n0::n1::n3" target="n0::n1::n4"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::e1" source="n0::n1" target="n0::n2"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="2.8060680342755404" sy="-48.37646484374994" tx="-162.49660512430125" ty="105.53540293375653"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n2::e0" source="n0::n2::n0" target="n0::n2::n1"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n2::n1::e0" source="n0::n2::n1::n0" target="n0::n2::n1::n1"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n2::n1::e1" source="n0::n2::n1::n1" target="n0::n2::n1::n2"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n2::e1" source="n0::n2::n1" target="n0::n2::n2"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::n2::e2" source="n0::n2::n2" target="n0::n2::n3"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="n0::e2" source="n0::n2" target="n0::n3"> |
||||
<data key="d9"/> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#666666" type="line" width="2.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:EdgeLabel alignment="center" backgroundColor="#99CCFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="59.353515625" x="-93.67673227804266" y="28.318773905436274">Exit status<y:LabelModel> |
||||
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="63.99999999999999" distanceToCenter="true" position="right" ratio="0.47945569632951074" segment="-1"/> |
||||
</y:ModelParameter> |
||||
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> |
||||
</y:EdgeLabel> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
</graph> |
||||
<data key="d7"> |
||||
<y:Resources/> |
||||
</data> |
||||
</graphml> |
After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 46 KiB |
@ -0,0 +1,21 @@
|
||||
Vue d'ensemble |
||||
============== |
||||
|
||||
À chaque fois qu'une application Yii prend en charge une requête, elle entreprend un flux de travail similaire. |
||||
|
||||
1. Un utilisateur effectue une requête auprès du [script d'entrée](structure-entry-scripts.md) `web/index.php`. |
||||
2. Le script d'entrée charge la [configuration](concept-configurations.md) de l'application et crée une instance d'[application](structure-applications.md) pour prendre en charge la requête. |
||||
3. L'application résoud la [route](runtime-routing.md) requise avec l'aide du composant d'application [request](runtime-requests.md). |
||||
4. L'application crée une instance de [contrôleur](structure-controllers.md) pour prendre en charge le requête. |
||||
5. Le contrôleur crée une instance d'[action](structure-controllers.md) et exécute les filtres de l'action. |
||||
6. Si un [filtre](structure-filters.md) échoue, l'exécution de l'action est annulée. |
||||
7. Si tous les filtres réussissent l'action est exécutée. |
||||
8. L'action charge un [modèle](structure-models.md) de données, possiblement à partir d'une base de données. |
||||
9. L'action rend une [vue](structure-views.md), en lui passant le modèle de données. |
||||
10. Le résultat rendu est retourné au composant d'application [response](runtime-responses.md). |
||||
11. Le composant *response* envoye le résultat rendu au navigateur de l'utilisateur. |
||||
Le diagramme ci-dessous illustre comment une application prend une requête en charge. |
||||
|
||||
![Cycle de vie d'une requête](images/request-lifecycle.png) |
||||
|
||||
Dans cette section, nous décrivons en détails comment se déroulent quelques unes de ces étapes. |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue