Compare commits
3 Commits
master
...
batch-quer
Author | SHA1 | Date |
---|---|---|
Carsten Brandt | 6d2f0837fc | 9 years ago |
Carsten Brandt | c73b116ba5 | 9 years ago |
Carsten Brandt | 0a88d4b0b7 | 9 years ago |
@ -1,41 +0,0 @@
|
||||
build: false |
||||
version: dev-{build} |
||||
clone_folder: C:\projects\yii2 |
||||
|
||||
environment: |
||||
matrix: |
||||
- php_ver: 7.2.4 |
||||
|
||||
cache: |
||||
- '%APPDATA%\Composer' |
||||
- '%LOCALAPPDATA%\Composer' |
||||
- C:\tools\php -> .appveyor.yml |
||||
- C:\tools\composer.phar -> .appveyor.yml |
||||
|
||||
init: |
||||
- SET PATH=C:\tools\php;%PATH% |
||||
|
||||
install: |
||||
- ps: Set-Service wuauserv -StartupType Manual |
||||
- IF NOT EXIST C:\tools\php (choco install --yes --allow-empty-checksums php --version %php_ver% --params '/InstallDir:C:\tools\php') |
||||
- cd C:\tools\php |
||||
- copy php.ini-production php.ini |
||||
- echo date.timezone="UTC" >> php.ini |
||||
- echo memory_limit=512M >> php.ini |
||||
- echo extension_dir=ext >> php.ini |
||||
- echo extension=php_curl.dll >> php.ini |
||||
- echo extension=php_fileinfo.dll >> php.ini |
||||
- echo extension=php_gd2.dll >> php.ini |
||||
- echo extension=php_intl.dll >> php.ini |
||||
- echo extension=php_mbstring.dll >> php.ini |
||||
- echo extension=php_openssl.dll >> php.ini |
||||
- echo extension=php_pdo_sqlite.dll >> php.ini |
||||
- IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/1.4.1/composer.phar) |
||||
|
||||
before_test: |
||||
- cd C:\projects\yii2 |
||||
- php C:\tools\composer.phar update --no-interaction --no-progress --prefer-stable --no-ansi |
||||
|
||||
test_script: |
||||
- cd C:\projects\yii2 |
||||
- vendor\bin\phpunit --exclude-group mssql,mysql,pgsql,sqlite,db,oci,wincache,xcache,zenddata,cubrid |
@ -1,32 +0,0 @@
|
||||
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/ |
||||
|
||||
checks: |
||||
file-lines: |
||||
enabled: false |
||||
method-count: |
||||
enabled: false |
||||
method-lines: |
||||
enabled: false |
@ -1,213 +0,0 @@
|
||||
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 |
@ -1,7 +0,0 @@
|
||||
Contributing to Yii 2 |
||||
===================== |
||||
|
||||
- [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) |
@ -1,5 +0,0 @@
|
||||
# These are supported funding model platforms |
||||
|
||||
open_collective: yiisoft |
||||
github: [yiisoft] |
||||
tidelift: "packagist/yiisoft/yii2" |
@ -1,19 +0,0 @@
|
||||
<!-- |
||||
Please use this issue tracker for bugs and feature requests only. In case you need support please use one of |
||||
Yii communities listed at https://github.com/yiisoft/yii2/wiki/communities |
||||
--> |
||||
|
||||
### What steps will reproduce the problem? |
||||
|
||||
### What is the expected result? |
||||
|
||||
### What do you get instead? |
||||
|
||||
|
||||
### Additional info |
||||
|
||||
| Q | A |
||||
| ---------------- | --- |
||||
| Yii version | 2.0.? |
||||
| PHP version | |
||||
| Operating system | |
@ -1,6 +0,0 @@
|
||||
# Security Policy |
||||
|
||||
Please use the [security issue form](https://www.yiiframework.com/security) to report to us any security issue you find in Yii. |
||||
DO NOT use the issue tracker or discuss it in the public forum as it will cause more damage than help. |
||||
|
||||
Please note that as a non-commercial OpenSource project we are not able to pay bounties at the moment. |
@ -1,113 +0,0 @@
|
||||
name: build |
||||
|
||||
on: [push, pull_request] |
||||
|
||||
env: |
||||
DEFAULT_COMPOSER_FLAGS: "--prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi" |
||||
PHPUNIT_EXCLUDE_GROUP: mssql,oci,wincache,xcache,zenddata,cubrid |
||||
XDEBUG_MODE: coverage, develop |
||||
|
||||
jobs: |
||||
phpunit: |
||||
name: PHP ${{ matrix.php }} on ${{ matrix.os }} |
||||
runs-on: ${{ matrix.os }} |
||||
services: |
||||
mysql: |
||||
image: mysql:5.7 |
||||
env: |
||||
MYSQL_ROOT_PASSWORD: root |
||||
MYSQL_DATABASE: yiitest |
||||
ports: |
||||
- 3306:3306 |
||||
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 |
||||
postgres: |
||||
image: postgres:9.6 |
||||
env: |
||||
POSTGRES_USER: postgres |
||||
POSTGRES_PASSWORD: postgres |
||||
POSTGRES_DB: yiitest |
||||
ports: |
||||
- 5432:5432 |
||||
options: --name=postgres --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3 |
||||
strategy: |
||||
fail-fast: false |
||||
matrix: |
||||
os: [ubuntu-latest] |
||||
php: ['5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1'] |
||||
|
||||
steps: |
||||
- name: Generate french locale |
||||
run: sudo locale-gen fr_FR.UTF-8 |
||||
- name: Checkout |
||||
uses: actions/checkout@v2 |
||||
- name: Install PHP |
||||
uses: shivammathur/setup-php@v2 |
||||
with: |
||||
php-version: ${{ matrix.php }} |
||||
tools: pecl |
||||
extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached, mysql, pdo, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, sqlite |
||||
ini-values: date.timezone='UTC', session.save_path="${{ runner.temp }}" |
||||
- name: Install Memcached |
||||
uses: niden/actions-memcached@v7 |
||||
- name: Get composer cache directory |
||||
id: composer-cache |
||||
run: echo "::set-output name=dir::$(composer config cache-files-dir)" |
||||
- name: Cache composer dependencies |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ steps.composer-cache.outputs.dir }} |
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} |
||||
restore-keys: ${{ runner.os }}-composer- |
||||
- name: Install dependencies |
||||
run: composer update $DEFAULT_COMPOSER_FLAGS |
||||
- name: PHP Unit tests for PHP 7.1 |
||||
run: vendor/bin/phpunit --verbose --coverage-clover=coverage.clover --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always |
||||
if: matrix.php == '7.1' |
||||
- name: PHP Unit tests for PHP >= 7.2 |
||||
run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always |
||||
env: |
||||
PHPUNIT_EXCLUDE_GROUP: mssql,oci,wincache,xcache,zenddata,cubrid |
||||
if: matrix.php >= '7.2' |
||||
- name: PHP Unit tests for PHP <= 7.0 |
||||
run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always |
||||
if: matrix.php <= '7.0' |
||||
- name: Code coverage |
||||
run: | |
||||
wget https://scrutinizer-ci.com/ocular.phar |
||||
php ocular.phar code-coverage:upload --format=php-clover coverage.clover |
||||
if: matrix.php == '7.1' |
||||
continue-on-error: true # if is fork |
||||
|
||||
npm: |
||||
name: NPM 6 on ubuntu-latest |
||||
runs-on: ubuntu-latest |
||||
|
||||
steps: |
||||
- name: Checkout |
||||
uses: actions/checkout@v2 |
||||
- name: Install PHP |
||||
uses: shivammathur/setup-php@v2 |
||||
with: |
||||
php-version: 7.2 |
||||
ini-values: session.save_path=${{ runner.temp }} |
||||
- name: Get composer cache directory |
||||
id: composer-cache |
||||
run: echo "::set-output name=dir::$(composer config cache-files-dir)" |
||||
- name: Cache composer dependencies |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ steps.composer-cache.outputs.dir }} |
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} |
||||
restore-keys: ${{ runner.os }}-composer- |
||||
- name: Install dependencies |
||||
run: composer update $DEFAULT_COMPOSER_FLAGS |
||||
- name: Install node.js |
||||
uses: actions/setup-node@v1 |
||||
with: |
||||
node-version: 6 |
||||
- name: Tests |
||||
run: | |
||||
npm install |
||||
npm test |
||||
# env: |
||||
# CI: true |
@ -1,103 +0,0 @@
|
||||
on: |
||||
- pull_request |
||||
- push |
||||
|
||||
name: ci-mssql |
||||
|
||||
jobs: |
||||
tests: |
||||
name: PHP ${{ matrix.php }}-mssql-${{ matrix.mssql }} |
||||
|
||||
env: |
||||
key: cache |
||||
|
||||
runs-on: ubuntu-latest |
||||
|
||||
strategy: |
||||
matrix: |
||||
include: |
||||
- php: '7.0' |
||||
extensions: pdo, pdo_sqlsrv-5.8.1 |
||||
mssql: 'server:2017-latest' |
||||
- php: '7.1' |
||||
extensions: pdo, pdo_sqlsrv-5.8.1 |
||||
mssql: 'server:2017-latest' |
||||
- php: '7.2' |
||||
extensions: pdo, pdo_sqlsrv-5.8.1 |
||||
mssql: 'server:2017-latest' |
||||
- php: '7.3' |
||||
extensions: pdo, pdo_sqlsrv-5.8.1 |
||||
mssql: 'server:2017-latest' |
||||
- php: '7.4' |
||||
extensions: pdo, pdo_sqlsrv |
||||
mssql: 'server:2017-latest' |
||||
- php: '7.4' |
||||
extensions: pdo, pdo_sqlsrv |
||||
mssql: 'server:2019-latest' |
||||
- php: '8.0' |
||||
extensions: pdo, pdo_sqlsrv |
||||
mssql: 'server:2017-latest' |
||||
- php: '8.0' |
||||
extensions: pdo, pdo_sqlsrv |
||||
mssql: 'server:2019-latest' |
||||
|
||||
services: |
||||
mssql: |
||||
image: mcr.microsoft.com/mssql/${{ matrix.mssql }} |
||||
env: |
||||
SA_PASSWORD: YourStrong!Passw0rd |
||||
ACCEPT_EULA: Y |
||||
MSSQL_PID: Developer |
||||
ports: |
||||
- 1433:1433 |
||||
options: --name=mssql --health-cmd="/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'" --health-interval=10s --health-timeout=5s --health-retries=3 |
||||
|
||||
steps: |
||||
- name: Checkout |
||||
uses: actions/checkout@v2.3.4 |
||||
|
||||
- name: Create MS SQL Database |
||||
run: docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest' |
||||
|
||||
- name: Install PHP with extensions |
||||
uses: shivammathur/setup-php@v2 |
||||
with: |
||||
php-version: ${{ matrix.php }} |
||||
extensions: ${{ matrix.extensions }} |
||||
ini-values: date.timezone='UTC' |
||||
tools: composer:v2, pecl |
||||
|
||||
- name: Determine composer cache directory on Linux |
||||
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV |
||||
|
||||
- name: Cache dependencies installed with composer |
||||
uses: actions/cache@v2 |
||||
with: |
||||
path: ${{ env.COMPOSER_CACHE_DIR }} |
||||
key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} |
||||
restore-keys: | |
||||
php${{ matrix.php }}-composer- |
||||
|
||||
- name: Update composer |
||||
run: composer self-update |
||||
|
||||
- name: Install dependencies with composer |
||||
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi |
||||
|
||||
- name: Install dependencies with composer php 8.0 |
||||
if: matrix.php == '8.0' |
||||
run: composer update --ignore-platform-reqs --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi |
||||
|
||||
- name: PHP Unit tests for PHP 7.1 |
||||
run: vendor/bin/phpunit --coverage-clover=coverage.clover --group mssql --colors=always |
||||
if: matrix.php == '7.1' |
||||
|
||||
- name: Run tests with phpunit without coverage |
||||
run: vendor/bin/phpunit --group mssql --colors=always |
||||
|
||||
- name: Code coverage |
||||
run: | |
||||
wget https://scrutinizer-ci.com/ocular.phar |
||||
php ocular.phar code-coverage:upload --format=php-clover coverage.clover |
||||
if: matrix.php == '7.1' |
||||
continue-on-error: true # if is fork |
@ -1,80 +0,0 @@
|
||||
on: |
||||
- pull_request |
||||
- push |
||||
|
||||
name: ci-mysql |
||||
|
||||
jobs: |
||||
tests: |
||||
name: PHP ${{ matrix.php-version }}-mysql-${{ matrix.mysql-version }} |
||||
env: |
||||
extensions: curl, intl, pdo, pdo_mysql |
||||
key: cache-v1 |
||||
|
||||
runs-on: ${{ matrix.os }} |
||||
|
||||
strategy: |
||||
matrix: |
||||
os: |
||||
- ubuntu-latest |
||||
|
||||
php-version: |
||||
- "7.4" |
||||
|
||||
mysql-version: |
||||
- "latest" |
||||
|
||||
services: |
||||
mysql: |
||||
image: mysql:${{ matrix.mysql-version }} |
||||
env: |
||||
MYSQL_ROOT_PASSWORD: root |
||||
MYSQL_DATABASE: yiitest |
||||
ports: |
||||
- 3306:3306 |
||||
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 |
||||
|
||||
steps: |
||||
- name: Checkout |
||||
uses: actions/checkout@v2 |
||||
|
||||
- name: Setup cache environment |
||||
id: cache-env |
||||
uses: shivammathur/cache-extensions@v1 |
||||
with: |
||||
php-version: ${{ matrix.php-version }} |
||||
extensions: ${{ env.extensions }} |
||||
key: ${{ env.key }} |
||||
|
||||
- name: Cache extensions |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ steps.cache-env.outputs.dir }} |
||||
key: ${{ steps.cache-env.outputs.key }} |
||||
restore-keys: ${{ steps.cache-env.outputs.key }} |
||||
|
||||
- name: Install PHP with extensions |
||||
uses: shivammathur/setup-php@v2 |
||||
with: |
||||
php-version: ${{ matrix.php-version }} |
||||
extensions: ${{ env.extensions }} |
||||
ini-values: date.timezone='UTC' |
||||
coverage: pcov |
||||
|
||||
- name: Determine composer cache directory |
||||
if: matrix.os == 'ubuntu-latest' |
||||
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV |
||||
|
||||
- name: Cache dependencies installed with composer |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ env.COMPOSER_CACHE_DIR }} |
||||
key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }} |
||||
restore-keys: | |
||||
php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}- |
||||
|
||||
- name: Install dependencies with composer |
||||
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi |
||||
|
||||
- name: Run mysql tests with phpunit |
||||
run: vendor/bin/phpunit --group mysql --colors=always |
@ -1,81 +0,0 @@
|
||||
on: |
||||
- pull_request |
||||
- push |
||||
|
||||
name: ci-oracle |
||||
|
||||
jobs: |
||||
tests: |
||||
name: PHP ${{ matrix.php }}-${{ matrix.os }} |
||||
|
||||
env: |
||||
extensions: oci8, pdo, pdo_oci |
||||
key: cache-v1 |
||||
|
||||
runs-on: ${{ matrix.os }} |
||||
|
||||
strategy: |
||||
matrix: |
||||
os: |
||||
- ubuntu-latest |
||||
|
||||
php: |
||||
- "7.4" |
||||
|
||||
services: |
||||
oci: |
||||
image: wnameless/oracle-xe-11g-r2:latest |
||||
ports: |
||||
- 1521:1521 |
||||
options: --name=oci |
||||
|
||||
steps: |
||||
- name: Checkout |
||||
uses: actions/checkout@v2 |
||||
|
||||
- name: Setup cache environment |
||||
id: cache-env |
||||
uses: shivammathur/cache-extensions@v1 |
||||
with: |
||||
php-version: ${{ matrix.php }} |
||||
extensions: ${{ env.extensions }} |
||||
key: ${{ env.key }} |
||||
|
||||
- name: Cache extensions |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ steps.cache-env.outputs.dir }} |
||||
key: ${{ steps.cache-env.outputs.key }} |
||||
restore-keys: ${{ steps.cache-env.outputs.key }} |
||||
|
||||
- name: Install PHP with extensions |
||||
uses: shivammathur/setup-php@v2 |
||||
with: |
||||
php-version: ${{ matrix.php }} |
||||
extensions: ${{ env.extensions }} |
||||
ini-values: date.timezone='UTC' |
||||
coverage: pcov |
||||
tools: composer:v2, pecl |
||||
|
||||
- name: Determine composer cache directory |
||||
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV |
||||
|
||||
- name: Cache dependencies installed with composer |
||||
uses: actions/cache@v2 |
||||
with: |
||||
path: ${{ env.COMPOSER_CACHE_DIR }} |
||||
key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} |
||||
restore-keys: | |
||||
php${{ matrix.php }}-composer- |
||||
|
||||
- name: Install dependencies with composer |
||||
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi |
||||
|
||||
- name: PHP Unit tests |
||||
run: vendor/bin/phpunit --coverage-clover=coverage.clover --group oci --colors=always |
||||
|
||||
- name: Code coverage |
||||
run: | |
||||
wget https://scrutinizer-ci.com/ocular.phar |
||||
php ocular.phar code-coverage:upload --format=php-clover coverage.clover |
||||
continue-on-error: true # if is fork |
@ -1,84 +0,0 @@
|
||||
on: |
||||
- pull_request |
||||
- push |
||||
|
||||
name: ci-pgsql |
||||
|
||||
jobs: |
||||
tests: |
||||
name: PHP ${{ matrix.php-version }}-pgsql-${{ matrix.pgsql-version }} |
||||
env: |
||||
extensions: curl, intl, pdo, pdo_pgsql |
||||
key: cache-v1 |
||||
|
||||
runs-on: ${{ matrix.os }} |
||||
|
||||
strategy: |
||||
matrix: |
||||
os: |
||||
- ubuntu-latest |
||||
|
||||
php-version: |
||||
- "7.4" |
||||
|
||||
pgsql-version: |
||||
- "10" |
||||
- "11" |
||||
- "12" |
||||
- "13" |
||||
|
||||
services: |
||||
postgres: |
||||
image: postgres:${{ matrix.pgsql-version }} |
||||
env: |
||||
POSTGRES_USER: postgres |
||||
POSTGRES_PASSWORD: postgres |
||||
POSTGRES_DB: yiitest |
||||
ports: |
||||
- 5432:5432 |
||||
options: --name=postgres --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3 |
||||
|
||||
steps: |
||||
- name: Checkout |
||||
uses: actions/checkout@v2 |
||||
|
||||
- name: Setup cache environment |
||||
id: cache-env |
||||
uses: shivammathur/cache-extensions@v1 |
||||
with: |
||||
php-version: ${{ matrix.php-version }} |
||||
extensions: ${{ env.extensions }} |
||||
key: ${{ env.key }} |
||||
|
||||
- name: Cache extensions |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ steps.cache-env.outputs.dir }} |
||||
key: ${{ steps.cache-env.outputs.key }} |
||||
restore-keys: ${{ steps.cache-env.outputs.key }} |
||||
|
||||
- name: Install PHP with extensions |
||||
uses: shivammathur/setup-php@v2 |
||||
with: |
||||
php-version: ${{ matrix.php-version }} |
||||
extensions: ${{ env.extensions }} |
||||
ini-values: date.timezone='UTC' |
||||
coverage: pcov |
||||
|
||||
- name: Determine composer cache directory |
||||
if: matrix.os == 'ubuntu-latest' |
||||
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV |
||||
|
||||
- name: Cache dependencies installed with composer |
||||
uses: actions/cache@v1 |
||||
with: |
||||
path: ${{ env.COMPOSER_CACHE_DIR }} |
||||
key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }} |
||||
restore-keys: | |
||||
php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}- |
||||
|
||||
- name: Install dependencies with composer |
||||
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi |
||||
|
||||
- name: Run pgsql tests with phpunit |
||||
run: vendor/bin/phpunit --group pgsql --colors=always |
@ -1,113 +0,0 @@
|
||||
image: docker:latest |
||||
|
||||
services: |
||||
- docker:dind |
||||
|
||||
variables: |
||||
DOCKER_YII2_PHP_IMAGE: yiisoftware/yii2-php:7.4-apache |
||||
DOCKER_MYSQL_IMAGE: percona:5.7 |
||||
DOCKER_POSTGRES_IMAGE: postgres:9.3 |
||||
|
||||
before_script: |
||||
- apk add --no-cache git curl docker-compose |
||||
- docker info |
||||
- cd tests |
||||
|
||||
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 |
||||
|
@ -1,27 +0,0 @@
|
||||
<?php |
||||
|
||||
if (!class_exists('yii\cs\YiisoftConfig', true)) { |
||||
// TODO: change error message |
||||
fwrite(STDERR, "Your php-cs-version is outdated: please upgrade it.\n"); |
||||
die(16); |
||||
} |
||||
|
||||
return yii\cs\YiisoftConfig::create() |
||||
->setCacheFile(__DIR__ . '/tests/runtime/php_cs.cache') |
||||
->mergeRules([ |
||||
'braces' => [ |
||||
'allow_single_line_closure' => true, |
||||
], |
||||
]) |
||||
->setFinder( |
||||
PhpCsFixer\Finder::create() |
||||
->in(__DIR__) |
||||
->exclude('docs') |
||||
->exclude('apps') |
||||
->exclude('extensions') |
||||
// requirement checker should work even on PHP 4.3, so it needs special treatment |
||||
->exclude('framework/requirements') |
||||
->notPath('framework/classes.php') |
||||
->notPath('framework/helpers/mimeTypes.php') |
||||
->notPath('framework/views/messageConfig.php') |
||||
); |
@ -1,20 +1,10 @@
|
||||
build: |
||||
nodes: |
||||
analysis: |
||||
tests: |
||||
override: |
||||
- php-scrutinizer-run |
||||
|
||||
filter: |
||||
excluded_paths: |
||||
- "tests/" |
||||
- "build/" |
||||
- "docs/" |
||||
- "framework/messages/" |
||||
dependency_paths: |
||||
- "vendor/" |
||||
imports: |
||||
- php |
||||
|
||||
tools: |
||||
external_code_coverage: |
||||
runs: 3 |
||||
timeout: 2100 # Timeout in seconds. |
||||
# disable copy paste detector and similarity analyzer as they have no real value |
||||
# and a huge bunch of false-positives |
||||
php_sim: false |
||||
php_cpd: false |
||||
|
@ -0,0 +1,65 @@
|
||||
language: php |
||||
|
||||
php: |
||||
- 5.4 |
||||
- 5.5 |
||||
- 5.6 |
||||
- 7.0 |
||||
- hhvm |
||||
|
||||
env: |
||||
- CUBRID_VERSION=9.3.0/CUBRID-9.3.0.0206 CUBRID_PDO_VERSION=9.3.0.0001 |
||||
|
||||
services: |
||||
- memcached |
||||
|
||||
# faster builds on new travis setup not using sudo |
||||
sudo: false |
||||
|
||||
# cache vendor dirs |
||||
cache: |
||||
directories: |
||||
# - cubrid/9.3.0 |
||||
- vendor |
||||
- $HOME/.composer/cache |
||||
|
||||
# try running against postgres 9.3 |
||||
addons: |
||||
postgresql: "9.3" |
||||
|
||||
install: |
||||
- travis_retry composer self-update && composer --version |
||||
- travis_retry composer global require "fxp/composer-asset-plugin:~1.1.1" |
||||
- export PATH="$HOME/.composer/vendor/bin:$PATH" |
||||
# core framework: |
||||
- travis_retry composer install --prefer-dist --no-interaction |
||||
- 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 |
||||
- php -r "echo INTL_ICU_VERSION . \"\n\";" |
||||
- php -r "echo INTL_ICU_DATA_VERSION . \"\n\";" |
||||
- mysql --version |
||||
- psql --version |
||||
|
||||
# initialize databases |
||||
- mysql -e 'CREATE DATABASE yiitest;'; |
||||
- psql -U postgres -c 'CREATE DATABASE yiitest;'; |
||||
|
||||
- | |
||||
if [ $TRAVIS_PHP_VERSION = '5.6' ]; then |
||||
PHPUNIT_FLAGS="--coverage-clover=coverage.clover" |
||||
fi |
||||
|
||||
|
||||
script: |
||||
- vendor/bin/phpunit --verbose $PHPUNIT_FLAGS --exclude-group mssql,oci,wincache,xcache,zenddata,cubrid |
||||
|
||||
after_script: |
||||
- | |
||||
if [ $TRAVIS_PHP_VERSION = '5.6' ]; then |
||||
travis_retry wget https://scrutinizer-ci.com/ocular.phar |
||||
php ocular.phar code-coverage:upload --format=php-clover coverage.clover |
||||
fi |
@ -0,0 +1,7 @@
|
||||
Contributing to Yii2 |
||||
==================== |
||||
|
||||
- [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) |
@ -1,13 +0,0 @@
|
||||
ARG DOCKER_YII2_PHP_IMAGE |
||||
FROM ${DOCKER_YII2_PHP_IMAGE} |
||||
|
||||
# Project source-code |
||||
WORKDIR /project |
||||
ADD composer.* /project/ |
||||
# Apply testing patches |
||||
ADD tests/phpunit_mock_objects.patch /project/tests/phpunit_mock_objects.patch |
||||
ADD tests/phpunit_getopt.patch /project/tests/phpunit_getopt.patch |
||||
# Install packgaes |
||||
RUN /usr/local/bin/composer install --prefer-dist |
||||
ADD ./ /project |
||||
ENV PATH /project/vendor/bin:${PATH} |
@ -1,27 +0,0 @@
|
||||
> Roadmap for Yii 3.0 and further was moved to [yiisoft/docs](https://github.com/yiisoft/docs/blob/master/003-roadmap.md). |
||||
|
||||
- Enhancements are not accepted for framework version 2.0. |
||||
- Enhancements are accepted for 2.0 extensions. |
||||
- Bug and security fixes are expected. |
||||
- Pull requests and maintainers are very welcome. |
||||
|
||||
Above would stand as it is [for two years after Yii 3.0 release](https://www.yiiframework.com/release-cycle). |
||||
|
||||
## Additional releases |
||||
|
||||
While we focus on 3.0, we tag 2.0 releases and extension releases [about once in a week](https://www.yiiframework.com/release-cycle). |
||||
|
||||
|
||||
## 2.0.16+ (since 2019 till 3.0 release + 2 years) |
||||
|
||||
- Bugfixes. |
||||
|
||||
## 2.0.15 (2nd quarter of 2018) |
||||
|
||||
- Since this release main focus is bug fixing. |
||||
- No full-branch merges into 3.0. |
||||
- No enhancements are accepted. |
||||
|
||||
## 2.0.14 (1st quarter of 2018) |
||||
|
||||
Will be last release with features and enhancements the last one that will be merged into 3.0 directly. |
@ -1,126 +0,0 @@
|
||||
<?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 CHARACTER', $c, $line, $pos, $file); |
||||
continue; |
||||
} |
||||
// if ($ord > 0x009F) { |
||||
// $this->found("NON ASCII CHARACTER", $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"); |
||||
} |
||||
|
||||
/** |
||||
* Equivalent 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; |
||||
} elseif ($h < 0xC2) { |
||||
return false; |
||||
} elseif ($h <= 0xDF) { |
||||
return ($h & 0x1F) << 6 | (\ord($c[1]) & 0x3F); |
||||
} elseif ($h <= 0xEF) { |
||||
return ($h & 0x0F) << 12 | (\ord($c[1]) & 0x3F) << 6 |
||||
| (\ord($c[2]) & 0x3F); |
||||
} elseif ($h <= 0xF4) { |
||||
return ($h & 0x0F) << 18 | (\ord($c[1]) & 0x3F) << 12 |
||||
| (\ord($c[2]) & 0x3F) << 6 |
||||
| (\ord($c[3]) & 0x3F); |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
@ -1,68 +1,45 @@
|
||||
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. |
||||
|
||||
## 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 |
||||
We are committed to making participation in this project a good experience for everyone. |
||||
|
||||
Examples of unacceptable behavior by participants include: |
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or |
||||
advances |
||||
* The use of sexualized language or imagery |
||||
* Personal attacks |
||||
* Trolling or insulting/derogatory comments, and personal or political attacks |
||||
* Trolling or insulting/derogatory comments |
||||
* Public or private harassment |
||||
* Publishing other's private information, such as physical or electronic |
||||
addresses, without explicit permission |
||||
* 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 |
||||
* Other unethical or unprofessional conduct |
||||
|
||||
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. |
||||
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. |
||||
|
||||
## Enforcement |
||||
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. |
||||
|
||||
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. |
||||
This Code of Conduct applies both within project spaces and in public spaces |
||||
when an individual is representing the project or its community. |
||||
|
||||
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. |
||||
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. |
||||
|
||||
## Attribution |
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], |
||||
version 1.4.0, available at |
||||
[https://contributor-covenant.org/version/1/4/][version] |
||||
version 1.3.0, available at |
||||
[http://contributor-covenant.org/version/1/3/0/][version] |
||||
|
||||
[homepage]: https://contributor-covenant.org |
||||
[version]: https://contributor-covenant.org/version/1/4/ |
||||
[homepage]: http://contributor-covenant.org |
||||
[version]: http://contributor-covenant.org/version/1/3/0/ |
||||
|
@ -1,60 +0,0 @@
|
||||
# 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]}" |
||||
prev="${COMP_WORDS[COMP_CWORD-1]}" |
||||
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" |
||||
[[ $prev == "help" ]] && state="help" |
||||
|
||||
case $state in |
||||
command|help) |
||||
# 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 -o default -F _yii ./yii yii |
@ -1,40 +0,0 @@
|
||||
#compdef yii |
||||
|
||||
_yii() { |
||||
local state command lastArgument commands options executive |
||||
lastArgument=${words[${#words[@]}]} |
||||
prevArgument=${words[${#words[@]}-1]} |
||||
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" |
||||
[[ $prevArgument == "help" ]] && state="help" |
||||
|
||||
case $state in |
||||
command|help) |
||||
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 |
||||
|
@ -1 +0,0 @@
|
||||
This should be moved to separate package, like `yii\yii2-cs`. |
@ -1,172 +0,0 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\cs; |
||||
|
||||
use PhpCsFixer\Config; |
||||
use yii\helpers\ArrayHelper; |
||||
|
||||
/** |
||||
* Basic rules used by Yii 2 ecosystem. |
||||
* |
||||
* @author Robert Korulczyk <robert@korulczyk.pl> |
||||
* @since 2.0.0 |
||||
*/ |
||||
class YiiConfig extends Config |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function __construct($name = 'yii-cs-config') |
||||
{ |
||||
parent::__construct($name); |
||||
|
||||
$this->setRiskyAllowed(true); |
||||
|
||||
$this->setRules([ |
||||
'@PSR2' => true, |
||||
'array_syntax' => [ |
||||
'syntax' => 'short', |
||||
], |
||||
'binary_operator_spaces' => [ |
||||
'align_double_arrow' => false, |
||||
'align_equals' => false, |
||||
], |
||||
'blank_line_after_opening_tag' => true, |
||||
'cast_spaces' => true, |
||||
'concat_space' => [ |
||||
'spacing' => 'one', |
||||
], |
||||
'dir_constant' => true, |
||||
'ereg_to_preg' => true, |
||||
'function_typehint_space' => true, |
||||
'hash_to_slash_comment' => true, |
||||
'include' => true, |
||||
'heredoc_to_nowdoc' => true, |
||||
'is_null' => [ |
||||
'use_yoda_style' => false, |
||||
], |
||||
'linebreak_after_opening_tag' => true, |
||||
'lowercase_cast' => true, |
||||
'magic_constant_casing' => true, |
||||
// 'mb_str_functions' => true, // needs more discussion |
||||
// 'method_separation' => true, // conflicts with current Yii style with double line between properties and methods |
||||
'modernize_types_casting' => true, |
||||
'native_function_casing' => true, |
||||
'new_with_braces' => true, |
||||
'no_alias_functions' => true, |
||||
'no_blank_lines_after_class_opening' => true, |
||||
'no_blank_lines_after_phpdoc' => true, |
||||
'no_empty_comment' => true, |
||||
'no_empty_phpdoc' => true, |
||||
'no_empty_statement' => true, |
||||
'no_extra_consecutive_blank_lines' => [ |
||||
'tokens' => [ |
||||
'break', |
||||
'continue', |
||||
// 'extra', // conflicts with current Yii style with double line between properties and methods |
||||
'return', |
||||
'throw', |
||||
'use', |
||||
'use_trait', |
||||
// 'curly_brace_block', // breaks namespaces blocks |
||||
'parenthesis_brace_block', |
||||
'square_brace_block', |
||||
], |
||||
], |
||||
'no_leading_import_slash' => true, |
||||
'no_leading_namespace_whitespace' => true, |
||||
'no_mixed_echo_print' => true, |
||||
'no_multiline_whitespace_around_double_arrow' => true, |
||||
'no_multiline_whitespace_before_semicolons' => true, |
||||
'no_php4_constructor' => true, |
||||
'no_short_bool_cast' => true, |
||||
'no_singleline_whitespace_before_semicolons' => true, |
||||
'no_spaces_around_offset' => true, |
||||
'no_trailing_comma_in_list_call' => true, |
||||
'no_trailing_comma_in_singleline_array' => true, |
||||
'no_unneeded_control_parentheses' => true, |
||||
'no_unused_imports' => true, |
||||
'no_useless_else' => true, |
||||
'no_useless_return' => true, |
||||
'no_whitespace_before_comma_in_array' => true, |
||||
'no_whitespace_in_blank_line' => true, |
||||
'non_printable_character' => true, |
||||
'normalize_index_brace' => true, |
||||
'object_operator_without_whitespace' => true, |
||||
// 'ordered_class_elements' => [ // needs more discussion |
||||
// 'order' => [ |
||||
// 'use_trait', |
||||
// 'constant_public', |
||||
// 'constant_protected', |
||||
// 'constant_private', |
||||
// 'property_public', |
||||
// 'property_protected', |
||||
// 'property_private', |
||||
// 'construct', |
||||
// 'destruct', |
||||
// 'magic', |
||||
// ], |
||||
// ], |
||||
'ordered_imports' => [ |
||||
'sortAlgorithm' => 'alpha', |
||||
'importsOrder' => [ |
||||
'const', |
||||
'function', |
||||
'class', |
||||
], |
||||
], |
||||
'php_unit_construct' => true, |
||||
'php_unit_dedicate_assert' => true, |
||||
'php_unit_fqcn_annotation' => true, |
||||
// 'php_unit_strict' => true, // needs more attention |
||||
'phpdoc_add_missing_param_annotation' => true, |
||||
'phpdoc_indent' => true, |
||||
// 'phpdoc_inline_tag' => true, // see https://github.com/yiisoft/yii2/issues/11635 |
||||
'phpdoc_no_access' => true, |
||||
'phpdoc_no_empty_return' => true, |
||||
'phpdoc_no_package' => true, |
||||
'phpdoc_no_useless_inheritdoc' => true, |
||||
// 'phpdoc_order', // may be useful, but should be configurable: https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/1602 |
||||
'phpdoc_return_self_reference' => true, |
||||
'phpdoc_scalar' => true, |
||||
'phpdoc_single_line_var_spacing' => true, |
||||
'phpdoc_summary' => true, |
||||
// 'phpdoc_to_comment' => true, // breaks phpdoc for define('CONSTANT', $value); |
||||
'phpdoc_trim' => true, |
||||
'phpdoc_types' => true, |
||||
'phpdoc_var_without_name' => true, |
||||
'protected_to_private' => true, |
||||
'psr4' => true, |
||||
'self_accessor' => true, |
||||
'short_scalar_cast' => true, |
||||
'single_blank_line_before_namespace' => true, |
||||
'single_quote' => true, |
||||
'standardize_not_equals' => true, |
||||
'ternary_operator_spaces' => true, |
||||
'trailing_comma_in_multiline_array' => true, |
||||
'trim_array_spaces' => true, |
||||
'unary_operator_spaces' => true, |
||||
'whitespace_after_comma_in_array' => true, |
||||
]); |
||||
} |
||||
|
||||
/** |
||||
* Merge current rules' config with provided list of rules. |
||||
* |
||||
* @param array $rules |
||||
* @return $this |
||||
* @see setRules() |
||||
* @see ArrayHelper::merge() |
||||
*/ |
||||
public function mergeRules(array $rules) |
||||
{ |
||||
$this->setRules(ArrayHelper::merge($this->getRules(), $rules)); |
||||
|
||||
return $this; |
||||
} |
||||
} |
@ -1,39 +0,0 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\cs; |
||||
|
||||
/** |
||||
* Basic rules used by Yii 2 official packages. |
||||
* |
||||
* @author Robert Korulczyk <robert@korulczyk.pl> |
||||
* @since 2.0.0 |
||||
*/ |
||||
final class YiisoftConfig extends YiiConfig |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function __construct() |
||||
{ |
||||
parent::__construct('yiisoft-cs-config'); |
||||
|
||||
$header = <<<'HEADER' |
||||
@link http://www.yiiframework.com/ |
||||
@copyright Copyright (c) 2008 Yii Software LLC |
||||
@license http://www.yiiframework.com/license/ |
||||
HEADER; |
||||
|
||||
$this->mergeRules([ |
||||
'header_comment' => [ |
||||
'header' => $header, |
||||
'commentType' => 'PHPDoc', |
||||
'separate' => 'bottom', |
||||
], |
||||
]); |
||||
} |
||||
} |
@ -1,205 +0,0 @@
|
||||
Yii 2.0 الدليل التقني الخاص ببيئة العمل |
||||
=============================== |
||||
|
||||
تم تحرير هذا الملف اعتمادا على [الشروط الخاصة بتوثيف ال Yii](https://www.yiiframework.com/doc/terms/). |
||||
|
||||
جميع الحقوق محفوظة |
||||
|
||||
2014 (c) Yii Software LLC. |
||||
|
||||
|
||||
المقدمة |
||||
------------ |
||||
|
||||
* [عن بيئة العمل Yii](intro-yii.md) |
||||
* [التحديث من الإصدار 1.1](../guide/intro-upgrade-from-v1.md) |
||||
|
||||
|
||||
البداية من هنا |
||||
--------------- |
||||
|
||||
* [ماذا يجب أن تعرف عن بيئة العمل](start-prerequisites.md) |
||||
* [تثبيت ال Yii](start-installation.md) |
||||
* [تشغيل التطبيقات - Running Applications](start-workflow.md) |
||||
* [قل مرحبا - المشروع الأول](start-hello.md) |
||||
* [التعامل مع ال forms](start-forms.md) |
||||
* [التعامل مع قواعد البيانات](start-databases.md) |
||||
* [إنشاء الشيفرة البرمجية من خلال ال gii](start-gii.md) |
||||
* [ماذا الآن - الخطوة القادمة](start-looking-ahead.md) |
||||
|
||||
|
||||
الهيكلية الخاصة بالتطبيق (Application Structure) |
||||
--------------------- |
||||
|
||||
* [نظرة عامة عن الهيكلية الخاصة بالتطبيق](../guide/structure-overview.md) |
||||
* [Entry Scripts](../guide/structure-entry-scripts.md) |
||||
* [التطبيقات](../guide/structure-applications.md) |
||||
* [مكونات التطبيقات](../guide/structure-application-components.md) |
||||
* [Controllers](../guide/structure-controllers.md) |
||||
* [Models](../guide/structure-models.md) |
||||
* [Views](../guide/structure-views.md) |
||||
* [Modules](../guide/structure-modules.md) |
||||
* [Filters](../guide/structure-filters.md) |
||||
* [Widgets](../guide/structure-widgets.md) |
||||
* [Assets](../guide/structure-assets.md) |
||||
* [Extensions](../guide/structure-extensions.md) |
||||
|
||||
|
||||
التعامل مع ال requests |
||||
----------------- |
||||
|
||||
* [نظرة عامة عن التعامل مع ال requests](../guide/runtime-overview.md) |
||||
* [Bootstrapping](../guide/runtime-bootstrapping.md) |
||||
* [Routing and URL Creation](../guide/runtime-routing.md) |
||||
* [Requests](../guide/runtime-requests.md) |
||||
* [Responses](../guide/runtime-responses.md) |
||||
* [Sessions and Cookies](../guide/runtime-sessions-cookies.md) |
||||
* [Handling Errors - التحكم بالأخطاء](../guide/runtime-handling-errors.md) |
||||
* [Logging - تسجيل الحركات](../guide/runtime-logging.md) |
||||
|
||||
|
||||
المفاهيم الرئيسية (Key Concepts) |
||||
------------ |
||||
|
||||
* [Components](../guide/concept-components.md) |
||||
* [Properties](../guide/concept-properties.md) |
||||
* [Events](../guide/concept-events.md) |
||||
* [Behaviors](../guide/concept-behaviors.md) |
||||
* [Configurations](../guide/concept-configurations.md) |
||||
* [Aliases](../guide/concept-aliases.md) |
||||
* [Class Autoloading](../guide/concept-autoloading.md) |
||||
* [Service Locator](../guide/concept-service-locator.md) |
||||
* [Dependency Injection Container](../guide/concept-di-container.md) |
||||
|
||||
|
||||
التعامل مع قواعد البيانات |
||||
---------------------- |
||||
|
||||
* [Database Access Objects](../guide/db-dao.md): Connecting to a database, basic queries, transactions, and schema manipulation |
||||
* [Query Builder](../guide/db-query-builder.md): Querying the database using a simple abstraction layer |
||||
* [Active Record](../guide/db-active-record.md): The Active Record ORM, retrieving and manipulating records, and defining relations |
||||
* [Migrations](../guide/db-migrations.md): Apply version control to your databases in a team development environment |
||||
* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide) |
||||
* [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide) |
||||
* [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide) |
||||
* [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide) |
||||
|
||||
|
||||
الحصول على البيانات من خلال المستخدمين |
||||
----------------------- |
||||
|
||||
* [Creating Forms](../guide/input-forms.md) |
||||
* [Validating Input](../guide/input-validation.md) |
||||
* [Uploading Files](../guide/input-file-upload.md) |
||||
* [Collecting Tabular Input](../guide/input-tabular-input.md) |
||||
* [Getting Data for Multiple Models](../guide/input-multiple-models.md) |
||||
* [Extending ActiveForm on the Client Side](../guide/input-form-javascript.md) |
||||
|
||||
|
||||
عرض البيانات |
||||
--------------- |
||||
|
||||
* [Data Formatting](../guide/output-formatting.md) |
||||
* [Pagination](../guide/output-pagination.md) |
||||
* [Sorting](../guide/output-sorting.md) |
||||
* [Data Providers](../guide/output-data-providers.md) |
||||
* [Data Widgets](../guide/output-data-widgets.md) |
||||
* [Working with Client Scripts](../guide/output-client-scripts.md) |
||||
* [Theming](../guide/output-theming.md) |
||||
|
||||
|
||||
الامان والحماية |
||||
-------- |
||||
|
||||
* [Security Overview](../guide/security-overview.md) |
||||
* [Authentication](../guide/security-authentication.md) |
||||
* [Authorization](../guide/security-authorization.md) |
||||
* [Working with Passwords](../guide/security-passwords.md) |
||||
* [Cryptography](../guide/security-cryptography.md) |
||||
* [Auth Clients](https://www.yiiframework.com/extension/yiisoft/yii2-authclient/doc/guide) |
||||
* [Best Practices](../guide/security-best-practices.md) |
||||
|
||||
|
||||
Caching التخزين المؤقت |
||||
------- |
||||
|
||||
* [Caching Overview](../guide/caching-overview.md) |
||||
* [Data Caching](../guide/caching-data.md) |
||||
* [Fragment Caching](../guide/caching-fragment.md) |
||||
* [Page Caching](../guide/caching-page.md) |
||||
* [HTTP Caching](../guide/caching-http.md) |
||||
|
||||
|
||||
RESTful Web Services |
||||
-------------------- |
||||
|
||||
* [Quick Start](../guide/rest-quick-start.md) |
||||
* [Resources](../guide/rest-resources.md) |
||||
* [Controllers](../guide/rest-controllers.md) |
||||
* [Routing](../guide/rest-routing.md) |
||||
* [Response Formatting](../guide/rest-response-formatting.md) |
||||
* [Authentication](../guide/rest-authentication.md) |
||||
* [Rate Limiting](../guide/rest-rate-limiting.md) |
||||
* [Versioning](../guide/rest-versioning.md) |
||||
* [Error Handling](../guide/rest-error-handling.md) |
||||
|
||||
|
||||
الأدوات المساعدة أثناء تطوير التطبيقات |
||||
----------------- |
||||
|
||||
* [Debug Toolbar and Debugger](https://www.yiiframework.com/extension/yiisoft/yii2-debug/doc/guide) |
||||
* [Generating Code using Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) |
||||
* [Generating API Documentation](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc) |
||||
|
||||
|
||||
فحص واختبار التطبيقات |
||||
------- |
||||
|
||||
* [Testing Overview](../guide/test-overview.md) |
||||
* [Testing environment setup](../guide/test-environment-setup.md) |
||||
* [Unit Tests](../guide/test-unit.md) |
||||
* [Functional Tests](../guide/test-functional.md) |
||||
* [Acceptance Tests](../guide/test-acceptance.md) |
||||
* [Fixtures](../guide/test-fixtures.md) |
||||
|
||||
|
||||
مواضيع وعناوين مميزة |
||||
-------------- |
||||
|
||||
* [Advanced Project Template](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) |
||||
* [Building Application from Scratch](../guide/tutorial-start-from-scratch.md) |
||||
* [Console Commands](../guide/tutorial-console.md) |
||||
* [Core Validators](../guide/tutorial-core-validators.md) |
||||
* [Docker](../guide/tutorial-docker.md) |
||||
* [Internationalization](../guide/tutorial-i18n.md) |
||||
* [Mailing](../guide/tutorial-mailing.md) |
||||
* [Performance Tuning](../guide/tutorial-performance-tuning.md) |
||||
* [Shared Hosting Environment](../guide/tutorial-shared-hosting.md) |
||||
* [Template Engines](../guide/tutorial-template-engines.md) |
||||
* [Working with Third-Party Code](../guide/tutorial-yii-integration.md) |
||||
* [Using Yii as a micro framework](../guide/tutorial-yii-as-micro-framework.md) |
||||
|
||||
|
||||
Widgets |
||||
------- |
||||
|
||||
* [GridView](https://www.yiiframework.com/doc-2.0/yii-grid-gridview.html) |
||||
* [ListView](https://www.yiiframework.com/doc-2.0/yii-widgets-listview.html) |
||||
* [DetailView](https://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html) |
||||
* [ActiveForm](https://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform) |
||||
* [Pjax](https://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html) |
||||
* [Menu](https://www.yiiframework.com/doc-2.0/yii-widgets-menu.html) |
||||
* [LinkPager](https://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html) |
||||
* [LinkSorter](https://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html) |
||||
* [Bootstrap Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide) |
||||
* [jQuery UI Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide) |
||||
|
||||
|
||||
Helpers |
||||
------- |
||||
|
||||
* [Helpers Overview](../guide/helper-overview.md) |
||||
* [ArrayHelper](../guide/helper-array.md) |
||||
* [Html](../guide/helper-html.md) |
||||
* [Url](../guide/helper-url.md) |
||||
|
@ -1,36 +0,0 @@
|
||||
# <div dir="rtl">ماذا الآن - الخطوة القادمة</div> |
||||
|
||||
<p dir="rtl"> |
||||
إذا قمت بقرائة الفصل الخاص ب "البداية من هنا"، فأنت الآن قادر على بناء تطبيق Yii متكامل، لقد تعلمت كيف يمكنك تنفيذ وإستخدام أكثر الخصائص والمميزات المشتركة، مثل جلب البيانات من قاعدة البيانات، وأخذ البيانات من المستخدمين، ومن ثم عرضها، كما تعلمت كيف يمكنك تقسيم البيانات الى صفحات، وقمنا باستخدام ال <a href="https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide">Gii</a> وتعلمنا كيف يمكننا إنشاء شيفرة برمجية من خلاله بشكل تلقائي، ومن الممارسة تعلمنا أن إنشاء الشيفرة البرمجية من خلال ال Gii يجعل من عملية تطوير المواقع والوظائف المطلوبة أمرا بسيطا وسهلا للغابة، كل ما عليك القيام به هو تعبئة ال forms. |
||||
</p> |
||||
|
||||
<p dir="rtl"> |
||||
في هذا الجزء من التوثيق سنعرض ملخص للمصادر المتاحة لل Yii، والتي ستساعدك في تحسين إنتاجيتك عند إستخدامك لبيئة العمل Yii. |
||||
</p> |
||||
|
||||
<ul dir="rtl"> |
||||
<li> |
||||
التوثيق |
||||
<ul> |
||||
<li><a href="https://www.yiiframework.com/doc-2.0/guide-README.html">The Definitive Guide - الدليل الشامل</a>: كما يشير الإسم، فإن هذا الدليل يحدد آلية عمل ال Yii بدقة عالية، ويوفر إرشادات حول كيفية إستخدام ال Yii، هذا الجزء الأكثر أهمية في ال Yii، والذي يجب عليك قرائته قبل كتابة أي Yii code (ملاحظة: جزء البداية من هنا، والذي قمنا بدراسته هو أحد هذه الأجزاء، ومن أهمها للبدء بإنشاء التطبيقات من خلال ال Yii).</li> |
||||
<li><a href="https://www.yiiframework.com/doc-2.0/index.html">The Class Reference - المرجع الخاص بال Class</a> في هذا الجزء يتم تحديد الية إستخدام كل Class يقدمه ال Yii، في العادة يتم إستخدام هذا المرجع عند كتابة شيفرة برمجية وأنت ترغب في فهم آلية العمل ل Class معين، أو Method, او فهم Proporty معينة...الخ، من الأفضل إستخدام المرجع الخاص بال Class فقط عند فهم آلية العمل لل Yii. </li> |
||||
<li><a href="https://www.yiiframework.com/wiki/?tag=yii2">The Wiki Articles - مقالات الويكي</a> مقالات الويكي هي مجموعة من الخبرات العملية للمستخدمين، تمت كتابتها ونشرها على شكل مقالات لمشاركة الخبرات، ومعظم هذه الكتابات تكون مثل الوصفات الخاصة بالطبخ، موجودة لخدمة هدف معين، وحل مشكلة محددة باستخدام ال Yii، وبالرغم من أن هذه الكتابات قد لا تكون بجودة ودقة الدليل الشامل، الا أنها قد تغطي مواضيع أكثر، وتطرح أيضا حلولا مباشرة للإستخدام.</li> |
||||
<li><a href="https://www.yiiframework.com/doc/">الكتب</a></li> |
||||
</ul> |
||||
</li> |
||||
<li><a href="https://www.yiiframework.com/extensions/">Extensions - الملحقات</a>: تفتخر ال Yii بوجود مكتبة ضخمة من الملحقات التي تمت برمجتها وإضافتها من قبل المستخدمين المتطوعين الذين شاركوا أعمالهم وطورها لتجعل مهمة المطورين الآخرين أسهل وأسرع في تطوير التطبيفات المبنية بواسطة ال Yii.</li> |
||||
<li> |
||||
المجتمع |
||||
<ul> |
||||
<li>المنتدى: <a href="https://forum.yiiframework.com/">https://forum.yiiframework.com/</a></li> |
||||
<li>IRC chat: The #yii channel on the Libera (ircs://irc.libera.chat:6697/yii)</li> |
||||
<li>Slack chanel: <a href="https://yii.slack.com">https://yii.slack.com</a></li> |
||||
<li>Gitter chat: <a href="https://gitter.im/yiisoft/yii2">https://gitter.im/yiisoft/yii2</a></li> |
||||
<li>GitHub: <a href="https://github.com/yiisoft/yii2">https://github.com/yiisoft/yii2</a></li> |
||||
<li>Facebook: <a href="https://www.facebook.com/groups/yiitalk/">https://www.facebook.com/groups/yiitalk/</a></li> |
||||
<li>Twitter: <a href="https://twitter.com/yiiframework">https://twitter.com/yiiframework</a></li> |
||||
<li>LinkedIn: <a href="https://www.linkedin.com/groups/yii-framework-1483367">https://www.linkedin.com/groups/yii-framework-1483367</a></li> |
||||
<li>Stackoverflow: <a href="https://stackoverflow.com/questions/tagged/yii2">https://stackoverflow.com/questions/tagged/yii2</a></li> |
||||
</ul> |
||||
</li> |
||||
</ul> |
@ -1,939 +0,0 @@
|
||||
Migración de Base de Datos |
||||
========================== |
||||
|
||||
Durante el curso de desarrollo y mantenimiento de una aplicación con base de datos, la estructura de dicha base de datos |
||||
evoluciona tanto como el código fuente. Por ejemplo, durante el desarrollo de una aplicación, |
||||
una nueva tabla podría ser necesaria; una vez que la aplicación se encuentra en producción, podría descrubrirse |
||||
que debería crearse un índice para mejorar el tiempo de ejecución de una consulta; y así sucesivamente. Debido a los cambios en la estructura de la base de datos |
||||
a menudo se requieren cambios en el código, Yii soporta la característica llamada *migración de base de datos*, la cual permite |
||||
tener un seguimiento de esos cambios en término de *migración de base de datos*, cuyo versionado es controlado |
||||
junto al del código fuente. |
||||
|
||||
Los siguientes pasos muestran cómo una migración puede ser utilizada por un equipo durante el desarrollo: |
||||
|
||||
1. Tim crea una nueva migración (por ej. crea una nueva table, cambia la definición de una columna, etc.). |
||||
2. Tim hace un commit con la nueva migración al sistema de control de versiones (por ej. Git, Mercurial). |
||||
3. Doug actualiza su repositorio desde el sistema de control de versiones y recibe la nueva migración. |
||||
4. Doug aplica dicha migración a su base de datos local de desarrollo, de ese modo sincronizando su base de datos |
||||
y reflejando los cambios que hizo Tim. |
||||
|
||||
Los siguientes pasos muestran cómo hacer una puesta en producción con una migración de base de datos: |
||||
|
||||
1. Scott crea un tag de lanzamiento en el repositorio del proyecto que contiene algunas migraciones de base de datos. |
||||
2. Scott actualiza el código fuente en el servidor de producción con el tag de lanzamiento. |
||||
3. Scott aplica cualquier migración de base de datos acumulada a la base de datos de producción. |
||||
|
||||
Yii provee un grupo de herramientas de línea de comandos que te permite: |
||||
|
||||
* crear nuevas migraciones; |
||||
* aplicar migraciones; |
||||
* revertir migraciones; |
||||
* re-aplicar migraciones; |
||||
* mostrar el historial y estado de migraciones. |
||||
|
||||
Todas esas herramientas son accesibles a través del comando `yii migrate`. En esta sección describiremos en detalle |
||||
cómo lograr varias tareas utilizando dichas herramientas. Puedes a su vez ver el uso de cada herramienta a través del comando |
||||
de ayuda `yii help migrate`. |
||||
|
||||
> Tip: las migraciones pueden no sólo afectar un esquema de base de datos sino también ajustar datos existentes para que encajen en el nuevo esquema, crear herencia RBAC |
||||
o también limpiar el cache. |
||||
|
||||
|
||||
## Creando Migraciones <span id="creating-migrations"></span> |
||||
|
||||
Para crear una nueva migración, ejecuta el siguiente comando: |
||||
|
||||
``` |
||||
yii migrate/create <name> |
||||
``` |
||||
|
||||
El argumento requerido `name` da una pequeña descripción de la nueva migración. Por ejemplo, si |
||||
la migración se trata acerca de crear una nueva tabla llamada *news*, podrías utilizar el nombre `create_news_table` |
||||
y ejecutar el siguiente comando: |
||||
|
||||
``` |
||||
yii migrate/create create_news_table |
||||
``` |
||||
|
||||
> Note: Debido a que el argumento `name` será utilizado como parte del nombre de clase de la migración generada, |
||||
sólo debería contener letras, dígitos, y/o guines bajos. |
||||
|
||||
El comando anterior un nuevo archivo de clase PHP llamado `m150101_185401_create_news_table.php` |
||||
en el directorio `@app/migrations`. El archivo contendrá el siguiente código, que principalmente declara |
||||
una clase de tipo migración `m150101_185401_create_news_table` con el siguiente esqueleto de código: |
||||
|
||||
```php |
||||
<?php |
||||
|
||||
use yii\db\Migration; |
||||
|
||||
class m150101_185401_create_news_table extends Migration |
||||
{ |
||||
public function up() |
||||
{ |
||||
|
||||
} |
||||
|
||||
public function down() |
||||
{ |
||||
echo "m101129_185401_create_news_table cannot be reverted.\n"; |
||||
|
||||
return false; |
||||
} |
||||
|
||||
/* |
||||
// Use safeUp/safeDown to run migration code within a transaction |
||||
public function safeUp() |
||||
{ |
||||
} |
||||
|
||||
public function safeDown() |
||||
{ |
||||
} |
||||
*/ |
||||
} |
||||
``` |
||||
|
||||
Cada migración de base de datos es definida como una clase PHP que extiende de [[yii\db\Migration]]. La nombre de clase |
||||
de la migración es generado automáticamente en el formato `m<YYMMDD_HHMMSS>_<Name>`, donde |
||||
|
||||
* `<YYMMDD_HHMMSS>` se refiere a la marca de tiempo UTC en la cual el comando de migración fue ejecutado. |
||||
* `<Name>` es el mismo valor del argumento `name` provisto al ejecutar el comando. |
||||
|
||||
En la clase de la migración, se espera que tu escribas código en el método `up()`, que realiza los cambios en la base de datos. |
||||
Podrías también querer introducir código en el método `down()`, que debería revertir los cambios realizados por `up()`. El método `up()` es llamado |
||||
cuando actualizas la base de datos con esta migración, mientras que el método `down()` es llamado cuando reviertes dicha migración. |
||||
El siguiente código muestra cómo podrías implementar la clase de migración para crear la tabla `news`: |
||||
|
||||
```php |
||||
<?php |
||||
|
||||
use yii\db\Schema; |
||||
use yii\db\Migration; |
||||
|
||||
class m150101_185401_create_news_table extends Migration |
||||
{ |
||||
public function up() |
||||
{ |
||||
$this->createTable('news', [ |
||||
'id' => Schema::TYPE_PK, |
||||
'title' => Schema::TYPE_STRING . ' NOT NULL', |
||||
'content' => Schema::TYPE_TEXT, |
||||
]); |
||||
} |
||||
|
||||
public function down() |
||||
{ |
||||
$this->dropTable('news'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
> Info: No todas las migraciones son reversibles. Por ejemplo, si el método `up()` elimina un registro en una tabla, podrías |
||||
no ser capáz de recuperarla en el método `down()`. A veces, podrías ser simplemente demasiado perezoso para implementar |
||||
el método `down()`, debido a que no es muy común revertir migraciones de base de datos. En este caso, deberías devolver |
||||
`false` en el método `down()` para indicar que dicha migración no es reversible. |
||||
|
||||
La clase de migración de base de datos [[yii\db\Migration]] expone una conexión a la base de datos mediante la propiedad [[yii\db\Migration::db|db]]. |
||||
Puedes utilizar esto para manipular el esquema de la base de datos utilizando métodos como se describen en |
||||
[Trabajando con Esquemas de Base de Datos](db-dao.md#database-schema). |
||||
|
||||
En vez de utilizar tipos físicos, al crear tablas o columnas deberías utilizar los *tipos abstractos* |
||||
así las migraciones son independientes de algún DBMS específico. La clase [[yii\db\Schema]] define |
||||
un grupo de constantes que representan los tipos abstractos soportados. Dichas constantes son llamadas utilizando el formato |
||||
de `TYPE_<Name>`. Por ejemplo, `TYPE_PK` se refiere al tipo clave primaria auto-incremental; `TYPE_STRING` |
||||
se refiere al tipo string. Cuando se aplica una migración a una base de datos en particular, los tipos abstractos |
||||
serán traducidos a los tipos físicos correspondientes. En el caso de MySQL, `TYPE_PK` será transformado |
||||
en `int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY`, mientras `TYPE_STRING` se vuelve `varchar(255)`. |
||||
|
||||
Puedes agregar restricciones adicionales al utilizar tipos abstractos. En el ejemplo anterior, ` NOT NULL` es agregado |
||||
a `Schema::TYPE_STRING` para especificar que la columna no puede ser `null`. |
||||
|
||||
> Info: El mapeo entre tipos abstractos y tipos físicos es especificado en |
||||
la propiedad [[yii\db\QueryBuilder::$typeMap|$typeMap]] en cada clase concreta `QueryBuilder`. |
||||
|
||||
Desde la versión 2.0.6, puedes hacer uso del recientemente introducido generador de esquemas, el cual provee una forma más conveniente de definir las columnas. |
||||
De esta manera, la migración anterior podría ser escrita así: |
||||
|
||||
```php |
||||
<?php |
||||
|
||||
use yii\db\Migration; |
||||
|
||||
class m150101_185401_create_news_table extends Migration |
||||
{ |
||||
public function up() |
||||
{ |
||||
$this->createTable('news', [ |
||||
'id' => $this->primaryKey(), |
||||
'title' => $this->string()->notNull(), |
||||
'content' => $this->text(), |
||||
]); |
||||
} |
||||
|
||||
public function down() |
||||
{ |
||||
$this->dropTable('news'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Existe una lista de todos los métodos disponibles para la definición de tipos de columna en la API de la documentación de [[yii\db\SchemaBuilderTrait]]. |
||||
|
||||
|
||||
## Generar Migraciones <span id="generating-migrations"></span> |
||||
|
||||
Desde la versión 2.0.7 la consola provee una manera muy conveniente de generar migraciones. |
||||
|
||||
Si el nombre de la migración tiene una forma especial, por ejemplo `create_xxx_table` o `drop_xxx_table` entonces el archivo de la migración generada |
||||
contendrá código extra, en este caso para crear/eliminar tablas. |
||||
A continuación se describen todas estas variantes. |
||||
|
||||
### Crear Tabla |
||||
|
||||
```php |
||||
yii migrate/create create_post_table |
||||
``` |
||||
|
||||
esto genera |
||||
|
||||
```php |
||||
/** |
||||
* Handles the creation for table `post`. |
||||
*/ |
||||
class m150811_220037_create_post_table extends Migration |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function up() |
||||
{ |
||||
$this->createTable('post', [ |
||||
'id' => $this->primaryKey() |
||||
]); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function down() |
||||
{ |
||||
$this->dropTable('post'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Para crear las columnas en ese momento, las puedes especificar vía la opción `--fields`. |
||||
|
||||
```php |
||||
yii migrate/create create_post_table --fields="title:string,body:text" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
/** |
||||
* Handles the creation for table `post`. |
||||
*/ |
||||
class m150811_220037_create_post_table extends Migration |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function up() |
||||
{ |
||||
$this->createTable('post', [ |
||||
'id' => $this->primaryKey(), |
||||
'title' => $this->string(), |
||||
'body' => $this->text(), |
||||
]); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function down() |
||||
{ |
||||
$this->dropTable('post'); |
||||
} |
||||
} |
||||
|
||||
``` |
||||
|
||||
Puedes especificar más parámetros para las columnas. |
||||
|
||||
```php |
||||
yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
/** |
||||
* Handles the creation for table `post`. |
||||
*/ |
||||
class m150811_220037_create_post_table extends Migration |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function up() |
||||
{ |
||||
$this->createTable('post', [ |
||||
'id' => $this->primaryKey(), |
||||
'title' => $this->string(12)->notNull()->unique(), |
||||
'body' => $this->text() |
||||
]); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function down() |
||||
{ |
||||
$this->dropTable('post'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
> Note: la clave primaria es automáticamente agragada y llamada `id` por defecto. Si quieres utilizar otro nombre puedes |
||||
> especificarlo así `--fields="name:primaryKey"`. |
||||
|
||||
#### Claves Foráneas |
||||
|
||||
Desde 2.0.8 el generador soporta claves foráneas utilizando la palabra clave `foreignKey`. |
||||
|
||||
```php |
||||
yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
/** |
||||
* Handles the creation for table `post`. |
||||
* Has foreign keys to the tables: |
||||
* |
||||
* - `user` |
||||
* - `category` |
||||
*/ |
||||
class m160328_040430_create_post_table extends Migration |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function up() |
||||
{ |
||||
$this->createTable('post', [ |
||||
'id' => $this->primaryKey(), |
||||
'author_id' => $this->integer()->notNull(), |
||||
'category_id' => $this->integer()->defaultValue(1), |
||||
'title' => $this->string(), |
||||
'body' => $this->text(), |
||||
]); |
||||
|
||||
// creates index for column `author_id` |
||||
$this->createIndex( |
||||
'idx-post-author_id', |
||||
'post', |
||||
'author_id' |
||||
); |
||||
|
||||
// add foreign key for table `user` |
||||
$this->addForeignKey( |
||||
'fk-post-author_id', |
||||
'post', |
||||
'author_id', |
||||
'user', |
||||
'id', |
||||
'CASCADE' |
||||
); |
||||
|
||||
// creates index for column `category_id` |
||||
$this->createIndex( |
||||
'idx-post-category_id', |
||||
'post', |
||||
'category_id' |
||||
); |
||||
|
||||
// add foreign key for table `category` |
||||
$this->addForeignKey( |
||||
'fk-post-category_id', |
||||
'post', |
||||
'category_id', |
||||
'category', |
||||
'id', |
||||
'CASCADE' |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function down() |
||||
{ |
||||
// drops foreign key for table `user` |
||||
$this->dropForeignKey( |
||||
'fk-post-author_id', |
||||
'post' |
||||
); |
||||
|
||||
// drops index for column `author_id` |
||||
$this->dropIndex( |
||||
'idx-post-author_id', |
||||
'post' |
||||
); |
||||
|
||||
// drops foreign key for table `category` |
||||
$this->dropForeignKey( |
||||
'fk-post-category_id', |
||||
'post' |
||||
); |
||||
|
||||
// drops index for column `category_id` |
||||
$this->dropIndex( |
||||
'idx-post-category_id', |
||||
'post' |
||||
); |
||||
|
||||
$this->dropTable('post'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
La posición de la palabra clave `foreignKey` en la descripción de la columna |
||||
no cambia el código generado. Esto significa: |
||||
|
||||
- `author_id:integer:notNull:foreignKey(user)` |
||||
- `author_id:integer:foreignKey(user):notNull` |
||||
- `author_id:foreignKey(user):integer:notNull` |
||||
|
||||
Todas generan el mismo código. |
||||
|
||||
La palabra clave `foreignKey` puede tomar un parámetro entre paréntesis el cual |
||||
será el nombre de la tabla relacionada por la clave foránea generada. Si no se pasa ningún parámetro |
||||
el nombre de la tabla será deducido en base al nombre de la columna. |
||||
|
||||
En el ejemplo anterior `author_id:integer:notNull:foreignKey(user)` generará |
||||
una columna llamada `author_id` con una clave foránea a la tabla `user` mientras |
||||
`category_id:integer:defaultValue(1):foreignKey` generará |
||||
`category_id` con una clave foránea a la tabla `category`. |
||||
|
||||
### Eliminar Tabla |
||||
|
||||
```php |
||||
yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
class m150811_220037_drop_post_table extends Migration |
||||
{ |
||||
public function up() |
||||
{ |
||||
$this->dropTable('post'); |
||||
} |
||||
|
||||
public function down() |
||||
{ |
||||
$this->createTable('post', [ |
||||
'id' => $this->primaryKey(), |
||||
'title' => $this->string(12)->notNull()->unique(), |
||||
'body' => $this->text() |
||||
]); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
### Agregar Columna |
||||
|
||||
Si el nombre de la migración está en la forma `add_xxx_column_to_yyy_table` entonces el archivo generado contendrá |
||||
las declaraciones `addColumn` y `dropColumn` necesarias. |
||||
|
||||
Para agregar una columna: |
||||
|
||||
```php |
||||
yii migrate/create add_position_column_to_post_table --fields="position:integer" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
class m150811_220037_add_position_column_to_post_table extends Migration |
||||
{ |
||||
public function up() |
||||
{ |
||||
$this->addColumn('post', 'position', $this->integer()); |
||||
} |
||||
|
||||
public function down() |
||||
{ |
||||
$this->dropColumn('post', 'position'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
### Eliminar Columna |
||||
|
||||
Si el nombre de la migración está en la forma `drop_xxx_column_from_yyy_table` entonces el archivo generado contendrá |
||||
las declaraciones `addColumn` y `dropColumn` necesarias. |
||||
|
||||
```php |
||||
yii migrate/create drop_position_column_from_post_table --fields="position:integer" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
class m150811_220037_drop_position_column_from_post_table extends Migration |
||||
{ |
||||
public function up() |
||||
{ |
||||
$this->dropColumn('post', 'position'); |
||||
} |
||||
|
||||
public function down() |
||||
{ |
||||
$this->addColumn('post', 'position', $this->integer()); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
### Agregar Tabla de Unión |
||||
|
||||
Si el nombre de la migración está en la forma `create_junction_table_for_xxx_and_yyy_tables` entonces se generará el código necesario |
||||
para una tabla de unión. |
||||
|
||||
```php |
||||
yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime" |
||||
``` |
||||
|
||||
genera |
||||
|
||||
```php |
||||
/** |
||||
* Handles the creation for table `post_tag`. |
||||
* Has foreign keys to the tables: |
||||
* |
||||
* - `post` |
||||
* - `tag` |
||||
*/ |
||||
class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migration |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function up() |
||||
{ |
||||
$this->createTable('post_tag', [ |
||||
'post_id' => $this->integer(), |
||||
'tag_id' => $this->integer(), |
||||
'created_at' => $this->dateTime(), |
||||
'PRIMARY KEY(post_id, tag_id)', |
||||
]); |
||||
|
||||
// creates index for column `post_id` |
||||
$this->createIndex( |
||||
'idx-post_tag-post_id', |
||||
'post_tag', |
||||
'post_id' |
||||
); |
||||
|
||||
// add foreign key for table `post` |
||||
$this->addForeignKey( |
||||
'fk-post_tag-post_id', |
||||
'post_tag', |
||||
'post_id', |
||||
'post', |
||||
'id', |
||||
'CASCADE' |
||||
); |
||||
|
||||
// creates index for column `tag_id` |
||||
$this->createIndex( |
||||
'idx-post_tag-tag_id', |
||||
'post_tag', |
||||
'tag_id' |
||||
); |
||||
|
||||
// add foreign key for table `tag` |
||||
$this->addForeignKey( |
||||
'fk-post_tag-tag_id', |
||||
'post_tag', |
||||
'tag_id', |
||||
'tag', |
||||
'id', |
||||
'CASCADE' |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function down() |
||||
{ |
||||
// drops foreign key for table `post` |
||||
$this->dropForeignKey( |
||||
'fk-post_tag-post_id', |
||||
'post_tag' |
||||
); |
||||
|
||||
// drops index for column `post_id` |
||||
$this->dropIndex( |
||||
'idx-post_tag-post_id', |
||||
'post_tag' |
||||
); |
||||
|
||||
// drops foreign key for table `tag` |
||||
$this->dropForeignKey( |
||||
'fk-post_tag-tag_id', |
||||
'post_tag' |
||||
); |
||||
|
||||
// drops index for column `tag_id` |
||||
$this->dropIndex( |
||||
'idx-post_tag-tag_id', |
||||
'post_tag' |
||||
); |
||||
|
||||
$this->dropTable('post_tag'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
### Migraciones Transaccionales <span id="transactional-migrations"></span> |
||||
|
||||
Al ejecutar migraciones complejas de BD, es importante asegurarse que todas las migraciones funcionen o fallen como una unidad |
||||
así la base de datos puede mantener integridad y consistencia. Para alcanzar este objetivo, se recomienda que |
||||
encierres las operación de la BD de cada migración en una [transacción](db-dao.md#performing-transactions). |
||||
|
||||
Una manera simple de implementar migraciones transaccionales es poniendo el código de las migraciones en los métodos `safeUp()` y `safeDown()`. |
||||
Estos métodos se diferencias con `up()` y `down()` en que son encerrados implícitamente en una transacción. |
||||
Como resultado, si alguna de las operaciones dentro de estos métodos falla, todas las operaciones previas son automáticamente revertidas. |
||||
|
||||
En el siguiente ejemplo, además de crear la tabla `news` también insertamos un registro inicial dentro de la dicha tabla. |
||||
|
||||
```php |
||||
<?php |
||||
|
||||
use yii\db\Migration; |
||||
|
||||
class m150101_185401_create_news_table extends Migration |
||||
{ |
||||
public function safeUp() |
||||
{ |
||||
$this->createTable('news', [ |
||||
'id' => $this->primaryKey(), |
||||
'title' => $this->string()->notNull(), |
||||
'content' => $this->text(), |
||||
]); |
||||
|
||||
$this->insert('news', [ |
||||
'title' => 'test 1', |
||||
'content' => 'content 1', |
||||
]); |
||||
} |
||||
|
||||
public function safeDown() |
||||
{ |
||||
$this->delete('news', ['id' => 1]); |
||||
$this->dropTable('news'); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Ten en cuenta que usualmente cuando ejecutas múltiples operaciones en la BD en `safeUp()`, deberías revertir su orden de ejecución |
||||
en `safeDown()`. En el ejemplo anterior primero creamos la tabla y luego insertamos la finla en `safeUp()`; mientras |
||||
que en `safeDown()` primero eliminamos el registro y posteriormente eliminamos la tabla. |
||||
|
||||
> Note: No todos los DBMS soportan transacciones. Y algunas consultas a la BD no pueden ser puestas en transacciones. Para algunos ejemplos, |
||||
por favor lee acerca de [commits implícitos](https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html). En estos casos, |
||||
deberías igualmente implementar `up()` y `down()`. |
||||
|
||||
|
||||
### Métodos de Acceso a la Base de Datos <span id="db-accessing-methods"></span> |
||||
|
||||
La clase base [[yii\db\Migration]] provee un grupo de métodos que te permiten acceder y manipular bases de datos. |
||||
Podrías encontrar que estos métodos son nombrados de forma similar a los [métodos DAO](db-dao.md) provistos por la clase [[yii\db\Command]]. |
||||
Por ejemplo, el método [[yii\db\Migration::createTable()]] te permite crear una nueva tabla, |
||||
tal como lo hace [[yii\db\Command::createTable()]]. |
||||
|
||||
El beneficio de utilizar lo métodos provistos por [[yii\db\Migration]] es que no necesitas explícitamente |
||||
crear instancias de [[yii\db\Command]], y la ejecución de cada método mostrará automáticamente mensajes útiles |
||||
diciéndote qué operaciones de la base de datos se realizaron y cuánto tiempo tomaron. |
||||
|
||||
Debajo hay una lista de todos los métodos de acceso a la base de datos: |
||||
|
||||
* [[yii\db\Migration::execute()|execute()]]: ejecuta una declaración SQL |
||||
* [[yii\db\Migration::insert()|insert()]]: inserta un único registro |
||||
* [[yii\db\Migration::batchInsert()|batchInsert()]]: inserta múltiples registros |
||||
* [[yii\db\Migration::update()|update()]]: actualiza registros |
||||
* [[yii\db\Migration::delete()|delete()]]: elimina registros |
||||
* [[yii\db\Migration::createTable()|createTable()]]: crea una nueva tabla |
||||
* [[yii\db\Migration::renameTable()|renameTable()]]: renombra una tabla |
||||
* [[yii\db\Migration::dropTable()|dropTable()]]: elimina una tabla |
||||
* [[yii\db\Migration::truncateTable()|truncateTable()]]: elimina todos los registros de una tabla |
||||
* [[yii\db\Migration::addColumn()|addColumn()]]: agrega una columna |
||||
* [[yii\db\Migration::renameColumn()|renameColumn()]]: renombra una columna |
||||
* [[yii\db\Migration::dropColumn()|dropColumn()]]: elimina una columna |
||||
* [[yii\db\Migration::alterColumn()|alterColumn()]]: modifica una columna |
||||
* [[yii\db\Migration::addPrimaryKey()|addPrimaryKey()]]: agrega una clave primaria |
||||
* [[yii\db\Migration::dropPrimaryKey()|dropPrimaryKey()]]: elimina una clave primaria |
||||
* [[yii\db\Migration::addForeignKey()|addForeignKey()]]: agrega una clave foránea |
||||
* [[yii\db\Migration::dropForeignKey()|dropForeignKey()]]: elimina una clave foránea |
||||
* [[yii\db\Migration::createIndex()|createIndex()]]: crea un índice |
||||
* [[yii\db\Migration::dropIndex()|dropIndex()]]: elimina un índice |
||||
* [[yii\db\Migration::addCommentOnColumn()|addCommentOnColumn()]]: agrega un comentario a una columna |
||||
* [[yii\db\Migration::dropCommentFromColumn()|dropCommentFromColumn()]]: elimina un comentario de una columna |
||||
* [[yii\db\Migration::addCommentOnTable()|addCommentOnTable()]]: agrega un comentario a una tabla |
||||
* [[yii\db\Migration::dropCommentFromTable()|dropCommentFromTable()]]: elimina un comentario de una tabla |
||||
|
||||
> Info: [[yii\db\Migration]] no provee un método de consulta a la base de datos. Esto es porque normalmente no necesitas |
||||
mostrar mensajes detallados al traer datos de una base de datos. También se debe a que puedes utilizar el poderoso |
||||
[Query Builder](db-query-builder.md) para generar y ejecutar consultas complejas. |
||||
|
||||
> Note: Al manipular datos utilizando una migración podrías encontrar que utilizando tus clases [Active Record](db-active-record.md) |
||||
> para esto podría ser útil ya que algo de la lógica ya está implementada ahí. Ten en cuenta de todos modos, que en contraste con |
||||
> el código escrito en las migraciones, cuya naturaleza es permanecer constante por siempre, la lógica de la aplicación está sujeta a cambios. |
||||
> Entonces al utilizar Active Record en migraciones, los cambios en la lógica en la capa Active Record podrían accidentalmente romper |
||||
> migraciones existentes. Por esta razón, el código de las migraciones debería permanecer independiente de determinada lógica de la aplicación |
||||
> tal como clases Active Record. |
||||
|
||||
|
||||
## Aplicar Migraciones <span id="applying-migrations"></span> |
||||
|
||||
To upgrade a database to its latest structure, you should apply all available new migrations using the following command: |
||||
Para actualizar una base de datos a su última estructura, deberías aplicar todas las nuevas migraciones utilizando el siguiente comando: |
||||
|
||||
``` |
||||
yii migrate |
||||
``` |
||||
|
||||
Este comando listará todas las migraciones que no han sido aplicadas hasta el momento. Si confirmas que quieres aplicar |
||||
dichas migraciones, se correrá el método `up()` o `safeUp()` en cada clase de migración nueva, una tras otra, |
||||
en el orden de su valor de marca temporal. Si alguna de las migraciones falla, el comando terminará su ejecución sin aplicar |
||||
el resto de las migraciones. |
||||
|
||||
> Tip: En caso de no disponer de la línea de comandos en el servidor, podrías intentar utilizar |
||||
> la extensión [web shell](https://github.com/samdark/yii2-webshell). |
||||
|
||||
Por cada migración aplicada correctamente, el comando insertará un registro en la base de datos, en la tabla llamada |
||||
`migration` para registrar la correcta aplicación de la migración. Esto permitirá a la herramienta de migración identificar |
||||
cuáles migraciones han sido aplicadas y cuáles no. |
||||
|
||||
> Info: La herramienta de migración creará automáticamente la tabla `migration` en la base de datos especificada |
||||
en la opción [[yii\console\controllers\MigrateController::db|db]] del comando. Por defecto, la base de datos |
||||
es especificada en el [componente de aplicación](structure-application-components.md) `db`. |
||||
|
||||
A veces, podrías sólo querer aplicar una o algunas pocas migraciones, en vez de todas las migraciones disponibles. |
||||
Puedes hacer esto el número de migraciones que quieres aplicar al ejecutar el comando. |
||||
Por ejemplo, el siguiente comando intentará aplicar las tres siguientes migraciones disponibles: |
||||
|
||||
``` |
||||
yii migrate 3 |
||||
``` |
||||
|
||||
Puedes además explícitamente especificar una migración en particular a la cual la base de datos debería migrar |
||||
utilizando el comando `migrate/to` de acuerdo a uno de los siguientes formatos: |
||||
|
||||
``` |
||||
yii migrate/to 150101_185401 # utiliza la marca temporal para especificar la migración |
||||
yii migrate/to "2015-01-01 18:54:01" # utiliza un string que puede ser analizado por strtotime() |
||||
yii migrate/to m150101_185401_create_news_table # utiliza el nombre completo |
||||
yii migrate/to 1392853618 # utiliza el tiempo UNIX |
||||
``` |
||||
|
||||
Si hubiera migraciones previas a la especificada sin aplicar, estas serán aplicadas antes de que la migración especificada |
||||
sea aplicada. |
||||
|
||||
Si la migración especificada ha sido aplicada previamente, cualquier migración aplicada posteriormente será revertida. |
||||
|
||||
|
||||
## Revertir Migraciones <span id="reverting-migrations"></span> |
||||
|
||||
Para revertir (deshacer) una o varias migraciones ya aplicadas, puedes ejecutar el siguiente comando: |
||||
|
||||
``` |
||||
yii migrate/down # revierte la más reciente migración aplicada |
||||
yii migrate/down 3 # revierte las 3 últimas migraciones aplicadas |
||||
``` |
||||
|
||||
> Note: No todas las migraciones son reversibles. Intentar revertir tales migraciones producirá un error y detendrá |
||||
completamente el proceso de reversión. |
||||
|
||||
|
||||
## Rehacer Migraciones <span id="redoing-migrations"></span> |
||||
|
||||
Rehacer (re-ejecutar) migraciones significa primero revertir las migraciones especificadas y luego aplicarlas nuevamente. Esto puede hacerse |
||||
de esta manera: |
||||
|
||||
``` |
||||
yii migrate/redo # rehace la más reciente migración aplicada |
||||
yii migrate/redo 3 # rehace las 3 últimas migraciones aplicadas |
||||
``` |
||||
|
||||
> Note: Si una migración no es reversible, no tendrás posibilidades de rehacerla. |
||||
|
||||
|
||||
## Listar Migraciones <span id="listing-migrations"></span> |
||||
|
||||
Para listar cuáles migraciones han sido aplicadas y cuáles no, puedes utilizar los siguientes comandos: |
||||
|
||||
``` |
||||
yii migrate/history # muestra las últimas 10 migraciones aplicadas |
||||
yii migrate/history 5 # muestra las últimas 5 migraciones aplicadas |
||||
yii migrate/history all # muestra todas las migraciones aplicadas |
||||
|
||||
yii migrate/new # muestra las primeras 10 nuevas migraciones |
||||
yii migrate/new 5 # muestra las primeras 5 nuevas migraciones |
||||
yii migrate/new all # muestra todas las nuevas migraciones |
||||
``` |
||||
|
||||
|
||||
## Modificar el Historial de Migraciones <span id="modifying-migration-history"></span> |
||||
|
||||
En vez de aplicar o revertir migraciones, a veces simplemente quieres marcar que tu base de datos |
||||
ha sido actualizada a una migración en particular. Esto sucede normalmente cuando cambias manualmente la base de datos |
||||
a un estado particular y no quieres que la/s migración/es de ese cambio sean re-aplicadas posteriormente. Puedes alcanzar este objetivo |
||||
con el siguiente comando: |
||||
|
||||
``` |
||||
yii migrate/mark 150101_185401 # utiliza la marca temporal para especificar la migración |
||||
yii migrate/mark "2015-01-01 18:54:01" # utiliza un string que puede ser analizado por strtotime() |
||||
yii migrate/mark m150101_185401_create_news_table # utiliza el nombre completo |
||||
yii migrate/mark 1392853618 # utiliza el tiempo UNIX |
||||
``` |
||||
|
||||
El comando modificará la tabla `migration` agregando o eliminado ciertos registros para indicar que en la base de datos |
||||
han sido aplicadas las migraciones hasta la especificada. Ninguna migración será aplicada ni revertida por este comando. |
||||
|
||||
|
||||
## Personalizar Migraciones <span id="customizing-migrations"></span> |
||||
|
||||
Hay varias maneras de personalizar el comando de migración. |
||||
|
||||
|
||||
### Utilizar Opciones de la Línea de Comandos <span id="using-command-line-options"></span> |
||||
|
||||
El comando de migración trae algunas opciones de línea de comandos que pueden ser utilizadas para personalizar su comportamiento: |
||||
|
||||
* `interactive`: boolean (por defecto `true`), especificar si se debe ejecutar la migración en modo interactivo. |
||||
Cuando se indica `true`, se le pedirá confirmación al usuario antes de ejecutar ciertas acciones. |
||||
Puedes querer definirlo como `false` si el comando está siendo utilizado como un proceso de fondo. |
||||
|
||||
* `migrationPath`: string (por defecto `@app/migrations`), especifica el directorio que contiene todos los archivos |
||||
de clase de las migraciones. Este puede ser especificado tanto como una ruta a un directorio un [alias](concept-aliases.md) de ruta. |
||||
Ten en cuenta que el directorio debe existir, o el comando disparará un error. |
||||
|
||||
* `migrationTable`: string (por defecto `migration`), especifica el nombre de la tabla de la base de datos que almacena |
||||
información del historial de migraciones. Dicha tabla será creada por el comando en caso de que no exista. |
||||
Puedes también crearla manualmente utilizando la estructura `version varchar(255) primary key, apply_time integer`. |
||||
|
||||
* `db`: string (por defecto `db`), especifica el ID del [componente de aplicación](structure-application-components.md) de la base de datos. |
||||
Esto representa la base de datos que será migrada en este comando. |
||||
|
||||
* `templateFile`: string (por defecto `@yii/views/migration.php`), especifica la ruta al template |
||||
utilizado para generar el esqueleto de los archivos de clases de migración. Puede ser especificado tanto como una ruta a un archivo |
||||
como una [alias](concept-aliases.md) de una ruta. El template es un archivo PHP en el cual puedes utilizar una variable predefinida |
||||
llamada `$className` para obtener el nombre de clase de la migración. |
||||
|
||||
* `generatorTemplateFiles`: array (por defecto `[ |
||||
'create_table' => '@yii/views/createTableMigration.php', |
||||
'drop_table' => '@yii/views/dropTableMigration.php', |
||||
'add_column' => '@yii/views/addColumnMigration.php', |
||||
'drop_column' => '@yii/views/dropColumnMigration.php', |
||||
'create_junction' => '@yii/views/createTableMigration.php' |
||||
]`), especifica los templates utilizados para generar las migraciones. Ver "[Generar Migraciones](#generating-migrations)" |
||||
para más detalles. |
||||
|
||||
* `fields`: array de strings de definiciones de columna utilizado por el código de migración. Por defecto `[]`. El formato de cada |
||||
definición es `COLUMN_NAME:COLUMN_TYPE:COLUMN_DECORATOR`. Por ejemplo, `--fields=name:string(12):notNull` produce |
||||
una columna string de tamaño 12 que es not `null`. |
||||
|
||||
El siguiente ejemplo muestra cómo se pueden utilizar estas opciones. |
||||
|
||||
Por ejemplo, si queremos migrar un módulo `forum` cuyos arhivos de migración |
||||
están ubicados dentro del directorio `migrations` del módulo, podemos utilizar el siguientedocs/guide-es/db-migrations.md |
||||
comando: |
||||
|
||||
``` |
||||
# realiza las migraciones de un módulo forum sin interacción del usuario |
||||
yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0 |
||||
``` |
||||
|
||||
|
||||
### Configurar el Comando Globalmente <span id="configuring-command-globally"></span> |
||||
|
||||
En vez de introducir los valores de las opciones cada vez que ejecutas un comandod e migración, podrías configurarlos |
||||
de una vez por todas en la configuración de la aplicación como se muestra a continuación: |
||||
|
||||
```php |
||||
return [ |
||||
'controllerMap' => [ |
||||
'migrate' => [ |
||||
'class' => 'yii\console\controllers\MigrateController', |
||||
'migrationTable' => 'backend_migration', |
||||
], |
||||
], |
||||
]; |
||||
``` |
||||
|
||||
Con esta configuración, cada vez que ejecutes un comando de migración, la tabla `backend_migration` |
||||
será utilizada para registrar el historial de migraciones. No necesitarás volver a especificarla con la opción `migrationTable` |
||||
de la línea de comandos. |
||||
|
||||
|
||||
## Migrar Múltiples Bases de Datos <span id="migrating-multiple-databases"></span> |
||||
|
||||
Por defecto, las migraciones son aplicadas en la misma base de datos especificada en el [componente de aplicación](structure-application-components.md) `db`. |
||||
Si quieres que sean aplicadas en una base de datos diferente, puedes especificar la opción `db` como se muestra a continuación, |
||||
|
||||
``` |
||||
yii migrate --db=db2 |
||||
``` |
||||
|
||||
El comando anterior aplicará las migraciones en la base de datos `db2`. |
||||
|
||||
A veces puede suceder que quieras aplicar *algunas* de las migraciones a una base de datos, mientras algunas otras |
||||
a una base de datos distinta. Para lograr esto, al implementar una clase de migración debes especificar explícitamente el ID del componente DB |
||||
que la migración debe utilizar, como a continuación: |
||||
|
||||
```php |
||||
<?php |
||||
|
||||
use yii\db\Migration; |
||||
|
||||
class m150101_185401_create_news_table extends Migration |
||||
{ |
||||
public function init() |
||||
{ |
||||
$this->db = 'db2'; |
||||
parent::init(); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
La migración anterior se aplicará a `db2`, incluso si especificas una base de datos diferente en la opción `db` de la |
||||
línea de comandos. Ten en cuenta que el historial aún será registrado in la base de datos especificada en la opción `db` de la línea de comandos. |
||||
|
||||
Si tienes múltiples migraciones que utilizan la misma base de datos, es recomandable que crees una clase base de migración |
||||
con el código `init()` mostrado. Entonces cada clase de migración puede extender de esa clase base. |
||||
|
||||
> Tip: Aparte de definir la propiedad [[yii\db\Migration::db|db]], puedes también operar en diferentes bases de datos |
||||
creando nuevas conexiones de base de datos en tus clases de migración. También puedes utilizar [métodos DAO](db-dao.md) |
||||
con esas conexiones para manipular diferentes bases de datos. |
||||
|
||||
Another strategy that you can take to migrate multiple databases is to keep migrations for different databases in |
||||
different migration paths. Then you can migrate these databases in separate commands like the following: |
||||
Otra estrategia que puedes seguir para migrar múltiples bases de datos es mantener las migraciones para diferentes bases de datos en |
||||
distintas rutas de migración. Entonces podrías migrar esas bases de datos en comandos separados como a continuación: |
||||
|
||||
``` |
||||
yii migrate --migrationPath=@app/migrations/db1 --db=db1 |
||||
yii migrate --migrationPath=@app/migrations/db2 --db=db2 |
||||
... |
||||
``` |
||||
|
||||
El primer comando aplicará las migraciones que se encuentran en `@app/migrations/db1` en la base de datos `db1`, el segundo comando |
||||
aplicará las migraciones que se encuentran en `@app/migrations/db2` en `db2`, y así sucesivamente. |
@ -1,67 +0,0 @@
|
||||
# A |
||||
|
||||
## alias |
||||
|
||||
Alias es un string utilizado por Yii para referirse a una clase o directorio tal como `@app/vendor`. |
||||
|
||||
## aplicación |
||||
|
||||
La aplicación es el objeto central durante la solicitud HTTP. Contiene un número de componentes con los que toma información de la solicitud y la envía al controlador apropiado para posterior procesamiento. |
||||
|
||||
El objeto de la aplicación es instanciado como un singleton por el script de entrada. El singleton de la aplicación puede ser accedido desde cualquier lugar a través de `\Yii::$app`. |
||||
|
||||
## assets |
||||
|
||||
Asset se refiere a un archivo de recurso. Típicamente contiene JavaScript o CSS pero puede ser cualquier otra cosa que sea accesible vía HTTP. |
||||
|
||||
## atributo |
||||
|
||||
Un atributo es una propiedad de un modelo (una variable miembro de clase o una propiedad mágica definida vía `__get()`/`__set()`) que almacena **datos de negocio**. |
||||
|
||||
# B |
||||
|
||||
## bundle |
||||
|
||||
Bundle, conocido como paquete en Yii 1.1, se refiere a un número de recursos y un archivo de configuración que describe dependencias y lista recursos. |
||||
|
||||
# C |
||||
|
||||
## configuración |
||||
|
||||
Configuración puede referirse tanto al proceso de establecer propiedades de un objeto como a un archivo de configuración que almacena la definición de propiedades para un objeto o clase de objetos. |
||||
|
||||
# E |
||||
|
||||
## extensión |
||||
|
||||
Extensión es un grupo de clases, paquete de recursos y configuraciones que agrega más características a la aplicación. |
||||
|
||||
# I |
||||
|
||||
## instalación |
||||
|
||||
Instalación es el proceso de preparar algo para trabajar, desde seguir un archivo léame hasta ejecutar un script preparado especialmente para tal fin. En el caso de Yii, define permisos y chequea los requerimientos para el funcionamiento del software. |
||||
|
||||
# M |
||||
|
||||
## módulo |
||||
|
||||
Módulo es una sub-aplicación que contiene elementos MVC en sí mismo, como modelos, vistas, controladores, etc. y puede ser utilizado dentro de la aplicación principal. Típicamente remitiendo las solicitudes al módulo en vez de manejándolo desde controladores. |
||||
|
||||
# N |
||||
|
||||
## namespace |
||||
|
||||
Namespace (espacio de nombres) se refiere a una [característica de PHP](https://www.php.net/manual/es/language.namespaces.php) activamente utilizada en Yii 2. |
||||
|
||||
# P |
||||
|
||||
## paquete |
||||
|
||||
[Ver bundle](#bundle). |
||||
|
||||
# V |
||||
|
||||
## vendor |
||||
|
||||
Vendor (proveedor) es una organización o un desarrollador individual que provee código en forma de extensiones, módulos o librerías. |
@ -1,527 +0,0 @@
|
||||
<?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> |
Before Width: | Height: | Size: 31 KiB |
@ -1,368 +0,0 @@
|
||||
<?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.12.2--> |
||||
<key for="graphml" id="d0" yfiles.type="resources"/> |
||||
<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 attr.name="Description" attr.type="string" for="graph" id="d7"/> |
||||
<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="d7"/> |
||||
<node id="n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="36.68359375" x="33.158203125" y="25.1494140625">admin<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="38.025390625" x="32.4873046875" y="25.1494140625">author<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n2"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="64.53585815429688" width="56.560157775878906" x="216.21992111206055" y="-132.03585815429688"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.905467987060547" y="-27.814727783203125">John, ID=2<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.113555908203125" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="1"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n3"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="66.76200103759766" width="56.554100036621094" x="57.22294998168945" y="-133.14892959594727"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.908496856689453" y="-27.701656341552734">Jane, ID=1<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.000484466552734" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="2"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n4"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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="64.71484375" x="19.142578125" y="25.1494140625">updatePost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n5"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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="89.388671875" x="6.8056640625" y="25.1494140625">updateOwnPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n6"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="352.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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.36328125" x="20.818359375" y="25.1494140625">createPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n7"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="29.535858154296875" width="103.0" x="193.0" y="167.96414184570312"/> |
||||
<y:Fill color="#FFCC00" 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="64.03515625" x="19.482421875" y="5.4173431396484375">AuthorRule<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<edge id="e0" source="n4" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e1" source="n4" target="n5"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e2" source="n1" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e3" source="n6" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> |
||||
<y:Point x="403.5" y="23.0"/> |
||||
</y:Path> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e4" source="n1" target="n2"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e5" source="n0" target="n3"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e6" source="n7" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
</graph> |
||||
<data key="d0"> |
||||
<y:Resources> |
||||
<y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
<path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 |
||||
c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
|
||||
<radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 |
||||
c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 |
||||
c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 |
||||
C40.445,49.917,26.288,53.051,26.288,53.051z"/> |
||||
|
||||
<radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 |
||||
c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 |
||||
c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 |
||||
C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 |
||||
c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 |
||||
c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> |
||||
|
||||
<radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 |
||||
c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 |
||||
c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> |
||||
|
||||
<radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 |
||||
c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> |
||||
|
||||
<radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 |
||||
c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 |
||||
c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 |
||||
s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 |
||||
L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
<y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 |
||||
C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 |
||||
c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 |
||||
s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 |
||||
c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> |
||||
|
||||
<linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> |
||||
<stop offset="0" style="stop-color:#49AD33"/> |
||||
<stop offset="1" style="stop-color:#C2DA92"/> |
||||
</linearGradient> |
||||
<path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 |
||||
c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
</y:Resources> |
||||
</data> |
||||
</graphml> |
Before Width: | Height: | Size: 19 KiB |
@ -1,368 +0,0 @@
|
||||
<?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.12.2--> |
||||
<key for="graphml" id="d0" yfiles.type="resources"/> |
||||
<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 attr.name="Description" attr.type="string" for="graph" id="d7"/> |
||||
<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="d7"/> |
||||
<node id="n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" 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="36.68359375" x="33.158203125" y="25.1494140625">admin<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="38.025390625" x="32.4873046875" y="25.1494140625">author<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n2"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="64.53585815429688" width="56.560157775878906" x="216.21992111206055" y="-132.03585815429688"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.905467987060547" y="-27.814727783203125">John, ID=2<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.113555908203125" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="1"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n3"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="66.76200103759766" width="56.554100036621094" x="57.22294998168945" y="-133.14892959594727"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.908496856689453" y="-27.701656341552734">Jane, ID=1<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.000484466552734" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="2"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n4"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="64.71484375" x="19.142578125" y="25.1494140625">updatePost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n5"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="89.388671875" x="6.8056640625" y="25.1494140625">updateOwnPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n6"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="352.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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.36328125" x="20.818359375" y="25.1494140625">createPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n7"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="29.535858154296875" width="103.0" x="193.0" y="167.96414184570312"/> |
||||
<y:Fill color="#FFCC00" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="64.03515625" x="19.482421875" y="5.4173431396484375">AuthorRule<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<edge id="e0" source="n4" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e1" source="n4" target="n5"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e2" source="n1" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e3" source="n6" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> |
||||
<y:Point x="403.5" y="23.0"/> |
||||
</y:Path> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e4" source="n1" target="n2"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e5" source="n0" target="n3"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e6" source="n7" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
</graph> |
||||
<data key="d0"> |
||||
<y:Resources> |
||||
<y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
<path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 |
||||
c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
|
||||
<radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 |
||||
c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 |
||||
c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 |
||||
C40.445,49.917,26.288,53.051,26.288,53.051z"/> |
||||
|
||||
<radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 |
||||
c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 |
||||
c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 |
||||
C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 |
||||
c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 |
||||
c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> |
||||
|
||||
<radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 |
||||
c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 |
||||
c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> |
||||
|
||||
<radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 |
||||
c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> |
||||
|
||||
<radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 |
||||
c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 |
||||
c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 |
||||
s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 |
||||
L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
<y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 |
||||
C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 |
||||
c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 |
||||
s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 |
||||
c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> |
||||
|
||||
<linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> |
||||
<stop offset="0" style="stop-color:#49AD33"/> |
||||
<stop offset="1" style="stop-color:#C2DA92"/> |
||||
</linearGradient> |
||||
<path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 |
||||
c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
</y:Resources> |
||||
</data> |
||||
</graphml> |
Before Width: | Height: | Size: 19 KiB |
@ -1,368 +0,0 @@
|
||||
<?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.12.2--> |
||||
<key for="graphml" id="d0" yfiles.type="resources"/> |
||||
<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 attr.name="Description" attr.type="string" for="graph" id="d7"/> |
||||
<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="d7"/> |
||||
<node id="n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="36.68359375" x="33.158203125" y="25.1494140625">admin<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" 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="38.025390625" x="32.4873046875" y="25.1494140625">author<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n2"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="64.53585815429688" width="56.560157775878906" x="216.21992111206055" y="-132.03585815429688"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.905467987060547" y="-27.814727783203125">John, ID=2<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.113555908203125" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="1"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n3"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="66.76200103759766" width="56.554100036621094" x="57.22294998168945" y="-133.14892959594727"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.908496856689453" y="-27.701656341552734">Jane, ID=1<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.000484466552734" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="2"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n4"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" transparent="false"/> |
||||
<y:BorderStyle color="#FF0000" 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="64.71484375" x="19.142578125" y="25.1494140625">updatePost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n5"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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="89.388671875" x="6.8056640625" y="25.1494140625">updateOwnPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n6"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="352.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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.36328125" x="20.818359375" y="25.1494140625">createPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n7"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="29.535858154296875" width="103.0" x="193.0" y="167.96414184570312"/> |
||||
<y:Fill color="#FFCC00" 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="64.03515625" x="19.482421875" y="5.4173431396484375">AuthorRule<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<edge id="e0" source="n4" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e1" source="n4" target="n5"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e2" source="n1" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e3" source="n6" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> |
||||
<y:Point x="403.5" y="23.0"/> |
||||
</y:Path> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e4" source="n1" target="n2"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e5" source="n0" target="n3"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#FF0000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e6" source="n7" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
</graph> |
||||
<data key="d0"> |
||||
<y:Resources> |
||||
<y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
<path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 |
||||
c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
|
||||
<radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 |
||||
c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 |
||||
c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 |
||||
C40.445,49.917,26.288,53.051,26.288,53.051z"/> |
||||
|
||||
<radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 |
||||
c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 |
||||
c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 |
||||
C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 |
||||
c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 |
||||
c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> |
||||
|
||||
<radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 |
||||
c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 |
||||
c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> |
||||
|
||||
<radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 |
||||
c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> |
||||
|
||||
<radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 |
||||
c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 |
||||
c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 |
||||
s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 |
||||
L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
<y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 |
||||
C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 |
||||
c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 |
||||
s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 |
||||
c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> |
||||
|
||||
<linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> |
||||
<stop offset="0" style="stop-color:#49AD33"/> |
||||
<stop offset="1" style="stop-color:#C2DA92"/> |
||||
</linearGradient> |
||||
<path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 |
||||
c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
</y:Resources> |
||||
</data> |
||||
</graphml> |
Before Width: | Height: | Size: 19 KiB |
@ -1,312 +0,0 @@
|
||||
<?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.12.2--> |
||||
<key for="graphml" id="d0" yfiles.type="resources"/> |
||||
<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 attr.name="Description" attr.type="string" for="graph" id="d7"/> |
||||
<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="d7"/> |
||||
<node id="n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" 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="36.68359375" x="33.158203125" y="25.1494140625">admin<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" 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="38.025390625" x="32.4873046875" y="25.1494140625">author<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n2"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="64.53585815429688" width="56.560157775878906" x="216.21992111206055" y="-132.03585815429688"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.905467987060547" y="-27.814727783203125">John, ID=2<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.113555908203125" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="1"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n3"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="66.76200103759766" width="56.554100036621094" x="57.22294998168945" y="-133.14892959594727"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.908496856689453" y="-27.701656341552734">Jane, ID=1<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.000484466552734" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="2"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n4"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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="64.71484375" x="19.142578125" y="25.1494140625">updatePost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n5"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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.36328125" x="20.818359375" y="25.1494140625">createPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<edge id="e0" source="n4" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e1" source="n1" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e2" source="n1" target="n2"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e3" source="n0" target="n3"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e4" source="n5" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
</graph> |
||||
<data key="d0"> |
||||
<y:Resources> |
||||
<y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
<path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 |
||||
c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
|
||||
<radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 |
||||
c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 |
||||
c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 |
||||
C40.445,49.917,26.288,53.051,26.288,53.051z"/> |
||||
|
||||
<radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 |
||||
c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 |
||||
c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 |
||||
C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 |
||||
c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 |
||||
c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> |
||||
|
||||
<radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 |
||||
c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 |
||||
c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> |
||||
|
||||
<radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 |
||||
c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> |
||||
|
||||
<radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 |
||||
c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 |
||||
c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 |
||||
s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 |
||||
L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
<y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 |
||||
C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 |
||||
c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 |
||||
s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 |
||||
c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> |
||||
|
||||
<linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> |
||||
<stop offset="0" style="stop-color:#49AD33"/> |
||||
<stop offset="1" style="stop-color:#C2DA92"/> |
||||
</linearGradient> |
||||
<path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 |
||||
c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
</y:Resources> |
||||
</data> |
||||
</graphml> |
Before Width: | Height: | Size: 16 KiB |
@ -1,368 +0,0 @@
|
||||
<?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.12.2--> |
||||
<key for="graphml" id="d0" yfiles.type="resources"/> |
||||
<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 attr.name="Description" attr.type="string" for="graph" id="d7"/> |
||||
<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="d7"/> |
||||
<node id="n0"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" 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="36.68359375" x="33.158203125" y="25.1494140625">admin<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n1"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="-11.5"/> |
||||
<y:Fill color="#ADF4A6" 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="38.025390625" x="32.4873046875" y="25.1494140625">author<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n2"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="64.53585815429688" width="56.560157775878906" x="216.21992111206055" y="-132.03585815429688"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.905467987060547" y="-27.814727783203125">John, ID=2<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.113555908203125" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="1"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n3"> |
||||
<data key="d6"> |
||||
<y:SVGNode> |
||||
<y:Geometry height="66.76200103759766" width="56.554100036621094" x="57.22294998168945" y="-133.14892959594727"/> |
||||
<y:Fill color="#CCCCFF" 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.37109375" x="-2.908496856689453" y="-27.701656341552734">Jane, ID=1<y:LabelModel> |
||||
<y:SmartNodeLabelModel distance="4.0"/> |
||||
</y:LabelModel> |
||||
<y:ModelParameter> |
||||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="-9.000484466552734" upX="0.0" upY="-1.0"/> |
||||
</y:ModelParameter> |
||||
</y:NodeLabel> |
||||
<y:SVGNodeProperties usingVisualBounds="true"/> |
||||
<y:SVGModel svgBoundsPolicy="0"> |
||||
<y:SVGContent refid="2"/> |
||||
</y:SVGModel> |
||||
</y:SVGNode> |
||||
</data> |
||||
</node> |
||||
<node id="n4"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="34.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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="64.71484375" x="19.142578125" y="25.1494140625">updatePost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n5"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="193.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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="89.388671875" x="6.8056640625" y="25.1494140625">updateOwnPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n6"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="69.0" width="103.0" x="352.0" y="197.5"/> |
||||
<y:Fill color="#99CCFF" 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.36328125" x="20.818359375" y="25.1494140625">createPost<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<node id="n7"> |
||||
<data key="d6"> |
||||
<y:ShapeNode> |
||||
<y:Geometry height="29.535858154296875" width="103.0" x="193.0" y="167.96414184570312"/> |
||||
<y:Fill color="#FFCC00" 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="64.03515625" x="19.482421875" y="5.4173431396484375">AuthorRule<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="roundrectangle"/> |
||||
</y:ShapeNode> |
||||
</data> |
||||
</node> |
||||
<edge id="e0" source="n4" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e1" source="n4" target="n5"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e2" source="n1" target="n0"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e3" source="n6" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> |
||||
<y:Point x="403.5" y="23.0"/> |
||||
</y:Path> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e4" source="n1" target="n2"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e5" source="n0" target="n3"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
<edge id="e6" source="n7" target="n1"> |
||||
<data key="d10"> |
||||
<y:PolyLineEdge> |
||||
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> |
||||
<y:LineStyle color="#000000" type="line" width="1.0"/> |
||||
<y:Arrows source="none" target="standard"/> |
||||
<y:BendStyle smoothed="false"/> |
||||
</y:PolyLineEdge> |
||||
</data> |
||||
</edge> |
||||
</graph> |
||||
<data key="d0"> |
||||
<y:Resources> |
||||
<y:Resource id="1"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
<path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 |
||||
c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
|
||||
<radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 |
||||
c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 |
||||
c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 |
||||
C40.445,49.917,26.288,53.051,26.288,53.051z"/> |
||||
|
||||
<radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 |
||||
c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 |
||||
c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 |
||||
C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 |
||||
c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 |
||||
c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> |
||||
|
||||
<radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 |
||||
c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 |
||||
c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> |
||||
|
||||
<radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 |
||||
c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> |
||||
|
||||
<radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FCB57A"/> |
||||
<stop offset="1" style="stop-color:#FF8C36"/> |
||||
</radialGradient> |
||||
<path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 |
||||
c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 |
||||
c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 |
||||
s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 |
||||
L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
<y:Resource id="2"><?xml version="1.0" encoding="utf-8"?> |
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |
||||
width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> |
||||
<g> |
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> |
||||
<stop offset="0.2711" style="stop-color:#FFAB4F"/> |
||||
<stop offset="1" style="stop-color:#FFD28F"/> |
||||
</linearGradient> |
||||
<path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 |
||||
V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 |
||||
c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> |
||||
|
||||
<radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> |
||||
<stop offset="0" style="stop-color:#FFD28F"/> |
||||
<stop offset="1" style="stop-color:#FFAB4F"/> |
||||
</radialGradient> |
||||
<path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 |
||||
c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 |
||||
C36.627,4.945,43.59,13.158,43.676,23.357z"/> |
||||
|
||||
<linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> |
||||
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> |
||||
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> |
||||
</linearGradient> |
||||
<path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 |
||||
c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 |
||||
c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> |
||||
<path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 |
||||
C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 |
||||
c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 |
||||
s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 |
||||
c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> |
||||
|
||||
<linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> |
||||
<stop offset="0" style="stop-color:#49AD33"/> |
||||
<stop offset="1" style="stop-color:#C2DA92"/> |
||||
</linearGradient> |
||||
<path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 |
||||
c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 |
||||
c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 |
||||
C1.378,56.689,0.5,62.768,0.5,62.768z"/> |
||||
</g> |
||||
</svg> |
||||
</y:Resource> |
||||
</y:Resources> |
||||
</data> |
||||
</graphml> |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 138 KiB |
@ -1,208 +0,0 @@
|
||||
Subir Archivos |
||||
============== |
||||
|
||||
Subir archivos en Yii es normalmente realizado con la ayuda de [[yii\web\UploadedFile]], que encapsula cada archivo subido |
||||
en un objeto `UploadedFile`. Combinado con [[yii\widgets\ActiveForm]] y [modelos](structure-models.md), |
||||
puedes fácilmente implementar un mecanismo seguro de subida de archivos. |
||||
|
||||
|
||||
## Crear Modelos <span id="creating-models"></span> |
||||
|
||||
Al igual que al trabajar con entradas de texto plano, para subir un archivo debes crear una clase de modelo y utilizar un atributo |
||||
de dicho modelo para mantener la instancia del archivo subido. Debes también declarar una regla para validar la subida del archivo. |
||||
Por ejemplo, |
||||
|
||||
```php |
||||
namespace app\models; |
||||
|
||||
use yii\base\Model; |
||||
use yii\web\UploadedFile; |
||||
|
||||
class UploadForm extends Model |
||||
{ |
||||
/** |
||||
* @var UploadedFile |
||||
*/ |
||||
public $imageFile; |
||||
|
||||
public function rules() |
||||
{ |
||||
return [ |
||||
[['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; |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
En el código anterior, el atributo `imageFile` es utilizado para mantener una instancia del archivo subido. Este está asociado con |
||||
una regla de validación `file`, que utiliza [[yii\validators\FileValidator]] para asegurarse que el archivo a subir tenga extensión `png` o `jpg`. |
||||
El método `upload()` realizará la validación y guardará el archivo subido en el servidor. |
||||
|
||||
El validador `file` te permite chequear las extensiones, el tamaño, el tipo MIME, etc. Por favor consulta |
||||
la sección [Validadores del Framework](tutorial-core-validators.md#file) para más detalles. |
||||
|
||||
> Tip: Si estás subiendo una imagen, podrías considerar el utilizar el validador `image`. El validador `image` es |
||||
implementado a través de [[yii\validators\ImageValidator]], que verifica que un atributo haya recibido una imagen válida |
||||
que pueda ser tanto guardada como procesada utilizando la [Extensión Imagine](https://github.com/yiisoft/yii2-imagine). |
||||
|
||||
|
||||
## Renderizar Campos de Subida de Archivos <span id="rendering-file-input"></span> |
||||
|
||||
A continuación, crea un campo de subida de archivo en la vista: |
||||
|
||||
```php |
||||
<?php |
||||
use yii\widgets\ActiveForm; |
||||
?> |
||||
|
||||
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> |
||||
|
||||
<?= $form->field($model, 'imageFile')->fileInput() ?> |
||||
|
||||
<button>Enviar</button> |
||||
|
||||
<?php ActiveForm::end() ?> |
||||
``` |
||||
|
||||
Es importante recordad que agregues la opción `enctype` al formulario para que el archivo pueda ser subido apropiadamente. |
||||
La llamada a `fileInput()` renderizará un tag `<input type="file">` que le permitirá al usuario seleccionar el archivo a subir. |
||||
|
||||
> Tip: desde la versión 2.0.8, [[yii\widgets\ActiveField::fileInput|fileInput]] agrega la opción `enctype` al formulario |
||||
automáticamente cuando se utiliza una campo de subida de archivo. |
||||
|
||||
## Uniendo Todo <span id="wiring-up"></span> |
||||
|
||||
Ahora, en una acción del controlador, escribe el código que una el modelo y la vista para implementar la subida de archivos: |
||||
|
||||
```php |
||||
namespace app\controllers; |
||||
|
||||
use Yii; |
||||
use yii\web\Controller; |
||||
use app\models\UploadForm; |
||||
use yii\web\UploadedFile; |
||||
|
||||
class SiteController extends Controller |
||||
{ |
||||
public function actionUpload() |
||||
{ |
||||
$model = new UploadForm(); |
||||
|
||||
if (Yii::$app->request->isPost) { |
||||
$model->imageFile = UploadedFile::getInstance($model, 'imageFile'); |
||||
if ($model->upload()) { |
||||
// el archivo se subió exitosamente |
||||
return; |
||||
} |
||||
} |
||||
|
||||
return $this->render('upload', ['model' => $model]); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
En el código anterior, cuando se envía el formulario, el método [[yii\web\UploadedFile::getInstance()]] es llamado |
||||
para representar el archivo subido como una instancia de `UploadedFile`. Entonces dependemos de la validación del modelo |
||||
para asegurarnos que el archivo subido es válido y entonces subirlo al servidor. |
||||
|
||||
|
||||
## Uploading Multiple Files <span id="uploading-multiple-files"></span> |
||||
|
||||
También puedes subir varios archivos a la vez, con algunos ajustes en el código de las subsecciones previas. |
||||
|
||||
Primero debes ajustar la clase del modelo, agregando la opción `maxFiles` en la regla de validación `file` para limitar |
||||
el número máximo de archivos a subir. Definir `maxFiles` como `0` significa que no hay límite en el número de archivos |
||||
a subir simultáneamente. El número máximo de archivos permitidos para subir simultáneamente está también limitado |
||||
por la directiva PHP [`max_file_uploads`](https://www.php.net/manual/en/ini.core.php#ini.max-file-uploads), |
||||
cuyo valor por defecto es 20. El método `upload()` debería también ser modificado para guardar los archivos uno a uno. |
||||
|
||||
```php |
||||
namespace app\models; |
||||
|
||||
use yii\base\Model; |
||||
use yii\web\UploadedFile; |
||||
|
||||
class UploadForm extends Model |
||||
{ |
||||
/** |
||||
* @var UploadedFile[] |
||||
*/ |
||||
public $imageFiles; |
||||
|
||||
public function rules() |
||||
{ |
||||
return [ |
||||
[['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; |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
En el archivo de la vista, debes agregar la opción `multiple` en la llamada a `fileInput()` de manera que el campo |
||||
pueda recibir varios archivos: |
||||
|
||||
```php |
||||
<?php |
||||
use yii\widgets\ActiveForm; |
||||
?> |
||||
|
||||
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> |
||||
|
||||
<?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?> |
||||
|
||||
<button>Enviar</button> |
||||
|
||||
<?php ActiveForm::end() ?> |
||||
``` |
||||
|
||||
Y finalmente en la acción del controlador, debes llamar `UploadedFile::getInstances()` en vez de |
||||
`UploadedFile::getInstance()` para asignar un array de instancias `UploadedFile` a `UploadForm::imageFiles`. |
||||
|
||||
```php |
||||
namespace app\controllers; |
||||
|
||||
use Yii; |
||||
use yii\web\Controller; |
||||
use app\models\UploadForm; |
||||
use yii\web\UploadedFile; |
||||
|
||||
class SiteController extends Controller |
||||
{ |
||||
public function actionUpload() |
||||
{ |
||||
$model = new UploadForm(); |
||||
|
||||
if (Yii::$app->request->isPost) { |
||||
$model->imageFiles = UploadedFile::getInstances($model, 'imageFiles'); |
||||
if ($model->upload()) { |
||||
// el archivo fue subido exitosamente |
||||
return; |
||||
} |
||||
} |
||||
|
||||
return $this->render('upload', ['model' => $model]); |
||||
} |
||||
} |
||||
``` |
@ -1,85 +0,0 @@
|
||||
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`. |
@ -1,715 +0,0 @@
|
||||
Validación de Entrada |
||||
===================== |
||||
|
||||
Como regla básica, nunca debes confiar en los datos recibidos de un usuario final y deberías validarlo siempre |
||||
antes de ponerlo en uso. |
||||
|
||||
Dado un [modelo](structure-models.md) poblado con entradas de usuarios, puedes validar esas entradas llamando al |
||||
método [[yii\base\Model::validate()]]. Dicho método devolverá un valor booleano indicando si la validación |
||||
tuvo éxito o no. En caso de que no, puedes obtener los mensajes de error de la propiedad [[yii\base\Model::errors]]. Por ejemplo, |
||||
|
||||
```php |
||||
$model = new \app\models\ContactForm(); |
||||
|
||||
// poblar los atributos del modelo desde la entrada del usuario |
||||
$model->load(\Yii::$app->request->post()); |
||||
// lo que es equivalente a: |
||||
// $model->attributes = \Yii::$app->request->post('ContactForm'); |
||||
|
||||
if ($model->validate()) { |
||||
// toda la entrada es válida |
||||
} else { |
||||
// la validación falló: $errors es un array que contienen los mensajes de error |
||||
$errors = $model->errors; |
||||
} |
||||
``` |
||||
|
||||
|
||||
## Declarar Reglas <span id="declaring-rules"></span> |
||||
|
||||
Para hacer que `validate()` realmente funcione, debes declarar reglas de validación para los atributos que planeas validar. |
||||
Esto debería hacerse sobrescribiendo el método [[yii\base\Model::rules()]]. El siguiente ejemplo muestra cómo |
||||
son declaradas las reglas de validación para el modelo `ContactForm`: |
||||
|
||||
```php |
||||
public function rules() |
||||
{ |
||||
return [ |
||||
// los atributos name, email, subject y body son obligatorios |
||||
[['name', 'email', 'subject', 'body'], 'required'], |
||||
|
||||
// el atributo email debe ser una dirección de email válida |
||||
['email', 'email'], |
||||
]; |
||||
} |
||||
``` |
||||
|
||||
El método [[yii\base\Model::rules()|rules()]] debe devolver un array de reglas, la cual cada una |
||||
tiene el siguiente formato: |
||||
|
||||
```php |
||||
[ |
||||
// requerido, especifica qué atributos deben ser validados por esta regla. |
||||
// Para un sólo atributo, puedes utilizar su nombre directamente |
||||
// sin tenerlo dentro de un array |
||||
['attribute1', 'attribute2', ...], |
||||
|
||||
// requerido, especifica de qué tipo es la regla. |
||||
// Puede ser un nombre de clase, un alias de validador, o el nombre de un método de validación |
||||
'validator', |
||||
|
||||
// opcional, especifica en qué escenario/s esta regla debe aplicarse |
||||
// si no se especifica, significa que la regla se aplica en todos los escenarios |
||||
// Puedes también configurar la opción "except" en caso de que quieras aplicar la regla |
||||
// en todos los escenarios salvo los listados |
||||
'on' => ['scenario1', 'scenario2', ...], |
||||
|
||||
// opcional, especifica atributos adicionales para el objeto validador |
||||
'property1' => 'value1', 'property2' => 'value2', ... |
||||
] |
||||
``` |
||||
|
||||
Por cada regla debes especificar al menos a cuáles atributos aplica la regla y cuál es el tipo de la regla. |
||||
Puedes especificar el tipo de regla de las siguientes maneras: |
||||
|
||||
* el alias de un validador propio del framework, tal como `required`, `in`, `date`, etc. Por favor consulta |
||||
[Validadores del núcleo](tutorial-core-validators.md) para la lista completa de todos los validadores incluidos. |
||||
* el nombre de un método de validación en la clase del modelo, o una función anónima. Consulta la |
||||
subsección [Validadores en Línea](#inline-validators) para más detalles. |
||||
* el nombre completo de una clase de validador. Por favor consulta la subsección [Validadores Independientes](#standalone-validators) |
||||
para más detalles. |
||||
|
||||
Una regla puede ser utilizada para validar uno o varios atributos, y un atributo puede ser validado por una o varias reglas. |
||||
Una regla puede ser aplicada en ciertos [escenarios](structure-models.md#scenarios) con tan sólo especificando la opción `on`. |
||||
Si no especificas una opción `on`, significa que la regla se aplicará en todos los escenarios. |
||||
|
||||
Cuando el método `validate()` es llamado, este sigue los siguientes pasos para realiza la validación: |
||||
|
||||
1. Determina cuáles atributos deberían ser validados obteniendo la lista de atributos de [[yii\base\Model::scenarios()]] |
||||
utilizando el [[yii\base\Model::scenario|scenario]] actual. Estos atributos son llamados *atributos activos*. |
||||
2. Determina cuáles reglas de validación deberían ser validados obteniendo la lista de reglas de [[yii\base\Model::rules()]] |
||||
utilizando el [[yii\base\Model::scenario|scenario]] actual. Estas reglas son llamadas *reglas activas*. |
||||
3. Utiliza cada regla activa para validar cada atributo activo que esté asociado a la regla. |
||||
Las reglas de validación son evaluadas en el orden en que están listadas. |
||||
|
||||
De acuerdo a los pasos de validación mostrados arriba, un atributo será validado si y sólo si |
||||
es un atributo activo declarado en `scenarios()` y está asociado a una o varias reglas activas |
||||
declaradas en `rules()`. |
||||
|
||||
> Note: Es práctico darle nombre a las reglas, por ej: |
||||
> |
||||
> ```php |
||||
> public function rules() |
||||
> { |
||||
> return [ |
||||
> // ... |
||||
> 'password' => [['password'], 'string', 'max' => 60], |
||||
> ]; |
||||
> } |
||||
> ``` |
||||
> |
||||
> Puedes utilizarlas en una subclase del modelo: |
||||
> |
||||
> ```php |
||||
> public function rules() |
||||
> { |
||||
> $rules = parent::rules(); |
||||
> unset($rules['password']); |
||||
> return $rules; |
||||
> } |
||||
|
||||
|
||||
### Personalizar Mensajes de Error <span id="customizing-error-messages"></span> |
||||
|
||||
La mayoría de los validadores tienen mensajes de error por defecto que serán agregados al modelo siendo validado cuando sus atributos |
||||
fallan la validación. Por ejemplo, el validador [[yii\validators\RequiredValidator|required]] agregará |
||||
el mensaje "Username no puede estar vacío." a un modelo cuando falla la validación del atributo `username` al utilizar esta regla. |
||||
|
||||
Puedes especificar el mensaje de error de una regla especificado la propiedad `message` al declarar la regla, |
||||
como a continuación, |
||||
|
||||
```php |
||||
public function rules() |
||||
{ |
||||
return [ |
||||
['username', 'required', 'message' => 'Por favor escoge un nombre de usuario.'], |
||||
]; |
||||
} |
||||
``` |
||||
|
||||
Algunos validadores pueden soportar mensajes de error adicionales para describir más precisamente las causas |
||||
del fallo de validación. Por ejemplo, el validador [[yii\validators\NumberValidator|number]] soporta |
||||
[[yii\validators\NumberValidator::tooBig|tooBig]] y [[yii\validators\NumberValidator::tooSmall|tooSmall]] |
||||
para describir si el fallo de validación es porque el valor siendo validado es demasiado grande o demasiado pequeño, respectivamente. |
||||
Puedes configurar estos mensajes de error tal como cualquier otroa propiedad del validador en una regla de validación. |
||||
|
||||
|
||||
### Eventos de Validación <span id="validation-events"></span> |
||||
|
||||
Cuando el método [[yii\base\Model::validate()]] es llamado, este llamará a dos métodos que puedes sobrescribir para personalizar |
||||
el proceso de validación: |
||||
|
||||
* [[yii\base\Model::beforeValidate()]]: la implementación por defecto lanzará un evento [[yii\base\Model::EVENT_BEFORE_VALIDATE]]. |
||||
Puedes tanto sobrescribir este método o responder a este evento para realizar algún trabajo de pre procesamiento |
||||
(por ej. normalizar datos de entrada) antes de que ocurra la validación en sí. El método debe devolver un booleano que indique |
||||
si la validación debe continuar o no. |
||||
* [[yii\base\Model::afterValidate()]]: la implementación por defecto lanzará un evento [[yii\base\Model::EVENT_AFTER_VALIDATE]]. |
||||
uedes tanto sobrescribir este método o responder a este evento para realizar algún trabajo de post procesamiento después |
||||
de completada la validación. |
||||
|
||||
|
||||
### Validación Condicional <span id="conditional-validation"></span> |
||||
|
||||
Para validar atributos sólo en determinadas condiciones, por ej. la validación de un atributo depende |
||||
del valor de otro atributo puedes utilizar la propiedad [[yii\validators\Validator::when|when]] |
||||
para definir la condición. Por ejemplo, |
||||
|
||||
```php |
||||
['state', 'required', 'when' => function($model) { |
||||
return $model->country == 'USA'; |
||||
}] |
||||
``` |
||||
|
||||
La propiedad [[yii\validators\Validator::when|when]] toma un método invocable PHP con la siguiente firma: |
||||
|
||||
```php |
||||
/** |
||||
* @param Model $model el modelo siendo validado |
||||
* @param string $attribute al atributo siendo validado |
||||
* @return bool si la regla debe ser aplicada o no |
||||
*/ |
||||
function ($model, $attribute) |
||||
``` |
||||
|
||||
Si también necesitas soportar validación condicional del lado del cliente, debes configurar |
||||
la propiedad [[yii\validators\Validator::whenClient|whenClient]], que toma un string que representa una función JavaScript |
||||
cuyo valor de retorno determina si debe aplicarse la regla o no. Por ejemplo, |
||||
|
||||
```php |
||||
['state', 'required', 'when' => function ($model) { |
||||
return $model->country == 'USA'; |
||||
}, 'whenClient' => "function (attribute, value) { |
||||
return $('#country').val() == 'USA'; |
||||
}"] |
||||
``` |
||||
|
||||
|
||||
### Filtro de Datos <span id="data-filtering"></span> |
||||
|
||||
La entrada del usuario a menudo debe ser filtrada o pre procesada. Por ejemplo, podrías querer eliminar los espacions alrededor |
||||
de la entrada `username`. Puedes utilizar reglas de validación para lograrlo. |
||||
|
||||
Los siguientes ejemplos muestran cómo eliminar esos espacios en la entrada y cómo transformar entradas vacías en `null` utilizando |
||||
los validadores del framework [trim](tutorial-core-validators.md#trim) y [default](tutorial-core-validators.md#default): |
||||
|
||||
```php |
||||
return [ |
||||
[['username', 'email'], 'trim'], |
||||
[['username', 'email'], 'default'], |
||||
]; |
||||
``` |
||||
|
||||
También puedes utilizar el validador más general [filter](tutorial-core-validators.md#filter) para realizar filtros |
||||
de datos más complejos. |
||||
|
||||
Como puedes ver, estas reglas de validación no validan la entrada realmente. En cambio, procesan los valores |
||||
y los guardan en el atributo siendo validado. |
||||
|
||||
|
||||
### Manejando Entradas Vacías <span id="handling-empty-inputs"></span> |
||||
|
||||
Cuando los datos de entrada son enviados desde formularios HTML, a menudo necesitas asignar algunos valores por defecto a las entradas |
||||
si estas están vacías. Puedes hacerlo utilizando el validador [default](tutorial-core-validators.md#default). Por ejemplo, |
||||
|
||||
```php |
||||
return [ |
||||
// convierte "username" y "email" en `null` si estos están vacíos |
||||
[['username', 'email'], 'default'], |
||||
|
||||
// convierte "level" a 1 si está vacío |
||||
['level', 'default', 'value' => 1], |
||||
]; |
||||
``` |
||||
|
||||
Por defecto, una entrada se considera vacía si su valor es un string vacío, un array vacío o `null`. |
||||
Puedes personalizar la lógica de detección de valores vacíos configurando la propiedad [[yii\validators\Validator::isEmpty]] |
||||
con una función PHP invocable. Por ejemplo, |
||||
|
||||
```php |
||||
['agree', 'required', 'isEmpty' => function ($value) { |
||||
return empty($value); |
||||
}] |
||||
``` |
||||
|
||||
> Note: La mayoría de los validadores no manejan entradas vacías si su propiedad [[yii\validators\Validator::skipOnEmpty]] toma |
||||
el valor por defecto `true`. Estas serán simplemente salteadas durante la validación si sus atributos asociados reciben una entrada vacía. |
||||
Entre los [validadores del framework](tutorial-core-validators.md), sólo `captcha`, `default`, `filter`, |
||||
`required`, y `trim` manejarán entradas vacías. |
||||
|
||||
|
||||
## Validación Ad Hoc <span id="ad-hoc-validation"></span> |
||||
|
||||
A veces necesitas realizar *validación ad hoc* para valores que no están ligados a ningún modelo. |
||||
|
||||
Si sólo necesitas realizar un tipo de validación (por ej: validar direcciones de email), podrías llamar |
||||
al método [[yii\validators\Validator::validate()|validate()]] de los validadores deseados, como a continuación: |
||||
|
||||
```php |
||||
$email = 'test@example.com'; |
||||
$validator = new yii\validators\EmailValidator(); |
||||
|
||||
if ($validator->validate($email, $error)) { |
||||
echo 'Email válido.'; |
||||
} else { |
||||
echo $error; |
||||
} |
||||
``` |
||||
|
||||
> Note: No todos los validadores soportan este tipo de validación. Un ejemplo es el validador del framework [unique](tutorial-core-validators.md#unique), |
||||
que está diseñado para trabajar sólo con un modelo. |
||||
|
||||
Si necesitas realizar varias validaciones contro varios valores, puedes utilizar [[yii\base\DynamicModel]], |
||||
que soporta declarar tanto los atributos como las reglas sobre la marcha. Su uso es como a continuación: |
||||
|
||||
```php |
||||
public function actionSearch($name, $email) |
||||
{ |
||||
$model = DynamicModel::validateData(compact('name', 'email'), [ |
||||
[['name', 'email'], 'string', 'max' => 128], |
||||
['email', 'email'], |
||||
]); |
||||
|
||||
if ($model->hasErrors()) { |
||||
// validación fallida |
||||
} else { |
||||
// validación exitosa |
||||
} |
||||
} |
||||
``` |
||||
|
||||
El método [[yii\base\DynamicModel::validateData()]] crea una instancia de `DynamicModel`, define los atributos |
||||
utilizando los datos provistos (`name` e `email` en este ejemplo), y entonces llama a [[yii\base\Model::validate()]] |
||||
con las reglas provistas. |
||||
|
||||
Alternativamente, puedes utilizar la sintaxis más "clásica" para realizar la validación ad hoc: |
||||
|
||||
```php |
||||
public function actionSearch($name, $email) |
||||
{ |
||||
$model = new DynamicModel(compact('name', 'email')); |
||||
$model->addRule(['name', 'email'], 'string', ['max' => 128]) |
||||
->addRule('email', 'email') |
||||
->validate(); |
||||
|
||||
if ($model->hasErrors()) { |
||||
// validación fallida |
||||
} else { |
||||
// validación exitosa |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Después de la validación, puedes verificar si la validación tuvo éxito o no llamando al |
||||
método [[yii\base\DynamicModel::hasErrors()|hasErrors()]], obteniendo así los errores de validación de la |
||||
propiedad [[yii\base\DynamicModel::errors|errors]], como haces con un modelo normal. |
||||
Puedes también acceder a los atributos dinámicos definidos a través de la instancia del modelo, por ej., |
||||
`$model->name` y `$model->email`. |
||||
|
||||
|
||||
## Crear Validadores <span id="creating-validators"></span> |
||||
|
||||
Además de los [validadores del framework](tutorial-core-validators.md) incluidos en los lanzamientos de Yii, puedes también |
||||
crear tus propios validadores. Puedes crear validadores en línea o validadores independientes. |
||||
|
||||
|
||||
### Validadores en Línea <span id="inline-validators"></span> |
||||
|
||||
Un validador en línea es uno definido en términos del método de un modelo o una función anónima. La firma |
||||
del método/función es: |
||||
|
||||
```php |
||||
/** |
||||
* @param string $attribute el atributo siendo validado actualmente |
||||
* @param mixed $params el valor de los "parámetros" dados en la regla |
||||
*/ |
||||
function ($attribute, $params) |
||||
``` |
||||
|
||||
Si falla la validación de un atributo, el método/función debería llamar a [[yii\base\Model::addError()]] para guardar |
||||
el mensaje de error en el modelo de manera que pueda ser recuperado más tarde y presentado a los usuarios finales. |
||||
|
||||
Debajo hay algunos ejemplos: |
||||
|
||||
```php |
||||
use yii\base\Model; |
||||
|
||||
class MyForm extends Model |
||||
{ |
||||
public $country; |
||||
public $token; |
||||
|
||||
public function rules() |
||||
{ |
||||
return [ |
||||
// un validador en línea definido como el método del modelo validateCountry() |
||||
['country', 'validateCountry'], |
||||
|
||||
// un validador en línea definido como una función anónima |
||||
['token', function ($attribute, $params) { |
||||
if (!ctype_alnum($this->$attribute)) { |
||||
$this->addError($attribute, 'El token debe contener letras y dígitos.'); |
||||
} |
||||
}], |
||||
]; |
||||
} |
||||
|
||||
public function validateCountry($attribute, $params) |
||||
{ |
||||
if (!in_array($this->$attribute, ['USA', 'Web'])) { |
||||
$this->addError($attribute, 'El país debe ser "USA" o "Web".'); |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
> Note: Por defecto, los validadores en línea no serán aplicados si sus atributos asociados reciben entradas vacías |
||||
o si alguna de sus reglas de validación ya falló. Si quieres asegurarte de que una regla siempre sea aplicada, |
||||
puedes configurar las reglas [[yii\validators\Validator::skipOnEmpty|skipOnEmpty]] y/o [[yii\validators\Validator::skipOnError|skipOnError]] |
||||
como `false` en las declaraciones de las reglas. Por ejemplo: |
||||
> |
||||
> ```php |
||||
> [ |
||||
> ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false], |
||||
> ] |
||||
> ``` |
||||
|
||||
|
||||
### Validadores Independientes <span id="standalone-validators"></span> |
||||
|
||||
Un validador independiente es una clase que extiende de [[yii\validators\Validator]] o sus sub clases. Puedes implementar |
||||
su lógica de validación sobrescribiendo el método [[yii\validators\Validator::validateAttribute()]]. Si falla la validación |
||||
de un atributo, llama a [[yii\base\Model::addError()]] para guardar el mensaje de error en el modelo, tal como haces |
||||
con los [validadores en línea](#inline-validators). |
||||
|
||||
|
||||
Por ejemplo, el validador en línea de arriba podría ser movida a una nueva clase [[components/validators/CountryValidator]]. |
||||
|
||||
```php |
||||
namespace app\components; |
||||
|
||||
use yii\validators\Validator; |
||||
|
||||
class CountryValidator extends Validator |
||||
{ |
||||
public function validateAttribute($model, $attribute) |
||||
{ |
||||
if (!in_array($model->$attribute, ['USA', 'Web'])) { |
||||
$this->addError($model, $attribute, 'El país debe ser "USA" o "Web".'); |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Si quieres que tu validador soporte la validación de un valor sin modelo, deberías también sobrescribir |
||||
el método[[yii\validators\Validator::validate()]]. Puedes también sobrescribir [[yii\validators\Validator::validateValue()]] |
||||
en vez de `validateAttribute()` y `validate()` porque por defecto los últimos dos métodos son implementados |
||||
llamando a `validateValue()`. |
||||
|
||||
Debajo hay un ejemplo de cómo podrías utilizar la clase del validador de arriba dentro de tu modelo. |
||||
|
||||
```php |
||||
namespace app\models; |
||||
|
||||
use Yii; |
||||
use yii\base\Model; |
||||
use app\components\validators\CountryValidator; |
||||
|
||||
class EntryForm extends Model |
||||
{ |
||||
public $name; |
||||
public $email; |
||||
public $country; |
||||
|
||||
public function rules() |
||||
{ |
||||
return [ |
||||
[['name', 'email'], 'required'], |
||||
['country', CountryValidator::class], |
||||
['email', 'email'], |
||||
]; |
||||
} |
||||
} |
||||
``` |
||||
|
||||
|
||||
## Validación del Lado del Cliente <span id="client-side-validation"></span> |
||||
|
||||
La validación del lado del cliente basada en JavaScript es deseable cuando la entrada del usuario proviene de formularios HTML, dado que |
||||
permite a los usuarios encontrar errores más rápido y por lo tanto provee una mejor experiencia. Puedes utilizar o implementar |
||||
un validador que soporte validación del lado del cliente *en adición a* validación del lado del servidor. |
||||
|
||||
> Info: Si bien la validación del lado del cliente es deseable, no es una necesidad. Su principal propósito es proveer al usuario una mejor |
||||
experiencia. Al igual que datos de entrada que vienen del los usuarios finales, nunca deberías confiar en la validación del lado del cliente. Por esta razón, |
||||
deberías realizar siempre la validación del lado del servidor llamando a [[yii\base\Model::validate()]], como |
||||
se describió en las subsecciones previas. |
||||
|
||||
|
||||
### Utilizar Validación del Lado del Cliente <span id="using-client-side-validation"></span> |
||||
|
||||
Varios [validadores del framework](tutorial-core-validators.md) incluyen validación del lado del cliente. Todo lo que necesitas hacer |
||||
es solamente utilizar [[yii\widgets\ActiveForm]] para construir tus formularios HTML. Por ejemplo, `LoginForm` mostrado abajo declara dos |
||||
reglas: una utiliza el validador del framework [required](tutorial-core-validators.md#required), el cual es soportado tanto en |
||||
lado del cliente como del servidor; y el otro usa el validador en línea `validatePassword`, que es sólo soportado de lado |
||||
del servidor. |
||||
|
||||
```php |
||||
namespace app\models; |
||||
|
||||
use yii\base\Model; |
||||
use app\models\User; |
||||
|
||||
class LoginForm extends Model |
||||
{ |
||||
public $username; |
||||
public $password; |
||||
|
||||
public function rules() |
||||
{ |
||||
return [ |
||||
// username y password son ambos requeridos |
||||
[['username', 'password'], 'required'], |
||||
|
||||
// password es validado por validatePassword() |
||||
['password', 'validatePassword'], |
||||
]; |
||||
} |
||||
|
||||
public function validatePassword() |
||||
{ |
||||
$user = User::findByUsername($this->username); |
||||
|
||||
if (!$user || !$user->validatePassword($this->password)) { |
||||
$this->addError('password', 'Username o password incorrecto.'); |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
El formulario HTML creado en el siguiente código contiene dos campos de entrada: `username` y `password`. |
||||
Si envias el formulario sin escribir nada, encontrarás que los mensajes de error requiriendo que |
||||
escribas algo aparecen sin que haya comunicación alguna con el servidor. |
||||
|
||||
```php |
||||
<?php $form = yii\widgets\ActiveForm::begin(); ?> |
||||
<?= $form->field($model, 'username') ?> |
||||
<?= $form->field($model, 'password')->passwordInput() ?> |
||||
<?= Html::submitButton('Login') ?> |
||||
<?php yii\widgets\ActiveForm::end(); ?> |
||||
``` |
||||
|
||||
Detrás de escena, [[yii\widgets\ActiveForm]] leerá las reglas de validación declaradas en el modelo |
||||
y generará el código JavaScript apropiado para los validadores que soportan validación del lado del cliente. Cuando un usuario |
||||
cambia el valor de un campo o envia el formulario, se lanzará la validación JavaScript del lado del cliente. |
||||
|
||||
Si quieres deshabilitar la validación del lado del cliente completamente, puedes configurar |
||||
la propiedad [[yii\widgets\ActiveForm::enableClientValidation]] como `false`. También puedes deshabilitar la validación |
||||
del lado del cliente de campos individuales configurando su propiedad [[yii\widgets\ActiveField::enableClientValidation]] |
||||
como `false`. Cuando `enableClientValidation` es configurado tanto a nivel de campo como a nivel de formulario, |
||||
tendrá prioridad la primera. |
||||
|
||||
### Implementar Validación del Lado del Cliente <span id="implementing-client-side-validation"></span> |
||||
|
||||
|
||||
Para crear validadores que soportan validación del lado del cliente, debes implementar |
||||
el método [[yii\validators\Validator::clientValidateAttribute()]], que devuelve una pieza de código JavaScript |
||||
que realiza dicha validación. Dentro del código JavaScript, puedes utilizar las siguientes |
||||
variables predefinidas: |
||||
|
||||
- `attribute`: el nombre del atributo siendo validado. |
||||
- `value`: el valor siendo validado. |
||||
- `messages`: un array utilizado para contener los mensajes de error de validación para el atributo. |
||||
- `deferred`: un array con objetos diferidos puede ser insertado (explicado en la subsección siguiente). |
||||
|
||||
En el siguiente ejemplo, creamos un `StatusValidator` que valida si la entrada es un status válido |
||||
contra datos de status existentes. El validador soporta tato tanto validación del lado del servidor como del lado del cliente. |
||||
|
||||
```php |
||||
namespace app\components; |
||||
|
||||
use yii\validators\Validator; |
||||
use app\models\Status; |
||||
|
||||
class StatusValidator extends Validator |
||||
{ |
||||
public function init() |
||||
{ |
||||
parent::init(); |
||||
$this->message = 'Entrada de Status Inválida.'; |
||||
} |
||||
|
||||
public function validateAttribute($model, $attribute) |
||||
{ |
||||
$value = $model->$attribute; |
||||
if (!Status::find()->where(['id' => $value])->exists()) { |
||||
$model->addError($attribute, $this->message); |
||||
} |
||||
} |
||||
|
||||
public function clientValidateAttribute($model, $attribute, $view) |
||||
{ |
||||
$statuses = json_encode(Status::find()->select('id')->asArray()->column()); |
||||
$message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); |
||||
return <<<JS |
||||
if ($.inArray(value, $statuses) === -1) { |
||||
messages.push($message); |
||||
} |
||||
JS; |
||||
} |
||||
} |
||||
``` |
||||
|
||||
> Tip: El código de arriba muestra principalmente cómo soportar validación del lado del cliente. En la práctica, |
||||
> puedes utilizar el validador del framework [in](tutorial-core-validators.md#in) para alcanzar el mismo objetivo. Puedes |
||||
> escribir la regla de validación como a como a continuación: |
||||
> |
||||
> ```php |
||||
> [ |
||||
> ['status', 'in', 'range' => Status::find()->select('id')->asArray()->column()], |
||||
> ] |
||||
> ``` |
||||
|
||||
> Tip: Si necesitas trabajar con validación del lado del cliente manualmente, por ejemplo, agregar campos dinámicamente o realizar alguna lógica de UI, |
||||
> consulta [Trabajar con ActiveForm vía JavaScript](https://github.com/samdark/yii2-cookbook/blob/master/book/forms-activeform-js.md) |
||||
> en el Yii 2.0 Cookbook. |
||||
|
||||
### Validación Diferida <span id="deferred-validation"></span> |
||||
|
||||
Si necesitas realizar validación del lado del cliente asincrónica, puedes crear [Objetos Diferidos](https://api.jquery.com/category/deferred-object/). |
||||
Por ejemplo, para realizar validación AJAX personalizada, puedes utilizar el siguiente código: |
||||
|
||||
```php |
||||
public function clientValidateAttribute($model, $attribute, $view) |
||||
{ |
||||
return <<<JS |
||||
deferred.push($.get("/check", {value: value}).done(function(data) { |
||||
if ('' !== data) { |
||||
messages.push(data); |
||||
} |
||||
})); |
||||
JS; |
||||
} |
||||
``` |
||||
|
||||
Arriba, la variable `deferred` es provista por Yii, y es un array de Objetos Diferidos. El método `$.get()` |
||||
de jQuery crea un Objeto Diferido, el cual es insertado en el array `deferred`. |
||||
|
||||
Puedes también crear un Objeto Diferito explícitamente y llamar a su método `resolve()` cuando la llamada asincrónica |
||||
tiene lugar. El siguiente ejemplo muestra cómo validar las dimensiones de un archivo de imagen del lado del cliente. |
||||
|
||||
```php |
||||
public function clientValidateAttribute($model, $attribute, $view) |
||||
{ |
||||
return <<<JS |
||||
var def = $.Deferred(); |
||||
var img = new Image(); |
||||
img.onload = function() { |
||||
if (this.width > 150) { |
||||
messages.push('Imagen demasiado ancha!!'); |
||||
} |
||||
def.resolve(); |
||||
} |
||||
var reader = new FileReader(); |
||||
reader.onloadend = function() { |
||||
img.src = reader.result; |
||||
} |
||||
reader.readAsDataURL(file); |
||||
|
||||
deferred.push(def); |
||||
JS; |
||||
} |
||||
``` |
||||
|
||||
> Note: El método `resolve()` debe ser llamado después de que el atributo ha sido validado. De otra manera la validación |
||||
principal del formulario no será completada. |
||||
|
||||
Por simplicidad, el array `deferred` está equipado con un método de atajo, `add()`, que automáticamente crea un |
||||
Objeto Diferido y lo agrega al array `deferred`. Utilizando este método, puedes simplificar el ejemplo de arriba de esta manera, |
||||
|
||||
```php |
||||
public function clientValidateAttribute($model, $attribute, $view) |
||||
{ |
||||
return <<<JS |
||||
deferred.add(function(def) { |
||||
var img = new Image(); |
||||
img.onload = function() { |
||||
if (this.width > 150) { |
||||
messages.push('Imagen demasiado ancha!!'); |
||||
} |
||||
def.resolve(); |
||||
} |
||||
var reader = new FileReader(); |
||||
reader.onloadend = function() { |
||||
img.src = reader.result; |
||||
} |
||||
reader.readAsDataURL(file); |
||||
}); |
||||
JS; |
||||
} |
||||
``` |
||||
|
||||
|
||||
### Validación AJAX <span id="ajax-validation"></span> |
||||
|
||||
Algunas validaciones sólo pueden realizarse del lado del servidor, debido a que sólo el servidor tiene la información necesaria. |
||||
Por ejemplo, para validar si un nombre de usuario es único o no, es necesario revisar la tabla de usuarios del lado del servidor. |
||||
Puedes utilizar validación basada en AJAX en este caso. Esta lanzará una petición AJAX de fondo para validar |
||||
la entrada mientras se mantiene la misma experiencia de usuario como en una validación del lado del cliente regular. |
||||
|
||||
Para habilitar la validación AJAX individualmente un campo de entrada, configura la propiedad [[yii\widgets\ActiveField::enableAjaxValidation|enableAjaxValidation]] |
||||
de ese campo como `true` y especifica un único `id` de formulario: |
||||
|
||||
```php |
||||
use yii\widgets\ActiveForm; |
||||
|
||||
$form = ActiveForm::begin([ |
||||
'id' => 'registration-form', |
||||
]); |
||||
|
||||
echo $form->field($model, 'username', ['enableAjaxValidation' => true]); |
||||
|
||||
// ... |
||||
|
||||
ActiveForm::end(); |
||||
``` |
||||
|
||||
Para habiliar la validación AJAX en el formulario entero, configura [[yii\widgets\ActiveForm::enableAjaxValidation|enableAjaxValidation]] |
||||
como `true` a nivel del formulario: |
||||
|
||||
```php |
||||
$form = ActiveForm::begin([ |
||||
'id' => 'contact-form', |
||||
'enableAjaxValidation' => true, |
||||
]); |
||||
``` |
||||
|
||||
> Note: Cuando la propiedad `enableAjaxValidation` es configurada tanto a nivel de campo como a nivel de formulario, |
||||
la primera tendrá prioridad. |
||||
|
||||
Necesitas también preparar el servidor para que pueda manejar las peticiones AJAX. |
||||
Esto puede alcanzarse con una porción de código como la siguiente en las acciones del controlador: |
||||
|
||||
```php |
||||
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { |
||||
Yii::$app->response->format = Response::FORMAT_JSON; |
||||
return ActiveForm::validate($model); |
||||
} |
||||
``` |
||||
|
||||
El código de arriba chequeará si la petición actual es AJAX o no. Si lo es, responderá |
||||
esta petición ejecutando la validación y devolviendo los errores en formato JSON. |
||||
|
||||
> Info: Puedes también utilizar [Validación Diferida](#deferred-validation) para realizar validación AJAX. |
||||
De todos modos, la característica de validación AJAX descrita aquí es más sistemática y requiere menos esfuerzo de escritura de código. |
||||
|
||||
Cuando tanto `enableClientValidation` como `enableAjaxValidation` son definidas como `true`, la petición de validación AJAX será lanzada |
||||
sólo después de una validación del lado del cliente exitosa. |
@ -1,98 +0,0 @@
|
||||
Trabajar con Scripts del Cliente |
||||
================================ |
||||
|
||||
> Note: Esta sección se encuentra en desarrollo. |
||||
|
||||
### Registrar scripts |
||||
|
||||
Con el objeto [[yii\web\View]] puedes registrar scripts. Hay dos métodos dedicados a esto: |
||||
[[yii\web\View::registerJs()|registerJs()]] para scripts en línea |
||||
[[yii\web\View::registerJsFile()|registerJsFile()]] para scripts externos. |
||||
Los scripts en línea son útiles para configuración y código generado dinámicamente. |
||||
El método para agregarlos puede ser utilizado así: |
||||
|
||||
```php |
||||
$this->registerJs("var options = ".json_encode($options).";", View::POS_END, 'my-options'); |
||||
``` |
||||
|
||||
El primer argumento es el código JS real que queremos insertar en la página. El segundo argumento |
||||
determina en qué parte de la página debería ser insertado el script. Los valores posibles son: |
||||
|
||||
- [[yii\web\View::POS_HEAD|View::POS_HEAD]] para la sección head. |
||||
- [[yii\web\View::POS_BEGIN|View::POS_BEGIN]] justo después de la etiqueta `<body>`. |
||||
- [[yii\web\View::POS_END|View::POS_END]] justo antes de cerrar la etiqueta `</body>`. |
||||
- [[yii\web\View::POS_READY|View::POS_READY]] para ejecutar código en el evento `ready` del documento. Esto registrará [[yii\web\JqueryAsset|jQuery]] automáticamente. |
||||
- [[yii\web\View::POS_LOAD|View::POS_LOAD]] para ejecutar código en el evento `load` del documento. Esto registrará [[yii\web\JqueryAsset|jQuery]] automáticamente. |
||||
|
||||
El último argumento es un ID único del script, utilizado para identificar el bloque de código y reemplazar otro con el mismo ID |
||||
en vez de agregar uno nuevo. En caso de no proveerlo, el código JS en sí será utilizado como ID. |
||||
|
||||
Un script externo puede ser agregado de esta manera: |
||||
|
||||
```php |
||||
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::class]]); |
||||
``` |
||||
|
||||
Los argumentos para [[yii\web\View::registerJsFile()|registerJsFile()]] son similares a los de |
||||
[[yii\web\View::registerCssFile()|registerCssFile()]]. En el ejemplo anterior, |
||||
registramos el archivo `main.js` con dependencia de `JqueryAsset`. Esto quiere decir que el archivo `main.js` |
||||
será agregado DESPUÉS de `jquery.js`. Si esta especificación de dependencia, el orden relativo entre |
||||
`main.js` y `jquery.js` sería indefinido. |
||||
|
||||
Como para [[yii\web\View::registerCssFile()|registerCssFile()]], es altamente recomendable que utilices |
||||
[asset bundles](structure-assets.md) para registrar archivos JS externos más que utilizar [[yii\web\View::registerJsFile()|registerJsFile()]]. |
||||
|
||||
|
||||
### Registrar asset bundles |
||||
|
||||
Como mencionamos anteriormente, es preferible utilizar asset bundles en vez de usar CSS y JavaScript directamente. Puedes obtener detalles |
||||
de cómo definir asset bundles en la sección [gestor de assets](structure-assets.md) de esta guía. Utilizar asset bundles |
||||
ya definidos es muy sencillo: |
||||
|
||||
```php |
||||
\frontend\assets\AppAsset::register($this); |
||||
``` |
||||
|
||||
|
||||
|
||||
### Registrar CSS |
||||
|
||||
Puedes registrar CSS utilizando [[yii\web\View::registerCss()|registerCss()]] o [[yii\web\View::registerCssFile()|registerCssFile()]]. |
||||
El primero registra un bloque de código CSS mientras que el segundo registra un archivo CSS externo. Por ejemplo, |
||||
|
||||
```php |
||||
$this->registerCss("body { background: #f00; }"); |
||||
``` |
||||
|
||||
El código anterior dará como resultado que se agregue lo siguiente a la sección head de la página: |
||||
|
||||
```html |
||||
<style> |
||||
body { background: #f00; } |
||||
</style> |
||||
``` |
||||
|
||||
Si quieres especificar propiedades adicionales a la etiqueta style, pasa un array de claves-valores como tercer argumento. |
||||
Si necesitas asegurarte que haya sólo una etiqueta style utiliza el cuarto argumento como fue mencionado en las descripciones de meta etiquetas. |
||||
|
||||
```php |
||||
$this->registerCssFile("http://example.com/css/themes/black-and-white.css", [ |
||||
'depends' => [BootstrapAsset::class], |
||||
'media' => 'print', |
||||
], 'css-print-theme'); |
||||
``` |
||||
|
||||
El código de arriba agregará un link al archivo CSS en la sección head de la página. |
||||
|
||||
* El primer argumento especifica el archivo CSS a ser registrado. |
||||
* El segundo argumento especifica los atributos HTML de la etiqueta `<link>` resultante. La opción `depends` |
||||
es especialmente tratada. Esta especifica de qué asset bundles depende este archivo CSS. En este caso, depende |
||||
del asset bundle [[yii\bootstrap\BootstrapAsset|BootstrapAsset]]. Esto significa que el archivo CSS será agregado |
||||
*después* de los archivos CSS de [[yii\bootstrap\BootstrapAsset|BootstrapAsset]]. |
||||
* El último argumento especifica un ID que identifica al archivo CSS. Si no es provisto, se utilizará la URL |
||||
del archivo. |
||||
|
||||
|
||||
Es altamente recomendable que ustilices [asset bundles](structure-assets.md) para registrar archivos CSS en vez de |
||||
utilizar [[yii\web\View::registerCssFile()|registerCssFile()]]. Utilizar asset bundles te permite combinar y comprimir |
||||
varios archivos CSS, deseable en sitios web de tráfico alto. |
@ -1,421 +0,0 @@
|
||||
Proveedores de datos |
||||
==================== |
||||
|
||||
En las secciones sobre [paginación](output-pagination.md) y [ordenación](output-sorting.md) se |
||||
describe como permitir a los usuarios finales elegir que se muestre una página de datos en |
||||
particular, y ordenar los datos por algunas columnas. Como la tarea de paginar y ordenar datos |
||||
es muy común, Yii proporciona un conjunto de clases *proveedoras de datos* para encapsularla. |
||||
|
||||
Un proveedor de datos es una clase que implementa la interfaz [[yii\data\DataProviderInterface]]. |
||||
Básicamente se encarga de obtener datos paginados y ordenados. Normalmente se usa junto con |
||||
[_widgets_ de datos](output-data-widgets.md) para que los usuarios finales puedan paginar y |
||||
ordenar datos de forma interactiva. |
||||
|
||||
Yii incluye las siguientes clases proveedoras de datos: |
||||
|
||||
* [[yii\data\ActiveDataProvider]]: usa [[yii\db\Query]] o [[yii\db\ActiveQuery]] para consultar datos de bases de datos y devolverlos como _arrays_ o instancias [Active Record](db-active-record.md). |
||||
* [[yii\data\SqlDataProvider]]: ejecuta una sentencia SQL y devuelve los datos de la base de datos como _arrays_. |
||||
* [[yii\data\ArrayDataProvider]]: toma un _array_ grande y devuelve una rodaja de él basándose en las especificaciones de paginación y ordenación. |
||||
|
||||
El uso de todos estos proveedores de datos comparte el siguiente patrón común: |
||||
|
||||
```php |
||||
// Crear el proveedor de datos configurando sus propiedades de paginación y ordenación |
||||
$provider = new XyzDataProvider([ |
||||
'pagination' => [...], |
||||
'sort' => [...], |
||||
]); |
||||
|
||||
// Obtener los datos paginados y ordenados |
||||
$models = $provider->getModels(); |
||||
|
||||
// Obtener el número de elementos de la página actual |
||||
$count = $provider->getCount(); |
||||
|
||||
// Obtener el número total de elementos entre todas las páginas |
||||
$totalCount = $provider->getTotalCount(); |
||||
``` |
||||
|
||||
Se puede especificar los comportamientos de paginación y ordenación de un proveedor de datos |
||||
configurando sus propiedades [[yii\data\BaseDataProvider::pagination|pagination]] y |
||||
[[yii\data\BaseDataProvider::sort|sort]], que corresponden a las configuraciones para |
||||
[[yii\data\Pagination]] y [[yii\data\Sort]] respectivamente. También se pueden configurar a |
||||
`false` para inhabilitar las funciones de paginación y/u ordenación. |
||||
|
||||
Los [_widgets_ de datos](output-data-widgets.md), como [[yii\grid\GridView]], tienen una |
||||
propiedad llamada `dataProvider` que puede tomar una instancia de un proveedor de datos y |
||||
mostrar los datos que proporciona. Por ejemplo, |
||||
|
||||
```php |
||||
echo yii\grid\GridView::widget([ |
||||
'dataProvider' => $dataProvider, |
||||
]); |
||||
``` |
||||
|
||||
Estos proveedores de datos varían principalmente en la manera en que se especifica la fuente de |
||||
datos. En las siguientes secciones se explica el uso detallado de cada uno de estos proveedores |
||||
de datos. |
||||
|
||||
|
||||
## Proveedor de datos activo <span id="active-data-provider"></span> |
||||
|
||||
Para usar [[yii\data\ActiveDataProvider]], hay que configurar su propiedad |
||||
[[yii\data\ActiveDataProvider::query|query]]. |
||||
Puede tomar un objeto [[yii\db\Query] o [[yii\db\ActiveQuery]]. En el primer caso, los datos |
||||
devueltos serán _arrays_. En el segundo, los datos devueltos pueden ser _arrays_ o instancias de |
||||
[Active Record](db-active-record.md). Por ejemplo: |
||||
|
||||
|
||||
```php |
||||
use yii\data\ActiveDataProvider; |
||||
|
||||
$query = Post::find()->where(['state_id' => 1]); |
||||
|
||||
$provider = new ActiveDataProvider([ |
||||
'query' => $query, |
||||
'pagination' => [ |
||||
'pageSize' => 10, |
||||
], |
||||
'sort' => [ |
||||
'defaultOrder' => [ |
||||
'created_at' => SORT_DESC, |
||||
'title' => SORT_ASC, |
||||
] |
||||
], |
||||
]); |
||||
|
||||
// Devuelve un array de objetos Post |
||||
$posts = $provider->getModels(); |
||||
``` |
||||
|
||||
En el ejemplo anterior, si `$query` se crea el siguiente código, el proveedor de datos |
||||
devolverá _arrays_ en bruto. |
||||
|
||||
```php |
||||
use yii\db\Query; |
||||
|
||||
$query = (new Query())->from('post')->where(['state' => 1]); |
||||
``` |
||||
|
||||
> Note: Si una consulta ya tiene la cláusula `orderBy`, las nuevas instrucciones de ordenación |
||||
dadas por los usuarios finales (mediante la configuración de `sort`) se añadirán a la cláusula |
||||
`orderBy` previa. Las cláusulas `limit` y `offset` que pueda haber se sobrescribirán por la |
||||
petición de paginación de los usuarios finales (mediante la configuración de `pagination`). |
||||
|
||||
Por omisión, [[yii\data\ActiveDataProvider]] usa el componente `db` de la aplicación como |
||||
conexión con la base de datos. Se puede indicar una conexión con base de datos diferente |
||||
configurando la propiedad [[yii\data\ActiveDataProvider::db]]. |
||||
|
||||
|
||||
## Proveedor de datos SQL <span id="sql-data-provider"></span> |
||||
|
||||
[[yii\data\SqlDataProvider]] funciona con una sentencia SQL en bruto, que se usa para obtener |
||||
los datos requeridos. |
||||
Basándose en las especificaciones de [[yii\data\SqlDataProvider::sort|sort]] y |
||||
[[yii\data\SqlDataProvider::pagination|pagination]], el proveedor ajustará las cláusulas |
||||
`ORDER BY` y `LIMIT` de la sentencia SQL acordemente para obtener sólo la página de datos |
||||
solicitados en el orden deseado. |
||||
|
||||
Para usar [[yii\data\SqlDataProvider]], hay que especificar las propiedades |
||||
[[yii\data\SqlDataProvider::sql|sql]] y [[yii\data\SqlDataProvider::totalCount|totalCount]]. |
||||
Por ejemplo: |
||||
|
||||
```php |
||||
use yii\data\SqlDataProvider; |
||||
|
||||
$count = Yii::$app->db->createCommand(' |
||||
SELECT COUNT(*) FROM post WHERE status=:status |
||||
', [':status' => 1])->queryScalar(); |
||||
|
||||
$provider = new SqlDataProvider([ |
||||
'sql' => 'SELECT * FROM post WHERE status=:status', |
||||
'params' => [':status' => 1], |
||||
'totalCount' => $count, |
||||
'pagination' => [ |
||||
'pageSize' => 10, |
||||
], |
||||
'sort' => [ |
||||
'attributes' => [ |
||||
'title', |
||||
'view_count', |
||||
'created_at', |
||||
], |
||||
], |
||||
]); |
||||
|
||||
// Devuelve un array de filas de datos |
||||
$models = $provider->getModels(); |
||||
``` |
||||
|
||||
> Info: La propiedad [[yii\data\SqlDataProvider::totalCount|totalCount]] se requiere sólo si se |
||||
necesita paginar los datos. Esto es porque el proveedor modificará la sentencia SQL |
||||
especificada vía [[yii\data\SqlDataProvider::sql|sql]] para que devuelva sólo la pagina de |
||||
datos solicitada. El proveedor sigue necesitando saber el número total de elementos de datos |
||||
para calcular correctamente el número de páginas. |
||||
|
||||
|
||||
## Proveedor de datos de _arrays_ <span id="array-data-provider"></span> |
||||
|
||||
Se recomienda usar [[yii\data\ArrayDataProvider]] cuando se trabaja con un _array_ grande. |
||||
El proveedor permite devolver una página de los datos del _array_ ordenados por una o varias |
||||
columnas. Para usar [[yii\data\ArrayDataProvider]], hay que especificar la propiedad |
||||
[[yii\data\ArrayDataProvider::allModels|allModels]] como el _array_ grande. Los elementos |
||||
del _array_ grande pueden ser _arrays_ asociativos (por ejemplo resultados de consultas de |
||||
[DAO](db-dao.md) u objetos (por ejemplo instancias de [Active Record](db-active-record.md). |
||||
Por ejemplo: |
||||
|
||||
```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' => 10, |
||||
], |
||||
'sort' => [ |
||||
'attributes' => ['id', 'name'], |
||||
], |
||||
]); |
||||
|
||||
// Obtener las filas de la página solicitada |
||||
$rows = $provider->getModels(); |
||||
``` |
||||
|
||||
> Note: En comparación con [Active Data Provider](#active-data-provider) y |
||||
[SQL Data Provider](#sql-data-provider), Array Data Provider es menos eficiente porque |
||||
requiere cargar *todos* los datos en memoria. |
||||
|
||||
|
||||
## Trabajar con las claves de los datos <span id="working-with-keys"></span> |
||||
|
||||
Al utilizar los elementos de datos devueltos por un proveedor de datos, con frecuencia |
||||
necesita identificar cada elemento de datos con una clave única. |
||||
Por ejemplo, si los elementos de datos representan información de los clientes, puede querer |
||||
usar el ID de cliente como la clave de cada conjunto de datos de un cliente. |
||||
Los proveedores de datos pueden devolver una lista de estas claves correspondientes a los |
||||
elementos de datos devueltos por [[yii\data\DataProviderInterface::getModels()]]. |
||||
Por ejemplo: |
||||
|
||||
```php |
||||
use yii\data\ActiveDataProvider; |
||||
|
||||
$query = Post::find()->where(['status' => 1]); |
||||
|
||||
$provider = new ActiveDataProvider([ |
||||
'query' => $query, |
||||
]); |
||||
|
||||
// Devuelve un array de objetos Post |
||||
$posts = $provider->getModels(); |
||||
|
||||
// Devuelve los valores de las claves primarias correspondientes a $posts |
||||
$ids = $provider->getKeys(); |
||||
``` |
||||
|
||||
En el ejemplo superior, como se le proporciona a [[yii\data\ActiveDataProvider]] un objeto |
||||
[[yii\db\ActiveQuery]], es lo suficientemente inteligente como para devolver los valores de |
||||
las claves primarias como las claves. También puede indicar explícitamente cómo se deben |
||||
calcular los valores de la clave configurando [[yii\data\ActiveDataProvider::key]] con un |
||||
nombre de columna o un invocable que calcule los valores de la clave. Por ejemplo: |
||||
|
||||
```php |
||||
// Utiliza la columna «slug» como valores de la clave |
||||
$provider = new ActiveDataProvider([ |
||||
'query' => Post::find(), |
||||
'key' => 'slug', |
||||
]); |
||||
|
||||
// Utiliza el resultado de md5(id) como valores de la clave |
||||
$provider = new ActiveDataProvider([ |
||||
'query' => Post::find(), |
||||
'key' => function ($model) { |
||||
return md5($model->id); |
||||
} |
||||
]); |
||||
``` |
||||
|
||||
|
||||
## Creación de un proveedor de datos personalizado <span id="custom-data-provider"></span> |
||||
|
||||
Para crear su propio proveedor de datos personalizado, debe implementar |
||||
[[yii\data\DataProviderInterface]]. |
||||
Una manera más fácil es extender [[yii\data\BaseDataProvider]], que le permite centrarse |
||||
en la lógica central del proveedor de datos. En particular, esencialmente necesita |
||||
implementar los siguientes métodos: |
||||
|
||||
- [[yii\data\BaseDataProvider::prepareModels()|prepareModels()]]: prepara los modelos |
||||
de datos que estarán disponibles en la página actual y los devuelve como un _array_. |
||||
- [[yii\data\BaseDataProvider::prepareKeys()|prepareKeys()]]: acepta un _array_ de |
||||
modelos de datos disponibles actualmente y devuelve las claves asociadas a ellos. |
||||
- [[yii\data\BaseDataProvider::prepareTotalCount()|prepareTotalCount]]: devuelve un valor |
||||
que indica el número total de modelos de datos en el proveedor de datos. |
||||
|
||||
Debajo se muestra un ejemplo de un proveedor de datos que lee datos CSV eficientemente: |
||||
|
||||
```php |
||||
<?php |
||||
use yii\data\BaseDataProvider; |
||||
|
||||
class CsvDataProvider extends BaseDataProvider |
||||
{ |
||||
/** |
||||
* @var string nombre del fichero CSV a leer |
||||
*/ |
||||
public $filename; |
||||
|
||||
/** |
||||
* @var string|callable nombre de la columna clave o un invocable que la devuelva |
||||
*/ |
||||
public $key; |
||||
|
||||
/** |
||||
* @var SplFileObject |
||||
*/ |
||||
protected $fileObject; // SplFileObject es muy práctico para buscar una línea concreta en un fichero |
||||
|
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function init() |
||||
{ |
||||
parent::init(); |
||||
|
||||
// Abrir el fichero |
||||
$this->fileObject = new SplFileObject($this->filename); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function prepareModels() |
||||
{ |
||||
$models = []; |
||||
$pagination = $this->getPagination(); |
||||
|
||||
if ($pagination === false) { |
||||
// En caso de que no haya paginación, leer todas las líneas |
||||
while (!$this->fileObject->eof()) { |
||||
$models[] = $this->fileObject->fgetcsv(); |
||||
$this->fileObject->next(); |
||||
} |
||||
} else { |
||||
// En caso de que haya paginación, leer sólo una única página |
||||
$pagination->totalCount = $this->getTotalCount(); |
||||
$this->fileObject->seek($pagination->getOffset()); |
||||
$limit = $pagination->getLimit(); |
||||
|
||||
for ($count = 0; $count < $limit; ++$count) { |
||||
$models[] = $this->fileObject->fgetcsv(); |
||||
$this->fileObject->next(); |
||||
} |
||||
} |
||||
|
||||
return $models; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function prepareKeys($models) |
||||
{ |
||||
if ($this->key !== null) { |
||||
$keys = []; |
||||
|
||||
foreach ($models as $model) { |
||||
if (is_string($this->key)) { |
||||
$keys[] = $model[$this->key]; |
||||
} else { |
||||
$keys[] = call_user_func($this->key, $model); |
||||
} |
||||
} |
||||
|
||||
return $keys; |
||||
} |
||||
|
||||
return array_keys($models); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function prepareTotalCount() |
||||
{ |
||||
$count = 0; |
||||
|
||||
while (!$this->fileObject->eof()) { |
||||
$this->fileObject->next(); |
||||
++$count; |
||||
} |
||||
|
||||
return $count; |
||||
} |
||||
} |
||||
``` |
||||
|
||||
## Filtrar proveedores de datos usando filtros de datos <span id="filtering-data-providers-using-data-filters"></span> |
||||
|
||||
Si bien puede construir condiciones para un proveedor de datos activo manualmente tal |
||||
y como se describe en las secciones [Filtering Data](output-data-widgets.md#filtering-data) |
||||
y [Separate Filter Form](output-data-widgets.md#separate-filter-form) de la guía de |
||||
_widgets_ de datos, Yii tiene filtros de datos que son muy útiles si necesita |
||||
condiciones de filtro flexibles. Los filtros de datos se pueden usar así: |
||||
|
||||
```php |
||||
$filter = new ActiveDataFilter([ |
||||
'searchModel' => 'app\models\PostSearch' |
||||
]); |
||||
|
||||
$filterCondition = null; |
||||
|
||||
// Puede cargar los filtros de datos de cualquier fuente. |
||||
// Por ejemplo, si prefiere JSON en el cuerpo de la petición, |
||||
// use Yii::$app->request->getBodyParams() aquí abajo: |
||||
if ($filter->load(\Yii::$app->request->get())) { |
||||
$filterCondition = $filter->build(); |
||||
if ($filterCondition === false) { |
||||
// Serializer recibiría errores |
||||
return $filter; |
||||
} |
||||
} |
||||
|
||||
$query = Post::find(); |
||||
if ($filterCondition !== null) { |
||||
$query->andWhere($filterCondition); |
||||
} |
||||
|
||||
return new ActiveDataProvider([ |
||||
'query' => $query, |
||||
]); |
||||
``` |
||||
|
||||
El propósito del modelo `PostSearch` es definir por qué propiedades y valores se permite filtrar: |
||||
|
||||
```php |
||||
use yii\base\Model; |
||||
|
||||
class PostSearch extends Model |
||||
{ |
||||
public $id; |
||||
public $title; |
||||
|
||||
public function rules() |
||||
{ |
||||
return [ |
||||
['id', 'integer'], |
||||
['title', 'string', 'min' => 2, 'max' => 200], |
||||
]; |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Los filtros de datos son bastante flexibles. Puede personalizar cómo se construyen |
||||
las condiciones y qué operadores se permiten. |
||||
Para más detalles consulte la documentación de la API en [[\yii\data\DataFilter]]. |
@ -1,245 +0,0 @@
|
||||
Widgets de datos |
||||
================ |
||||
|
||||
Yii proporciona un conjunto de [widgets](structure-widgets.md) que se pueden usar para mostrar datos. |
||||
Mientras que el _widget_ [DetailView](#detail-view) se puede usar para mostrar los datos de un único |
||||
registro, [ListView](#list-view) y [GridView](#grid-view) se pueden usar para mostrar una lista o |
||||
tabla de registros de datos proporcionando funcionalidades como paginación, ordenación y filtro. |
||||
|
||||
|
||||
DetailView <span id="detail-view"></span> |
||||
---------- |
||||
|
||||
El _widget_ [[yii\widgets\DetailView|DetailView]] muestra los detalles de un único |
||||
[[yii\widgets\DetailView::$model|modelo]] de datos. |
||||
|
||||
Se recomienda su uso para mostrar un modelo en un formato estándar (por ejemplo, cada atributo del |
||||
modelo se muestra como una fila en una tabla). El modelo puede ser tanto una instancia o subclase |
||||
de [[\yii\base\Model]] como un [active record](db-active-record.md) o un _array_ asociativo. |
||||
|
||||
DetailView usa la propiedad [[yii\widgets\DetailView::$attributes|$attributes]] para determinar |
||||
qué atributos del modelo se deben mostrar y cómo se deben formatear. |
||||
En la [sección sobre formateadores](output-formatting.html) se pueden ver las opciones de formato |
||||
disponibles. |
||||
|
||||
Un uso típico de DetailView sería así: |
||||
|
||||
```php |
||||
echo DetailView::widget([ |
||||
'model' => $model, |
||||
'attributes' => [ |
||||
'title', // atributo title (en texto plano) |
||||
'description:html', // atributo description formateado como HTML |
||||
[ // nombre del propietario del modelo |
||||
'label' => 'Owner', |
||||
'value' => $model->owner->name, |
||||
'contentOptions' => ['class' => 'bg-red'], // atributos HTML para personalizar el valor |
||||
'captionOptions' => ['tooltip' => 'Tooltip'], // atributos HTML para personalizar la etiqueta |
||||
], |
||||
'created_at:datetime', // fecha de creación formateada como datetime |
||||
], |
||||
]); |
||||
``` |
||||
|
||||
Recuerde que a diferencia de [[yii\widgets\GridView|GridView]], que procesa un conjunto de modelos, |
||||
[[yii\widgets\DetailView|DetailView]] sólo procesa uno. Así que la mayoría de las veces no hay |
||||
necesidad de usar funciones anónimas ya que `$model` es el único modelo a mostrar y está disponible |
||||
en la vista como una variable. |
||||
|
||||
Sin embargo, en algunos casos el uso de una función anónima puede ser útil. Por ejemplo cuando |
||||
`visible` está especificado y se desea impedir el cálculo de `value` en case de que evalúe a `false`: |
||||
|
||||
```php |
||||
echo DetailView::widget([ |
||||
'model' => $model, |
||||
'attributes' => [ |
||||
[ |
||||
'attribute' => 'owner', |
||||
'value' => function ($model) { |
||||
return $model->owner->name; |
||||
}, |
||||
'visible' => \Yii::$app->user->can('posts.owner.view'), |
||||
], |
||||
], |
||||
]); |
||||
``` |
||||
|
||||
|
||||
ListView <span id="list-view"></span> |
||||
-------- |
||||
|
||||
El _widget_ [[yii\widgets\ListView|ListView]] se usa para mostrar datos de un |
||||
[proveedor de datos](output-data-providers.md). |
||||
Cada modelo de datos se representa usando el [[yii\widgets\ListView::$itemView|fichero de vista]] |
||||
indicado. |
||||
Como proporciona de serie funcionalidades tales como paginación, ordenación y filtro, |
||||
es útil tanto para mostrar información al usuario final como para crear una interfaz |
||||
de usuario de gestión de datos. |
||||
|
||||
Un uso típico es el siguiente: |
||||
|
||||
```php |
||||
use yii\widgets\ListView; |
||||
use yii\data\ActiveDataProvider; |
||||
|
||||
$dataProvider = new ActiveDataProvider([ |
||||
'query' => Post::find(), |
||||
'pagination' => [ |
||||
'pageSize' => 20, |
||||
], |
||||
]); |
||||
|
||||
echo ListView::widget([ |
||||
'dataProvider' => $dataProvider, |
||||
'itemView' => '_post', |
||||
]); |
||||
``` |
||||
|
||||
El fichero de vista `_post` podría contener lo siguiente: |
||||
|
||||
```php |
||||
<?php |
||||
use yii\helpers\Html; |
||||
use yii\helpers\HtmlPurifier; |
||||
?> |
||||
<div class="tarea"> |
||||
<h2><?= Html::encode($model->title) ?></h2> |
||||
|
||||
<?= HtmlPurifier::process($model->text) ?> |
||||
</div> |
||||
``` |
||||
|
||||
En el fichero de vista anterior, el modelo de datos actual está disponible como `$model`. |
||||
Además están disponibles las siguientes variables: |
||||
|
||||
- `$key`: mixto, el valor de la clave asociada a este elemento de datos. |
||||
- `$index`: entero, el índice empezando por cero del elemento de datos en el array de elementos devuelto por el proveedor de datos. |
||||
- `$widget`: ListView, esta instancia del _widget_. |
||||
|
||||
Si se necesita pasar datos adicionales a cada vista, se puede usar la propiedad |
||||
[[yii\widgets\ListView::$viewParams|$viewParams]] para pasar parejas clave-valor como las siguientes: |
||||
|
||||
```php |
||||
echo ListView::widget([ |
||||
'dataProvider' => $dataProvider, |
||||
'itemView' => '_post', |
||||
'viewParams' => [ |
||||
'fullView' => true, |
||||
'context' => 'main-page', |
||||
// ... |
||||
], |
||||
]); |
||||
``` |
||||
|
||||
Entonces éstas también estarán disponibles en la vista como variables. |
||||
|
||||
|
||||
GridView <span id="grid-view"></span> |
||||
-------- |
||||
|
||||
La cuadrícula de datos o [[yii\grid\GridView|GridView]] es uno de los _widgets_ de Yii |
||||
más potentes. Es extremadamente útil si necesita construir rápidamente la sección de |
||||
administración del sistema. Recibe los datos de un [proveedor de datos](output-data-providers.md) |
||||
y representa cada fila usando un conjunto de [[yii\grid\GridView::columns|columnas]] |
||||
que presentan los datos en forma de tabla. |
||||
|
||||
Cada fila de la tabla representa los datos de un único elemento de datos, y una columna |
||||
normalmente representa un atributo del elemento (algunas columnas pueden corresponder a |
||||
expresiones complejas de los atributos o a un texto estático). |
||||
|
||||
El mínimo código necesario para usar GridView es como sigue: |
||||
|
||||
```php |
||||
use yii\grid\GridView; |
||||
use yii\data\ActiveDataProvider; |
||||
|
||||
$dataProvider = new ActiveDataProvider([ |
||||
'query' => Post::find(), |
||||
'pagination' => [ |
||||
'pageSize' => 20, |
||||
], |
||||
]); |
||||
echo GridView::widget([ |
||||
'dataProvider' => $dataProvider, |
||||
]); |
||||
``` |
||||
|
||||
El código anterior primero crea un proveedor de datos y a continuación usa GridView |
||||
para mostrar cada atributo en cada fila tomados del proveedor de datos. La tabla |
||||
mostrada está equipada de serie con las funcionalidades de ordenación y paginación. |
||||
|
||||
|
||||
### Columnas de la cuadrícula <span id="grid-columns"></span> |
||||
|
||||
Las columnas de la tabla se configuran en términos de clase [[yii\grid\Column]], que |
||||
se configuran en la propiedad [[yii\grid\GridView::columns|columns]] de la configuración |
||||
del GridView. |
||||
Dependiendo del tipo y ajustes de las columnas éstas pueden presentar los datos de |
||||
diferentes maneras. |
||||
La clase predefinida es [[yii\grid\DataColumn]], que representa un atributo del modelo |
||||
por el que se puede ordenar y filtrar. |
||||
|
||||
|
||||
```php |
||||
echo GridView::widget([ |
||||
'dataProvider' => $dataProvider, |
||||
'columns' => [ |
||||
['class' => 'yii\grid\SerialColumn'], |
||||
// Columnas sencillas definidas por los datos contenidos en $dataProvider. |
||||
// Se usarán los datos de la columna del modelo. |
||||
'id', |
||||
'username', |
||||
// Un ejemplo más complejo. |
||||
[ |
||||
'class' => 'yii\grid\DataColumn', // Se puede omitir, ya que es la predefinida. |
||||
'value' => function ($data) { |
||||
return $data->name; // $data['name'] para datos de un array, por ejemplo al usar SqlDataProvider. |
||||
}, |
||||
], |
||||
], |
||||
]); |
||||
``` |
||||
|
||||
Observe que si no se especifica la parte [[yii\grid\GridView::columns|columns]] de la |
||||
configuración, Yii intenta mostrar todas las columnas posibles del modelo del proveedor |
||||
de datos. |
||||
|
||||
|
||||
### Clases de columna <span id="column-classes"></span> |
||||
|
||||
Las columnas de la cuadrícula se pueden personalizar usando diferentes clases de columna: |
||||
|
||||
```php |
||||
echo GridView::widget([ |
||||
'dataProvider' => $dataProvider, |
||||
'columns' => [ |
||||
[ |
||||
'class' => 'yii\grid\SerialColumn', // <-- aquí |
||||
// puede configurar propiedades adicionales aquí |
||||
], |
||||
``` |
||||
|
||||
Además de las clases de columna proporcionadas por Yii que se revisarán más abajo, |
||||
puede crear sus propias clases de columna. |
||||
|
||||
Cada clase de columna extiende [[yii\grid\Column]] de modo que hay algunas opciones |
||||
comunes que puede establecer al configurar las columnas de una cuadrícula. |
||||
|
||||
- [[yii\grid\Column::header|header]] permite establecer el contenida para la fila cabecera |
||||
- [[yii\grid\Column::footer|footer]] permite establece el contenido de la fila al pie |
||||
- [[yii\grid\Column::visible|visible]] define si la columna debería ser visible. |
||||
- [[yii\grid\Column::content|content]] le permite pasar una función PHP válida que devuelva datos para una fila. El formato es el siguiente: |
||||
|
||||
```php |
||||
function ($model, $key, $index, $column) { |
||||
return 'una cadena'; |
||||
} |
||||
``` |
||||
|
||||
Puede indicar varias opciones HTML del contenedor pasando _arrays_ a: |
||||
|
||||
- [[yii\grid\Column::headerOptions|headerOptions]] |
||||
- [[yii\grid\Column::footerOptions|footerOptions]] |
||||
- [[yii\grid\Column::filterOptions|filterOptions]] |
||||
- [[yii\grid\Column::contentOptions|contentOptions]] |
||||
|
@ -1,72 +0,0 @@
|
||||
Paginación |
||||
========== |
||||
|
||||
Cuando hay muchos datos a mostrar en una sola página, una estrategia común es mostrarlos en varias |
||||
páginas y en cada una de ellas mostrar sólo una pequeña porción de datos. Esta estrategia es conocida como *paginación*. |
||||
|
||||
Yii utiliza el objeto [[yii\data\Pagination]] para representar la información acerca del esquema de paginación. En particular, |
||||
|
||||
* [[yii\data\Pagination::$totalCount|cuenta total]] especifica el número total de ítems de datos. Ten en cuenta que |
||||
este es normalmente un número mucho mayor que el número de ítems necesarios a mostrar en una simple página. |
||||
* [[yii\data\Pagination::$pageSize|tamaño de página]] especifica cuántos ítems de datos contiene cada página. El valor |
||||
por defecto es 20. |
||||
* [[yii\data\Pagination::$page|página actual]] da el número de la página actual (comenzando desde 0). El valor |
||||
por defecto es 0, lo que sería la primera página. |
||||
|
||||
Con un objeto [[yii\data\Pagination]] totalmente especificado, puedes obtener y mostrar datos en partes. Por ejemplo, |
||||
si estás recuperando datos de una base de datos, puedes especificar las cláusulas `OFFSET` y `LIMIT` de la consulta a la BD |
||||
correspondientes a los valores provistos por la paginación. A continuación hay un ejemplo, |
||||
|
||||
```php |
||||
use yii\data\Pagination; |
||||
|
||||
// construye una consulta a la BD para obtener todos los artículos con status = 1 |
||||
$query = Article::find()->where(['status' => 1]); |
||||
|
||||
// obtiene el número total de artículos (pero no recupera los datos de los artículos todavía) |
||||
$count = $query->count(); |
||||
|
||||
// crea un objeto paginación con dicho total |
||||
$pagination = new Pagination(['totalCount' => $count]); |
||||
|
||||
// limita la consulta utilizando la paginación y recupera los artículos |
||||
$articles = $query->offset($pagination->offset) |
||||
->limit($pagination->limit) |
||||
->all(); |
||||
``` |
||||
|
||||
¿Qué página de artículos devolverá el ejemplo de arriba? Depende de si se le es pasado un parámetro llamado `page`. |
||||
Por defecto, la paginación intentará definir la [[yii\data\Pagination::$page|página actual]] con |
||||
el valor del parámetro `page`. Si el parámetro no es provisto, entonces tomará por defecto el valor 0. |
||||
|
||||
Para facilitar la construcción de elementos UI que soporten paginación, Yii provee el widget [[yii\widgets\LinkPager]], |
||||
que muestra una lista de botones de navegación que el usuario puede presionar para indicar qué página de datos debería mostrarse. |
||||
El widget toma un objeto de paginación y tal manera conoce cuál es la página actual y cuántos botones |
||||
debe mostrar. Por ejemplo, |
||||
|
||||
```php |
||||
use yii\widgets\LinkPager; |
||||
|
||||
echo LinkPager::widget([ |
||||
'pagination' => $pagination, |
||||
]); |
||||
``` |
||||
|
||||
Si quieres construir los elementos de UI manualmente, puedes utilizar [[yii\data\Pagination::createUrl()]] para generar URLs que |
||||
dirigirán a las distintas páginas. El método requiere un parámetro de página y generará una URL apropiadamente formada |
||||
contieniendo el parámetro de página. Por ejemplo, |
||||
|
||||
```php |
||||
// especifica la ruta que la URL generada debería utilizar |
||||
// Si no lo especificas, se utilizará la ruta de la petición actual |
||||
$pagination->route = 'article/index'; |
||||
|
||||
// muestra: /index.php?r=article%2Findex&page=100 |
||||
echo $pagination->createUrl(100); |
||||
|
||||
// muestra: /index.php?r=article%2Findex&page=101 |
||||
echo $pagination->createUrl(101); |
||||
``` |
||||
|
||||
> Tip: puedes personalizar el parámetro `page` de la consulta configurando |
||||
la propiedad [[yii\data\Pagination::pageParam|pageParam]] al crear el objeto de la paginación. |