Commit d87bdb77287d96e5453ad1b150441fae15f5bda0

Authored by Administrator
0 parents

first commit

Showing 132 changed files with 8910 additions and 0 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 132 files are displayed.

.bowerrc 0 โ†’ 100755
  1 +++ a/.bowerrc
  1 +{
  2 + "directory" : "vendor/bower"
  3 +}
... ...
.gitignore 0 โ†’ 100755
  1 +++ a/.gitignore
  1 +# yii console command
  2 +/yii
  3 +
  4 +# phpstorm project files
  5 +.idea
  6 +
  7 +# netbeans project files
  8 +nbproject
  9 +
  10 +# zend studio for eclipse project files
  11 +.buildpath
  12 +.project
  13 +.settings
  14 +
  15 +# windows thumbnail cache
  16 +Thumbs.db
  17 +
  18 +# composer vendor dir
  19 +/vendor
  20 +
  21 +# composer itself is not needed
  22 +composer.phar
  23 +
  24 +# Mac DS_Store Files
  25 +.DS_Store
  26 +
  27 +# phpunit itself is not needed
  28 +phpunit.phar
  29 +# local phpunit config
  30 +/phpunit.xml
  31 +
  32 +tests/_output/*
0 33 \ No newline at end of file
... ...
.htaccess 0 โ†’ 100755
  1 +++ a/.htaccess
  1 +# Mod_Autoindex
  2 +<IfModule mod_autoindex.c>
  3 + # ะ—ะฐะฟั€ะตั‰ะฐะตะผ ะฟั€ะพัะผะพั‚ั€ ัะพะดะตั€ะถะธะผะพะณะพ ะฟะฐะฟะพะบ
  4 + Options -Indexes
  5 +</IfModule>
  6 +
  7 +# Mod_Rewrite
  8 +<IfModule mod_rewrite.c>
  9 + Options +FollowSymlinks
  10 + # ะ’ะบะปัŽั‡ะฐะตะผ mod_rewrite
  11 + RewriteEngine On
  12 + IndexIgnore */*
  13 + # ะŸะตั€ะตะฝะฐะฟั€ะฐะฒะปัะตะผ administrator ะฝะฐ ะฒั…ะพะดะฝะพะน ัะบั€ะธะฟั‚ ะฐะดะผะธะฝะบะธ
  14 + RewriteRule ^administrator/(.*)?$ /backend/web/$1 [L,PT]
  15 + RewriteRule ^storage/(.*)?$ /storage/$1 [L,PT]
  16 + # ะŸะตั€ะตะฝะฐะฟั€ะฐะฒะปัะตะผ ะฒัะต ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฒั…ะพะดะฝะพะน ัะบั€ะธะฟั‚
  17 + RewriteRule ^([^/].*)?$ /frontend/web/$1
  18 +
  19 +
  20 +</IfModule>
... ...
LICENSE.md 0 โ†’ 100755
  1 +++ a/LICENSE.md
  1 +The Yii framework is free software. It is released under the terms of
  2 +the following BSD License.
  3 +
  4 +Copyright ยฉ 2008 by Yii Software LLC (http://www.yiisoft.com)
  5 +All rights reserved.
  6 +
  7 +Redistribution and use in source and binary forms, with or without
  8 +modification, are permitted provided that the following conditions
  9 +are met:
  10 +
  11 + * Redistributions of source code must retain the above copyright
  12 + notice, this list of conditions and the following disclaimer.
  13 + * Redistributions in binary form must reproduce the above copyright
  14 + notice, this list of conditions and the following disclaimer in
  15 + the documentation and/or other materials provided with the
  16 + distribution.
  17 + * Neither the name of Yii Software LLC nor the names of its
  18 + contributors may be used to endorse or promote products derived
  19 + from this software without specific prior written permission.
  20 +
  21 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  24 +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  25 +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  26 +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  27 +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  28 +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  29 +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30 +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  31 +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  32 +POSSIBILITY OF SUCH DAMAGE.
... ...
README.md 0 โ†’ 100755
  1 +++ a/README.md
  1 +Yii 2 Advanced Project Template
  2 +===============================
  3 +
  4 +Yii 2 Advanced Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for
  5 +developing complex Web applications with multiple tiers.
  6 +
  7 +The template includes three tiers: front end, back end, and console, each of which
  8 +is a separate Yii application.
  9 +
  10 +The template is designed to work in a team development environment. It supports
  11 +deploying the application in different environments.
  12 +
  13 +Documentation is at [docs/guide/README.md](docs/guide/README.md).
  14 +
  15 +[![Latest Stable Version](https://poser.pugx.org/yiisoft/yii2-app-advanced/v/stable.png)](https://packagist.org/packages/yiisoft/yii2-app-advanced)
  16 +[![Total Downloads](https://poser.pugx.org/yiisoft/yii2-app-advanced/downloads.png)](https://packagist.org/packages/yiisoft/yii2-app-advanced)
  17 +[![Build Status](https://travis-ci.org/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-advanced)
  18 +
  19 +DIRECTORY STRUCTURE
  20 +-------------------
  21 +
  22 +```
  23 +common
  24 + config/ contains shared configurations
  25 + mail/ contains view files for e-mails
  26 + models/ contains model classes used in both backend and frontend
  27 +console
  28 + config/ contains console configurations
  29 + controllers/ contains console controllers (commands)
  30 + migrations/ contains database migrations
  31 + models/ contains console-specific model classes
  32 + runtime/ contains files generated during runtime
  33 +backend
  34 + assets/ contains application assets such as JavaScript and CSS
  35 + config/ contains backend configurations
  36 + controllers/ contains Web controller classes
  37 + models/ contains backend-specific model classes
  38 + runtime/ contains files generated during runtime
  39 + views/ contains view files for the Web application
  40 + web/ contains the entry script and Web resources
  41 +frontend
  42 + assets/ contains application assets such as JavaScript and CSS
  43 + config/ contains frontend configurations
  44 + controllers/ contains Web controller classes
  45 + models/ contains frontend-specific model classes
  46 + runtime/ contains files generated during runtime
  47 + views/ contains view files for the Web application
  48 + web/ contains the entry script and Web resources
  49 + widgets/ contains frontend widgets
  50 +vendor/ contains dependent 3rd-party packages
  51 +environments/ contains environment-based overrides
  52 +tests contains various tests for the advanced application
  53 + codeception/ contains tests developed with Codeception PHP Testing Framework
  54 +```
... ...
backend/assets/AppAsset.php 0 โ†’ 100755
  1 +++ a/backend/assets/AppAsset.php
  1 +<?php
  2 +/**
  3 + * @link http://www.yiiframework.com/
  4 + * @copyright Copyright (c) 2008 Yii Software LLC
  5 + * @license http://www.yiiframework.com/license/
  6 + */
  7 +
  8 +namespace backend\assets;
  9 +
  10 +use yii\web\AssetBundle;
  11 +
  12 +/**
  13 + * @author Qiang Xue <qiang.xue@gmail.com>
  14 + * @since 2.0
  15 + */
  16 +class AppAsset extends AssetBundle
  17 +{
  18 + public $basePath = '@webroot';
  19 + public $baseUrl = '@web';
  20 + public $css = [
  21 + 'css/site.css',
  22 + ];
  23 + public $js = [
  24 + ];
  25 + public $depends = [
  26 + 'yii\web\YiiAsset',
  27 + 'yii\bootstrap\BootstrapAsset',
  28 + ];
  29 +}
... ...
backend/config/.gitignore 0 โ†’ 100755
  1 +++ a/backend/config/.gitignore
  1 +main-local.php
  2 +params-local.php
0 3 \ No newline at end of file
... ...
backend/config/bootstrap.php 0 โ†’ 100755
  1 +++ a/backend/config/bootstrap.php
  1 +<?php
... ...
backend/config/main.php 0 โ†’ 100755
  1 +++ a/backend/config/main.php
  1 +<?php
  2 +$params = array_merge(
  3 + require(__DIR__ . '/../../common/config/params.php'),
  4 + require(__DIR__ . '/../../common/config/params-local.php'),
  5 + require(__DIR__ . '/params.php'),
  6 + require(__DIR__ . '/params-local.php')
  7 +);
  8 +
  9 +return [
  10 + 'id' => 'app-backend',
  11 + 'basePath' => dirname(__DIR__),
  12 + 'controllerNamespace' => 'backend\controllers',
  13 + 'bootstrap' => ['log'],
  14 + 'modules' => [],
  15 + 'components' => [
  16 + 'user' => [
  17 + 'identityClass' => 'common\models\User',
  18 + 'enableAutoLogin' => true,
  19 + ],
  20 + 'log' => [
  21 + 'traceLevel' => YII_DEBUG ? 3 : 0,
  22 + 'targets' => [
  23 + [
  24 + 'class' => 'yii\log\FileTarget',
  25 + 'levels' => ['error', 'warning'],
  26 + ],
  27 + ],
  28 + ],
  29 + 'errorHandler' => [
  30 + 'errorAction' => 'site/error',
  31 + ],
  32 + ],
  33 + 'params' => $params,
  34 +];
... ...
backend/config/params.php 0 โ†’ 100755
  1 +++ a/backend/config/params.php
  1 +<?php
  2 +return [
  3 + 'adminEmail' => 'admin@example.com',
  4 +];
... ...
backend/controllers/SiteController.php 0 โ†’ 100755
  1 +++ a/backend/controllers/SiteController.php
  1 +<?php
  2 +namespace backend\controllers;
  3 +
  4 +use Yii;
  5 +use yii\filters\AccessControl;
  6 +use yii\web\Controller;
  7 +use common\models\LoginForm;
  8 +use yii\filters\VerbFilter;
  9 +
  10 +/**
  11 + * Site controller
  12 + */
  13 +class SiteController extends Controller
  14 +{
  15 + /**
  16 + * @inheritdoc
  17 + */
  18 + public function behaviors()
  19 + {
  20 + return [
  21 + 'access' => [
  22 + 'class' => AccessControl::className(),
  23 + 'rules' => [
  24 + [
  25 + 'actions' => ['login', 'error'],
  26 + 'allow' => true,
  27 + ],
  28 + [
  29 + 'actions' => ['logout', 'index'],
  30 + 'allow' => true,
  31 + 'roles' => ['@'],
  32 + ],
  33 + ],
  34 + ],
  35 + 'verbs' => [
  36 + 'class' => VerbFilter::className(),
  37 + 'actions' => [
  38 + 'logout' => ['post'],
  39 + ],
  40 + ],
  41 + ];
  42 + }
  43 +
  44 + /**
  45 + * @inheritdoc
  46 + */
  47 + public function actions()
  48 + {
  49 + return [
  50 + 'error' => [
  51 + 'class' => 'yii\web\ErrorAction',
  52 + ],
  53 + ];
  54 + }
  55 +
  56 + public function actionIndex()
  57 + {
  58 + return $this->render('index');
  59 + }
  60 +
  61 + public function actionLogin()
  62 + {
  63 + if (!\Yii::$app->user->isGuest) {
  64 + return $this->goHome();
  65 + }
  66 +
  67 + $model = new LoginForm();
  68 + if ($model->load(Yii::$app->request->post()) && $model->login()) {
  69 + return $this->goBack();
  70 + } else {
  71 + return $this->render('login', [
  72 + 'model' => $model,
  73 + ]);
  74 + }
  75 + }
  76 +
  77 + public function actionLogout()
  78 + {
  79 + Yii::$app->user->logout();
  80 +
  81 + return $this->goHome();
  82 + }
  83 +}
... ...
backend/models/.gitkeep 0 โ†’ 100755
  1 +++ a/backend/models/.gitkeep
  1 +*
... ...
backend/runtime/.gitignore 0 โ†’ 100755
  1 +++ a/backend/runtime/.gitignore
  1 +*
  2 +!.gitignore
0 3 \ No newline at end of file
... ...
backend/views/layouts/main.php 0 โ†’ 100755
  1 +++ a/backend/views/layouts/main.php
  1 +<?php
  2 +
  3 +/* @var $this \yii\web\View */
  4 +/* @var $content string */
  5 +
  6 +use backend\assets\AppAsset;
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\Nav;
  9 +use yii\bootstrap\NavBar;
  10 +use yii\widgets\Breadcrumbs;
  11 +use common\widgets\Alert;
  12 +
  13 +AppAsset::register($this);
  14 +?>
  15 +<?php $this->beginPage() ?>
  16 +<!DOCTYPE html>
  17 +<html lang="<?= Yii::$app->language ?>">
  18 +<head>
  19 + <meta charset="<?= Yii::$app->charset ?>">
  20 + <meta name="viewport" content="width=device-width, initial-scale=1">
  21 + <?= Html::csrfMetaTags() ?>
  22 + <title><?= Html::encode($this->title) ?></title>
  23 + <?php $this->head() ?>
  24 +</head>
  25 +<body>
  26 +<?php $this->beginBody() ?>
  27 +
  28 +<div class="wrap">
  29 + <?php
  30 + NavBar::begin([
  31 + 'brandLabel' => 'My Company',
  32 + 'brandUrl' => Yii::$app->homeUrl,
  33 + 'options' => [
  34 + 'class' => 'navbar-inverse navbar-fixed-top',
  35 + ],
  36 + ]);
  37 + $menuItems = [
  38 + ['label' => 'Home', 'url' => ['/site/index']],
  39 + ];
  40 + if (Yii::$app->user->isGuest) {
  41 + $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
  42 + } else {
  43 + $menuItems[] = [
  44 + 'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
  45 + 'url' => ['/site/logout'],
  46 + 'linkOptions' => ['data-method' => 'post']
  47 + ];
  48 + }
  49 + echo Nav::widget([
  50 + 'options' => ['class' => 'navbar-nav navbar-right'],
  51 + 'items' => $menuItems,
  52 + ]);
  53 + NavBar::end();
  54 + ?>
  55 +
  56 + <div class="container">
  57 + <?= Breadcrumbs::widget([
  58 + 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
  59 + ]) ?>
  60 + <?= Alert::widget() ?>
  61 + <?= $content ?>
  62 + </div>
  63 +</div>
  64 +
  65 +<footer class="footer">
  66 + <div class="container">
  67 + <p class="pull-left">&copy; My Company <?= date('Y') ?></p>
  68 +
  69 + <p class="pull-right"><?= Yii::powered() ?></p>
  70 + </div>
  71 +</footer>
  72 +
  73 +<?php $this->endBody() ?>
  74 +</body>
  75 +</html>
  76 +<?php $this->endPage() ?>
... ...
backend/views/site/error.php 0 โ†’ 100755
  1 +++ a/backend/views/site/error.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $name string */
  5 +/* @var $message string */
  6 +/* @var $exception Exception */
  7 +
  8 +use yii\helpers\Html;
  9 +
  10 +$this->title = $name;
  11 +?>
  12 +<div class="site-error">
  13 +
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <div class="alert alert-danger">
  17 + <?= nl2br(Html::encode($message)) ?>
  18 + </div>
  19 +
  20 + <p>
  21 + The above error occurred while the Web server was processing your request.
  22 + </p>
  23 + <p>
  24 + Please contact us if you think this is a server error. Thank you.
  25 + </p>
  26 +
  27 +</div>
... ...
backend/views/site/index.php 0 โ†’ 100755
  1 +++ a/backend/views/site/index.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +
  5 +$this->title = 'My Yii Application';
  6 +?>
  7 +<div class="site-index">
  8 +
  9 + <div class="jumbotron">
  10 + <h1>Congratulations!</h1>
  11 +
  12 + <p class="lead">You have successfully created your Yii-powered application.</p>
  13 +
  14 + <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
  15 + </div>
  16 +
  17 + <div class="body-content">
  18 +
  19 + <div class="row">
  20 + <div class="col-lg-4">
  21 + <h2>Heading</h2>
  22 +
  23 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  24 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  25 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  26 + fugiat nulla pariatur.</p>
  27 +
  28 + <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
  29 + </div>
  30 + <div class="col-lg-4">
  31 + <h2>Heading</h2>
  32 +
  33 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  34 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  35 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  36 + fugiat nulla pariatur.</p>
  37 +
  38 + <p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
  39 + </div>
  40 + <div class="col-lg-4">
  41 + <h2>Heading</h2>
  42 +
  43 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  44 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  45 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  46 + fugiat nulla pariatur.</p>
  47 +
  48 + <p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
  49 + </div>
  50 + </div>
  51 +
  52 + </div>
  53 +</div>
... ...
backend/views/site/login.php 0 โ†’ 100755
  1 +++ a/backend/views/site/login.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model \common\models\LoginForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +
  10 +$this->title = 'Login';
  11 +$this->params['breadcrumbs'][] = $this->title;
  12 +?>
  13 +<div class="site-login">
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <p>Please fill out the following fields to login:</p>
  17 +
  18 + <div class="row">
  19 + <div class="col-lg-5">
  20 + <?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
  21 +
  22 + <?= $form->field($model, 'username') ?>
  23 +
  24 + <?= $form->field($model, 'password')->passwordInput() ?>
  25 +
  26 + <?= $form->field($model, 'rememberMe')->checkbox() ?>
  27 +
  28 + <div class="form-group">
  29 + <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
  30 + </div>
  31 +
  32 + <?php ActiveForm::end(); ?>
  33 + </div>
  34 + </div>
  35 +</div>
... ...
backend/web/.gitignore 0 โ†’ 100755
  1 +++ a/backend/web/.gitignore
  1 +/index.php
  2 +/index-test.php
... ...
backend/web/assets/.gitignore 0 โ†’ 100755
  1 +++ a/backend/web/assets/.gitignore
  1 +*
  2 +!.gitignore
... ...
backend/web/css/site.css 0 โ†’ 100755
  1 +++ a/backend/web/css/site.css
  1 +html,
  2 +body {
  3 + height: 100%;
  4 +}
  5 +
  6 +.wrap {
  7 + min-height: 100%;
  8 + height: auto;
  9 + margin: 0 auto -60px;
  10 + padding: 0 0 60px;
  11 +}
  12 +
  13 +.wrap > .container {
  14 + padding: 70px 15px 20px;
  15 +}
  16 +
  17 +.footer {
  18 + height: 60px;
  19 + background-color: #f5f5f5;
  20 + border-top: 1px solid #ddd;
  21 + padding-top: 20px;
  22 +}
  23 +
  24 +.jumbotron {
  25 + text-align: center;
  26 + background-color: transparent;
  27 +}
  28 +
  29 +.jumbotron .btn {
  30 + font-size: 21px;
  31 + padding: 14px 24px;
  32 +}
  33 +
  34 +.not-set {
  35 + color: #c55;
  36 + font-style: italic;
  37 +}
  38 +
  39 +/* add sorting icons to gridview sort links */
  40 +a.asc:after, a.desc:after {
  41 + position: relative;
  42 + top: 1px;
  43 + display: inline-block;
  44 + font-family: 'Glyphicons Halflings';
  45 + font-style: normal;
  46 + font-weight: normal;
  47 + line-height: 1;
  48 + padding-left: 5px;
  49 +}
  50 +
  51 +a.asc:after {
  52 + content: /*"\e113"*/ "\e151";
  53 +}
  54 +
  55 +a.desc:after {
  56 + content: /*"\e114"*/ "\e152";
  57 +}
  58 +
  59 +.sort-numerical a.asc:after {
  60 + content: "\e153";
  61 +}
  62 +
  63 +.sort-numerical a.desc:after {
  64 + content: "\e154";
  65 +}
  66 +
  67 +.sort-ordinal a.asc:after {
  68 + content: "\e155";
  69 +}
  70 +
  71 +.sort-ordinal a.desc:after {
  72 + content: "\e156";
  73 +}
  74 +
  75 +.grid-view th {
  76 + white-space: nowrap;
  77 +}
  78 +
  79 +.hint-block {
  80 + display: block;
  81 + margin-top: 5px;
  82 + color: #999;
  83 +}
  84 +
  85 +.error-summary {
  86 + color: #a94442;
  87 + background: #fdf7f7;
  88 + border-left: 3px solid #eed3d7;
  89 + padding: 10px 20px;
  90 + margin: 0 0 15px 0;
  91 +}
... ...
backend/web/favicon.ico 0 โ†’ 100755
No preview for this file type
backend/web/robots.txt 0 โ†’ 100755
  1 +++ a/backend/web/robots.txt
  1 +User-agent: *
  2 +Disallow: /
... ...
codeception.yml 0 โ†’ 100755
  1 +++ a/codeception.yml
  1 +actor: Tester
  2 +paths:
  3 + tests: tests
  4 + log: tests/_output
  5 + data: tests/_data
  6 + support: tests/_support
  7 + envs: tests/_envs
  8 +settings:
  9 + bootstrap: _bootstrap.php
  10 + colors: true
  11 + memory_limit: 1024M
  12 +extensions:
  13 + enabled:
  14 + - Codeception\Extension\RunFailed
  15 +modules:
  16 + config:
  17 + Db:
  18 + dsn: 'mysql:host=localhost;dbname=test6'
  19 + user: 'test6'
  20 + password: 'T4n2W9e3'
  21 + dump: tests/_data/test6.sql
... ...
common/components/UserStore.php 0 โ†’ 100755
  1 +++ a/common/components/UserStore.php
  1 +<?php
  2 +namespace common\components;
  3 +
  4 +use yii\base\Exception;
  5 +
  6 +class UserStore {
  7 +
  8 + private $users = [];
  9 +
  10 + function addUser( $name, $email, $pass){
  11 + if(isset($this->users[$email])){
  12 + throw new Exception("ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ {$email} ัƒะถะต ะทะฐั€ะตะณะธัั‚ั€ะธั€ะพะฒะฐะฝ");
  13 + }
  14 +
  15 + if (strlen($pass) < 5 ){
  16 + throw new Exception(
  17 + "ะ”ะปะธะฝะฝะฐ ะฟะฐั€ะพะปั ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ะฑะพะปัŒัˆะต 5 ัะธะผะฒะพะปะพะฒ"
  18 + );
  19 + }
  20 +
  21 + $this->users[$email] = [
  22 + 'pass' => $pass,
  23 + 'email' => $email,
  24 + 'name' => $name
  25 + ];
  26 +
  27 + return true;
  28 + }
  29 +
  30 + function notifyPasswordFailure($email){
  31 + if(isset($this->users[$email])){
  32 + $this->users[$email]['failed'] = time();
  33 + }
  34 + }
  35 +
  36 + function getUser($email){
  37 + return ($this->users[$email]);
  38 + }
  39 +
  40 +
  41 +
  42 +}
0 43 \ No newline at end of file
... ...
common/components/Validator.php 0 โ†’ 100755
  1 +++ a/common/components/Validator.php
  1 +<?php
  2 +namespace common\components;
  3 +
  4 +
  5 +class Validator {
  6 + private $store;
  7 +
  8 + public function __construct(UserStore $store){
  9 + $this->store = $store;
  10 + }
  11 +
  12 + public function validateUser($email, $pass){
  13 + if(!is_array($user = $this->store->getUser($email))){
  14 + return false;
  15 + }
  16 +
  17 + if($user['pass'] == $pass){
  18 + return true;
  19 + }
  20 +
  21 + $this->store->notifyPasswordFailure($email);
  22 +
  23 + return false;
  24 + }
  25 +
  26 +
  27 +}
0 28 \ No newline at end of file
... ...
common/config/.gitignore 0 โ†’ 100755
  1 +++ a/common/config/.gitignore
  1 +main-local.php
  2 +params-local.php
... ...
common/config/bootstrap.php 0 โ†’ 100755
  1 +++ a/common/config/bootstrap.php
  1 +<?php
  2 +Yii::setAlias('common', dirname(__DIR__));
  3 +Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend');
  4 +Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend');
  5 +Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console');
... ...
common/config/main.php 0 โ†’ 100755
  1 +++ a/common/config/main.php
  1 +<?php
  2 +return [
  3 + 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
  4 + 'components' => [
  5 + 'user' => [
  6 + 'class'=>'common\components\UserStore'
  7 + ],
  8 + 'cache' => [
  9 + 'class' => 'yii\caching\FileCache',
  10 + ],
  11 +
  12 + ],
  13 +];
... ...
common/config/params.php 0 โ†’ 100755
  1 +++ a/common/config/params.php
  1 +<?php
  2 +return [
  3 + 'adminEmail' => 'admin@example.com',
  4 + 'supportEmail' => 'support@example.com',
  5 + 'user.passwordResetTokenExpire' => 3600,
  6 +];
... ...
common/mail/layouts/html.php 0 โ†’ 100755
  1 +++ a/common/mail/layouts/html.php
  1 +<?php
  2 +use yii\helpers\Html;
  3 +
  4 +/* @var $this \yii\web\View view component instance */
  5 +/* @var $message \yii\mail\MessageInterface the message being composed */
  6 +/* @var $content string main view render result */
  7 +?>
  8 +<?php $this->beginPage() ?>
  9 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  10 +<html xmlns="http://www.w3.org/1999/xhtml">
  11 +<head>
  12 + <meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
  13 + <title><?= Html::encode($this->title) ?></title>
  14 + <?php $this->head() ?>
  15 +</head>
  16 +<body>
  17 + <?php $this->beginBody() ?>
  18 + <?= $content ?>
  19 + <?php $this->endBody() ?>
  20 +</body>
  21 +</html>
  22 +<?php $this->endPage() ?>
... ...
common/mail/layouts/text.php 0 โ†’ 100755
  1 +++ a/common/mail/layouts/text.php
  1 +<?php
  2 +use yii\helpers\Html;
  3 +
  4 +/* @var $this \yii\web\View view component instance */
  5 +/* @var $message \yii\mail\MessageInterface the message being composed */
  6 +/* @var $content string main view render result */
  7 +?>
  8 +<?php $this->beginPage() ?>
  9 +<?php $this->beginBody() ?>
  10 +<?= $content ?>
  11 +<?php $this->endBody() ?>
  12 +<?php $this->endPage() ?>
... ...
common/mail/passwordResetToken-html.php 0 โ†’ 100755
  1 +++ a/common/mail/passwordResetToken-html.php
  1 +<?php
  2 +use yii\helpers\Html;
  3 +
  4 +/* @var $this yii\web\View */
  5 +/* @var $user common\models\User */
  6 +
  7 +$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
  8 +?>
  9 +<div class="password-reset">
  10 + <p>Hello <?= Html::encode($user->username) ?>,</p>
  11 +
  12 + <p>Follow the link below to reset your password:</p>
  13 +
  14 + <p><?= Html::a(Html::encode($resetLink), $resetLink) ?></p>
  15 +</div>
... ...
common/mail/passwordResetToken-text.php 0 โ†’ 100755
  1 +++ a/common/mail/passwordResetToken-text.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $user common\models\User */
  5 +
  6 +$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
  7 +?>
  8 +Hello <?= $user->username ?>,
  9 +
  10 +Follow the link below to reset your password:
  11 +
  12 +<?= $resetLink ?>
... ...
common/models/LoginForm.php 0 โ†’ 100755
  1 +++ a/common/models/LoginForm.php
  1 +<?php
  2 +namespace common\models;
  3 +
  4 +use Yii;
  5 +use yii\base\Model;
  6 +
  7 +/**
  8 + * Login form
  9 + */
  10 +class LoginForm extends Model
  11 +{
  12 + public $username;
  13 + public $password;
  14 + public $rememberMe = true;
  15 +
  16 + private $_user;
  17 +
  18 +
  19 + /**
  20 + * @inheritdoc
  21 + */
  22 + public function rules()
  23 + {
  24 + return [
  25 + // username and password are both required
  26 + [['username', 'password'], 'required'],
  27 + // rememberMe must be a boolean value
  28 + ['rememberMe', 'boolean'],
  29 + // password is validated by validatePassword()
  30 + ['password', 'validatePassword'],
  31 + ];
  32 + }
  33 +
  34 + /**
  35 + * Validates the password.
  36 + * This method serves as the inline validation for password.
  37 + *
  38 + * @param string $attribute the attribute currently being validated
  39 + * @param array $params the additional name-value pairs given in the rule
  40 + */
  41 + public function validatePassword($attribute, $params)
  42 + {
  43 + if (!$this->hasErrors()) {
  44 + $user = $this->getUser();
  45 + if (!$user || !$user->validatePassword($this->password)) {
  46 + $this->addError($attribute, 'Incorrect username or password.');
  47 + }
  48 + }
  49 + }
  50 +
  51 + /**
  52 + * Logs in a user using the provided username and password.
  53 + *
  54 + * @return boolean whether the user is logged in successfully
  55 + */
  56 + public function login()
  57 + {
  58 + if ($this->validate()) {
  59 + return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
  60 + } else {
  61 + return false;
  62 + }
  63 + }
  64 +
  65 + /**
  66 + * Finds user by [[username]]
  67 + *
  68 + * @return User|null
  69 + */
  70 + protected function getUser()
  71 + {
  72 + if ($this->_user === null) {
  73 + $this->_user = User::findByUsername($this->username);
  74 + }
  75 +
  76 + return $this->_user;
  77 + }
  78 +}
... ...
common/models/User.php 0 โ†’ 100755
  1 +++ a/common/models/User.php
  1 +<?php
  2 +namespace common\models;
  3 +
  4 +use Yii;
  5 +use yii\base\NotSupportedException;
  6 +use yii\behaviors\TimestampBehavior;
  7 +use yii\db\ActiveRecord;
  8 +use yii\web\IdentityInterface;
  9 +
  10 +/**
  11 + * User model
  12 + *
  13 + * @property integer $id
  14 + * @property string $username
  15 + * @property string $password_hash
  16 + * @property string $password_reset_token
  17 + * @property string $email
  18 + * @property string $auth_key
  19 + * @property integer $status
  20 + * @property integer $created_at
  21 + * @property integer $updated_at
  22 + * @property string $password write-only password
  23 + */
  24 +class User extends ActiveRecord implements IdentityInterface
  25 +{
  26 + const STATUS_DELETED = 0;
  27 + const STATUS_ACTIVE = 10;
  28 +
  29 + /**
  30 + * @inheritdoc
  31 + */
  32 + public static function tableName()
  33 + {
  34 + return '{{%user}}';
  35 + }
  36 +
  37 + /**
  38 + * @inheritdoc
  39 + */
  40 + public function behaviors()
  41 + {
  42 + return [
  43 + TimestampBehavior::className(),
  44 + ];
  45 + }
  46 +
  47 + /**
  48 + * @inheritdoc
  49 + */
  50 + public function rules()
  51 + {
  52 + return [
  53 + ['status', 'default', 'value' => self::STATUS_ACTIVE],
  54 + ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
  55 + ];
  56 + }
  57 +
  58 + /**
  59 + * @inheritdoc
  60 + */
  61 + public static function findIdentity($id)
  62 + {
  63 + return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
  64 + }
  65 +
  66 + /**
  67 + * @inheritdoc
  68 + */
  69 + public static function findIdentityByAccessToken($token, $type = null)
  70 + {
  71 + throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
  72 + }
  73 +
  74 + /**
  75 + * Finds user by username
  76 + *
  77 + * @param string $username
  78 + * @return static|null
  79 + */
  80 + public static function findByUsername($username)
  81 + {
  82 + return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
  83 + }
  84 +
  85 + /**
  86 + * Finds user by password reset token
  87 + *
  88 + * @param string $token password reset token
  89 + * @return static|null
  90 + */
  91 + public static function findByPasswordResetToken($token)
  92 + {
  93 + if (!static::isPasswordResetTokenValid($token)) {
  94 + return null;
  95 + }
  96 +
  97 + return static::findOne([
  98 + 'password_reset_token' => $token,
  99 + 'status' => self::STATUS_ACTIVE,
  100 + ]);
  101 + }
  102 +
  103 + /**
  104 + * Finds out if password reset token is valid
  105 + *
  106 + * @param string $token password reset token
  107 + * @return boolean
  108 + */
  109 + public static function isPasswordResetTokenValid($token)
  110 + {
  111 + if (empty($token)) {
  112 + return false;
  113 + }
  114 +
  115 + $timestamp = (int) substr($token, strrpos($token, '_') + 1);
  116 + $expire = Yii::$app->params['user.passwordResetTokenExpire'];
  117 + return $timestamp + $expire >= time();
  118 + }
  119 +
  120 + /**
  121 + * @inheritdoc
  122 + */
  123 + public function getId()
  124 + {
  125 + return $this->getPrimaryKey();
  126 + }
  127 +
  128 + /**
  129 + * @inheritdoc
  130 + */
  131 + public function getAuthKey()
  132 + {
  133 + return $this->auth_key;
  134 + }
  135 +
  136 + /**
  137 + * @inheritdoc
  138 + */
  139 + public function validateAuthKey($authKey)
  140 + {
  141 + return $this->getAuthKey() === $authKey;
  142 + }
  143 +
  144 + /**
  145 + * Validates password
  146 + *
  147 + * @param string $password password to validate
  148 + * @return boolean if password provided is valid for current user
  149 + */
  150 + public function validatePassword($password)
  151 + {
  152 + return Yii::$app->security->validatePassword($password, $this->password_hash);
  153 + }
  154 +
  155 + /**
  156 + * Generates password hash from password and sets it to the model
  157 + *
  158 + * @param string $password
  159 + */
  160 + public function setPassword($password)
  161 + {
  162 + $this->password_hash = Yii::$app->security->generatePasswordHash($password);
  163 + }
  164 +
  165 + /**
  166 + * Generates "remember me" authentication key
  167 + */
  168 + public function generateAuthKey()
  169 + {
  170 + $this->auth_key = Yii::$app->security->generateRandomString();
  171 + }
  172 +
  173 + /**
  174 + * Generates new password reset token
  175 + */
  176 + public function generatePasswordResetToken()
  177 + {
  178 + $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
  179 + }
  180 +
  181 + /**
  182 + * Removes password reset token
  183 + */
  184 + public function removePasswordResetToken()
  185 + {
  186 + $this->password_reset_token = null;
  187 + }
  188 +}
... ...
common/widgets/Alert.php 0 โ†’ 100755
  1 +++ a/common/widgets/Alert.php
  1 +<?php
  2 +/**
  3 + * @link http://www.yiiframework.com/
  4 + * @copyright Copyright (c) 2008 Yii Software LLC
  5 + * @license http://www.yiiframework.com/license/
  6 + */
  7 +
  8 +namespace common\widgets;
  9 +
  10 +/**
  11 + * Alert widget renders a message from session flash. All flash messages are displayed
  12 + * in the sequence they were assigned using setFlash. You can set message as following:
  13 + *
  14 + * ```php
  15 + * \Yii::$app->session->setFlash('error', 'This is the message');
  16 + * \Yii::$app->session->setFlash('success', 'This is the message');
  17 + * \Yii::$app->session->setFlash('info', 'This is the message');
  18 + * ```
  19 + *
  20 + * Multiple messages could be set as follows:
  21 + *
  22 + * ```php
  23 + * \Yii::$app->session->setFlash('error', ['Error 1', 'Error 2']);
  24 + * ```
  25 + *
  26 + * @author Kartik Visweswaran <kartikv2@gmail.com>
  27 + * @author Alexander Makarov <sam@rmcreative.ru>
  28 + */
  29 +class Alert extends \yii\bootstrap\Widget
  30 +{
  31 + /**
  32 + * @var array the alert types configuration for the flash messages.
  33 + * This array is setup as $key => $value, where:
  34 + * - $key is the name of the session flash variable
  35 + * - $value is the bootstrap alert type (i.e. danger, success, info, warning)
  36 + */
  37 + public $alertTypes = [
  38 + 'error' => 'alert-danger',
  39 + 'danger' => 'alert-danger',
  40 + 'success' => 'alert-success',
  41 + 'info' => 'alert-info',
  42 + 'warning' => 'alert-warning'
  43 + ];
  44 +
  45 + /**
  46 + * @var array the options for rendering the close button tag.
  47 + */
  48 + public $closeButton = [];
  49 +
  50 + public function init()
  51 + {
  52 + parent::init();
  53 +
  54 + $session = \Yii::$app->session;
  55 + $flashes = $session->getAllFlashes();
  56 + $appendCss = isset($this->options['class']) ? ' ' . $this->options['class'] : '';
  57 +
  58 + foreach ($flashes as $type => $data) {
  59 + if (isset($this->alertTypes[$type])) {
  60 + $data = (array) $data;
  61 + foreach ($data as $i => $message) {
  62 + /* initialize css class for each alert box */
  63 + $this->options['class'] = $this->alertTypes[$type] . $appendCss;
  64 +
  65 + /* assign unique id to each alert box */
  66 + $this->options['id'] = $this->getId() . '-' . $type . '-' . $i;
  67 +
  68 + echo \yii\bootstrap\Alert::widget([
  69 + 'body' => $message,
  70 + 'closeButton' => $this->closeButton,
  71 + 'options' => $this->options,
  72 + ]);
  73 + }
  74 +
  75 + $session->removeFlash($type);
  76 + }
  77 + }
  78 + }
  79 +}
... ...
composer.json 0 โ†’ 100755
  1 +++ a/composer.json
  1 +{
  2 + "name": "yiisoft/yii2-app-advanced",
  3 + "description": "Yii 2 Advanced Project Template",
  4 + "keywords": ["yii2", "framework", "advanced", "project template"],
  5 + "homepage": "http://www.yiiframework.com/",
  6 + "type": "project",
  7 + "license": "BSD-3-Clause",
  8 + "support": {
  9 + "issues": "https://github.com/yiisoft/yii2/issues?state=open",
  10 + "forum": "http://www.yiiframework.com/forum/",
  11 + "wiki": "http://www.yiiframework.com/wiki/",
  12 + "irc": "irc://irc.freenode.net/yii",
  13 + "source": "https://github.com/yiisoft/yii2"
  14 + },
  15 + "minimum-stability": "stable",
  16 + "require": {
  17 + "php": ">=5.4.0",
  18 + "yiisoft/yii2": ">=2.0.6",
  19 + "yiisoft/yii2-bootstrap": "*",
  20 + "yiisoft/yii2-swiftmailer": "*",
  21 + "codeception/codeception": "*"
  22 + },
  23 + "require-dev": {
  24 + "yiisoft/yii2-codeception": "*",
  25 + "yiisoft/yii2-debug": "*",
  26 + "yiisoft/yii2-gii": "*",
  27 + "yiisoft/yii2-faker": "*"
  28 + },
  29 + "config": {
  30 + "process-timeout": 1800
  31 + },
  32 + "extra": {
  33 + "asset-installer-paths": {
  34 + "npm-asset-library": "vendor/npm",
  35 + "bower-asset-library": "vendor/bower"
  36 + }
  37 + }
  38 +}
... ...
composer.lock 0 โ†’ 100755
  1 +++ a/composer.lock
  1 +{
  2 + "_readme": [
  3 + "This file locks the dependencies of your project to a known state",
  4 + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
  5 + "This file is @generated automatically"
  6 + ],
  7 + "hash": "7b9dfbced775c4ca09d6d679ba910fdb",
  8 + "content-hash": "93afe42821bf36e571dff90696b85cb9",
  9 + "packages": [
  10 + {
  11 + "name": "bower-asset/bootstrap",
  12 + "version": "v3.3.5",
  13 + "source": {
  14 + "type": "git",
  15 + "url": "https://github.com/twbs/bootstrap.git",
  16 + "reference": "16b48259a62f576e52c903c476bd42b90ab22482"
  17 + },
  18 + "dist": {
  19 + "type": "zip",
  20 + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/16b48259a62f576e52c903c476bd42b90ab22482",
  21 + "reference": "16b48259a62f576e52c903c476bd42b90ab22482",
  22 + "shasum": ""
  23 + },
  24 + "require": {
  25 + "bower-asset/jquery": ">=1.9.1"
  26 + },
  27 + "type": "bower-asset-library",
  28 + "extra": {
  29 + "bower-asset-main": [
  30 + "less/bootstrap.less",
  31 + "dist/js/bootstrap.js"
  32 + ],
  33 + "bower-asset-ignore": [
  34 + "/.*",
  35 + "_config.yml",
  36 + "CNAME",
  37 + "composer.json",
  38 + "CONTRIBUTING.md",
  39 + "docs",
  40 + "js/tests",
  41 + "test-infra"
  42 + ]
  43 + },
  44 + "license": [
  45 + "MIT"
  46 + ],
  47 + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
  48 + "keywords": [
  49 + "css",
  50 + "framework",
  51 + "front-end",
  52 + "js",
  53 + "less",
  54 + "mobile-first",
  55 + "responsive",
  56 + "web"
  57 + ]
  58 + },
  59 + {
  60 + "name": "bower-asset/jquery",
  61 + "version": "2.1.4",
  62 + "source": {
  63 + "type": "git",
  64 + "url": "https://github.com/jquery/jquery.git",
  65 + "reference": "7751e69b615c6eca6f783a81e292a55725af6b85"
  66 + },
  67 + "dist": {
  68 + "type": "zip",
  69 + "url": "https://api.github.com/repos/jquery/jquery/zipball/7751e69b615c6eca6f783a81e292a55725af6b85",
  70 + "reference": "7751e69b615c6eca6f783a81e292a55725af6b85",
  71 + "shasum": ""
  72 + },
  73 + "require-dev": {
  74 + "bower-asset/qunit": "1.14.0",
  75 + "bower-asset/requirejs": "2.1.10",
  76 + "bower-asset/sinon": "1.8.1",
  77 + "bower-asset/sizzle": "2.1.1-patch2"
  78 + },
  79 + "type": "bower-asset-library",
  80 + "extra": {
  81 + "bower-asset-main": "dist/jquery.js",
  82 + "bower-asset-ignore": [
  83 + "**/.*",
  84 + "build",
  85 + "dist/cdn",
  86 + "speed",
  87 + "test",
  88 + "*.md",
  89 + "AUTHORS.txt",
  90 + "Gruntfile.js",
  91 + "package.json"
  92 + ]
  93 + },
  94 + "license": [
  95 + "MIT"
  96 + ],
  97 + "keywords": [
  98 + "javascript",
  99 + "jquery",
  100 + "library"
  101 + ]
  102 + },
  103 + {
  104 + "name": "bower-asset/jquery.inputmask",
  105 + "version": "3.1.63",
  106 + "source": {
  107 + "type": "git",
  108 + "url": "https://github.com/RobinHerbots/jquery.inputmask.git",
  109 + "reference": "c40c7287eadc31e341ebbf0c02352eb55b9cbc48"
  110 + },
  111 + "dist": {
  112 + "type": "zip",
  113 + "url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/c40c7287eadc31e341ebbf0c02352eb55b9cbc48",
  114 + "reference": "c40c7287eadc31e341ebbf0c02352eb55b9cbc48",
  115 + "shasum": ""
  116 + },
  117 + "require": {
  118 + "bower-asset/jquery": ">=1.7"
  119 + },
  120 + "type": "bower-asset-library",
  121 + "extra": {
  122 + "bower-asset-main": [
  123 + "./dist/inputmask/jquery.inputmask.js",
  124 + "./dist/inputmask/jquery.inputmask.extensions.js",
  125 + "./dist/inputmask/jquery.inputmask.date.extensions.js",
  126 + "./dist/inputmask/jquery.inputmask.numeric.extensions.js",
  127 + "./dist/inputmask/jquery.inputmask.phone.extensions.js",
  128 + "./dist/inputmask/jquery.inputmask.regex.extensions.js"
  129 + ],
  130 + "bower-asset-ignore": [
  131 + "**/.*",
  132 + "qunit/",
  133 + "nuget/",
  134 + "tools/",
  135 + "js/",
  136 + "*.md",
  137 + "build.properties",
  138 + "build.xml",
  139 + "jquery.inputmask.jquery.json"
  140 + ]
  141 + },
  142 + "license": [
  143 + "http://opensource.org/licenses/mit-license.php"
  144 + ],
  145 + "description": "jquery.inputmask is a jquery plugin which create an input mask.",
  146 + "keywords": [
  147 + "form",
  148 + "input",
  149 + "inputmask",
  150 + "jquery",
  151 + "mask",
  152 + "plugins"
  153 + ]
  154 + },
  155 + {
  156 + "name": "bower-asset/punycode",
  157 + "version": "v1.3.2",
  158 + "source": {
  159 + "type": "git",
  160 + "url": "https://github.com/bestiejs/punycode.js.git",
  161 + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3"
  162 + },
  163 + "dist": {
  164 + "type": "zip",
  165 + "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3",
  166 + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3",
  167 + "shasum": ""
  168 + },
  169 + "type": "bower-asset-library",
  170 + "extra": {
  171 + "bower-asset-main": "punycode.js",
  172 + "bower-asset-ignore": [
  173 + "coverage",
  174 + "tests",
  175 + ".*",
  176 + "component.json",
  177 + "Gruntfile.js",
  178 + "node_modules",
  179 + "package.json"
  180 + ]
  181 + }
  182 + },
  183 + {
  184 + "name": "bower-asset/yii2-pjax",
  185 + "version": "v2.0.4",
  186 + "source": {
  187 + "type": "git",
  188 + "url": "https://github.com/yiisoft/jquery-pjax.git",
  189 + "reference": "3f20897307cca046fca5323b318475ae9dac0ca0"
  190 + },
  191 + "dist": {
  192 + "type": "zip",
  193 + "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/3f20897307cca046fca5323b318475ae9dac0ca0",
  194 + "reference": "3f20897307cca046fca5323b318475ae9dac0ca0",
  195 + "shasum": ""
  196 + },
  197 + "require": {
  198 + "bower-asset/jquery": ">=1.8"
  199 + },
  200 + "type": "bower-asset-library",
  201 + "extra": {
  202 + "bower-asset-main": "./jquery.pjax.js",
  203 + "bower-asset-ignore": [
  204 + ".travis.yml",
  205 + "Gemfile",
  206 + "Gemfile.lock",
  207 + "vendor/",
  208 + "script/",
  209 + "test/"
  210 + ]
  211 + },
  212 + "license": [
  213 + "MIT"
  214 + ]
  215 + },
  216 + {
  217 + "name": "cebe/markdown",
  218 + "version": "1.1.0",
  219 + "source": {
  220 + "type": "git",
  221 + "url": "https://github.com/cebe/markdown.git",
  222 + "reference": "54a2c49de31cc44e864ebf0500a35ef21d0010b2"
  223 + },
  224 + "dist": {
  225 + "type": "zip",
  226 + "url": "https://api.github.com/repos/cebe/markdown/zipball/54a2c49de31cc44e864ebf0500a35ef21d0010b2",
  227 + "reference": "54a2c49de31cc44e864ebf0500a35ef21d0010b2",
  228 + "shasum": ""
  229 + },
  230 + "require": {
  231 + "lib-pcre": "*",
  232 + "php": ">=5.4.0"
  233 + },
  234 + "require-dev": {
  235 + "cebe/indent": "*",
  236 + "facebook/xhprof": "*@dev",
  237 + "phpunit/phpunit": "4.1.*"
  238 + },
  239 + "bin": [
  240 + "bin/markdown"
  241 + ],
  242 + "type": "library",
  243 + "extra": {
  244 + "branch-alias": {
  245 + "dev-master": "1.1.x-dev"
  246 + }
  247 + },
  248 + "autoload": {
  249 + "psr-4": {
  250 + "cebe\\markdown\\": ""
  251 + }
  252 + },
  253 + "notification-url": "https://packagist.org/downloads/",
  254 + "license": [
  255 + "MIT"
  256 + ],
  257 + "authors": [
  258 + {
  259 + "name": "Carsten Brandt",
  260 + "email": "mail@cebe.cc",
  261 + "homepage": "http://cebe.cc/",
  262 + "role": "Creator"
  263 + }
  264 + ],
  265 + "description": "A super fast, highly extensible markdown parser for PHP",
  266 + "homepage": "https://github.com/cebe/markdown#readme",
  267 + "keywords": [
  268 + "extensible",
  269 + "fast",
  270 + "gfm",
  271 + "markdown",
  272 + "markdown-extra"
  273 + ],
  274 + "time": "2015-03-06 05:28:07"
  275 + },
  276 + {
  277 + "name": "codeception/codeception",
  278 + "version": "2.1.3",
  279 + "source": {
  280 + "type": "git",
  281 + "url": "https://github.com/Codeception/Codeception.git",
  282 + "reference": "cd810cb78a869408602e17271f9b7368b09a7ca8"
  283 + },
  284 + "dist": {
  285 + "type": "zip",
  286 + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/cd810cb78a869408602e17271f9b7368b09a7ca8",
  287 + "reference": "cd810cb78a869408602e17271f9b7368b09a7ca8",
  288 + "shasum": ""
  289 + },
  290 + "require": {
  291 + "ext-json": "*",
  292 + "ext-mbstring": "*",
  293 + "facebook/webdriver": ">=1.0.1",
  294 + "guzzlehttp/guzzle": ">=4.1.4 <7.0",
  295 + "guzzlehttp/psr7": "~1.0",
  296 + "php": ">=5.4.0",
  297 + "phpunit/phpunit": "~4.8.0",
  298 + "symfony/browser-kit": "~2.4",
  299 + "symfony/console": "~2.4",
  300 + "symfony/css-selector": "~2.4",
  301 + "symfony/dom-crawler": "~2.4,!=2.4.5",
  302 + "symfony/event-dispatcher": "~2.4",
  303 + "symfony/finder": "~2.4",
  304 + "symfony/yaml": "~2.4"
  305 + },
  306 + "require-dev": {
  307 + "codeception/specify": "~0.3",
  308 + "facebook/php-sdk-v4": "~4.0",
  309 + "flow/jsonpath": "~0.2",
  310 + "monolog/monolog": "~1.8",
  311 + "pda/pheanstalk": "~2.0",
  312 + "videlalvaro/php-amqplib": "~2.4"
  313 + },
  314 + "suggest": {
  315 + "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests",
  316 + "codeception/specify": "BDD-style code blocks",
  317 + "codeception/verify": "BDD-style assertions",
  318 + "monolog/monolog": "Log test steps",
  319 + "phpseclib/phpseclib": "Extension required to use the SFTP option in the FTP Module."
  320 + },
  321 + "bin": [
  322 + "codecept"
  323 + ],
  324 + "type": "library",
  325 + "extra": {
  326 + "branch-alias": []
  327 + },
  328 + "autoload": {
  329 + "psr-4": {
  330 + "Codeception\\": "src\\Codeception",
  331 + "Codeception\\Extension\\": "ext"
  332 + }
  333 + },
  334 + "notification-url": "https://packagist.org/downloads/",
  335 + "license": [
  336 + "MIT"
  337 + ],
  338 + "authors": [
  339 + {
  340 + "name": "Michael Bodnarchuk",
  341 + "email": "davert@mail.ua",
  342 + "homepage": "http://codegyre.com"
  343 + }
  344 + ],
  345 + "description": "BDD-style testing framework",
  346 + "homepage": "http://codeception.com/",
  347 + "keywords": [
  348 + "BDD",
  349 + "TDD",
  350 + "acceptance testing",
  351 + "functional testing",
  352 + "unit testing"
  353 + ],
  354 + "time": "2015-10-02 09:38:59"
  355 + },
  356 + {
  357 + "name": "doctrine/instantiator",
  358 + "version": "1.0.5",
  359 + "source": {
  360 + "type": "git",
  361 + "url": "https://github.com/doctrine/instantiator.git",
  362 + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
  363 + },
  364 + "dist": {
  365 + "type": "zip",
  366 + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
  367 + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
  368 + "shasum": ""
  369 + },
  370 + "require": {
  371 + "php": ">=5.3,<8.0-DEV"
  372 + },
  373 + "require-dev": {
  374 + "athletic/athletic": "~0.1.8",
  375 + "ext-pdo": "*",
  376 + "ext-phar": "*",
  377 + "phpunit/phpunit": "~4.0",
  378 + "squizlabs/php_codesniffer": "~2.0"
  379 + },
  380 + "type": "library",
  381 + "extra": {
  382 + "branch-alias": {
  383 + "dev-master": "1.0.x-dev"
  384 + }
  385 + },
  386 + "autoload": {
  387 + "psr-4": {
  388 + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
  389 + }
  390 + },
  391 + "notification-url": "https://packagist.org/downloads/",
  392 + "license": [
  393 + "MIT"
  394 + ],
  395 + "authors": [
  396 + {
  397 + "name": "Marco Pivetta",
  398 + "email": "ocramius@gmail.com",
  399 + "homepage": "http://ocramius.github.com/"
  400 + }
  401 + ],
  402 + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
  403 + "homepage": "https://github.com/doctrine/instantiator",
  404 + "keywords": [
  405 + "constructor",
  406 + "instantiate"
  407 + ],
  408 + "time": "2015-06-14 21:17:01"
  409 + },
  410 + {
  411 + "name": "ezyang/htmlpurifier",
  412 + "version": "v4.6.0",
  413 + "source": {
  414 + "type": "git",
  415 + "url": "https://github.com/ezyang/htmlpurifier.git",
  416 + "reference": "6f389f0f25b90d0b495308efcfa073981177f0fd"
  417 + },
  418 + "dist": {
  419 + "type": "zip",
  420 + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6f389f0f25b90d0b495308efcfa073981177f0fd",
  421 + "reference": "6f389f0f25b90d0b495308efcfa073981177f0fd",
  422 + "shasum": ""
  423 + },
  424 + "require": {
  425 + "php": ">=5.2"
  426 + },
  427 + "type": "library",
  428 + "autoload": {
  429 + "psr-0": {
  430 + "HTMLPurifier": "library/"
  431 + },
  432 + "files": [
  433 + "library/HTMLPurifier.composer.php"
  434 + ]
  435 + },
  436 + "notification-url": "https://packagist.org/downloads/",
  437 + "license": [
  438 + "LGPL"
  439 + ],
  440 + "authors": [
  441 + {
  442 + "name": "Edward Z. Yang",
  443 + "email": "admin@htmlpurifier.org",
  444 + "homepage": "http://ezyang.com"
  445 + }
  446 + ],
  447 + "description": "Standards compliant HTML filter written in PHP",
  448 + "homepage": "http://htmlpurifier.org/",
  449 + "keywords": [
  450 + "html"
  451 + ],
  452 + "time": "2013-11-30 08:25:19"
  453 + },
  454 + {
  455 + "name": "facebook/webdriver",
  456 + "version": "1.0.2",
  457 + "source": {
  458 + "type": "git",
  459 + "url": "https://github.com/facebook/php-webdriver.git",
  460 + "reference": "fe1bbbc5dde804d08a8593f1d9d0d3b05f5c84f5"
  461 + },
  462 + "dist": {
  463 + "type": "zip",
  464 + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/fe1bbbc5dde804d08a8593f1d9d0d3b05f5c84f5",
  465 + "reference": "fe1bbbc5dde804d08a8593f1d9d0d3b05f5c84f5",
  466 + "shasum": ""
  467 + },
  468 + "require": {
  469 + "php": ">=5.3.19"
  470 + },
  471 + "require-dev": {
  472 + "phpunit/phpunit": "4.6.*"
  473 + },
  474 + "suggest": {
  475 + "phpdocumentor/phpdocumentor": "2.*"
  476 + },
  477 + "type": "library",
  478 + "autoload": {
  479 + "psr-4": {
  480 + "Facebook\\WebDriver\\": "lib/"
  481 + }
  482 + },
  483 + "notification-url": "https://packagist.org/downloads/",
  484 + "license": [
  485 + "Apache-2.0"
  486 + ],
  487 + "description": "A PHP client for WebDriver",
  488 + "homepage": "https://github.com/facebook/php-webdriver",
  489 + "keywords": [
  490 + "facebook",
  491 + "php",
  492 + "selenium",
  493 + "webdriver"
  494 + ],
  495 + "time": "2015-08-12 20:21:31"
  496 + },
  497 + {
  498 + "name": "guzzlehttp/guzzle",
  499 + "version": "5.3.0",
  500 + "source": {
  501 + "type": "git",
  502 + "url": "https://github.com/guzzle/guzzle.git",
  503 + "reference": "f3c8c22471cb55475105c14769644a49c3262b93"
  504 + },
  505 + "dist": {
  506 + "type": "zip",
  507 + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93",
  508 + "reference": "f3c8c22471cb55475105c14769644a49c3262b93",
  509 + "shasum": ""
  510 + },
  511 + "require": {
  512 + "guzzlehttp/ringphp": "^1.1",
  513 + "php": ">=5.4.0"
  514 + },
  515 + "require-dev": {
  516 + "ext-curl": "*",
  517 + "phpunit/phpunit": "^4.0",
  518 + "psr/log": "^1.0"
  519 + },
  520 + "type": "library",
  521 + "extra": {
  522 + "branch-alias": {
  523 + "dev-master": "5.0-dev"
  524 + }
  525 + },
  526 + "autoload": {
  527 + "psr-4": {
  528 + "GuzzleHttp\\": "src/"
  529 + }
  530 + },
  531 + "notification-url": "https://packagist.org/downloads/",
  532 + "license": [
  533 + "MIT"
  534 + ],
  535 + "authors": [
  536 + {
  537 + "name": "Michael Dowling",
  538 + "email": "mtdowling@gmail.com",
  539 + "homepage": "https://github.com/mtdowling"
  540 + }
  541 + ],
  542 + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
  543 + "homepage": "http://guzzlephp.org/",
  544 + "keywords": [
  545 + "client",
  546 + "curl",
  547 + "framework",
  548 + "http",
  549 + "http client",
  550 + "rest",
  551 + "web service"
  552 + ],
  553 + "time": "2015-05-20 03:47:55"
  554 + },
  555 + {
  556 + "name": "guzzlehttp/psr7",
  557 + "version": "1.2.0",
  558 + "source": {
  559 + "type": "git",
  560 + "url": "https://github.com/guzzle/psr7.git",
  561 + "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e"
  562 + },
  563 + "dist": {
  564 + "type": "zip",
  565 + "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
  566 + "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
  567 + "shasum": ""
  568 + },
  569 + "require": {
  570 + "php": ">=5.4.0",
  571 + "psr/http-message": "~1.0"
  572 + },
  573 + "provide": {
  574 + "psr/http-message-implementation": "1.0"
  575 + },
  576 + "require-dev": {
  577 + "phpunit/phpunit": "~4.0"
  578 + },
  579 + "type": "library",
  580 + "extra": {
  581 + "branch-alias": {
  582 + "dev-master": "1.0-dev"
  583 + }
  584 + },
  585 + "autoload": {
  586 + "psr-4": {
  587 + "GuzzleHttp\\Psr7\\": "src/"
  588 + },
  589 + "files": [
  590 + "src/functions_include.php"
  591 + ]
  592 + },
  593 + "notification-url": "https://packagist.org/downloads/",
  594 + "license": [
  595 + "MIT"
  596 + ],
  597 + "authors": [
  598 + {
  599 + "name": "Michael Dowling",
  600 + "email": "mtdowling@gmail.com",
  601 + "homepage": "https://github.com/mtdowling"
  602 + }
  603 + ],
  604 + "description": "PSR-7 message implementation",
  605 + "keywords": [
  606 + "http",
  607 + "message",
  608 + "stream",
  609 + "uri"
  610 + ],
  611 + "time": "2015-08-15 19:32:36"
  612 + },
  613 + {
  614 + "name": "guzzlehttp/ringphp",
  615 + "version": "1.1.0",
  616 + "source": {
  617 + "type": "git",
  618 + "url": "https://github.com/guzzle/RingPHP.git",
  619 + "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b"
  620 + },
  621 + "dist": {
  622 + "type": "zip",
  623 + "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
  624 + "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
  625 + "shasum": ""
  626 + },
  627 + "require": {
  628 + "guzzlehttp/streams": "~3.0",
  629 + "php": ">=5.4.0",
  630 + "react/promise": "~2.0"
  631 + },
  632 + "require-dev": {
  633 + "ext-curl": "*",
  634 + "phpunit/phpunit": "~4.0"
  635 + },
  636 + "suggest": {
  637 + "ext-curl": "Guzzle will use specific adapters if cURL is present"
  638 + },
  639 + "type": "library",
  640 + "extra": {
  641 + "branch-alias": {
  642 + "dev-master": "1.1-dev"
  643 + }
  644 + },
  645 + "autoload": {
  646 + "psr-4": {
  647 + "GuzzleHttp\\Ring\\": "src/"
  648 + }
  649 + },
  650 + "notification-url": "https://packagist.org/downloads/",
  651 + "license": [
  652 + "MIT"
  653 + ],
  654 + "authors": [
  655 + {
  656 + "name": "Michael Dowling",
  657 + "email": "mtdowling@gmail.com",
  658 + "homepage": "https://github.com/mtdowling"
  659 + }
  660 + ],
  661 + "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
  662 + "time": "2015-05-20 03:37:09"
  663 + },
  664 + {
  665 + "name": "guzzlehttp/streams",
  666 + "version": "3.0.0",
  667 + "source": {
  668 + "type": "git",
  669 + "url": "https://github.com/guzzle/streams.git",
  670 + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5"
  671 + },
  672 + "dist": {
  673 + "type": "zip",
  674 + "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
  675 + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
  676 + "shasum": ""
  677 + },
  678 + "require": {
  679 + "php": ">=5.4.0"
  680 + },
  681 + "require-dev": {
  682 + "phpunit/phpunit": "~4.0"
  683 + },
  684 + "type": "library",
  685 + "extra": {
  686 + "branch-alias": {
  687 + "dev-master": "3.0-dev"
  688 + }
  689 + },
  690 + "autoload": {
  691 + "psr-4": {
  692 + "GuzzleHttp\\Stream\\": "src/"
  693 + }
  694 + },
  695 + "notification-url": "https://packagist.org/downloads/",
  696 + "license": [
  697 + "MIT"
  698 + ],
  699 + "authors": [
  700 + {
  701 + "name": "Michael Dowling",
  702 + "email": "mtdowling@gmail.com",
  703 + "homepage": "https://github.com/mtdowling"
  704 + }
  705 + ],
  706 + "description": "Provides a simple abstraction over streams of data",
  707 + "homepage": "http://guzzlephp.org/",
  708 + "keywords": [
  709 + "Guzzle",
  710 + "stream"
  711 + ],
  712 + "time": "2014-10-12 19:18:40"
  713 + },
  714 + {
  715 + "name": "phpdocumentor/reflection-docblock",
  716 + "version": "2.0.4",
  717 + "source": {
  718 + "type": "git",
  719 + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
  720 + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
  721 + },
  722 + "dist": {
  723 + "type": "zip",
  724 + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
  725 + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
  726 + "shasum": ""
  727 + },
  728 + "require": {
  729 + "php": ">=5.3.3"
  730 + },
  731 + "require-dev": {
  732 + "phpunit/phpunit": "~4.0"
  733 + },
  734 + "suggest": {
  735 + "dflydev/markdown": "~1.0",
  736 + "erusev/parsedown": "~1.0"
  737 + },
  738 + "type": "library",
  739 + "extra": {
  740 + "branch-alias": {
  741 + "dev-master": "2.0.x-dev"
  742 + }
  743 + },
  744 + "autoload": {
  745 + "psr-0": {
  746 + "phpDocumentor": [
  747 + "src/"
  748 + ]
  749 + }
  750 + },
  751 + "notification-url": "https://packagist.org/downloads/",
  752 + "license": [
  753 + "MIT"
  754 + ],
  755 + "authors": [
  756 + {
  757 + "name": "Mike van Riel",
  758 + "email": "mike.vanriel@naenius.com"
  759 + }
  760 + ],
  761 + "time": "2015-02-03 12:10:50"
  762 + },
  763 + {
  764 + "name": "phpspec/prophecy",
  765 + "version": "v1.5.0",
  766 + "source": {
  767 + "type": "git",
  768 + "url": "https://github.com/phpspec/prophecy.git",
  769 + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7"
  770 + },
  771 + "dist": {
  772 + "type": "zip",
  773 + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7",
  774 + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7",
  775 + "shasum": ""
  776 + },
  777 + "require": {
  778 + "doctrine/instantiator": "^1.0.2",
  779 + "phpdocumentor/reflection-docblock": "~2.0",
  780 + "sebastian/comparator": "~1.1"
  781 + },
  782 + "require-dev": {
  783 + "phpspec/phpspec": "~2.0"
  784 + },
  785 + "type": "library",
  786 + "extra": {
  787 + "branch-alias": {
  788 + "dev-master": "1.4.x-dev"
  789 + }
  790 + },
  791 + "autoload": {
  792 + "psr-0": {
  793 + "Prophecy\\": "src/"
  794 + }
  795 + },
  796 + "notification-url": "https://packagist.org/downloads/",
  797 + "license": [
  798 + "MIT"
  799 + ],
  800 + "authors": [
  801 + {
  802 + "name": "Konstantin Kudryashov",
  803 + "email": "ever.zet@gmail.com",
  804 + "homepage": "http://everzet.com"
  805 + },
  806 + {
  807 + "name": "Marcello Duarte",
  808 + "email": "marcello.duarte@gmail.com"
  809 + }
  810 + ],
  811 + "description": "Highly opinionated mocking framework for PHP 5.3+",
  812 + "homepage": "https://github.com/phpspec/prophecy",
  813 + "keywords": [
  814 + "Double",
  815 + "Dummy",
  816 + "fake",
  817 + "mock",
  818 + "spy",
  819 + "stub"
  820 + ],
  821 + "time": "2015-08-13 10:07:40"
  822 + },
  823 + {
  824 + "name": "phpunit/php-code-coverage",
  825 + "version": "2.2.4",
  826 + "source": {
  827 + "type": "git",
  828 + "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
  829 + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
  830 + },
  831 + "dist": {
  832 + "type": "zip",
  833 + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
  834 + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
  835 + "shasum": ""
  836 + },
  837 + "require": {
  838 + "php": ">=5.3.3",
  839 + "phpunit/php-file-iterator": "~1.3",
  840 + "phpunit/php-text-template": "~1.2",
  841 + "phpunit/php-token-stream": "~1.3",
  842 + "sebastian/environment": "^1.3.2",
  843 + "sebastian/version": "~1.0"
  844 + },
  845 + "require-dev": {
  846 + "ext-xdebug": ">=2.1.4",
  847 + "phpunit/phpunit": "~4"
  848 + },
  849 + "suggest": {
  850 + "ext-dom": "*",
  851 + "ext-xdebug": ">=2.2.1",
  852 + "ext-xmlwriter": "*"
  853 + },
  854 + "type": "library",
  855 + "extra": {
  856 + "branch-alias": {
  857 + "dev-master": "2.2.x-dev"
  858 + }
  859 + },
  860 + "autoload": {
  861 + "classmap": [
  862 + "src/"
  863 + ]
  864 + },
  865 + "notification-url": "https://packagist.org/downloads/",
  866 + "license": [
  867 + "BSD-3-Clause"
  868 + ],
  869 + "authors": [
  870 + {
  871 + "name": "Sebastian Bergmann",
  872 + "email": "sb@sebastian-bergmann.de",
  873 + "role": "lead"
  874 + }
  875 + ],
  876 + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
  877 + "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
  878 + "keywords": [
  879 + "coverage",
  880 + "testing",
  881 + "xunit"
  882 + ],
  883 + "time": "2015-10-06 15:47:00"
  884 + },
  885 + {
  886 + "name": "phpunit/php-file-iterator",
  887 + "version": "1.4.1",
  888 + "source": {
  889 + "type": "git",
  890 + "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
  891 + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
  892 + },
  893 + "dist": {
  894 + "type": "zip",
  895 + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
  896 + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
  897 + "shasum": ""
  898 + },
  899 + "require": {
  900 + "php": ">=5.3.3"
  901 + },
  902 + "type": "library",
  903 + "extra": {
  904 + "branch-alias": {
  905 + "dev-master": "1.4.x-dev"
  906 + }
  907 + },
  908 + "autoload": {
  909 + "classmap": [
  910 + "src/"
  911 + ]
  912 + },
  913 + "notification-url": "https://packagist.org/downloads/",
  914 + "license": [
  915 + "BSD-3-Clause"
  916 + ],
  917 + "authors": [
  918 + {
  919 + "name": "Sebastian Bergmann",
  920 + "email": "sb@sebastian-bergmann.de",
  921 + "role": "lead"
  922 + }
  923 + ],
  924 + "description": "FilterIterator implementation that filters files based on a list of suffixes.",
  925 + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
  926 + "keywords": [
  927 + "filesystem",
  928 + "iterator"
  929 + ],
  930 + "time": "2015-06-21 13:08:43"
  931 + },
  932 + {
  933 + "name": "phpunit/php-text-template",
  934 + "version": "1.2.1",
  935 + "source": {
  936 + "type": "git",
  937 + "url": "https://github.com/sebastianbergmann/php-text-template.git",
  938 + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
  939 + },
  940 + "dist": {
  941 + "type": "zip",
  942 + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
  943 + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
  944 + "shasum": ""
  945 + },
  946 + "require": {
  947 + "php": ">=5.3.3"
  948 + },
  949 + "type": "library",
  950 + "autoload": {
  951 + "classmap": [
  952 + "src/"
  953 + ]
  954 + },
  955 + "notification-url": "https://packagist.org/downloads/",
  956 + "license": [
  957 + "BSD-3-Clause"
  958 + ],
  959 + "authors": [
  960 + {
  961 + "name": "Sebastian Bergmann",
  962 + "email": "sebastian@phpunit.de",
  963 + "role": "lead"
  964 + }
  965 + ],
  966 + "description": "Simple template engine.",
  967 + "homepage": "https://github.com/sebastianbergmann/php-text-template/",
  968 + "keywords": [
  969 + "template"
  970 + ],
  971 + "time": "2015-06-21 13:50:34"
  972 + },
  973 + {
  974 + "name": "phpunit/php-timer",
  975 + "version": "1.0.7",
  976 + "source": {
  977 + "type": "git",
  978 + "url": "https://github.com/sebastianbergmann/php-timer.git",
  979 + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
  980 + },
  981 + "dist": {
  982 + "type": "zip",
  983 + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
  984 + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
  985 + "shasum": ""
  986 + },
  987 + "require": {
  988 + "php": ">=5.3.3"
  989 + },
  990 + "type": "library",
  991 + "autoload": {
  992 + "classmap": [
  993 + "src/"
  994 + ]
  995 + },
  996 + "notification-url": "https://packagist.org/downloads/",
  997 + "license": [
  998 + "BSD-3-Clause"
  999 + ],
  1000 + "authors": [
  1001 + {
  1002 + "name": "Sebastian Bergmann",
  1003 + "email": "sb@sebastian-bergmann.de",
  1004 + "role": "lead"
  1005 + }
  1006 + ],
  1007 + "description": "Utility class for timing",
  1008 + "homepage": "https://github.com/sebastianbergmann/php-timer/",
  1009 + "keywords": [
  1010 + "timer"
  1011 + ],
  1012 + "time": "2015-06-21 08:01:12"
  1013 + },
  1014 + {
  1015 + "name": "phpunit/php-token-stream",
  1016 + "version": "1.4.8",
  1017 + "source": {
  1018 + "type": "git",
  1019 + "url": "https://github.com/sebastianbergmann/php-token-stream.git",
  1020 + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
  1021 + },
  1022 + "dist": {
  1023 + "type": "zip",
  1024 + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
  1025 + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
  1026 + "shasum": ""
  1027 + },
  1028 + "require": {
  1029 + "ext-tokenizer": "*",
  1030 + "php": ">=5.3.3"
  1031 + },
  1032 + "require-dev": {
  1033 + "phpunit/phpunit": "~4.2"
  1034 + },
  1035 + "type": "library",
  1036 + "extra": {
  1037 + "branch-alias": {
  1038 + "dev-master": "1.4-dev"
  1039 + }
  1040 + },
  1041 + "autoload": {
  1042 + "classmap": [
  1043 + "src/"
  1044 + ]
  1045 + },
  1046 + "notification-url": "https://packagist.org/downloads/",
  1047 + "license": [
  1048 + "BSD-3-Clause"
  1049 + ],
  1050 + "authors": [
  1051 + {
  1052 + "name": "Sebastian Bergmann",
  1053 + "email": "sebastian@phpunit.de"
  1054 + }
  1055 + ],
  1056 + "description": "Wrapper around PHP's tokenizer extension.",
  1057 + "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
  1058 + "keywords": [
  1059 + "tokenizer"
  1060 + ],
  1061 + "time": "2015-09-15 10:49:45"
  1062 + },
  1063 + {
  1064 + "name": "phpunit/phpunit",
  1065 + "version": "4.8.16",
  1066 + "source": {
  1067 + "type": "git",
  1068 + "url": "https://github.com/sebastianbergmann/phpunit.git",
  1069 + "reference": "625f8c345606ed0f3a141dfb88f4116f0e22978e"
  1070 + },
  1071 + "dist": {
  1072 + "type": "zip",
  1073 + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/625f8c345606ed0f3a141dfb88f4116f0e22978e",
  1074 + "reference": "625f8c345606ed0f3a141dfb88f4116f0e22978e",
  1075 + "shasum": ""
  1076 + },
  1077 + "require": {
  1078 + "ext-dom": "*",
  1079 + "ext-json": "*",
  1080 + "ext-pcre": "*",
  1081 + "ext-reflection": "*",
  1082 + "ext-spl": "*",
  1083 + "php": ">=5.3.3",
  1084 + "phpspec/prophecy": "^1.3.1",
  1085 + "phpunit/php-code-coverage": "~2.1",
  1086 + "phpunit/php-file-iterator": "~1.4",
  1087 + "phpunit/php-text-template": "~1.2",
  1088 + "phpunit/php-timer": ">=1.0.6",
  1089 + "phpunit/phpunit-mock-objects": "~2.3",
  1090 + "sebastian/comparator": "~1.1",
  1091 + "sebastian/diff": "~1.2",
  1092 + "sebastian/environment": "~1.3",
  1093 + "sebastian/exporter": "~1.2",
  1094 + "sebastian/global-state": "~1.0",
  1095 + "sebastian/version": "~1.0",
  1096 + "symfony/yaml": "~2.1|~3.0"
  1097 + },
  1098 + "suggest": {
  1099 + "phpunit/php-invoker": "~1.1"
  1100 + },
  1101 + "bin": [
  1102 + "phpunit"
  1103 + ],
  1104 + "type": "library",
  1105 + "extra": {
  1106 + "branch-alias": {
  1107 + "dev-master": "4.8.x-dev"
  1108 + }
  1109 + },
  1110 + "autoload": {
  1111 + "classmap": [
  1112 + "src/"
  1113 + ]
  1114 + },
  1115 + "notification-url": "https://packagist.org/downloads/",
  1116 + "license": [
  1117 + "BSD-3-Clause"
  1118 + ],
  1119 + "authors": [
  1120 + {
  1121 + "name": "Sebastian Bergmann",
  1122 + "email": "sebastian@phpunit.de",
  1123 + "role": "lead"
  1124 + }
  1125 + ],
  1126 + "description": "The PHP Unit Testing framework.",
  1127 + "homepage": "https://phpunit.de/",
  1128 + "keywords": [
  1129 + "phpunit",
  1130 + "testing",
  1131 + "xunit"
  1132 + ],
  1133 + "time": "2015-10-23 06:48:33"
  1134 + },
  1135 + {
  1136 + "name": "phpunit/phpunit-mock-objects",
  1137 + "version": "2.3.8",
  1138 + "source": {
  1139 + "type": "git",
  1140 + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
  1141 + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
  1142 + },
  1143 + "dist": {
  1144 + "type": "zip",
  1145 + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
  1146 + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
  1147 + "shasum": ""
  1148 + },
  1149 + "require": {
  1150 + "doctrine/instantiator": "^1.0.2",
  1151 + "php": ">=5.3.3",
  1152 + "phpunit/php-text-template": "~1.2",
  1153 + "sebastian/exporter": "~1.2"
  1154 + },
  1155 + "require-dev": {
  1156 + "phpunit/phpunit": "~4.4"
  1157 + },
  1158 + "suggest": {
  1159 + "ext-soap": "*"
  1160 + },
  1161 + "type": "library",
  1162 + "extra": {
  1163 + "branch-alias": {
  1164 + "dev-master": "2.3.x-dev"
  1165 + }
  1166 + },
  1167 + "autoload": {
  1168 + "classmap": [
  1169 + "src/"
  1170 + ]
  1171 + },
  1172 + "notification-url": "https://packagist.org/downloads/",
  1173 + "license": [
  1174 + "BSD-3-Clause"
  1175 + ],
  1176 + "authors": [
  1177 + {
  1178 + "name": "Sebastian Bergmann",
  1179 + "email": "sb@sebastian-bergmann.de",
  1180 + "role": "lead"
  1181 + }
  1182 + ],
  1183 + "description": "Mock Object library for PHPUnit",
  1184 + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
  1185 + "keywords": [
  1186 + "mock",
  1187 + "xunit"
  1188 + ],
  1189 + "time": "2015-10-02 06:51:40"
  1190 + },
  1191 + {
  1192 + "name": "psr/http-message",
  1193 + "version": "1.0",
  1194 + "source": {
  1195 + "type": "git",
  1196 + "url": "https://github.com/php-fig/http-message.git",
  1197 + "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298"
  1198 + },
  1199 + "dist": {
  1200 + "type": "zip",
  1201 + "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
  1202 + "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
  1203 + "shasum": ""
  1204 + },
  1205 + "require": {
  1206 + "php": ">=5.3.0"
  1207 + },
  1208 + "type": "library",
  1209 + "extra": {
  1210 + "branch-alias": {
  1211 + "dev-master": "1.0.x-dev"
  1212 + }
  1213 + },
  1214 + "autoload": {
  1215 + "psr-4": {
  1216 + "Psr\\Http\\Message\\": "src/"
  1217 + }
  1218 + },
  1219 + "notification-url": "https://packagist.org/downloads/",
  1220 + "license": [
  1221 + "MIT"
  1222 + ],
  1223 + "authors": [
  1224 + {
  1225 + "name": "PHP-FIG",
  1226 + "homepage": "http://www.php-fig.org/"
  1227 + }
  1228 + ],
  1229 + "description": "Common interface for HTTP messages",
  1230 + "keywords": [
  1231 + "http",
  1232 + "http-message",
  1233 + "psr",
  1234 + "psr-7",
  1235 + "request",
  1236 + "response"
  1237 + ],
  1238 + "time": "2015-05-04 20:22:00"
  1239 + },
  1240 + {
  1241 + "name": "react/promise",
  1242 + "version": "v2.2.1",
  1243 + "source": {
  1244 + "type": "git",
  1245 + "url": "https://github.com/reactphp/promise.git",
  1246 + "reference": "3b6fca09c7d56321057fa8867c8dbe1abf648627"
  1247 + },
  1248 + "dist": {
  1249 + "type": "zip",
  1250 + "url": "https://api.github.com/repos/reactphp/promise/zipball/3b6fca09c7d56321057fa8867c8dbe1abf648627",
  1251 + "reference": "3b6fca09c7d56321057fa8867c8dbe1abf648627",
  1252 + "shasum": ""
  1253 + },
  1254 + "require": {
  1255 + "php": ">=5.4.0"
  1256 + },
  1257 + "type": "library",
  1258 + "extra": {
  1259 + "branch-alias": {
  1260 + "dev-master": "2.0-dev"
  1261 + }
  1262 + },
  1263 + "autoload": {
  1264 + "psr-4": {
  1265 + "React\\Promise\\": "src/"
  1266 + },
  1267 + "files": [
  1268 + "src/functions_include.php"
  1269 + ]
  1270 + },
  1271 + "notification-url": "https://packagist.org/downloads/",
  1272 + "license": [
  1273 + "MIT"
  1274 + ],
  1275 + "authors": [
  1276 + {
  1277 + "name": "Jan Sorgalla",
  1278 + "email": "jsorgalla@gmail.com"
  1279 + }
  1280 + ],
  1281 + "description": "A lightweight implementation of CommonJS Promises/A for PHP",
  1282 + "time": "2015-07-03 13:48:55"
  1283 + },
  1284 + {
  1285 + "name": "sebastian/comparator",
  1286 + "version": "1.2.0",
  1287 + "source": {
  1288 + "type": "git",
  1289 + "url": "https://github.com/sebastianbergmann/comparator.git",
  1290 + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
  1291 + },
  1292 + "dist": {
  1293 + "type": "zip",
  1294 + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
  1295 + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
  1296 + "shasum": ""
  1297 + },
  1298 + "require": {
  1299 + "php": ">=5.3.3",
  1300 + "sebastian/diff": "~1.2",
  1301 + "sebastian/exporter": "~1.2"
  1302 + },
  1303 + "require-dev": {
  1304 + "phpunit/phpunit": "~4.4"
  1305 + },
  1306 + "type": "library",
  1307 + "extra": {
  1308 + "branch-alias": {
  1309 + "dev-master": "1.2.x-dev"
  1310 + }
  1311 + },
  1312 + "autoload": {
  1313 + "classmap": [
  1314 + "src/"
  1315 + ]
  1316 + },
  1317 + "notification-url": "https://packagist.org/downloads/",
  1318 + "license": [
  1319 + "BSD-3-Clause"
  1320 + ],
  1321 + "authors": [
  1322 + {
  1323 + "name": "Jeff Welch",
  1324 + "email": "whatthejeff@gmail.com"
  1325 + },
  1326 + {
  1327 + "name": "Volker Dusch",
  1328 + "email": "github@wallbash.com"
  1329 + },
  1330 + {
  1331 + "name": "Bernhard Schussek",
  1332 + "email": "bschussek@2bepublished.at"
  1333 + },
  1334 + {
  1335 + "name": "Sebastian Bergmann",
  1336 + "email": "sebastian@phpunit.de"
  1337 + }
  1338 + ],
  1339 + "description": "Provides the functionality to compare PHP values for equality",
  1340 + "homepage": "http://www.github.com/sebastianbergmann/comparator",
  1341 + "keywords": [
  1342 + "comparator",
  1343 + "compare",
  1344 + "equality"
  1345 + ],
  1346 + "time": "2015-07-26 15:48:44"
  1347 + },
  1348 + {
  1349 + "name": "sebastian/diff",
  1350 + "version": "1.3.0",
  1351 + "source": {
  1352 + "type": "git",
  1353 + "url": "https://github.com/sebastianbergmann/diff.git",
  1354 + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
  1355 + },
  1356 + "dist": {
  1357 + "type": "zip",
  1358 + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
  1359 + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
  1360 + "shasum": ""
  1361 + },
  1362 + "require": {
  1363 + "php": ">=5.3.3"
  1364 + },
  1365 + "require-dev": {
  1366 + "phpunit/phpunit": "~4.2"
  1367 + },
  1368 + "type": "library",
  1369 + "extra": {
  1370 + "branch-alias": {
  1371 + "dev-master": "1.3-dev"
  1372 + }
  1373 + },
  1374 + "autoload": {
  1375 + "classmap": [
  1376 + "src/"
  1377 + ]
  1378 + },
  1379 + "notification-url": "https://packagist.org/downloads/",
  1380 + "license": [
  1381 + "BSD-3-Clause"
  1382 + ],
  1383 + "authors": [
  1384 + {
  1385 + "name": "Kore Nordmann",
  1386 + "email": "mail@kore-nordmann.de"
  1387 + },
  1388 + {
  1389 + "name": "Sebastian Bergmann",
  1390 + "email": "sebastian@phpunit.de"
  1391 + }
  1392 + ],
  1393 + "description": "Diff implementation",
  1394 + "homepage": "http://www.github.com/sebastianbergmann/diff",
  1395 + "keywords": [
  1396 + "diff"
  1397 + ],
  1398 + "time": "2015-02-22 15:13:53"
  1399 + },
  1400 + {
  1401 + "name": "sebastian/environment",
  1402 + "version": "1.3.2",
  1403 + "source": {
  1404 + "type": "git",
  1405 + "url": "https://github.com/sebastianbergmann/environment.git",
  1406 + "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44"
  1407 + },
  1408 + "dist": {
  1409 + "type": "zip",
  1410 + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44",
  1411 + "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44",
  1412 + "shasum": ""
  1413 + },
  1414 + "require": {
  1415 + "php": ">=5.3.3"
  1416 + },
  1417 + "require-dev": {
  1418 + "phpunit/phpunit": "~4.4"
  1419 + },
  1420 + "type": "library",
  1421 + "extra": {
  1422 + "branch-alias": {
  1423 + "dev-master": "1.3.x-dev"
  1424 + }
  1425 + },
  1426 + "autoload": {
  1427 + "classmap": [
  1428 + "src/"
  1429 + ]
  1430 + },
  1431 + "notification-url": "https://packagist.org/downloads/",
  1432 + "license": [
  1433 + "BSD-3-Clause"
  1434 + ],
  1435 + "authors": [
  1436 + {
  1437 + "name": "Sebastian Bergmann",
  1438 + "email": "sebastian@phpunit.de"
  1439 + }
  1440 + ],
  1441 + "description": "Provides functionality to handle HHVM/PHP environments",
  1442 + "homepage": "http://www.github.com/sebastianbergmann/environment",
  1443 + "keywords": [
  1444 + "Xdebug",
  1445 + "environment",
  1446 + "hhvm"
  1447 + ],
  1448 + "time": "2015-08-03 06:14:51"
  1449 + },
  1450 + {
  1451 + "name": "sebastian/exporter",
  1452 + "version": "1.2.1",
  1453 + "source": {
  1454 + "type": "git",
  1455 + "url": "https://github.com/sebastianbergmann/exporter.git",
  1456 + "reference": "7ae5513327cb536431847bcc0c10edba2701064e"
  1457 + },
  1458 + "dist": {
  1459 + "type": "zip",
  1460 + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e",
  1461 + "reference": "7ae5513327cb536431847bcc0c10edba2701064e",
  1462 + "shasum": ""
  1463 + },
  1464 + "require": {
  1465 + "php": ">=5.3.3",
  1466 + "sebastian/recursion-context": "~1.0"
  1467 + },
  1468 + "require-dev": {
  1469 + "phpunit/phpunit": "~4.4"
  1470 + },
  1471 + "type": "library",
  1472 + "extra": {
  1473 + "branch-alias": {
  1474 + "dev-master": "1.2.x-dev"
  1475 + }
  1476 + },
  1477 + "autoload": {
  1478 + "classmap": [
  1479 + "src/"
  1480 + ]
  1481 + },
  1482 + "notification-url": "https://packagist.org/downloads/",
  1483 + "license": [
  1484 + "BSD-3-Clause"
  1485 + ],
  1486 + "authors": [
  1487 + {
  1488 + "name": "Jeff Welch",
  1489 + "email": "whatthejeff@gmail.com"
  1490 + },
  1491 + {
  1492 + "name": "Volker Dusch",
  1493 + "email": "github@wallbash.com"
  1494 + },
  1495 + {
  1496 + "name": "Bernhard Schussek",
  1497 + "email": "bschussek@2bepublished.at"
  1498 + },
  1499 + {
  1500 + "name": "Sebastian Bergmann",
  1501 + "email": "sebastian@phpunit.de"
  1502 + },
  1503 + {
  1504 + "name": "Adam Harvey",
  1505 + "email": "aharvey@php.net"
  1506 + }
  1507 + ],
  1508 + "description": "Provides the functionality to export PHP variables for visualization",
  1509 + "homepage": "http://www.github.com/sebastianbergmann/exporter",
  1510 + "keywords": [
  1511 + "export",
  1512 + "exporter"
  1513 + ],
  1514 + "time": "2015-06-21 07:55:53"
  1515 + },
  1516 + {
  1517 + "name": "sebastian/global-state",
  1518 + "version": "1.1.1",
  1519 + "source": {
  1520 + "type": "git",
  1521 + "url": "https://github.com/sebastianbergmann/global-state.git",
  1522 + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
  1523 + },
  1524 + "dist": {
  1525 + "type": "zip",
  1526 + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
  1527 + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
  1528 + "shasum": ""
  1529 + },
  1530 + "require": {
  1531 + "php": ">=5.3.3"
  1532 + },
  1533 + "require-dev": {
  1534 + "phpunit/phpunit": "~4.2"
  1535 + },
  1536 + "suggest": {
  1537 + "ext-uopz": "*"
  1538 + },
  1539 + "type": "library",
  1540 + "extra": {
  1541 + "branch-alias": {
  1542 + "dev-master": "1.0-dev"
  1543 + }
  1544 + },
  1545 + "autoload": {
  1546 + "classmap": [
  1547 + "src/"
  1548 + ]
  1549 + },
  1550 + "notification-url": "https://packagist.org/downloads/",
  1551 + "license": [
  1552 + "BSD-3-Clause"
  1553 + ],
  1554 + "authors": [
  1555 + {
  1556 + "name": "Sebastian Bergmann",
  1557 + "email": "sebastian@phpunit.de"
  1558 + }
  1559 + ],
  1560 + "description": "Snapshotting of global state",
  1561 + "homepage": "http://www.github.com/sebastianbergmann/global-state",
  1562 + "keywords": [
  1563 + "global state"
  1564 + ],
  1565 + "time": "2015-10-12 03:26:01"
  1566 + },
  1567 + {
  1568 + "name": "sebastian/recursion-context",
  1569 + "version": "1.0.1",
  1570 + "source": {
  1571 + "type": "git",
  1572 + "url": "https://github.com/sebastianbergmann/recursion-context.git",
  1573 + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
  1574 + },
  1575 + "dist": {
  1576 + "type": "zip",
  1577 + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba",
  1578 + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
  1579 + "shasum": ""
  1580 + },
  1581 + "require": {
  1582 + "php": ">=5.3.3"
  1583 + },
  1584 + "require-dev": {
  1585 + "phpunit/phpunit": "~4.4"
  1586 + },
  1587 + "type": "library",
  1588 + "extra": {
  1589 + "branch-alias": {
  1590 + "dev-master": "1.0.x-dev"
  1591 + }
  1592 + },
  1593 + "autoload": {
  1594 + "classmap": [
  1595 + "src/"
  1596 + ]
  1597 + },
  1598 + "notification-url": "https://packagist.org/downloads/",
  1599 + "license": [
  1600 + "BSD-3-Clause"
  1601 + ],
  1602 + "authors": [
  1603 + {
  1604 + "name": "Jeff Welch",
  1605 + "email": "whatthejeff@gmail.com"
  1606 + },
  1607 + {
  1608 + "name": "Sebastian Bergmann",
  1609 + "email": "sebastian@phpunit.de"
  1610 + },
  1611 + {
  1612 + "name": "Adam Harvey",
  1613 + "email": "aharvey@php.net"
  1614 + }
  1615 + ],
  1616 + "description": "Provides functionality to recursively process PHP variables",
  1617 + "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
  1618 + "time": "2015-06-21 08:04:50"
  1619 + },
  1620 + {
  1621 + "name": "sebastian/version",
  1622 + "version": "1.0.6",
  1623 + "source": {
  1624 + "type": "git",
  1625 + "url": "https://github.com/sebastianbergmann/version.git",
  1626 + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
  1627 + },
  1628 + "dist": {
  1629 + "type": "zip",
  1630 + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
  1631 + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
  1632 + "shasum": ""
  1633 + },
  1634 + "type": "library",
  1635 + "autoload": {
  1636 + "classmap": [
  1637 + "src/"
  1638 + ]
  1639 + },
  1640 + "notification-url": "https://packagist.org/downloads/",
  1641 + "license": [
  1642 + "BSD-3-Clause"
  1643 + ],
  1644 + "authors": [
  1645 + {
  1646 + "name": "Sebastian Bergmann",
  1647 + "email": "sebastian@phpunit.de",
  1648 + "role": "lead"
  1649 + }
  1650 + ],
  1651 + "description": "Library that helps with managing the version number of Git-hosted PHP projects",
  1652 + "homepage": "https://github.com/sebastianbergmann/version",
  1653 + "time": "2015-06-21 13:59:46"
  1654 + },
  1655 + {
  1656 + "name": "swiftmailer/swiftmailer",
  1657 + "version": "v5.4.1",
  1658 + "source": {
  1659 + "type": "git",
  1660 + "url": "https://github.com/swiftmailer/swiftmailer.git",
  1661 + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421"
  1662 + },
  1663 + "dist": {
  1664 + "type": "zip",
  1665 + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421",
  1666 + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421",
  1667 + "shasum": ""
  1668 + },
  1669 + "require": {
  1670 + "php": ">=5.3.3"
  1671 + },
  1672 + "require-dev": {
  1673 + "mockery/mockery": "~0.9.1,<0.9.4"
  1674 + },
  1675 + "type": "library",
  1676 + "extra": {
  1677 + "branch-alias": {
  1678 + "dev-master": "5.4-dev"
  1679 + }
  1680 + },
  1681 + "autoload": {
  1682 + "files": [
  1683 + "lib/swift_required.php"
  1684 + ]
  1685 + },
  1686 + "notification-url": "https://packagist.org/downloads/",
  1687 + "license": [
  1688 + "MIT"
  1689 + ],
  1690 + "authors": [
  1691 + {
  1692 + "name": "Chris Corbyn"
  1693 + },
  1694 + {
  1695 + "name": "Fabien Potencier",
  1696 + "email": "fabien@symfony.com"
  1697 + }
  1698 + ],
  1699 + "description": "Swiftmailer, free feature-rich PHP mailer",
  1700 + "homepage": "http://swiftmailer.org",
  1701 + "keywords": [
  1702 + "email",
  1703 + "mail",
  1704 + "mailer"
  1705 + ],
  1706 + "time": "2015-06-06 14:19:39"
  1707 + },
  1708 + {
  1709 + "name": "symfony/browser-kit",
  1710 + "version": "v2.7.6",
  1711 + "source": {
  1712 + "type": "git",
  1713 + "url": "https://github.com/symfony/browser-kit.git",
  1714 + "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367"
  1715 + },
  1716 + "dist": {
  1717 + "type": "zip",
  1718 + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/07d664a052572ccc28eb2ab7dbbe82155b1ad367",
  1719 + "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367",
  1720 + "shasum": ""
  1721 + },
  1722 + "require": {
  1723 + "php": ">=5.3.9",
  1724 + "symfony/dom-crawler": "~2.0,>=2.0.5"
  1725 + },
  1726 + "require-dev": {
  1727 + "symfony/css-selector": "~2.0,>=2.0.5",
  1728 + "symfony/process": "~2.3.34|~2.7,>=2.7.6"
  1729 + },
  1730 + "suggest": {
  1731 + "symfony/process": ""
  1732 + },
  1733 + "type": "library",
  1734 + "extra": {
  1735 + "branch-alias": {
  1736 + "dev-master": "2.7-dev"
  1737 + }
  1738 + },
  1739 + "autoload": {
  1740 + "psr-4": {
  1741 + "Symfony\\Component\\BrowserKit\\": ""
  1742 + }
  1743 + },
  1744 + "notification-url": "https://packagist.org/downloads/",
  1745 + "license": [
  1746 + "MIT"
  1747 + ],
  1748 + "authors": [
  1749 + {
  1750 + "name": "Fabien Potencier",
  1751 + "email": "fabien@symfony.com"
  1752 + },
  1753 + {
  1754 + "name": "Symfony Community",
  1755 + "homepage": "https://symfony.com/contributors"
  1756 + }
  1757 + ],
  1758 + "description": "Symfony BrowserKit Component",
  1759 + "homepage": "https://symfony.com",
  1760 + "time": "2015-10-23 14:47:27"
  1761 + },
  1762 + {
  1763 + "name": "symfony/console",
  1764 + "version": "v2.7.6",
  1765 + "source": {
  1766 + "type": "git",
  1767 + "url": "https://github.com/symfony/console.git",
  1768 + "reference": "5efd632294c8320ea52492db22292ff853a43766"
  1769 + },
  1770 + "dist": {
  1771 + "type": "zip",
  1772 + "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766",
  1773 + "reference": "5efd632294c8320ea52492db22292ff853a43766",
  1774 + "shasum": ""
  1775 + },
  1776 + "require": {
  1777 + "php": ">=5.3.9"
  1778 + },
  1779 + "require-dev": {
  1780 + "psr/log": "~1.0",
  1781 + "symfony/event-dispatcher": "~2.1",
  1782 + "symfony/process": "~2.1"
  1783 + },
  1784 + "suggest": {
  1785 + "psr/log": "For using the console logger",
  1786 + "symfony/event-dispatcher": "",
  1787 + "symfony/process": ""
  1788 + },
  1789 + "type": "library",
  1790 + "extra": {
  1791 + "branch-alias": {
  1792 + "dev-master": "2.7-dev"
  1793 + }
  1794 + },
  1795 + "autoload": {
  1796 + "psr-4": {
  1797 + "Symfony\\Component\\Console\\": ""
  1798 + }
  1799 + },
  1800 + "notification-url": "https://packagist.org/downloads/",
  1801 + "license": [
  1802 + "MIT"
  1803 + ],
  1804 + "authors": [
  1805 + {
  1806 + "name": "Fabien Potencier",
  1807 + "email": "fabien@symfony.com"
  1808 + },
  1809 + {
  1810 + "name": "Symfony Community",
  1811 + "homepage": "https://symfony.com/contributors"
  1812 + }
  1813 + ],
  1814 + "description": "Symfony Console Component",
  1815 + "homepage": "https://symfony.com",
  1816 + "time": "2015-10-20 14:38:46"
  1817 + },
  1818 + {
  1819 + "name": "symfony/css-selector",
  1820 + "version": "v2.7.6",
  1821 + "source": {
  1822 + "type": "git",
  1823 + "url": "https://github.com/symfony/css-selector.git",
  1824 + "reference": "e1b865b26be4a56d22a8dee398375044a80c865b"
  1825 + },
  1826 + "dist": {
  1827 + "type": "zip",
  1828 + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b",
  1829 + "reference": "e1b865b26be4a56d22a8dee398375044a80c865b",
  1830 + "shasum": ""
  1831 + },
  1832 + "require": {
  1833 + "php": ">=5.3.9"
  1834 + },
  1835 + "type": "library",
  1836 + "extra": {
  1837 + "branch-alias": {
  1838 + "dev-master": "2.7-dev"
  1839 + }
  1840 + },
  1841 + "autoload": {
  1842 + "psr-4": {
  1843 + "Symfony\\Component\\CssSelector\\": ""
  1844 + }
  1845 + },
  1846 + "notification-url": "https://packagist.org/downloads/",
  1847 + "license": [
  1848 + "MIT"
  1849 + ],
  1850 + "authors": [
  1851 + {
  1852 + "name": "Jean-Franรงois Simon",
  1853 + "email": "jeanfrancois.simon@sensiolabs.com"
  1854 + },
  1855 + {
  1856 + "name": "Fabien Potencier",
  1857 + "email": "fabien@symfony.com"
  1858 + },
  1859 + {
  1860 + "name": "Symfony Community",
  1861 + "homepage": "https://symfony.com/contributors"
  1862 + }
  1863 + ],
  1864 + "description": "Symfony CssSelector Component",
  1865 + "homepage": "https://symfony.com",
  1866 + "time": "2015-10-11 09:39:48"
  1867 + },
  1868 + {
  1869 + "name": "symfony/dom-crawler",
  1870 + "version": "v2.7.6",
  1871 + "source": {
  1872 + "type": "git",
  1873 + "url": "https://github.com/symfony/dom-crawler.git",
  1874 + "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612"
  1875 + },
  1876 + "dist": {
  1877 + "type": "zip",
  1878 + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5fef7d8b80d8f9992df99d8ee283f420484c9612",
  1879 + "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612",
  1880 + "shasum": ""
  1881 + },
  1882 + "require": {
  1883 + "php": ">=5.3.9"
  1884 + },
  1885 + "require-dev": {
  1886 + "symfony/css-selector": "~2.3"
  1887 + },
  1888 + "suggest": {
  1889 + "symfony/css-selector": ""
  1890 + },
  1891 + "type": "library",
  1892 + "extra": {
  1893 + "branch-alias": {
  1894 + "dev-master": "2.7-dev"
  1895 + }
  1896 + },
  1897 + "autoload": {
  1898 + "psr-4": {
  1899 + "Symfony\\Component\\DomCrawler\\": ""
  1900 + }
  1901 + },
  1902 + "notification-url": "https://packagist.org/downloads/",
  1903 + "license": [
  1904 + "MIT"
  1905 + ],
  1906 + "authors": [
  1907 + {
  1908 + "name": "Fabien Potencier",
  1909 + "email": "fabien@symfony.com"
  1910 + },
  1911 + {
  1912 + "name": "Symfony Community",
  1913 + "homepage": "https://symfony.com/contributors"
  1914 + }
  1915 + ],
  1916 + "description": "Symfony DomCrawler Component",
  1917 + "homepage": "https://symfony.com",
  1918 + "time": "2015-10-11 09:39:48"
  1919 + },
  1920 + {
  1921 + "name": "symfony/event-dispatcher",
  1922 + "version": "v2.7.6",
  1923 + "source": {
  1924 + "type": "git",
  1925 + "url": "https://github.com/symfony/event-dispatcher.git",
  1926 + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8"
  1927 + },
  1928 + "dist": {
  1929 + "type": "zip",
  1930 + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8",
  1931 + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8",
  1932 + "shasum": ""
  1933 + },
  1934 + "require": {
  1935 + "php": ">=5.3.9"
  1936 + },
  1937 + "require-dev": {
  1938 + "psr/log": "~1.0",
  1939 + "symfony/config": "~2.0,>=2.0.5",
  1940 + "symfony/dependency-injection": "~2.6",
  1941 + "symfony/expression-language": "~2.6",
  1942 + "symfony/stopwatch": "~2.3"
  1943 + },
  1944 + "suggest": {
  1945 + "symfony/dependency-injection": "",
  1946 + "symfony/http-kernel": ""
  1947 + },
  1948 + "type": "library",
  1949 + "extra": {
  1950 + "branch-alias": {
  1951 + "dev-master": "2.7-dev"
  1952 + }
  1953 + },
  1954 + "autoload": {
  1955 + "psr-4": {
  1956 + "Symfony\\Component\\EventDispatcher\\": ""
  1957 + }
  1958 + },
  1959 + "notification-url": "https://packagist.org/downloads/",
  1960 + "license": [
  1961 + "MIT"
  1962 + ],
  1963 + "authors": [
  1964 + {
  1965 + "name": "Fabien Potencier",
  1966 + "email": "fabien@symfony.com"
  1967 + },
  1968 + {
  1969 + "name": "Symfony Community",
  1970 + "homepage": "https://symfony.com/contributors"
  1971 + }
  1972 + ],
  1973 + "description": "Symfony EventDispatcher Component",
  1974 + "homepage": "https://symfony.com",
  1975 + "time": "2015-10-11 09:39:48"
  1976 + },
  1977 + {
  1978 + "name": "symfony/finder",
  1979 + "version": "v2.7.6",
  1980 + "source": {
  1981 + "type": "git",
  1982 + "url": "https://github.com/symfony/finder.git",
  1983 + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d"
  1984 + },
  1985 + "dist": {
  1986 + "type": "zip",
  1987 + "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d",
  1988 + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d",
  1989 + "shasum": ""
  1990 + },
  1991 + "require": {
  1992 + "php": ">=5.3.9"
  1993 + },
  1994 + "type": "library",
  1995 + "extra": {
  1996 + "branch-alias": {
  1997 + "dev-master": "2.7-dev"
  1998 + }
  1999 + },
  2000 + "autoload": {
  2001 + "psr-4": {
  2002 + "Symfony\\Component\\Finder\\": ""
  2003 + }
  2004 + },
  2005 + "notification-url": "https://packagist.org/downloads/",
  2006 + "license": [
  2007 + "MIT"
  2008 + ],
  2009 + "authors": [
  2010 + {
  2011 + "name": "Fabien Potencier",
  2012 + "email": "fabien@symfony.com"
  2013 + },
  2014 + {
  2015 + "name": "Symfony Community",
  2016 + "homepage": "https://symfony.com/contributors"
  2017 + }
  2018 + ],
  2019 + "description": "Symfony Finder Component",
  2020 + "homepage": "https://symfony.com",
  2021 + "time": "2015-10-11 09:39:48"
  2022 + },
  2023 + {
  2024 + "name": "symfony/yaml",
  2025 + "version": "v2.7.6",
  2026 + "source": {
  2027 + "type": "git",
  2028 + "url": "https://github.com/symfony/yaml.git",
  2029 + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d"
  2030 + },
  2031 + "dist": {
  2032 + "type": "zip",
  2033 + "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d",
  2034 + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d",
  2035 + "shasum": ""
  2036 + },
  2037 + "require": {
  2038 + "php": ">=5.3.9"
  2039 + },
  2040 + "type": "library",
  2041 + "extra": {
  2042 + "branch-alias": {
  2043 + "dev-master": "2.7-dev"
  2044 + }
  2045 + },
  2046 + "autoload": {
  2047 + "psr-4": {
  2048 + "Symfony\\Component\\Yaml\\": ""
  2049 + }
  2050 + },
  2051 + "notification-url": "https://packagist.org/downloads/",
  2052 + "license": [
  2053 + "MIT"
  2054 + ],
  2055 + "authors": [
  2056 + {
  2057 + "name": "Fabien Potencier",
  2058 + "email": "fabien@symfony.com"
  2059 + },
  2060 + {
  2061 + "name": "Symfony Community",
  2062 + "homepage": "https://symfony.com/contributors"
  2063 + }
  2064 + ],
  2065 + "description": "Symfony Yaml Component",
  2066 + "homepage": "https://symfony.com",
  2067 + "time": "2015-10-11 09:39:48"
  2068 + },
  2069 + {
  2070 + "name": "yiisoft/yii2",
  2071 + "version": "2.0.6",
  2072 + "source": {
  2073 + "type": "git",
  2074 + "url": "https://github.com/yiisoft/yii2-framework.git",
  2075 + "reference": "f42b2eb80f61992438661b01d0d74c6738e2ff38"
  2076 + },
  2077 + "dist": {
  2078 + "type": "zip",
  2079 + "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/f42b2eb80f61992438661b01d0d74c6738e2ff38",
  2080 + "reference": "f42b2eb80f61992438661b01d0d74c6738e2ff38",
  2081 + "shasum": ""
  2082 + },
  2083 + "require": {
  2084 + "bower-asset/jquery": "2.1.*@stable | 1.11.*@stable",
  2085 + "bower-asset/jquery.inputmask": "3.1.*",
  2086 + "bower-asset/punycode": "1.3.*",
  2087 + "bower-asset/yii2-pjax": ">=2.0.1",
  2088 + "cebe/markdown": "~1.0.0 | ~1.1.0",
  2089 + "ext-mbstring": "*",
  2090 + "ezyang/htmlpurifier": "4.6.*",
  2091 + "lib-pcre": "*",
  2092 + "php": ">=5.4.0",
  2093 + "yiisoft/yii2-composer": "*"
  2094 + },
  2095 + "bin": [
  2096 + "yii"
  2097 + ],
  2098 + "type": "library",
  2099 + "extra": {
  2100 + "branch-alias": {
  2101 + "dev-master": "2.0.x-dev"
  2102 + }
  2103 + },
  2104 + "autoload": {
  2105 + "psr-4": {
  2106 + "yii\\": ""
  2107 + }
  2108 + },
  2109 + "notification-url": "https://packagist.org/downloads/",
  2110 + "license": [
  2111 + "BSD-3-Clause"
  2112 + ],
  2113 + "authors": [
  2114 + {
  2115 + "name": "Qiang Xue",
  2116 + "email": "qiang.xue@gmail.com",
  2117 + "homepage": "http://www.yiiframework.com/",
  2118 + "role": "Founder and project lead"
  2119 + },
  2120 + {
  2121 + "name": "Alexander Makarov",
  2122 + "email": "sam@rmcreative.ru",
  2123 + "homepage": "http://rmcreative.ru/",
  2124 + "role": "Core framework development"
  2125 + },
  2126 + {
  2127 + "name": "Maurizio Domba",
  2128 + "homepage": "http://mdomba.info/",
  2129 + "role": "Core framework development"
  2130 + },
  2131 + {
  2132 + "name": "Carsten Brandt",
  2133 + "email": "mail@cebe.cc",
  2134 + "homepage": "http://cebe.cc/",
  2135 + "role": "Core framework development"
  2136 + },
  2137 + {
  2138 + "name": "Timur Ruziev",
  2139 + "email": "resurtm@gmail.com",
  2140 + "homepage": "http://resurtm.com/",
  2141 + "role": "Core framework development"
  2142 + },
  2143 + {
  2144 + "name": "Paul Klimov",
  2145 + "email": "klimov.paul@gmail.com",
  2146 + "role": "Core framework development"
  2147 + }
  2148 + ],
  2149 + "description": "Yii PHP Framework Version 2",
  2150 + "homepage": "http://www.yiiframework.com/",
  2151 + "keywords": [
  2152 + "framework",
  2153 + "yii2"
  2154 + ],
  2155 + "time": "2015-08-05 22:00:30"
  2156 + },
  2157 + {
  2158 + "name": "yiisoft/yii2-bootstrap",
  2159 + "version": "2.0.5",
  2160 + "source": {
  2161 + "type": "git",
  2162 + "url": "https://github.com/yiisoft/yii2-bootstrap.git",
  2163 + "reference": "1464f93834b1d5edb1f5625f7ffd6c3723fa4923"
  2164 + },
  2165 + "dist": {
  2166 + "type": "zip",
  2167 + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/1464f93834b1d5edb1f5625f7ffd6c3723fa4923",
  2168 + "reference": "1464f93834b1d5edb1f5625f7ffd6c3723fa4923",
  2169 + "shasum": ""
  2170 + },
  2171 + "require": {
  2172 + "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*",
  2173 + "yiisoft/yii2": ">=2.0.6"
  2174 + },
  2175 + "type": "yii2-extension",
  2176 + "extra": {
  2177 + "branch-alias": {
  2178 + "dev-master": "2.0.x-dev"
  2179 + },
  2180 + "asset-installer-paths": {
  2181 + "npm-asset-library": "vendor/npm",
  2182 + "bower-asset-library": "vendor/bower"
  2183 + }
  2184 + },
  2185 + "autoload": {
  2186 + "psr-4": {
  2187 + "yii\\bootstrap\\": ""
  2188 + }
  2189 + },
  2190 + "notification-url": "https://packagist.org/downloads/",
  2191 + "license": [
  2192 + "BSD-3-Clause"
  2193 + ],
  2194 + "authors": [
  2195 + {
  2196 + "name": "Qiang Xue",
  2197 + "email": "qiang.xue@gmail.com"
  2198 + }
  2199 + ],
  2200 + "description": "The Twitter Bootstrap extension for the Yii framework",
  2201 + "keywords": [
  2202 + "bootstrap",
  2203 + "yii2"
  2204 + ],
  2205 + "time": "2015-09-23 17:48:24"
  2206 + },
  2207 + {
  2208 + "name": "yiisoft/yii2-composer",
  2209 + "version": "2.0.3",
  2210 + "source": {
  2211 + "type": "git",
  2212 + "url": "https://github.com/yiisoft/yii2-composer.git",
  2213 + "reference": "ca8d23707ae47d20b0454e4b135c156f6da6d7be"
  2214 + },
  2215 + "dist": {
  2216 + "type": "zip",
  2217 + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/ca8d23707ae47d20b0454e4b135c156f6da6d7be",
  2218 + "reference": "ca8d23707ae47d20b0454e4b135c156f6da6d7be",
  2219 + "shasum": ""
  2220 + },
  2221 + "require": {
  2222 + "composer-plugin-api": "1.0.0"
  2223 + },
  2224 + "type": "composer-plugin",
  2225 + "extra": {
  2226 + "class": "yii\\composer\\Plugin",
  2227 + "branch-alias": {
  2228 + "dev-master": "2.0.x-dev"
  2229 + }
  2230 + },
  2231 + "autoload": {
  2232 + "psr-4": {
  2233 + "yii\\composer\\": ""
  2234 + }
  2235 + },
  2236 + "notification-url": "https://packagist.org/downloads/",
  2237 + "license": [
  2238 + "BSD-3-Clause"
  2239 + ],
  2240 + "authors": [
  2241 + {
  2242 + "name": "Qiang Xue",
  2243 + "email": "qiang.xue@gmail.com"
  2244 + }
  2245 + ],
  2246 + "description": "The composer plugin for Yii extension installer",
  2247 + "keywords": [
  2248 + "composer",
  2249 + "extension installer",
  2250 + "yii2"
  2251 + ],
  2252 + "time": "2015-03-01 06:22:44"
  2253 + },
  2254 + {
  2255 + "name": "yiisoft/yii2-swiftmailer",
  2256 + "version": "2.0.4",
  2257 + "source": {
  2258 + "type": "git",
  2259 + "url": "https://github.com/yiisoft/yii2-swiftmailer.git",
  2260 + "reference": "4ec435a89e30b203cea99770910fb5499cb3627a"
  2261 + },
  2262 + "dist": {
  2263 + "type": "zip",
  2264 + "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/4ec435a89e30b203cea99770910fb5499cb3627a",
  2265 + "reference": "4ec435a89e30b203cea99770910fb5499cb3627a",
  2266 + "shasum": ""
  2267 + },
  2268 + "require": {
  2269 + "swiftmailer/swiftmailer": "~5.0",
  2270 + "yiisoft/yii2": ">=2.0.4"
  2271 + },
  2272 + "type": "yii2-extension",
  2273 + "extra": {
  2274 + "branch-alias": {
  2275 + "dev-master": "2.0.x-dev"
  2276 + }
  2277 + },
  2278 + "autoload": {
  2279 + "psr-4": {
  2280 + "yii\\swiftmailer\\": ""
  2281 + }
  2282 + },
  2283 + "notification-url": "https://packagist.org/downloads/",
  2284 + "license": [
  2285 + "BSD-3-Clause"
  2286 + ],
  2287 + "authors": [
  2288 + {
  2289 + "name": "Paul Klimov",
  2290 + "email": "klimov.paul@gmail.com"
  2291 + }
  2292 + ],
  2293 + "description": "The SwiftMailer integration for the Yii framework",
  2294 + "keywords": [
  2295 + "email",
  2296 + "mail",
  2297 + "mailer",
  2298 + "swift",
  2299 + "swiftmailer",
  2300 + "yii2"
  2301 + ],
  2302 + "time": "2015-05-10 22:12:32"
  2303 + }
  2304 + ],
  2305 + "packages-dev": [
  2306 + {
  2307 + "name": "bower-asset/typeahead.js",
  2308 + "version": "v0.10.5",
  2309 + "source": {
  2310 + "type": "git",
  2311 + "url": "https://github.com/twitter/typeahead.js.git",
  2312 + "reference": "5f198b87d1af845da502ea9df93a5e84801ce742"
  2313 + },
  2314 + "dist": {
  2315 + "type": "zip",
  2316 + "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/5f198b87d1af845da502ea9df93a5e84801ce742",
  2317 + "reference": "5f198b87d1af845da502ea9df93a5e84801ce742",
  2318 + "shasum": ""
  2319 + },
  2320 + "require": {
  2321 + "bower-asset/jquery": ">=1.7"
  2322 + },
  2323 + "require-dev": {
  2324 + "bower-asset/jasmine-ajax": "~1.3.1",
  2325 + "bower-asset/jasmine-jquery": "~1.5.2",
  2326 + "bower-asset/jquery": "~1.7"
  2327 + },
  2328 + "type": "bower-asset-library",
  2329 + "extra": {
  2330 + "bower-asset-main": "dist/typeahead.bundle.js"
  2331 + }
  2332 + },
  2333 + {
  2334 + "name": "fzaninotto/faker",
  2335 + "version": "v1.5.0",
  2336 + "source": {
  2337 + "type": "git",
  2338 + "url": "https://github.com/fzaninotto/Faker.git",
  2339 + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d"
  2340 + },
  2341 + "dist": {
  2342 + "type": "zip",
  2343 + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d",
  2344 + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d",
  2345 + "shasum": ""
  2346 + },
  2347 + "require": {
  2348 + "php": ">=5.3.3"
  2349 + },
  2350 + "require-dev": {
  2351 + "phpunit/phpunit": "~4.0",
  2352 + "squizlabs/php_codesniffer": "~1.5"
  2353 + },
  2354 + "suggest": {
  2355 + "ext-intl": "*"
  2356 + },
  2357 + "type": "library",
  2358 + "extra": {
  2359 + "branch-alias": {
  2360 + "dev-master": "1.5.x-dev"
  2361 + }
  2362 + },
  2363 + "autoload": {
  2364 + "psr-4": {
  2365 + "Faker\\": "src/Faker/"
  2366 + }
  2367 + },
  2368 + "notification-url": "https://packagist.org/downloads/",
  2369 + "license": [
  2370 + "MIT"
  2371 + ],
  2372 + "authors": [
  2373 + {
  2374 + "name": "Franรงois Zaninotto"
  2375 + }
  2376 + ],
  2377 + "description": "Faker is a PHP library that generates fake data for you.",
  2378 + "keywords": [
  2379 + "data",
  2380 + "faker",
  2381 + "fixtures"
  2382 + ],
  2383 + "time": "2015-05-29 06:29:14"
  2384 + },
  2385 + {
  2386 + "name": "phpspec/php-diff",
  2387 + "version": "v1.0.2",
  2388 + "source": {
  2389 + "type": "git",
  2390 + "url": "https://github.com/phpspec/php-diff.git",
  2391 + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a"
  2392 + },
  2393 + "dist": {
  2394 + "type": "zip",
  2395 + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a",
  2396 + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a",
  2397 + "shasum": ""
  2398 + },
  2399 + "type": "library",
  2400 + "autoload": {
  2401 + "psr-0": {
  2402 + "Diff": "lib/"
  2403 + }
  2404 + },
  2405 + "notification-url": "https://packagist.org/downloads/",
  2406 + "license": [
  2407 + "BSD-3-Clause"
  2408 + ],
  2409 + "authors": [
  2410 + {
  2411 + "name": "Chris Boulton",
  2412 + "homepage": "http://github.com/chrisboulton",
  2413 + "role": "Original developer"
  2414 + }
  2415 + ],
  2416 + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).",
  2417 + "time": "2013-11-01 13:02:21"
  2418 + },
  2419 + {
  2420 + "name": "yiisoft/yii2-codeception",
  2421 + "version": "2.0.4",
  2422 + "source": {
  2423 + "type": "git",
  2424 + "url": "https://github.com/yiisoft/yii2-codeception.git",
  2425 + "reference": "de5007e7a99359597abbfe1c88dca3ce620061c5"
  2426 + },
  2427 + "dist": {
  2428 + "type": "zip",
  2429 + "url": "https://api.github.com/repos/yiisoft/yii2-codeception/zipball/de5007e7a99359597abbfe1c88dca3ce620061c5",
  2430 + "reference": "de5007e7a99359597abbfe1c88dca3ce620061c5",
  2431 + "shasum": ""
  2432 + },
  2433 + "require": {
  2434 + "yiisoft/yii2": ">=2.0.4"
  2435 + },
  2436 + "type": "yii2-extension",
  2437 + "extra": {
  2438 + "branch-alias": {
  2439 + "dev-master": "2.0.x-dev"
  2440 + }
  2441 + },
  2442 + "autoload": {
  2443 + "psr-4": {
  2444 + "yii\\codeception\\": ""
  2445 + }
  2446 + },
  2447 + "notification-url": "https://packagist.org/downloads/",
  2448 + "license": [
  2449 + "BSD-3-Clause"
  2450 + ],
  2451 + "authors": [
  2452 + {
  2453 + "name": "Mark Jebri",
  2454 + "email": "mark.github@yandex.ru"
  2455 + }
  2456 + ],
  2457 + "description": "The Codeception integration for the Yii framework",
  2458 + "keywords": [
  2459 + "codeception",
  2460 + "yii2"
  2461 + ],
  2462 + "time": "2015-05-10 22:08:30"
  2463 + },
  2464 + {
  2465 + "name": "yiisoft/yii2-debug",
  2466 + "version": "2.0.5",
  2467 + "source": {
  2468 + "type": "git",
  2469 + "url": "https://github.com/yiisoft/yii2-debug.git",
  2470 + "reference": "1b302e67521d46feb2413d9d96ca94ed82b39b0e"
  2471 + },
  2472 + "dist": {
  2473 + "type": "zip",
  2474 + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/1b302e67521d46feb2413d9d96ca94ed82b39b0e",
  2475 + "reference": "1b302e67521d46feb2413d9d96ca94ed82b39b0e",
  2476 + "shasum": ""
  2477 + },
  2478 + "require": {
  2479 + "yiisoft/yii2": ">=2.0.4",
  2480 + "yiisoft/yii2-bootstrap": "*"
  2481 + },
  2482 + "type": "yii2-extension",
  2483 + "extra": {
  2484 + "branch-alias": {
  2485 + "dev-master": "2.0.x-dev"
  2486 + }
  2487 + },
  2488 + "autoload": {
  2489 + "psr-4": {
  2490 + "yii\\debug\\": ""
  2491 + }
  2492 + },
  2493 + "notification-url": "https://packagist.org/downloads/",
  2494 + "license": [
  2495 + "BSD-3-Clause"
  2496 + ],
  2497 + "authors": [
  2498 + {
  2499 + "name": "Qiang Xue",
  2500 + "email": "qiang.xue@gmail.com"
  2501 + }
  2502 + ],
  2503 + "description": "The debugger extension for the Yii framework",
  2504 + "keywords": [
  2505 + "debug",
  2506 + "debugger",
  2507 + "yii2"
  2508 + ],
  2509 + "time": "2015-08-06 16:14:06"
  2510 + },
  2511 + {
  2512 + "name": "yiisoft/yii2-faker",
  2513 + "version": "2.0.3",
  2514 + "source": {
  2515 + "type": "git",
  2516 + "url": "https://github.com/yiisoft/yii2-faker.git",
  2517 + "reference": "b88ca69ee226a3610b2c26c026c3203d7ac50f6c"
  2518 + },
  2519 + "dist": {
  2520 + "type": "zip",
  2521 + "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/b88ca69ee226a3610b2c26c026c3203d7ac50f6c",
  2522 + "reference": "b88ca69ee226a3610b2c26c026c3203d7ac50f6c",
  2523 + "shasum": ""
  2524 + },
  2525 + "require": {
  2526 + "fzaninotto/faker": "*",
  2527 + "yiisoft/yii2": "*"
  2528 + },
  2529 + "type": "yii2-extension",
  2530 + "extra": {
  2531 + "branch-alias": {
  2532 + "dev-master": "2.0.x-dev"
  2533 + }
  2534 + },
  2535 + "autoload": {
  2536 + "psr-4": {
  2537 + "yii\\faker\\": ""
  2538 + }
  2539 + },
  2540 + "notification-url": "https://packagist.org/downloads/",
  2541 + "license": [
  2542 + "BSD-3-Clause"
  2543 + ],
  2544 + "authors": [
  2545 + {
  2546 + "name": "Mark Jebri",
  2547 + "email": "mark.github@yandex.ru"
  2548 + }
  2549 + ],
  2550 + "description": "Fixture generator. The Faker integration for the Yii framework.",
  2551 + "keywords": [
  2552 + "Fixture",
  2553 + "faker",
  2554 + "yii2"
  2555 + ],
  2556 + "time": "2015-03-01 06:22:44"
  2557 + },
  2558 + {
  2559 + "name": "yiisoft/yii2-gii",
  2560 + "version": "2.0.4",
  2561 + "source": {
  2562 + "type": "git",
  2563 + "url": "https://github.com/yiisoft/yii2-gii.git",
  2564 + "reference": "e5a023e8779bd774194842ec1b8fb4917cf04007"
  2565 + },
  2566 + "dist": {
  2567 + "type": "zip",
  2568 + "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/e5a023e8779bd774194842ec1b8fb4917cf04007",
  2569 + "reference": "e5a023e8779bd774194842ec1b8fb4917cf04007",
  2570 + "shasum": ""
  2571 + },
  2572 + "require": {
  2573 + "bower-asset/typeahead.js": "0.10.*",
  2574 + "phpspec/php-diff": ">=1.0.2",
  2575 + "yiisoft/yii2": ">=2.0.4",
  2576 + "yiisoft/yii2-bootstrap": "~2.0"
  2577 + },
  2578 + "type": "yii2-extension",
  2579 + "extra": {
  2580 + "branch-alias": {
  2581 + "dev-master": "2.0.x-dev"
  2582 + },
  2583 + "asset-installer-paths": {
  2584 + "npm-asset-library": "vendor/npm",
  2585 + "bower-asset-library": "vendor/bower"
  2586 + }
  2587 + },
  2588 + "autoload": {
  2589 + "psr-4": {
  2590 + "yii\\gii\\": ""
  2591 + }
  2592 + },
  2593 + "notification-url": "https://packagist.org/downloads/",
  2594 + "license": [
  2595 + "BSD-3-Clause"
  2596 + ],
  2597 + "authors": [
  2598 + {
  2599 + "name": "Qiang Xue",
  2600 + "email": "qiang.xue@gmail.com"
  2601 + }
  2602 + ],
  2603 + "description": "The Gii extension for the Yii framework",
  2604 + "keywords": [
  2605 + "code generator",
  2606 + "gii",
  2607 + "yii2"
  2608 + ],
  2609 + "time": "2015-05-10 22:09:31"
  2610 + }
  2611 + ],
  2612 + "aliases": [],
  2613 + "minimum-stability": "stable",
  2614 + "stability-flags": [],
  2615 + "prefer-stable": false,
  2616 + "prefer-lowest": false,
  2617 + "platform": {
  2618 + "php": ">=5.4.0"
  2619 + },
  2620 + "platform-dev": []
  2621 +}
... ...
console/config/.gitignore 0 โ†’ 100755
  1 +++ a/console/config/.gitignore
  1 +main-local.php
  2 +params-local.php
0 3 \ No newline at end of file
... ...
console/config/bootstrap.php 0 โ†’ 100755
  1 +++ a/console/config/bootstrap.php
  1 +<?php
... ...
console/config/main.php 0 โ†’ 100755
  1 +++ a/console/config/main.php
  1 +<?php
  2 +$params = array_merge(
  3 + require(__DIR__ . '/../../common/config/params.php'),
  4 + require(__DIR__ . '/../../common/config/params-local.php'),
  5 + require(__DIR__ . '/params.php'),
  6 + require(__DIR__ . '/params-local.php')
  7 +);
  8 +
  9 +return [
  10 + 'id' => 'app-console',
  11 + 'basePath' => dirname(__DIR__),
  12 + 'bootstrap' => ['log'],
  13 + 'controllerNamespace' => 'console\controllers',
  14 + 'components' => [
  15 + 'log' => [
  16 + 'targets' => [
  17 + [
  18 + 'class' => 'yii\log\FileTarget',
  19 + 'levels' => ['error', 'warning'],
  20 + ],
  21 + ],
  22 + ],
  23 + ],
  24 + 'params' => $params,
  25 +];
... ...
console/config/params.php 0 โ†’ 100755
  1 +++ a/console/config/params.php
  1 +<?php
  2 +return [
  3 + 'adminEmail' => 'admin@example.com',
  4 +];
... ...
console/controllers/.gitkeep 0 โ†’ 100755
  1 +++ a/console/controllers/.gitkeep
... ...
console/migrations/m130524_201442_init.php 0 โ†’ 100755
  1 +++ a/console/migrations/m130524_201442_init.php
  1 +<?php
  2 +
  3 +use yii\db\Schema;
  4 +use yii\db\Migration;
  5 +
  6 +class m130524_201442_init extends Migration
  7 +{
  8 + public function up()
  9 + {
  10 + $tableOptions = null;
  11 + if ($this->db->driverName === 'mysql') {
  12 + // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
  13 + $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
  14 + }
  15 +
  16 + $this->createTable('{{%user}}', [
  17 + 'id' => $this->primaryKey(),
  18 + 'username' => $this->string()->notNull()->unique(),
  19 + 'auth_key' => $this->string(32)->notNull(),
  20 + 'password_hash' => $this->string()->notNull(),
  21 + 'password_reset_token' => $this->string()->unique(),
  22 + 'email' => $this->string()->notNull()->unique(),
  23 +
  24 + 'status' => $this->smallInteger()->notNull()->defaultValue(10),
  25 + 'created_at' => $this->integer()->notNull(),
  26 + 'updated_at' => $this->integer()->notNull(),
  27 + ], $tableOptions);
  28 + }
  29 +
  30 + public function down()
  31 + {
  32 + $this->dropTable('{{%user}}');
  33 + }
  34 +}
... ...
console/models/.gitkeep 0 โ†’ 100755
  1 +++ a/console/models/.gitkeep
  1 +*
... ...
console/runtime/.gitignore 0 โ†’ 100755
  1 +++ a/console/runtime/.gitignore
  1 +*
  2 +!.gitignore
0 3 \ No newline at end of file
... ...
environments/dev/backend/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/backend/config/main-local.php
  1 +<?php
  2 +
  3 +$config = [
  4 + 'components' => [
  5 + 'request' => [
  6 + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
  7 + 'cookieValidationKey' => '',
  8 + ],
  9 + ],
  10 +];
  11 +
  12 +if (!YII_ENV_TEST) {
  13 + // configuration adjustments for 'dev' environment
  14 + $config['bootstrap'][] = 'debug';
  15 + $config['modules']['debug'] = [
  16 + 'class' => 'yii\debug\Module',
  17 + ];
  18 +
  19 + $config['bootstrap'][] = 'gii';
  20 + $config['modules']['gii'] = [
  21 + 'class' => 'yii\gii\Module',
  22 + ];
  23 +}
  24 +
  25 +return $config;
... ...
environments/dev/backend/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/backend/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/dev/backend/web/index-test.php 0 โ†’ 100755
  1 +++ a/environments/dev/backend/web/index-test.php
  1 +<?php
  2 +
  3 +// NOTE: Make sure this file is not accessible when deployed to production
  4 +if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
  5 + die('You are not allowed to access this file.');
  6 +}
  7 +
  8 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  9 +defined('YII_ENV') or define('YII_ENV', 'test');
  10 +
  11 +require(__DIR__ . '/../../vendor/autoload.php');
  12 +require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  13 +require(__DIR__ . '/../../common/config/bootstrap.php');
  14 +require(__DIR__ . '/../config/bootstrap.php');
  15 +
  16 +
  17 +$config = require(__DIR__ . '/../../tests/codeception/config/backend/acceptance.php');
  18 +
  19 +(new yii\web\Application($config))->run();
... ...
environments/dev/backend/web/index.php 0 โ†’ 100755
  1 +++ a/environments/dev/backend/web/index.php
  1 +<?php
  2 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  3 +defined('YII_ENV') or define('YII_ENV', 'dev');
  4 +
  5 +require(__DIR__ . '/../../vendor/autoload.php');
  6 +require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  7 +require(__DIR__ . '/../../common/config/bootstrap.php');
  8 +require(__DIR__ . '/../config/bootstrap.php');
  9 +
  10 +$config = yii\helpers\ArrayHelper::merge(
  11 + require(__DIR__ . '/../../common/config/main.php'),
  12 + require(__DIR__ . '/../../common/config/main-local.php'),
  13 + require(__DIR__ . '/../config/main.php'),
  14 + require(__DIR__ . '/../config/main-local.php')
  15 +);
  16 +
  17 +$application = new yii\web\Application($config);
  18 +$application->run();
... ...
environments/dev/common/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/common/config/main-local.php
  1 +<?php
  2 +return [
  3 + 'components' => [
  4 + 'db' => [
  5 + 'class' => 'yii\db\Connection',
  6 + 'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
  7 + 'username' => 'root',
  8 + 'password' => '',
  9 + 'charset' => 'utf8',
  10 + ],
  11 + 'mailer' => [
  12 + 'class' => 'yii\swiftmailer\Mailer',
  13 + 'viewPath' => '@common/mail',
  14 + // send all mails to a file by default. You have to set
  15 + // 'useFileTransport' to false and configure a transport
  16 + // for the mailer to send real emails.
  17 + 'useFileTransport' => true,
  18 + ],
  19 + ],
  20 +];
... ...
environments/dev/common/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/common/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/dev/console/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/console/config/main-local.php
  1 +<?php
  2 +return [
  3 + 'bootstrap' => ['gii'],
  4 + 'modules' => [
  5 + 'gii' => 'yii\gii\Module',
  6 + ],
  7 +];
... ...
environments/dev/console/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/console/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/dev/frontend/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/frontend/config/main-local.php
  1 +<?php
  2 +
  3 +$config = [
  4 + 'components' => [
  5 + 'request' => [
  6 + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
  7 + 'cookieValidationKey' => '',
  8 + ],
  9 + ],
  10 +];
  11 +
  12 +if (!YII_ENV_TEST) {
  13 + // configuration adjustments for 'dev' environment
  14 + $config['bootstrap'][] = 'debug';
  15 + $config['modules']['debug'] = 'yii\debug\Module';
  16 +
  17 + $config['bootstrap'][] = 'gii';
  18 + $config['modules']['gii'] = 'yii\gii\Module';
  19 +}
  20 +
  21 +return $config;
... ...
environments/dev/frontend/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/dev/frontend/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/dev/frontend/web/index-test.php 0 โ†’ 100755
  1 +++ a/environments/dev/frontend/web/index-test.php
  1 +<?php
  2 +
  3 +// NOTE: Make sure this file is not accessible when deployed to production
  4 +if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
  5 + die('You are not allowed to access this file.');
  6 +}
  7 +
  8 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  9 +defined('YII_ENV') or define('YII_ENV', 'test');
  10 +
  11 +require(__DIR__ . '/../../vendor/autoload.php');
  12 +require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  13 +require(__DIR__ . '/../../common/config/bootstrap.php');
  14 +require(__DIR__ . '/../config/bootstrap.php');
  15 +
  16 +$config = require(__DIR__ . '/../../tests/codeception/config/frontend/acceptance.php');
  17 +
  18 +(new yii\web\Application($config))->run();
... ...
environments/dev/frontend/web/index.php 0 โ†’ 100755
  1 +++ a/environments/dev/frontend/web/index.php
  1 +<?php
  2 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  3 +defined('YII_ENV') or define('YII_ENV', 'dev');
  4 +
  5 +require(__DIR__ . '/../../vendor/autoload.php');
  6 +require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  7 +require(__DIR__ . '/../../common/config/bootstrap.php');
  8 +require(__DIR__ . '/../config/bootstrap.php');
  9 +
  10 +$config = yii\helpers\ArrayHelper::merge(
  11 + require(__DIR__ . '/../../common/config/main.php'),
  12 + require(__DIR__ . '/../../common/config/main-local.php'),
  13 + require(__DIR__ . '/../config/main.php'),
  14 + require(__DIR__ . '/../config/main-local.php')
  15 +);
  16 +
  17 +$application = new yii\web\Application($config);
  18 +$application->run();
... ...
environments/dev/yii 0 โ†’ 100755
  1 +++ a/environments/dev/yii
  1 +#!/usr/bin/env php
  2 +<?php
  3 +/**
  4 + * Yii console bootstrap file.
  5 + *
  6 + * @link http://www.yiiframework.com/
  7 + * @copyright Copyright (c) 2008 Yii Software LLC
  8 + * @license http://www.yiiframework.com/license/
  9 + */
  10 +
  11 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  12 +defined('YII_ENV') or define('YII_ENV', 'dev');
  13 +
  14 +require(__DIR__ . '/vendor/autoload.php');
  15 +require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
  16 +require(__DIR__ . '/common/config/bootstrap.php');
  17 +require(__DIR__ . '/console/config/bootstrap.php');
  18 +
  19 +$config = yii\helpers\ArrayHelper::merge(
  20 + require(__DIR__ . '/common/config/main.php'),
  21 + require(__DIR__ . '/common/config/main-local.php'),
  22 + require(__DIR__ . '/console/config/main.php'),
  23 + require(__DIR__ . '/console/config/main-local.php')
  24 +);
  25 +
  26 +$application = new yii\console\Application($config);
  27 +$exitCode = $application->run();
  28 +exit($exitCode);
... ...
environments/index.php 0 โ†’ 100755
  1 +++ a/environments/index.php
  1 +<?php
  2 +/**
  3 + * The manifest of files that are local to specific environment.
  4 + * This file returns a list of environments that the application
  5 + * may be installed under. The returned data must be in the following
  6 + * format:
  7 + *
  8 + * ```php
  9 + * return [
  10 + * 'environment name' => [
  11 + * 'path' => 'directory storing the local files',
  12 + * 'skipFiles' => [
  13 + * // list of files that should only copied once and skipped if they already exist
  14 + * ],
  15 + * 'setWritable' => [
  16 + * // list of directories that should be set writable
  17 + * ],
  18 + * 'setExecutable' => [
  19 + * // list of files that should be set executable
  20 + * ],
  21 + * 'setCookieValidationKey' => [
  22 + * // list of config files that need to be inserted with automatically generated cookie validation keys
  23 + * ],
  24 + * 'createSymlink' => [
  25 + * // list of symlinks to be created. Keys are symlinks, and values are the targets.
  26 + * ],
  27 + * ],
  28 + * ];
  29 + * ```
  30 + */
  31 +return [
  32 + 'Development' => [
  33 + 'path' => 'dev',
  34 + 'setWritable' => [
  35 + 'backend/runtime',
  36 + 'backend/web/assets',
  37 + 'frontend/runtime',
  38 + 'frontend/web/assets',
  39 + ],
  40 + 'setExecutable' => [
  41 + 'yii',
  42 + 'tests/codeception/bin/yii',
  43 + ],
  44 + 'setCookieValidationKey' => [
  45 + 'backend/config/main-local.php',
  46 + 'frontend/config/main-local.php',
  47 + ],
  48 + ],
  49 + 'Production' => [
  50 + 'path' => 'prod',
  51 + 'setWritable' => [
  52 + 'backend/runtime',
  53 + 'backend/web/assets',
  54 + 'frontend/runtime',
  55 + 'frontend/web/assets',
  56 + ],
  57 + 'setExecutable' => [
  58 + 'yii',
  59 + ],
  60 + 'setCookieValidationKey' => [
  61 + 'backend/config/main-local.php',
  62 + 'frontend/config/main-local.php',
  63 + ],
  64 + ],
  65 +];
... ...
environments/prod/backend/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/backend/config/main-local.php
  1 +<?php
  2 +return [
  3 + 'components' => [
  4 + 'request' => [
  5 + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
  6 + 'cookieValidationKey' => '',
  7 + ],
  8 + ],
  9 +];
... ...
environments/prod/backend/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/backend/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/prod/backend/web/index.php 0 โ†’ 100755
  1 +++ a/environments/prod/backend/web/index.php
  1 +<?php
  2 +defined('YII_DEBUG') or define('YII_DEBUG', false);
  3 +defined('YII_ENV') or define('YII_ENV', 'prod');
  4 +
  5 +require(__DIR__ . '/../../vendor/autoload.php');
  6 +require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  7 +require(__DIR__ . '/../../common/config/bootstrap.php');
  8 +require(__DIR__ . '/../config/bootstrap.php');
  9 +
  10 +$config = yii\helpers\ArrayHelper::merge(
  11 + require(__DIR__ . '/../../common/config/main.php'),
  12 + require(__DIR__ . '/../../common/config/main-local.php'),
  13 + require(__DIR__ . '/../config/main.php'),
  14 + require(__DIR__ . '/../config/main-local.php')
  15 +);
  16 +
  17 +$application = new yii\web\Application($config);
  18 +$application->run();
... ...
environments/prod/common/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/common/config/main-local.php
  1 +<?php
  2 +return [
  3 + 'components' => [
  4 + 'db' => [
  5 + 'class' => 'yii\db\Connection',
  6 + 'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
  7 + 'username' => 'root',
  8 + 'password' => '',
  9 + 'charset' => 'utf8',
  10 + ],
  11 + 'mailer' => [
  12 + 'class' => 'yii\swiftmailer\Mailer',
  13 + 'viewPath' => '@common/mail',
  14 + ],
  15 + ],
  16 +];
... ...
environments/prod/common/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/common/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/prod/console/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/console/config/main-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/prod/console/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/console/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/prod/frontend/config/main-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/frontend/config/main-local.php
  1 +<?php
  2 +return [
  3 + 'components' => [
  4 + 'request' => [
  5 + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
  6 + 'cookieValidationKey' => '',
  7 + ],
  8 + ],
  9 +];
... ...
environments/prod/frontend/config/params-local.php 0 โ†’ 100755
  1 +++ a/environments/prod/frontend/config/params-local.php
  1 +<?php
  2 +return [
  3 +];
... ...
environments/prod/frontend/web/index.php 0 โ†’ 100755
  1 +++ a/environments/prod/frontend/web/index.php
  1 +<?php
  2 +defined('YII_DEBUG') or define('YII_DEBUG', false);
  3 +defined('YII_ENV') or define('YII_ENV', 'prod');
  4 +
  5 +require(__DIR__ . '/../../vendor/autoload.php');
  6 +require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  7 +require(__DIR__ . '/../../common/config/bootstrap.php');
  8 +require(__DIR__ . '/../config/bootstrap.php');
  9 +
  10 +$config = yii\helpers\ArrayHelper::merge(
  11 + require(__DIR__ . '/../../common/config/main.php'),
  12 + require(__DIR__ . '/../../common/config/main-local.php'),
  13 + require(__DIR__ . '/../config/main.php'),
  14 + require(__DIR__ . '/../config/main-local.php')
  15 +);
  16 +
  17 +$application = new yii\web\Application($config);
  18 +$application->run();
... ...
environments/prod/yii 0 โ†’ 100755
  1 +++ a/environments/prod/yii
  1 +#!/usr/bin/env php
  2 +<?php
  3 +/**
  4 + * Yii console bootstrap file.
  5 + *
  6 + * @link http://www.yiiframework.com/
  7 + * @copyright Copyright (c) 2008 Yii Software LLC
  8 + * @license http://www.yiiframework.com/license/
  9 + */
  10 +
  11 +defined('YII_DEBUG') or define('YII_DEBUG', false);
  12 +defined('YII_ENV') or define('YII_ENV', 'prod');
  13 +
  14 +require(__DIR__ . '/vendor/autoload.php');
  15 +require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
  16 +require(__DIR__ . '/common/config/bootstrap.php');
  17 +require(__DIR__ . '/console/config/bootstrap.php');
  18 +
  19 +$config = yii\helpers\ArrayHelper::merge(
  20 + require(__DIR__ . '/common/config/main.php'),
  21 + require(__DIR__ . '/common/config/main-local.php'),
  22 + require(__DIR__ . '/console/config/main.php'),
  23 + require(__DIR__ . '/console/config/main-local.php')
  24 +);
  25 +
  26 +$application = new yii\console\Application($config);
  27 +$exitCode = $application->run();
  28 +exit($exitCode);
... ...
frontend/assets/AppAsset.php 0 โ†’ 100755
  1 +++ a/frontend/assets/AppAsset.php
  1 +<?php
  2 +/**
  3 + * @link http://www.yiiframework.com/
  4 + * @copyright Copyright (c) 2008 Yii Software LLC
  5 + * @license http://www.yiiframework.com/license/
  6 + */
  7 +
  8 +namespace frontend\assets;
  9 +
  10 +use yii\web\AssetBundle;
  11 +
  12 +/**
  13 + * @author Qiang Xue <qiang.xue@gmail.com>
  14 + * @since 2.0
  15 + */
  16 +class AppAsset extends AssetBundle
  17 +{
  18 + public $basePath = '@webroot';
  19 + public $baseUrl = '@web';
  20 + public $css = [
  21 + 'css/site.css',
  22 + ];
  23 + public $js = [
  24 + ];
  25 + public $depends = [
  26 + 'yii\web\YiiAsset',
  27 + 'yii\bootstrap\BootstrapAsset',
  28 + ];
  29 +}
... ...
frontend/config/.gitignore 0 โ†’ 100755
  1 +++ a/frontend/config/.gitignore
  1 +main-local.php
  2 +params-local.php
0 3 \ No newline at end of file
... ...
frontend/config/bootstrap.php 0 โ†’ 100755
  1 +++ a/frontend/config/bootstrap.php
  1 +<?php
... ...
frontend/config/main.php 0 โ†’ 100755
  1 +++ a/frontend/config/main.php
  1 +<?php
  2 +$params = array_merge(
  3 + require(__DIR__ . '/../../common/config/params.php'),
  4 + require(__DIR__ . '/../../common/config/params-local.php'),
  5 + require(__DIR__ . '/params.php'),
  6 + require(__DIR__ . '/params-local.php')
  7 +);
  8 +
  9 +return [
  10 + 'id' => 'app-frontend',
  11 + 'basePath' => dirname(__DIR__),
  12 + 'bootstrap' => ['log'],
  13 + 'controllerNamespace' => 'frontend\controllers',
  14 + 'components' => [
  15 + 'request' => [
  16 + 'baseUrl' => '',
  17 + ],
  18 + 'urlManager' => [
  19 + 'baseUrl' => '/',
  20 + 'enablePrettyUrl' => true,
  21 + 'showScriptName' => false
  22 + ],
  23 + 'user' => [
  24 + 'identityClass' => 'common\models\User',
  25 + 'enableAutoLogin' => true,
  26 + ],
  27 + 'log' => [
  28 + 'traceLevel' => YII_DEBUG ? 3 : 0,
  29 + 'targets' => [
  30 + [
  31 + 'class' => 'yii\log\FileTarget',
  32 + 'levels' => ['error', 'warning'],
  33 + ],
  34 + ],
  35 + ],
  36 + 'errorHandler' => [
  37 + 'errorAction' => 'site/error',
  38 + ],
  39 + ],
  40 + 'params' => $params,
  41 +];
... ...
frontend/config/params.php 0 โ†’ 100755
  1 +++ a/frontend/config/params.php
  1 +<?php
  2 +return [
  3 + 'adminEmail' => 'admin@example.com',
  4 +];
... ...
frontend/controllers/SiteController.php 0 โ†’ 100755
  1 +++ a/frontend/controllers/SiteController.php
  1 +<?php
  2 +namespace frontend\controllers;
  3 +
  4 +use Yii;
  5 +use common\models\LoginForm;
  6 +use frontend\models\PasswordResetRequestForm;
  7 +use frontend\models\ResetPasswordForm;
  8 +use frontend\models\SignupForm;
  9 +use frontend\models\ContactForm;
  10 +use yii\base\InvalidParamException;
  11 +use yii\web\BadRequestHttpException;
  12 +use yii\web\Controller;
  13 +use yii\filters\VerbFilter;
  14 +use yii\filters\AccessControl;
  15 +
  16 +/**
  17 + * Site controller
  18 + */
  19 +class SiteController extends Controller
  20 +{
  21 + /**
  22 + * @inheritdoc
  23 + */
  24 + public function behaviors()
  25 + {
  26 + return [
  27 + 'access' => [
  28 + 'class' => AccessControl::className(),
  29 + 'only' => ['logout', 'signup'],
  30 + 'rules' => [
  31 + [
  32 + 'actions' => ['signup'],
  33 + 'allow' => true,
  34 + 'roles' => ['?'],
  35 + ],
  36 + [
  37 + 'actions' => ['logout'],
  38 + 'allow' => true,
  39 + 'roles' => ['@'],
  40 + ],
  41 + ],
  42 + ],
  43 + 'verbs' => [
  44 + 'class' => VerbFilter::className(),
  45 + 'actions' => [
  46 + 'logout' => ['post'],
  47 + ],
  48 + ],
  49 + ];
  50 + }
  51 +
  52 + /**
  53 + * @inheritdoc
  54 + */
  55 + public function actions()
  56 + {
  57 + return [
  58 + 'error' => [
  59 + 'class' => 'yii\web\ErrorAction',
  60 + ],
  61 + 'captcha' => [
  62 + 'class' => 'yii\captcha\CaptchaAction',
  63 + 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  64 + ],
  65 + ];
  66 + }
  67 +
  68 + /**
  69 + * Displays homepage.
  70 + *
  71 + * @return mixed
  72 + */
  73 + public function actionIndex()
  74 + {
  75 + return $this->render('index');
  76 + }
  77 +
  78 + /**
  79 + * Logs in a user.
  80 + *
  81 + * @return mixed
  82 + */
  83 + public function actionLogin()
  84 + {
  85 + if (!\Yii::$app->user->isGuest) {
  86 + return $this->goHome();
  87 + }
  88 +
  89 + $model = new LoginForm();
  90 + if ($model->load(Yii::$app->request->post()) && $model->login()) {
  91 + return $this->goBack();
  92 + } else {
  93 + return $this->render('login', [
  94 + 'model' => $model,
  95 + ]);
  96 + }
  97 + }
  98 +
  99 + /**
  100 + * Logs out the current user.
  101 + *
  102 + * @return mixed
  103 + */
  104 + public function actionLogout()
  105 + {
  106 + Yii::$app->user->logout();
  107 +
  108 + return $this->goHome();
  109 + }
  110 +
  111 + /**
  112 + * Displays contact page.
  113 + *
  114 + * @return mixed
  115 + */
  116 + public function actionContact()
  117 + {
  118 + $model = new ContactForm();
  119 + if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  120 + if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
  121 + Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
  122 + } else {
  123 + Yii::$app->session->setFlash('error', 'There was an error sending email.');
  124 + }
  125 +
  126 + return $this->refresh();
  127 + } else {
  128 + return $this->render('contact', [
  129 + 'model' => $model,
  130 + ]);
  131 + }
  132 + }
  133 +
  134 + /**
  135 + * Displays about page.
  136 + *
  137 + * @return mixed
  138 + */
  139 + public function actionAbout()
  140 + {
  141 + return $this->render('about');
  142 + }
  143 +
  144 + /**
  145 + * Signs user up.
  146 + *
  147 + * @return mixed
  148 + */
  149 + public function actionSignup()
  150 + {
  151 + $model = new SignupForm();
  152 + if ($model->load(Yii::$app->request->post())) {
  153 + if ($user = $model->signup()) {
  154 + if (Yii::$app->getUser()->login($user)) {
  155 + return $this->goHome();
  156 + }
  157 + }
  158 + }
  159 +
  160 + return $this->render('signup', [
  161 + 'model' => $model,
  162 + ]);
  163 + }
  164 +
  165 + /**
  166 + * Requests password reset.
  167 + *
  168 + * @return mixed
  169 + */
  170 + public function actionRequestPasswordReset()
  171 + {
  172 + $model = new PasswordResetRequestForm();
  173 + if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  174 + if ($model->sendEmail()) {
  175 + Yii::$app->session->setFlash('success', 'Check your email for further instructions.');
  176 +
  177 + return $this->goHome();
  178 + } else {
  179 + Yii::$app->session->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
  180 + }
  181 + }
  182 +
  183 + return $this->render('requestPasswordResetToken', [
  184 + 'model' => $model,
  185 + ]);
  186 + }
  187 +
  188 + /**
  189 + * Resets password.
  190 + *
  191 + * @param string $token
  192 + * @return mixed
  193 + * @throws BadRequestHttpException
  194 + */
  195 + public function actionResetPassword($token)
  196 + {
  197 + try {
  198 + $model = new ResetPasswordForm($token);
  199 + } catch (InvalidParamException $e) {
  200 + throw new BadRequestHttpException($e->getMessage());
  201 + }
  202 +
  203 + if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
  204 + Yii::$app->session->setFlash('success', 'New password was saved.');
  205 +
  206 + return $this->goHome();
  207 + }
  208 +
  209 + return $this->render('resetPassword', [
  210 + 'model' => $model,
  211 + ]);
  212 + }
  213 +}
... ...
frontend/models/ContactForm.php 0 โ†’ 100755
  1 +++ a/frontend/models/ContactForm.php
  1 +<?php
  2 +
  3 +namespace frontend\models;
  4 +
  5 +use Yii;
  6 +use yii\base\Model;
  7 +
  8 +/**
  9 + * ContactForm is the model behind the contact form.
  10 + */
  11 +class ContactForm extends Model
  12 +{
  13 + public $name;
  14 + public $email;
  15 + public $subject;
  16 + public $body;
  17 + public $verifyCode;
  18 +
  19 + /**
  20 + * @inheritdoc
  21 + */
  22 + public function rules()
  23 + {
  24 + return [
  25 + // name, email, subject and body are required
  26 + [['name', 'email', 'subject', 'body'], 'required'],
  27 + // email has to be a valid email address
  28 + ['email', 'email'],
  29 + // verifyCode needs to be entered correctly
  30 + ['verifyCode', 'captcha'],
  31 + ];
  32 + }
  33 +
  34 + /**
  35 + * @inheritdoc
  36 + */
  37 + public function attributeLabels()
  38 + {
  39 + return [
  40 + 'verifyCode' => 'Verification Code',
  41 + ];
  42 + }
  43 +
  44 + /**
  45 + * Sends an email to the specified email address using the information collected by this model.
  46 + *
  47 + * @param string $email the target email address
  48 + * @return boolean whether the email was sent
  49 + */
  50 + public function sendEmail($email)
  51 + {
  52 + return Yii::$app->mailer->compose()
  53 + ->setTo($email)
  54 + ->setFrom([$this->email => $this->name])
  55 + ->setSubject($this->subject)
  56 + ->setTextBody($this->body)
  57 + ->send();
  58 + }
  59 +}
... ...
frontend/models/PasswordResetRequestForm.php 0 โ†’ 100755
  1 +++ a/frontend/models/PasswordResetRequestForm.php
  1 +<?php
  2 +namespace frontend\models;
  3 +
  4 +use common\models\User;
  5 +use yii\base\Model;
  6 +
  7 +/**
  8 + * Password reset request form
  9 + */
  10 +class PasswordResetRequestForm extends Model
  11 +{
  12 + public $email;
  13 +
  14 + /**
  15 + * @inheritdoc
  16 + */
  17 + public function rules()
  18 + {
  19 + return [
  20 + ['email', 'filter', 'filter' => 'trim'],
  21 + ['email', 'required'],
  22 + ['email', 'email'],
  23 + ['email', 'exist',
  24 + 'targetClass' => '\common\models\User',
  25 + 'filter' => ['status' => User::STATUS_ACTIVE],
  26 + 'message' => 'There is no user with such email.'
  27 + ],
  28 + ];
  29 + }
  30 +
  31 + /**
  32 + * Sends an email with a link, for resetting the password.
  33 + *
  34 + * @return boolean whether the email was send
  35 + */
  36 + public function sendEmail()
  37 + {
  38 + /* @var $user User */
  39 + $user = User::findOne([
  40 + 'status' => User::STATUS_ACTIVE,
  41 + 'email' => $this->email,
  42 + ]);
  43 +
  44 + if ($user) {
  45 + if (!User::isPasswordResetTokenValid($user->password_reset_token)) {
  46 + $user->generatePasswordResetToken();
  47 + }
  48 +
  49 + if ($user->save()) {
  50 + return \Yii::$app->mailer->compose(['html' => 'passwordResetToken-html', 'text' => 'passwordResetToken-text'], ['user' => $user])
  51 + ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot'])
  52 + ->setTo($this->email)
  53 + ->setSubject('Password reset for ' . \Yii::$app->name)
  54 + ->send();
  55 + }
  56 + }
  57 +
  58 + return false;
  59 + }
  60 +}
... ...
frontend/models/ResetPasswordForm.php 0 โ†’ 100755
  1 +++ a/frontend/models/ResetPasswordForm.php
  1 +<?php
  2 +namespace frontend\models;
  3 +
  4 +use common\models\User;
  5 +use yii\base\InvalidParamException;
  6 +use yii\base\Model;
  7 +use Yii;
  8 +
  9 +/**
  10 + * Password reset form
  11 + */
  12 +class ResetPasswordForm extends Model
  13 +{
  14 + public $password;
  15 +
  16 + /**
  17 + * @var \common\models\User
  18 + */
  19 + private $_user;
  20 +
  21 +
  22 + /**
  23 + * Creates a form model given a token.
  24 + *
  25 + * @param string $token
  26 + * @param array $config name-value pairs that will be used to initialize the object properties
  27 + * @throws \yii\base\InvalidParamException if token is empty or not valid
  28 + */
  29 + public function __construct($token, $config = [])
  30 + {
  31 + if (empty($token) || !is_string($token)) {
  32 + throw new InvalidParamException('Password reset token cannot be blank.');
  33 + }
  34 + $this->_user = User::findByPasswordResetToken($token);
  35 + if (!$this->_user) {
  36 + throw new InvalidParamException('Wrong password reset token.');
  37 + }
  38 + parent::__construct($config);
  39 + }
  40 +
  41 + /**
  42 + * @inheritdoc
  43 + */
  44 + public function rules()
  45 + {
  46 + return [
  47 + ['password', 'required'],
  48 + ['password', 'string', 'min' => 6],
  49 + ];
  50 + }
  51 +
  52 + /**
  53 + * Resets password.
  54 + *
  55 + * @return boolean if password was reset.
  56 + */
  57 + public function resetPassword()
  58 + {
  59 + $user = $this->_user;
  60 + $user->setPassword($this->password);
  61 + $user->removePasswordResetToken();
  62 +
  63 + return $user->save(false);
  64 + }
  65 +}
... ...
frontend/models/SignupForm.php 0 โ†’ 100755
  1 +++ a/frontend/models/SignupForm.php
  1 +<?php
  2 +namespace frontend\models;
  3 +
  4 +use common\models\User;
  5 +use yii\base\Model;
  6 +use Yii;
  7 +
  8 +/**
  9 + * Signup form
  10 + */
  11 +class SignupForm extends Model
  12 +{
  13 + public $username;
  14 + public $email;
  15 + public $password;
  16 +
  17 + /**
  18 + * @inheritdoc
  19 + */
  20 + public function rules()
  21 + {
  22 + return [
  23 + ['username', 'filter', 'filter' => 'trim'],
  24 + ['username', 'required'],
  25 + ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
  26 + ['username', 'string', 'min' => 2, 'max' => 255],
  27 +
  28 + ['email', 'filter', 'filter' => 'trim'],
  29 + ['email', 'required'],
  30 + ['email', 'email'],
  31 + ['email', 'string', 'max' => 255],
  32 + ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],
  33 +
  34 + ['password', 'required'],
  35 + ['password', 'string', 'min' => 6],
  36 + ];
  37 + }
  38 +
  39 + /**
  40 + * Signs user up.
  41 + *
  42 + * @return User|null the saved model or null if saving fails
  43 + */
  44 + public function signup()
  45 + {
  46 + if ($this->validate()) {
  47 + $user = new User();
  48 + $user->username = $this->username;
  49 + $user->email = $this->email;
  50 + $user->setPassword($this->password);
  51 + $user->generateAuthKey();
  52 + if ($user->save()) {
  53 + return $user;
  54 + }
  55 + }
  56 +
  57 + return null;
  58 + }
  59 +}
... ...
frontend/runtime/.gitignore 0 โ†’ 100755
  1 +++ a/frontend/runtime/.gitignore
  1 +*
  2 +!.gitignore
0 3 \ No newline at end of file
... ...
frontend/views/layouts/main.php 0 โ†’ 100755
  1 +++ a/frontend/views/layouts/main.php
  1 +<?php
  2 +
  3 +/* @var $this \yii\web\View */
  4 +/* @var $content string */
  5 +
  6 +use yii\helpers\Html;
  7 +use yii\bootstrap\Nav;
  8 +use yii\bootstrap\NavBar;
  9 +use yii\widgets\Breadcrumbs;
  10 +use frontend\assets\AppAsset;
  11 +use common\widgets\Alert;
  12 +
  13 +AppAsset::register($this);
  14 +?>
  15 +<?php $this->beginPage() ?>
  16 +<!DOCTYPE html>
  17 +<html lang="<?= Yii::$app->language ?>">
  18 +<head>
  19 + <meta charset="<?= Yii::$app->charset ?>">
  20 + <meta name="viewport" content="width=device-width, initial-scale=1">
  21 + <?= Html::csrfMetaTags() ?>
  22 + <title><?= Html::encode($this->title) ?></title>
  23 + <?php $this->head() ?>
  24 +</head>
  25 +<body>
  26 +<?php $this->beginBody() ?>
  27 +
  28 +<div class="wrap">
  29 + <?php
  30 + NavBar::begin([
  31 + 'brandLabel' => 'My Company',
  32 + 'brandUrl' => Yii::$app->homeUrl,
  33 + 'options' => [
  34 + 'class' => 'navbar-inverse navbar-fixed-top',
  35 + ],
  36 + ]);
  37 + $menuItems = [
  38 + ['label' => 'Home', 'url' => ['/site/index']],
  39 + ['label' => 'About', 'url' => ['/site/about']],
  40 + ['label' => 'Contact', 'url' => ['/site/contact']],
  41 + ];
  42 + if (Yii::$app->user->isGuest) {
  43 + $menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
  44 + $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
  45 + } else {
  46 + $menuItems[] = [
  47 + 'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
  48 + 'url' => ['/site/logout'],
  49 + 'linkOptions' => ['data-method' => 'post']
  50 + ];
  51 + }
  52 + echo Nav::widget([
  53 + 'options' => ['class' => 'navbar-nav navbar-right'],
  54 + 'items' => $menuItems,
  55 + ]);
  56 + NavBar::end();
  57 + ?>
  58 +
  59 + <div class="container">
  60 + <?= Breadcrumbs::widget([
  61 + 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
  62 + ]) ?>
  63 + <?= Alert::widget() ?>
  64 + <?= $content ?>
  65 + </div>
  66 +</div>
  67 +
  68 +<footer class="footer">
  69 + <div class="container">
  70 + <p class="pull-left">&copy; My Company <?= date('Y') ?></p>
  71 +
  72 + <p class="pull-right"><?= Yii::powered() ?></p>
  73 + </div>
  74 +</footer>
  75 +
  76 +<?php $this->endBody() ?>
  77 +</body>
  78 +</html>
  79 +<?php $this->endPage() ?>
... ...
frontend/views/site/about.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/about.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +
  5 +use yii\helpers\Html;
  6 +
  7 +$this->title = 'About';
  8 +$this->params['breadcrumbs'][] = $this->title;
  9 +?>
  10 +<div class="site-about">
  11 + <h1><?= Html::encode($this->title) ?></h1>
  12 +
  13 + <p>This is the About page. You may modify the following file to customize its content:</p>
  14 +
  15 + <code><?= __FILE__ ?></code>
  16 +</div>
... ...
frontend/views/site/contact.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/contact.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model \frontend\models\ContactForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +use yii\captcha\Captcha;
  10 +
  11 +$this->title = 'Contact';
  12 +$this->params['breadcrumbs'][] = $this->title;
  13 +?>
  14 +<div class="site-contact">
  15 + <h1><?= Html::encode($this->title) ?></h1>
  16 +
  17 + <p>
  18 + If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
  19 + </p>
  20 +
  21 + <div class="row">
  22 + <div class="col-lg-5">
  23 + <?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
  24 +
  25 + <?= $form->field($model, 'name') ?>
  26 +
  27 + <?= $form->field($model, 'email') ?>
  28 +
  29 + <?= $form->field($model, 'subject') ?>
  30 +
  31 + <?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
  32 +
  33 + <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
  34 + 'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
  35 + ]) ?>
  36 +
  37 + <div class="form-group">
  38 + <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
  39 + </div>
  40 +
  41 + <?php ActiveForm::end(); ?>
  42 + </div>
  43 + </div>
  44 +
  45 +</div>
... ...
frontend/views/site/error.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/error.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $name string */
  5 +/* @var $message string */
  6 +/* @var $exception Exception */
  7 +
  8 +use yii\helpers\Html;
  9 +
  10 +$this->title = $name;
  11 +?>
  12 +<div class="site-error">
  13 +
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <div class="alert alert-danger">
  17 + <?= nl2br(Html::encode($message)) ?>
  18 + </div>
  19 +
  20 + <p>
  21 + The above error occurred while the Web server was processing your request.
  22 + </p>
  23 + <p>
  24 + Please contact us if you think this is a server error. Thank you.
  25 + </p>
  26 +
  27 +</div>
... ...
frontend/views/site/index.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/index.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +
  5 +$this->title = 'My Yii Application';
  6 +?>
  7 +<div class="site-index">
  8 +
  9 + <div class="jumbotron">
  10 + <h1>Congratulations!</h1>
  11 +
  12 + <p class="lead">You have successfully created your Yii-powered application.</p>
  13 +
  14 + <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
  15 + </div>
  16 +
  17 + <div class="body-content">
  18 +
  19 + <div class="row">
  20 + <div class="col-lg-4">
  21 + <h2>Heading</h2>
  22 +
  23 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  24 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  25 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  26 + fugiat nulla pariatur.</p>
  27 +
  28 + <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
  29 + </div>
  30 + <div class="col-lg-4">
  31 + <h2>Heading</h2>
  32 +
  33 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  34 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  35 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  36 + fugiat nulla pariatur.</p>
  37 +
  38 + <p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
  39 + </div>
  40 + <div class="col-lg-4">
  41 + <h2>Heading</h2>
  42 +
  43 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  44 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  45 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  46 + fugiat nulla pariatur.</p>
  47 +
  48 + <p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
  49 + </div>
  50 + </div>
  51 +
  52 + </div>
  53 +</div>
... ...
frontend/views/site/login.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/login.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model \common\models\LoginForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +
  10 +$this->title = 'Login';
  11 +$this->params['breadcrumbs'][] = $this->title;
  12 +?>
  13 +<div class="site-login">
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <p>Please fill out the following fields to login:</p>
  17 +
  18 + <div class="row">
  19 + <div class="col-lg-5">
  20 + <?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
  21 +
  22 + <?= $form->field($model, 'username') ?>
  23 +
  24 + <?= $form->field($model, 'password')->passwordInput() ?>
  25 +
  26 + <?= $form->field($model, 'rememberMe')->checkbox() ?>
  27 +
  28 + <div style="color:#999;margin:1em 0">
  29 + If you forgot your password you can <?= Html::a('reset it', ['site/request-password-reset']) ?>.
  30 + </div>
  31 +
  32 + <div class="form-group">
  33 + <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
  34 + </div>
  35 +
  36 + <?php ActiveForm::end(); ?>
  37 + </div>
  38 + </div>
  39 +</div>
... ...
frontend/views/site/requestPasswordResetToken.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/requestPasswordResetToken.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model \frontend\models\PasswordResetRequestForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +
  10 +$this->title = 'Request password reset';
  11 +$this->params['breadcrumbs'][] = $this->title;
  12 +?>
  13 +<div class="site-request-password-reset">
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <p>Please fill out your email. A link to reset password will be sent there.</p>
  17 +
  18 + <div class="row">
  19 + <div class="col-lg-5">
  20 + <?php $form = ActiveForm::begin(['id' => 'request-password-reset-form']); ?>
  21 +
  22 + <?= $form->field($model, 'email') ?>
  23 +
  24 + <div class="form-group">
  25 + <?= Html::submitButton('Send', ['class' => 'btn btn-primary']) ?>
  26 + </div>
  27 +
  28 + <?php ActiveForm::end(); ?>
  29 + </div>
  30 + </div>
  31 +</div>
... ...
frontend/views/site/resetPassword.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/resetPassword.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model \frontend\models\ResetPasswordForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +
  10 +$this->title = 'Reset password';
  11 +$this->params['breadcrumbs'][] = $this->title;
  12 +?>
  13 +<div class="site-reset-password">
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <p>Please choose your new password:</p>
  17 +
  18 + <div class="row">
  19 + <div class="col-lg-5">
  20 + <?php $form = ActiveForm::begin(['id' => 'reset-password-form']); ?>
  21 +
  22 + <?= $form->field($model, 'password')->passwordInput() ?>
  23 +
  24 + <div class="form-group">
  25 + <?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?>
  26 + </div>
  27 +
  28 + <?php ActiveForm::end(); ?>
  29 + </div>
  30 + </div>
  31 +</div>
... ...
frontend/views/site/signup.php 0 โ†’ 100755
  1 +++ a/frontend/views/site/signup.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model \frontend\models\SignupForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +
  10 +$this->title = 'Signup';
  11 +$this->params['breadcrumbs'][] = $this->title;
  12 +?>
  13 +<div class="site-signup">
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <p>Please fill out the following fields to signup:</p>
  17 +
  18 + <div class="row">
  19 + <div class="col-lg-5">
  20 + <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>
  21 +
  22 + <?= $form->field($model, 'username') ?>
  23 +
  24 + <?= $form->field($model, 'email') ?>
  25 +
  26 + <?= $form->field($model, 'password')->passwordInput() ?>
  27 +
  28 + <div class="form-group">
  29 + <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
  30 + </div>
  31 +
  32 + <?php ActiveForm::end(); ?>
  33 + </div>
  34 + </div>
  35 +</div>
... ...
frontend/web/.gitignore 0 โ†’ 100755
  1 +++ a/frontend/web/.gitignore
  1 +/index.php
  2 +/index-test.php
... ...
frontend/web/.htaccess 0 โ†’ 100755
  1 +++ a/frontend/web/.htaccess
  1 +RewriteEngine on
  2 +RewriteBase /
  3 +RewriteCond %{REQUEST_FILENAME} !-f
  4 +RewriteCond %{REQUEST_FILENAME} !-d
  5 +
  6 +RewriteRule . index.php
  7 +
  8 +Options -Indexes
0 9 \ No newline at end of file
... ...
frontend/web/assets/.gitignore 0 โ†’ 100755
  1 +++ a/frontend/web/assets/.gitignore
  1 +*
  2 +!.gitignore
... ...
frontend/web/css/site.css 0 โ†’ 100755
  1 +++ a/frontend/web/css/site.css
  1 +html,
  2 +body {
  3 + height: 100%;
  4 +}
  5 +
  6 +.wrap {
  7 + min-height: 100%;
  8 + height: auto;
  9 + margin: 0 auto -60px;
  10 + padding: 0 0 60px;
  11 +}
  12 +
  13 +.wrap > .container {
  14 + padding: 70px 15px 20px;
  15 +}
  16 +
  17 +.footer {
  18 + height: 60px;
  19 + background-color: #f5f5f5;
  20 + border-top: 1px solid #ddd;
  21 + padding-top: 20px;
  22 +}
  23 +
  24 +.jumbotron {
  25 + text-align: center;
  26 + background-color: transparent;
  27 +}
  28 +
  29 +.jumbotron .btn {
  30 + font-size: 21px;
  31 + padding: 14px 24px;
  32 +}
  33 +
  34 +.not-set {
  35 + color: #c55;
  36 + font-style: italic;
  37 +}
  38 +
  39 +/* add sorting icons to gridview sort links */
  40 +a.asc:after, a.desc:after {
  41 + position: relative;
  42 + top: 1px;
  43 + display: inline-block;
  44 + font-family: 'Glyphicons Halflings';
  45 + font-style: normal;
  46 + font-weight: normal;
  47 + line-height: 1;
  48 + padding-left: 5px;
  49 +}
  50 +
  51 +a.asc:after {
  52 + content: /*"\e113"*/ "\e151";
  53 +}
  54 +
  55 +a.desc:after {
  56 + content: /*"\e114"*/ "\e152";
  57 +}
  58 +
  59 +.sort-numerical a.asc:after {
  60 + content: "\e153";
  61 +}
  62 +
  63 +.sort-numerical a.desc:after {
  64 + content: "\e154";
  65 +}
  66 +
  67 +.sort-ordinal a.asc:after {
  68 + content: "\e155";
  69 +}
  70 +
  71 +.sort-ordinal a.desc:after {
  72 + content: "\e156";
  73 +}
  74 +
  75 +.grid-view th {
  76 + white-space: nowrap;
  77 +}
  78 +
  79 +.hint-block {
  80 + display: block;
  81 + margin-top: 5px;
  82 + color: #999;
  83 +}
  84 +
  85 +.error-summary {
  86 + color: #a94442;
  87 + background: #fdf7f7;
  88 + border-left: 3px solid #eed3d7;
  89 + padding: 10px 20px;
  90 + margin: 0 0 15px 0;
  91 +}
... ...
frontend/web/favicon.ico 0 โ†’ 100755
No preview for this file type
frontend/web/robots.txt 0 โ†’ 100755
  1 +++ a/frontend/web/robots.txt
  1 +User-agent: *
  2 +Disallow:
0 3 \ No newline at end of file
... ...
init 0 โ†’ 100755
  1 +++ a/init
  1 +#!/usr/bin/env php
  2 +<?php
  3 +/**
  4 + * Yii Application Initialization Tool
  5 + *
  6 + * In order to run in non-interactive mode:
  7 + *
  8 + * init --env=Development --overwrite=n
  9 + *
  10 + * @author Alexander Makarov <sam@rmcreative.ru>
  11 + *
  12 + * @link http://www.yiiframework.com/
  13 + * @copyright Copyright (c) 2008 Yii Software LLC
  14 + * @license http://www.yiiframework.com/license/
  15 + */
  16 +
  17 +if (!extension_loaded('openssl')) {
  18 + die('The OpenSSL PHP extension is required by Yii2.');
  19 +}
  20 +
  21 +$params = getParams();
  22 +$root = str_replace('\\', '/', __DIR__);
  23 +$envs = require("$root/environments/index.php");
  24 +$envNames = array_keys($envs);
  25 +
  26 +echo "Yii Application Initialization Tool v1.0\n\n";
  27 +
  28 +$envName = null;
  29 +if (empty($params['env']) || $params['env'] === '1') {
  30 + echo "Which environment do you want the application to be initialized in?\n\n";
  31 + foreach ($envNames as $i => $name) {
  32 + echo " [$i] $name\n";
  33 + }
  34 + echo "\n Your choice [0-" . (count($envs) - 1) . ', or "q" to quit] ';
  35 + $answer = trim(fgets(STDIN));
  36 +
  37 + if (!ctype_digit($answer) || !in_array($answer, range(0, count($envs) - 1))) {
  38 + echo "\n Quit initialization.\n";
  39 + exit(0);
  40 + }
  41 +
  42 + if (isset($envNames[$answer])) {
  43 + $envName = $envNames[$answer];
  44 + }
  45 +} else {
  46 + $envName = $params['env'];
  47 +}
  48 +
  49 +if (!in_array($envName, $envNames)) {
  50 + $envsList = implode(', ', $envNames);
  51 + echo "\n $envName is not a valid environment. Try one of the following: $envsList. \n";
  52 + exit(2);
  53 +}
  54 +
  55 +$env = $envs[$envName];
  56 +
  57 +if (empty($params['env'])) {
  58 + echo "\n Initialize the application under '{$envNames[$answer]}' environment? [yes|no] ";
  59 + $answer = trim(fgets(STDIN));
  60 + if (strncasecmp($answer, 'y', 1)) {
  61 + echo "\n Quit initialization.\n";
  62 + exit(0);
  63 + }
  64 +}
  65 +
  66 +echo "\n Start initialization ...\n\n";
  67 +$files = getFileList("$root/environments/{$env['path']}");
  68 +if (isset($env['skipFiles'])) {
  69 + $skipFiles = $env['skipFiles'];
  70 + array_walk($skipFiles, function(&$value) use($env, $root) { $value = "$root/$value"; });
  71 + $files = array_diff($files, array_intersect_key($env['skipFiles'], array_filter($skipFiles, 'file_exists')));
  72 +}
  73 +$all = false;
  74 +foreach ($files as $file) {
  75 + if (!copyFile($root, "environments/{$env['path']}/$file", $file, $all, $params)) {
  76 + break;
  77 + }
  78 +}
  79 +
  80 +$callbacks = ['setCookieValidationKey', 'setWritable', 'setExecutable', 'createSymlink'];
  81 +foreach ($callbacks as $callback) {
  82 + if (!empty($env[$callback])) {
  83 + $callback($root, $env[$callback]);
  84 + }
  85 +}
  86 +
  87 +echo "\n ... initialization completed.\n\n";
  88 +
  89 +function getFileList($root, $basePath = '')
  90 +{
  91 + $files = [];
  92 + $handle = opendir($root);
  93 + while (($path = readdir($handle)) !== false) {
  94 + if ($path === '.git' || $path === '.svn' || $path === '.' || $path === '..') {
  95 + continue;
  96 + }
  97 + $fullPath = "$root/$path";
  98 + $relativePath = $basePath === '' ? $path : "$basePath/$path";
  99 + if (is_dir($fullPath)) {
  100 + $files = array_merge($files, getFileList($fullPath, $relativePath));
  101 + } else {
  102 + $files[] = $relativePath;
  103 + }
  104 + }
  105 + closedir($handle);
  106 + return $files;
  107 +}
  108 +
  109 +function copyFile($root, $source, $target, &$all, $params)
  110 +{
  111 + if (!is_file($root . '/' . $source)) {
  112 + echo " skip $target ($source not exist)\n";
  113 + return true;
  114 + }
  115 + if (is_file($root . '/' . $target)) {
  116 + if (file_get_contents($root . '/' . $source) === file_get_contents($root . '/' . $target)) {
  117 + echo " unchanged $target\n";
  118 + return true;
  119 + }
  120 + if ($all) {
  121 + echo " overwrite $target\n";
  122 + } else {
  123 + echo " exist $target\n";
  124 + echo " ...overwrite? [Yes|No|All|Quit] ";
  125 +
  126 +
  127 + $answer = !empty($params['overwrite']) ? $params['overwrite'] : trim(fgets(STDIN));
  128 + if (!strncasecmp($answer, 'q', 1)) {
  129 + return false;
  130 + } else {
  131 + if (!strncasecmp($answer, 'y', 1)) {
  132 + echo " overwrite $target\n";
  133 + } else {
  134 + if (!strncasecmp($answer, 'a', 1)) {
  135 + echo " overwrite $target\n";
  136 + $all = true;
  137 + } else {
  138 + echo " skip $target\n";
  139 + return true;
  140 + }
  141 + }
  142 + }
  143 + }
  144 + file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));
  145 + return true;
  146 + }
  147 + echo " generate $target\n";
  148 + @mkdir(dirname($root . '/' . $target), 0777, true);
  149 + file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));
  150 + return true;
  151 +}
  152 +
  153 +function getParams()
  154 +{
  155 + $rawParams = [];
  156 + if (isset($_SERVER['argv'])) {
  157 + $rawParams = $_SERVER['argv'];
  158 + array_shift($rawParams);
  159 + }
  160 +
  161 + $params = [];
  162 + foreach ($rawParams as $param) {
  163 + if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) {
  164 + $name = $matches[1];
  165 + $params[$name] = isset($matches[3]) ? $matches[3] : true;
  166 + } else {
  167 + $params[] = $param;
  168 + }
  169 + }
  170 + return $params;
  171 +}
  172 +
  173 +function setWritable($root, $paths)
  174 +{
  175 + foreach ($paths as $writable) {
  176 + echo " chmod 0777 $writable\n";
  177 + @chmod("$root/$writable", 0777);
  178 + }
  179 +}
  180 +
  181 +function setExecutable($root, $paths)
  182 +{
  183 + foreach ($paths as $executable) {
  184 + echo " chmod 0755 $executable\n";
  185 + @chmod("$root/$executable", 0755);
  186 + }
  187 +}
  188 +
  189 +function setCookieValidationKey($root, $paths)
  190 +{
  191 + foreach ($paths as $file) {
  192 + echo " generate cookie validation key in $file\n";
  193 + $file = $root . '/' . $file;
  194 + $length = 32;
  195 + $bytes = openssl_random_pseudo_bytes($length);
  196 + $key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.');
  197 + $content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file));
  198 + file_put_contents($file, $content);
  199 + }
  200 +}
  201 +
  202 +function createSymlink($root, $links) {
  203 + foreach ($links as $link => $target) {
  204 + echo " symlink " . $root . "/" . $target . " " . $root . "/" . $link . "\n";
  205 + //first removing folders to avoid errors if the folder already exists
  206 + @rmdir($root . "/" . $link);
  207 + @symlink($root . "/" . $target, $root . "/" . $link);
  208 + }
  209 +}
... ...
init.bat 0 โ†’ 100755
  1 +++ a/init.bat
  1 +@echo off
  2 +
  3 +rem -------------------------------------------------------------
  4 +rem Yii command line init script for Windows.
  5 +rem
  6 +rem @author Qiang Xue <qiang.xue@gmail.com>
  7 +rem @link http://www.yiiframework.com/
  8 +rem @copyright Copyright (c) 2008 Yii Software LLC
  9 +rem @license http://www.yiiframework.com/license/
  10 +rem -------------------------------------------------------------
  11 +
  12 +@setlocal
  13 +
  14 +set YII_PATH=%~dp0
  15 +
  16 +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
  17 +
  18 +"%PHP_COMMAND%" "%YII_PATH%init" %*
  19 +
  20 +@endlocal
... ...
requirements.php 0 โ†’ 100755
  1 +++ a/requirements.php
  1 +<?php
  2 +/**
  3 + * Application requirement checker script.
  4 + *
  5 + * In order to run this script use the following console command:
  6 + * php requirements.php
  7 + *
  8 + * In order to run this script from the web, you should copy it to the web root.
  9 + * If you are using Linux you can create a hard link instead, using the following command:
  10 + * ln requirements.php ../requirements.php
  11 + */
  12 +
  13 +// you may need to adjust this path to the correct Yii framework path
  14 +$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2';
  15 +
  16 +if (!is_dir($frameworkPath)) {
  17 + echo '<h1>Error</h1>';
  18 + echo '<p><strong>The path to yii framework seems to be incorrect.</strong></p>';
  19 + echo '<p>You need to install Yii framework via composer or adjust the framework path in file <abbr title="' . __FILE__ . '">' . basename(__FILE__) . '</abbr>.</p>';
  20 + echo '<p>Please refer to the <abbr title="' . dirname(__FILE__) . '/README.md">README</abbr> on how to install Yii.</p>';
  21 +}
  22 +
  23 +require_once($frameworkPath . '/requirements/YiiRequirementChecker.php');
  24 +$requirementsChecker = new YiiRequirementChecker();
  25 +
  26 +$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.';
  27 +$gdOK = $imagickOK = false;
  28 +
  29 +if (extension_loaded('imagick')) {
  30 + $imagick = new Imagick();
  31 + $imagickFormats = $imagick->queryFormats('PNG');
  32 + if (in_array('PNG', $imagickFormats)) {
  33 + $imagickOK = true;
  34 + } else {
  35 + $imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.';
  36 + }
  37 +}
  38 +
  39 +if (extension_loaded('gd')) {
  40 + $gdInfo = gd_info();
  41 + if (!empty($gdInfo['FreeType Support'])) {
  42 + $gdOK = true;
  43 + } else {
  44 + $gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.';
  45 + }
  46 +}
  47 +
  48 +/**
  49 + * Adjust requirements according to your application specifics.
  50 + */
  51 +$requirements = array(
  52 + // Database :
  53 + array(
  54 + 'name' => 'PDO extension',
  55 + 'mandatory' => true,
  56 + 'condition' => extension_loaded('pdo'),
  57 + 'by' => 'All DB-related classes',
  58 + ),
  59 + array(
  60 + 'name' => 'PDO SQLite extension',
  61 + 'mandatory' => false,
  62 + 'condition' => extension_loaded('pdo_sqlite'),
  63 + 'by' => 'All DB-related classes',
  64 + 'memo' => 'Required for SQLite database.',
  65 + ),
  66 + array(
  67 + 'name' => 'PDO MySQL extension',
  68 + 'mandatory' => false,
  69 + 'condition' => extension_loaded('pdo_mysql'),
  70 + 'by' => 'All DB-related classes',
  71 + 'memo' => 'Required for MySQL database.',
  72 + ),
  73 + array(
  74 + 'name' => 'PDO PostgreSQL extension',
  75 + 'mandatory' => false,
  76 + 'condition' => extension_loaded('pdo_pgsql'),
  77 + 'by' => 'All DB-related classes',
  78 + 'memo' => 'Required for PostgreSQL database.',
  79 + ),
  80 + // Cache :
  81 + array(
  82 + 'name' => 'Memcache extension',
  83 + 'mandatory' => false,
  84 + 'condition' => extension_loaded('memcache') || extension_loaded('memcached'),
  85 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html">MemCache</a>',
  86 + 'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html#$useMemcached-detail">MemCache::useMemcached</a> to <code>true</code>.' : ''
  87 + ),
  88 + array(
  89 + 'name' => 'APC extension',
  90 + 'mandatory' => false,
  91 + 'condition' => extension_loaded('apc'),
  92 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
  93 + ),
  94 + // CAPTCHA:
  95 + array(
  96 + 'name' => 'GD PHP extension with FreeType support',
  97 + 'mandatory' => false,
  98 + 'condition' => $gdOK,
  99 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
  100 + 'memo' => $gdMemo,
  101 + ),
  102 + array(
  103 + 'name' => 'ImageMagick PHP extension with PNG support',
  104 + 'mandatory' => false,
  105 + 'condition' => $imagickOK,
  106 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
  107 + 'memo' => $imagickMemo,
  108 + ),
  109 + // PHP ini :
  110 + 'phpExposePhp' => array(
  111 + 'name' => 'Expose PHP',
  112 + 'mandatory' => false,
  113 + 'condition' => $requirementsChecker->checkPhpIniOff("expose_php"),
  114 + 'by' => 'Security reasons',
  115 + 'memo' => '"expose_php" should be disabled at php.ini',
  116 + ),
  117 + 'phpAllowUrlInclude' => array(
  118 + 'name' => 'PHP allow url include',
  119 + 'mandatory' => false,
  120 + 'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"),
  121 + 'by' => 'Security reasons',
  122 + 'memo' => '"allow_url_include" should be disabled at php.ini',
  123 + ),
  124 + 'phpSmtp' => array(
  125 + 'name' => 'PHP mail SMTP',
  126 + 'mandatory' => false,
  127 + 'condition' => strlen(ini_get('SMTP')) > 0,
  128 + 'by' => 'Email sending',
  129 + 'memo' => 'PHP mail SMTP server required',
  130 + ),
  131 +);
  132 +$requirementsChecker->checkYii()->check($requirements)->render();
... ...