initial commit
This commit is contained in:
commit
4edcf5536e
30
.gitignore
vendored
Normal file
30
.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# yii console command
|
||||||
|
/yii
|
||||||
|
|
||||||
|
# phpstorm project files
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# netbeans project files
|
||||||
|
nbproject
|
||||||
|
|
||||||
|
# zend studio for eclipse project files
|
||||||
|
.buildpath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
|
||||||
|
# windows thumbnail cache
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# composer vendor dir
|
||||||
|
/vendor
|
||||||
|
|
||||||
|
# composer itself is not needed
|
||||||
|
composer.phar
|
||||||
|
|
||||||
|
# Mac DS_Store Files
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# phpunit itself is not needed
|
||||||
|
phpunit.phar
|
||||||
|
# local phpunit config
|
||||||
|
/phpunit.xml
|
||||||
32
LICENSE.md
Normal file
32
LICENSE.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
The Yii framework is free software. It is released under the terms of
|
||||||
|
the following BSD License.
|
||||||
|
|
||||||
|
Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com)
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Yii Software LLC nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
54
README.md
Normal file
54
README.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
Yii 2 Advanced Project Template
|
||||||
|
===============================
|
||||||
|
|
||||||
|
Yii 2 Advanced Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for
|
||||||
|
developing complex Web applications with multiple tiers.
|
||||||
|
|
||||||
|
The template includes three tiers: front end, back end, and console, each of which
|
||||||
|
is a separate Yii application.
|
||||||
|
|
||||||
|
The template is designed to work in a team development environment. It supports
|
||||||
|
deploying the application in different environments.
|
||||||
|
|
||||||
|
Documentation is at [docs/guide/README.md](docs/guide/README.md).
|
||||||
|
|
||||||
|
[](https://packagist.org/packages/yiisoft/yii2-app-advanced)
|
||||||
|
[](https://packagist.org/packages/yiisoft/yii2-app-advanced)
|
||||||
|
[](https://travis-ci.org/yiisoft/yii2-app-advanced)
|
||||||
|
|
||||||
|
DIRECTORY STRUCTURE
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
common
|
||||||
|
config/ contains shared configurations
|
||||||
|
mail/ contains view files for e-mails
|
||||||
|
models/ contains model classes used in both backend and frontend
|
||||||
|
console
|
||||||
|
config/ contains console configurations
|
||||||
|
controllers/ contains console controllers (commands)
|
||||||
|
migrations/ contains database migrations
|
||||||
|
models/ contains console-specific model classes
|
||||||
|
runtime/ contains files generated during runtime
|
||||||
|
backend
|
||||||
|
assets/ contains application assets such as JavaScript and CSS
|
||||||
|
config/ contains backend configurations
|
||||||
|
controllers/ contains Web controller classes
|
||||||
|
models/ contains backend-specific model classes
|
||||||
|
runtime/ contains files generated during runtime
|
||||||
|
views/ contains view files for the Web application
|
||||||
|
web/ contains the entry script and Web resources
|
||||||
|
frontend
|
||||||
|
assets/ contains application assets such as JavaScript and CSS
|
||||||
|
config/ contains frontend configurations
|
||||||
|
controllers/ contains Web controller classes
|
||||||
|
models/ contains frontend-specific model classes
|
||||||
|
runtime/ contains files generated during runtime
|
||||||
|
views/ contains view files for the Web application
|
||||||
|
web/ contains the entry script and Web resources
|
||||||
|
widgets/ contains frontend widgets
|
||||||
|
vendor/ contains dependent 3rd-party packages
|
||||||
|
environments/ contains environment-based overrides
|
||||||
|
tests contains various tests for the advanced application
|
||||||
|
codeception/ contains tests developed with Codeception PHP Testing Framework
|
||||||
|
```
|
||||||
29
backend/assets/AppAsset.php
Normal file
29
backend/assets/AppAsset.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace backend\assets;
|
||||||
|
|
||||||
|
use yii\web\AssetBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class AppAsset extends AssetBundle
|
||||||
|
{
|
||||||
|
public $basePath = '@webroot';
|
||||||
|
public $baseUrl = '@web';
|
||||||
|
public $css = [
|
||||||
|
'css/site.css',
|
||||||
|
];
|
||||||
|
public $js = [
|
||||||
|
];
|
||||||
|
public $depends = [
|
||||||
|
'yii\web\YiiAsset',
|
||||||
|
'yii\bootstrap\BootstrapAsset',
|
||||||
|
];
|
||||||
|
}
|
||||||
2
backend/config/.gitignore
vendored
Normal file
2
backend/config/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
main-local.php
|
||||||
|
params-local.php
|
||||||
1
backend/config/bootstrap.php
Normal file
1
backend/config/bootstrap.php
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?php
|
||||||
34
backend/config/main.php
Normal file
34
backend/config/main.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
$params = array_merge(
|
||||||
|
require(__DIR__ . '/../../common/config/params.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/params-local.php'),
|
||||||
|
require(__DIR__ . '/params.php'),
|
||||||
|
require(__DIR__ . '/params-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => 'app-backend',
|
||||||
|
'basePath' => dirname(__DIR__),
|
||||||
|
'controllerNamespace' => 'backend\controllers',
|
||||||
|
'bootstrap' => ['log'],
|
||||||
|
'modules' => [],
|
||||||
|
'components' => [
|
||||||
|
'user' => [
|
||||||
|
'identityClass' => 'common\models\User',
|
||||||
|
'enableAutoLogin' => true,
|
||||||
|
],
|
||||||
|
'log' => [
|
||||||
|
'traceLevel' => YII_DEBUG ? 3 : 0,
|
||||||
|
'targets' => [
|
||||||
|
[
|
||||||
|
'class' => 'yii\log\FileTarget',
|
||||||
|
'levels' => ['error', 'warning'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'errorHandler' => [
|
||||||
|
'errorAction' => 'site/error',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'params' => $params,
|
||||||
|
];
|
||||||
4
backend/config/params.php
Normal file
4
backend/config/params.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'adminEmail' => 'admin@example.com',
|
||||||
|
];
|
||||||
83
backend/controllers/SiteController.php
Normal file
83
backend/controllers/SiteController.php
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
namespace backend\controllers;
|
||||||
|
|
||||||
|
use Yii;
|
||||||
|
use yii\filters\AccessControl;
|
||||||
|
use yii\web\Controller;
|
||||||
|
use common\models\LoginForm;
|
||||||
|
use yii\filters\VerbFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Site controller
|
||||||
|
*/
|
||||||
|
class SiteController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function behaviors()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'access' => [
|
||||||
|
'class' => AccessControl::className(),
|
||||||
|
'rules' => [
|
||||||
|
[
|
||||||
|
'actions' => ['login', 'error'],
|
||||||
|
'allow' => true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'actions' => ['logout', 'index'],
|
||||||
|
'allow' => true,
|
||||||
|
'roles' => ['@'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'verbs' => [
|
||||||
|
'class' => VerbFilter::className(),
|
||||||
|
'actions' => [
|
||||||
|
'logout' => ['post'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function actions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'error' => [
|
||||||
|
'class' => 'yii\web\ErrorAction',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function actionIndex()
|
||||||
|
{
|
||||||
|
return $this->render('index');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function actionLogin()
|
||||||
|
{
|
||||||
|
if (!\Yii::$app->user->isGuest) {
|
||||||
|
return $this->goHome();
|
||||||
|
}
|
||||||
|
|
||||||
|
$model = new LoginForm();
|
||||||
|
if ($model->load(Yii::$app->request->post()) && $model->login()) {
|
||||||
|
return $this->goBack();
|
||||||
|
} else {
|
||||||
|
return $this->render('login', [
|
||||||
|
'model' => $model,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function actionLogout()
|
||||||
|
{
|
||||||
|
Yii::$app->user->logout();
|
||||||
|
|
||||||
|
return $this->goHome();
|
||||||
|
}
|
||||||
|
}
|
||||||
1
backend/models/.gitkeep
Normal file
1
backend/models/.gitkeep
Normal file
@ -0,0 +1 @@
|
|||||||
|
*
|
||||||
2
backend/runtime/.gitignore
vendored
Normal file
2
backend/runtime/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
76
backend/views/layouts/main.php
Normal file
76
backend/views/layouts/main.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this \yii\web\View */
|
||||||
|
/* @var $content string */
|
||||||
|
|
||||||
|
use backend\assets\AppAsset;
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\Nav;
|
||||||
|
use yii\bootstrap\NavBar;
|
||||||
|
use yii\widgets\Breadcrumbs;
|
||||||
|
use common\widgets\Alert;
|
||||||
|
|
||||||
|
AppAsset::register($this);
|
||||||
|
?>
|
||||||
|
<?php $this->beginPage() ?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="<?= Yii::$app->language ?>">
|
||||||
|
<head>
|
||||||
|
<meta charset="<?= Yii::$app->charset ?>">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<?= Html::csrfMetaTags() ?>
|
||||||
|
<title><?= Html::encode($this->title) ?></title>
|
||||||
|
<?php $this->head() ?>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?php $this->beginBody() ?>
|
||||||
|
|
||||||
|
<div class="wrap">
|
||||||
|
<?php
|
||||||
|
NavBar::begin([
|
||||||
|
'brandLabel' => 'My Company',
|
||||||
|
'brandUrl' => Yii::$app->homeUrl,
|
||||||
|
'options' => [
|
||||||
|
'class' => 'navbar-inverse navbar-fixed-top',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$menuItems = [
|
||||||
|
['label' => 'Home', 'url' => ['/site/index']],
|
||||||
|
];
|
||||||
|
if (Yii::$app->user->isGuest) {
|
||||||
|
$menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
|
||||||
|
} else {
|
||||||
|
$menuItems[] = [
|
||||||
|
'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
|
||||||
|
'url' => ['/site/logout'],
|
||||||
|
'linkOptions' => ['data-method' => 'post']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
echo Nav::widget([
|
||||||
|
'options' => ['class' => 'navbar-nav navbar-right'],
|
||||||
|
'items' => $menuItems,
|
||||||
|
]);
|
||||||
|
NavBar::end();
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<?= Breadcrumbs::widget([
|
||||||
|
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
|
||||||
|
]) ?>
|
||||||
|
<?= Alert::widget() ?>
|
||||||
|
<?= $content ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
<p class="pull-left">© My Company <?= date('Y') ?></p>
|
||||||
|
|
||||||
|
<p class="pull-right"><?= Yii::powered() ?></p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<?php $this->endBody() ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php $this->endPage() ?>
|
||||||
27
backend/views/site/error.php
Normal file
27
backend/views/site/error.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $name string */
|
||||||
|
/* @var $message string */
|
||||||
|
/* @var $exception Exception */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
|
||||||
|
$this->title = $name;
|
||||||
|
?>
|
||||||
|
<div class="site-error">
|
||||||
|
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<?= nl2br(Html::encode($message)) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The above error occurred while the Web server was processing your request.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Please contact us if you think this is a server error. Thank you.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
53
backend/views/site/index.php
Normal file
53
backend/views/site/index.php
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
|
||||||
|
$this->title = 'My Yii Application';
|
||||||
|
?>
|
||||||
|
<div class="site-index">
|
||||||
|
|
||||||
|
<div class="jumbotron">
|
||||||
|
<h1>Congratulations!</h1>
|
||||||
|
|
||||||
|
<p class="lead">You have successfully created your Yii-powered application.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="body-content">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h2>Heading</h2>
|
||||||
|
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
|
||||||
|
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
||||||
|
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
||||||
|
fugiat nulla pariatur.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation »</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h2>Heading</h2>
|
||||||
|
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
|
||||||
|
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
||||||
|
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
||||||
|
fugiat nulla pariatur.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum »</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h2>Heading</h2>
|
||||||
|
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
|
||||||
|
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
||||||
|
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
||||||
|
fugiat nulla pariatur.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions »</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
35
backend/views/site/login.php
Normal file
35
backend/views/site/login.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $form yii\bootstrap\ActiveForm */
|
||||||
|
/* @var $model \common\models\LoginForm */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\ActiveForm;
|
||||||
|
|
||||||
|
$this->title = 'Login';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-login">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>Please fill out the following fields to login:</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'username') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'password')->passwordInput() ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'rememberMe')->checkbox() ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php ActiveForm::end(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
2
backend/web/.gitignore
vendored
Normal file
2
backend/web/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/index.php
|
||||||
|
/index-test.php
|
||||||
2
backend/web/assets/.gitignore
vendored
Normal file
2
backend/web/assets/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
91
backend/web/css/site.css
Normal file
91
backend/web/css/site.css
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrap {
|
||||||
|
min-height: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin: 0 auto -60px;
|
||||||
|
padding: 0 0 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrap > .container {
|
||||||
|
padding: 70px 15px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
height: 60px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jumbotron {
|
||||||
|
text-align: center;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jumbotron .btn {
|
||||||
|
font-size: 21px;
|
||||||
|
padding: 14px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.not-set {
|
||||||
|
color: #c55;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add sorting icons to gridview sort links */
|
||||||
|
a.asc:after, a.desc:after {
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
display: inline-block;
|
||||||
|
font-family: 'Glyphicons Halflings';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.asc:after {
|
||||||
|
content: /*"\e113"*/ "\e151";
|
||||||
|
}
|
||||||
|
|
||||||
|
a.desc:after {
|
||||||
|
content: /*"\e114"*/ "\e152";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-numerical a.asc:after {
|
||||||
|
content: "\e153";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-numerical a.desc:after {
|
||||||
|
content: "\e154";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-ordinal a.asc:after {
|
||||||
|
content: "\e155";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-ordinal a.desc:after {
|
||||||
|
content: "\e156";
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-view th {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hint-block {
|
||||||
|
display: block;
|
||||||
|
margin-top: 5px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-summary {
|
||||||
|
color: #a94442;
|
||||||
|
background: #fdf7f7;
|
||||||
|
border-left: 3px solid #eed3d7;
|
||||||
|
padding: 10px 20px;
|
||||||
|
margin: 0 0 15px 0;
|
||||||
|
}
|
||||||
BIN
backend/web/favicon.ico
Normal file
BIN
backend/web/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 318 B |
2
backend/web/robots.txt
Normal file
2
backend/web/robots.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow: /
|
||||||
2
common/config/.gitignore
vendored
Normal file
2
common/config/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
main-local.php
|
||||||
|
params-local.php
|
||||||
5
common/config/bootstrap.php
Normal file
5
common/config/bootstrap.php
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
Yii::setAlias('common', dirname(__DIR__));
|
||||||
|
Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend');
|
||||||
|
Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend');
|
||||||
|
Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console');
|
||||||
9
common/config/main.php
Normal file
9
common/config/main.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
|
||||||
|
'components' => [
|
||||||
|
'cache' => [
|
||||||
|
'class' => 'yii\caching\FileCache',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
6
common/config/params.php
Normal file
6
common/config/params.php
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'adminEmail' => 'admin@example.com',
|
||||||
|
'supportEmail' => 'support@example.com',
|
||||||
|
'user.passwordResetTokenExpire' => 3600,
|
||||||
|
];
|
||||||
22
common/mail/layouts/html.php
Normal file
22
common/mail/layouts/html.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
use yii\helpers\Html;
|
||||||
|
|
||||||
|
/* @var $this \yii\web\View view component instance */
|
||||||
|
/* @var $message \yii\mail\MessageInterface the message being composed */
|
||||||
|
/* @var $content string main view render result */
|
||||||
|
?>
|
||||||
|
<?php $this->beginPage() ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
|
||||||
|
<title><?= Html::encode($this->title) ?></title>
|
||||||
|
<?php $this->head() ?>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?php $this->beginBody() ?>
|
||||||
|
<?= $content ?>
|
||||||
|
<?php $this->endBody() ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php $this->endPage() ?>
|
||||||
12
common/mail/layouts/text.php
Normal file
12
common/mail/layouts/text.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
use yii\helpers\Html;
|
||||||
|
|
||||||
|
/* @var $this \yii\web\View view component instance */
|
||||||
|
/* @var $message \yii\mail\MessageInterface the message being composed */
|
||||||
|
/* @var $content string main view render result */
|
||||||
|
?>
|
||||||
|
<?php $this->beginPage() ?>
|
||||||
|
<?php $this->beginBody() ?>
|
||||||
|
<?= $content ?>
|
||||||
|
<?php $this->endBody() ?>
|
||||||
|
<?php $this->endPage() ?>
|
||||||
15
common/mail/passwordResetToken-html.php
Normal file
15
common/mail/passwordResetToken-html.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
use yii\helpers\Html;
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $user common\models\User */
|
||||||
|
|
||||||
|
$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
|
||||||
|
?>
|
||||||
|
<div class="password-reset">
|
||||||
|
<p>Hello <?= Html::encode($user->username) ?>,</p>
|
||||||
|
|
||||||
|
<p>Follow the link below to reset your password:</p>
|
||||||
|
|
||||||
|
<p><?= Html::a(Html::encode($resetLink), $resetLink) ?></p>
|
||||||
|
</div>
|
||||||
12
common/mail/passwordResetToken-text.php
Normal file
12
common/mail/passwordResetToken-text.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $user common\models\User */
|
||||||
|
|
||||||
|
$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
|
||||||
|
?>
|
||||||
|
Hello <?= $user->username ?>,
|
||||||
|
|
||||||
|
Follow the link below to reset your password:
|
||||||
|
|
||||||
|
<?= $resetLink ?>
|
||||||
78
common/models/LoginForm.php
Normal file
78
common/models/LoginForm.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
namespace common\models;
|
||||||
|
|
||||||
|
use Yii;
|
||||||
|
use yii\base\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Login form
|
||||||
|
*/
|
||||||
|
class LoginForm extends Model
|
||||||
|
{
|
||||||
|
public $username;
|
||||||
|
public $password;
|
||||||
|
public $rememberMe = true;
|
||||||
|
|
||||||
|
private $_user;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// username and password are both required
|
||||||
|
[['username', 'password'], 'required'],
|
||||||
|
// rememberMe must be a boolean value
|
||||||
|
['rememberMe', 'boolean'],
|
||||||
|
// password is validated by validatePassword()
|
||||||
|
['password', 'validatePassword'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the password.
|
||||||
|
* This method serves as the inline validation for password.
|
||||||
|
*
|
||||||
|
* @param string $attribute the attribute currently being validated
|
||||||
|
* @param array $params the additional name-value pairs given in the rule
|
||||||
|
*/
|
||||||
|
public function validatePassword($attribute, $params)
|
||||||
|
{
|
||||||
|
if (!$this->hasErrors()) {
|
||||||
|
$user = $this->getUser();
|
||||||
|
if (!$user || !$user->validatePassword($this->password)) {
|
||||||
|
$this->addError($attribute, 'Incorrect username or password.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs in a user using the provided username and password.
|
||||||
|
*
|
||||||
|
* @return boolean whether the user is logged in successfully
|
||||||
|
*/
|
||||||
|
public function login()
|
||||||
|
{
|
||||||
|
if ($this->validate()) {
|
||||||
|
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds user by [[username]]
|
||||||
|
*
|
||||||
|
* @return User|null
|
||||||
|
*/
|
||||||
|
protected function getUser()
|
||||||
|
{
|
||||||
|
if ($this->_user === null) {
|
||||||
|
$this->_user = User::findByUsername($this->username);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_user;
|
||||||
|
}
|
||||||
|
}
|
||||||
188
common/models/User.php
Normal file
188
common/models/User.php
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
<?php
|
||||||
|
namespace common\models;
|
||||||
|
|
||||||
|
use Yii;
|
||||||
|
use yii\base\NotSupportedException;
|
||||||
|
use yii\behaviors\TimestampBehavior;
|
||||||
|
use yii\db\ActiveRecord;
|
||||||
|
use yii\web\IdentityInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User model
|
||||||
|
*
|
||||||
|
* @property integer $id
|
||||||
|
* @property string $username
|
||||||
|
* @property string $password_hash
|
||||||
|
* @property string $password_reset_token
|
||||||
|
* @property string $email
|
||||||
|
* @property string $auth_key
|
||||||
|
* @property integer $status
|
||||||
|
* @property integer $created_at
|
||||||
|
* @property integer $updated_at
|
||||||
|
* @property string $password write-only password
|
||||||
|
*/
|
||||||
|
class User extends ActiveRecord implements IdentityInterface
|
||||||
|
{
|
||||||
|
const STATUS_DELETED = 0;
|
||||||
|
const STATUS_ACTIVE = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public static function tableName()
|
||||||
|
{
|
||||||
|
return '{{%user}}';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function behaviors()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
TimestampBehavior::className(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['status', 'default', 'value' => self::STATUS_ACTIVE],
|
||||||
|
['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public static function findIdentity($id)
|
||||||
|
{
|
||||||
|
return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public static function findIdentityByAccessToken($token, $type = null)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds user by username
|
||||||
|
*
|
||||||
|
* @param string $username
|
||||||
|
* @return static|null
|
||||||
|
*/
|
||||||
|
public static function findByUsername($username)
|
||||||
|
{
|
||||||
|
return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds user by password reset token
|
||||||
|
*
|
||||||
|
* @param string $token password reset token
|
||||||
|
* @return static|null
|
||||||
|
*/
|
||||||
|
public static function findByPasswordResetToken($token)
|
||||||
|
{
|
||||||
|
if (!static::isPasswordResetTokenValid($token)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return static::findOne([
|
||||||
|
'password_reset_token' => $token,
|
||||||
|
'status' => self::STATUS_ACTIVE,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds out if password reset token is valid
|
||||||
|
*
|
||||||
|
* @param string $token password reset token
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function isPasswordResetTokenValid($token)
|
||||||
|
{
|
||||||
|
if (empty($token)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$timestamp = (int) substr($token, strrpos($token, '_') + 1);
|
||||||
|
$expire = Yii::$app->params['user.passwordResetTokenExpire'];
|
||||||
|
return $timestamp + $expire >= time();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function getId()
|
||||||
|
{
|
||||||
|
return $this->getPrimaryKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function getAuthKey()
|
||||||
|
{
|
||||||
|
return $this->auth_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function validateAuthKey($authKey)
|
||||||
|
{
|
||||||
|
return $this->getAuthKey() === $authKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates password
|
||||||
|
*
|
||||||
|
* @param string $password password to validate
|
||||||
|
* @return boolean if password provided is valid for current user
|
||||||
|
*/
|
||||||
|
public function validatePassword($password)
|
||||||
|
{
|
||||||
|
return Yii::$app->security->validatePassword($password, $this->password_hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates password hash from password and sets it to the model
|
||||||
|
*
|
||||||
|
* @param string $password
|
||||||
|
*/
|
||||||
|
public function setPassword($password)
|
||||||
|
{
|
||||||
|
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates "remember me" authentication key
|
||||||
|
*/
|
||||||
|
public function generateAuthKey()
|
||||||
|
{
|
||||||
|
$this->auth_key = Yii::$app->security->generateRandomString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates new password reset token
|
||||||
|
*/
|
||||||
|
public function generatePasswordResetToken()
|
||||||
|
{
|
||||||
|
$this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes password reset token
|
||||||
|
*/
|
||||||
|
public function removePasswordResetToken()
|
||||||
|
{
|
||||||
|
$this->password_reset_token = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
79
common/widgets/Alert.php
Normal file
79
common/widgets/Alert.php
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace common\widgets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alert widget renders a message from session flash. All flash messages are displayed
|
||||||
|
* in the sequence they were assigned using setFlash. You can set message as following:
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* \Yii::$app->session->setFlash('error', 'This is the message');
|
||||||
|
* \Yii::$app->session->setFlash('success', 'This is the message');
|
||||||
|
* \Yii::$app->session->setFlash('info', 'This is the message');
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Multiple messages could be set as follows:
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* \Yii::$app->session->setFlash('error', ['Error 1', 'Error 2']);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @author Kartik Visweswaran <kartikv2@gmail.com>
|
||||||
|
* @author Alexander Makarov <sam@rmcreative.ru>
|
||||||
|
*/
|
||||||
|
class Alert extends \yii\bootstrap\Widget
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array the alert types configuration for the flash messages.
|
||||||
|
* This array is setup as $key => $value, where:
|
||||||
|
* - $key is the name of the session flash variable
|
||||||
|
* - $value is the bootstrap alert type (i.e. danger, success, info, warning)
|
||||||
|
*/
|
||||||
|
public $alertTypes = [
|
||||||
|
'error' => 'alert-danger',
|
||||||
|
'danger' => 'alert-danger',
|
||||||
|
'success' => 'alert-success',
|
||||||
|
'info' => 'alert-info',
|
||||||
|
'warning' => 'alert-warning'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array the options for rendering the close button tag.
|
||||||
|
*/
|
||||||
|
public $closeButton = [];
|
||||||
|
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
parent::init();
|
||||||
|
|
||||||
|
$session = \Yii::$app->session;
|
||||||
|
$flashes = $session->getAllFlashes();
|
||||||
|
$appendCss = isset($this->options['class']) ? ' ' . $this->options['class'] : '';
|
||||||
|
|
||||||
|
foreach ($flashes as $type => $data) {
|
||||||
|
if (isset($this->alertTypes[$type])) {
|
||||||
|
$data = (array) $data;
|
||||||
|
foreach ($data as $i => $message) {
|
||||||
|
/* initialize css class for each alert box */
|
||||||
|
$this->options['class'] = $this->alertTypes[$type] . $appendCss;
|
||||||
|
|
||||||
|
/* assign unique id to each alert box */
|
||||||
|
$this->options['id'] = $this->getId() . '-' . $type . '-' . $i;
|
||||||
|
|
||||||
|
echo \yii\bootstrap\Alert::widget([
|
||||||
|
'body' => $message,
|
||||||
|
'closeButton' => $this->closeButton,
|
||||||
|
'options' => $this->options,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->removeFlash($type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
37
composer.json
Normal file
37
composer.json
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-app-advanced",
|
||||||
|
"description": "Yii 2 Advanced Project Template",
|
||||||
|
"keywords": ["yii2", "framework", "advanced", "project template"],
|
||||||
|
"homepage": "http://www.yiiframework.com/",
|
||||||
|
"type": "project",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
|
||||||
|
"forum": "http://www.yiiframework.com/forum/",
|
||||||
|
"wiki": "http://www.yiiframework.com/wiki/",
|
||||||
|
"irc": "irc://irc.freenode.net/yii",
|
||||||
|
"source": "https://github.com/yiisoft/yii2"
|
||||||
|
},
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0",
|
||||||
|
"yiisoft/yii2": ">=2.0.6",
|
||||||
|
"yiisoft/yii2-bootstrap": "*",
|
||||||
|
"yiisoft/yii2-swiftmailer": "*"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"yiisoft/yii2-codeception": "*",
|
||||||
|
"yiisoft/yii2-debug": "*",
|
||||||
|
"yiisoft/yii2-gii": "*",
|
||||||
|
"yiisoft/yii2-faker": "*"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"process-timeout": 1800
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"asset-installer-paths": {
|
||||||
|
"npm-asset-library": "vendor/npm",
|
||||||
|
"bower-asset-library": "vendor/bower"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
924
composer.lock
generated
Normal file
924
composer.lock
generated
Normal file
@ -0,0 +1,924 @@
|
|||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"hash": "8580bd82955b1fbb80d47024e184056e",
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "bower-asset/bootstrap",
|
||||||
|
"version": "v3.3.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/twbs/bootstrap.git",
|
||||||
|
"reference": "16b48259a62f576e52c903c476bd42b90ab22482"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/twbs/bootstrap/zipball/16b48259a62f576e52c903c476bd42b90ab22482",
|
||||||
|
"reference": "16b48259a62f576e52c903c476bd42b90ab22482",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/jquery": ">=1.9.1"
|
||||||
|
},
|
||||||
|
"type": "bower-asset-library",
|
||||||
|
"extra": {
|
||||||
|
"bower-asset-main": [
|
||||||
|
"less/bootstrap.less",
|
||||||
|
"dist/js/bootstrap.js"
|
||||||
|
],
|
||||||
|
"bower-asset-ignore": [
|
||||||
|
"/.*",
|
||||||
|
"_config.yml",
|
||||||
|
"CNAME",
|
||||||
|
"composer.json",
|
||||||
|
"CONTRIBUTING.md",
|
||||||
|
"docs",
|
||||||
|
"js/tests",
|
||||||
|
"test-infra"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
|
||||||
|
"keywords": [
|
||||||
|
"css",
|
||||||
|
"framework",
|
||||||
|
"front-end",
|
||||||
|
"js",
|
||||||
|
"less",
|
||||||
|
"mobile-first",
|
||||||
|
"responsive",
|
||||||
|
"web"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bower-asset/jquery",
|
||||||
|
"version": "2.1.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/jquery/jquery.git",
|
||||||
|
"reference": "7751e69b615c6eca6f783a81e292a55725af6b85"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/jquery/jquery/zipball/7751e69b615c6eca6f783a81e292a55725af6b85",
|
||||||
|
"reference": "7751e69b615c6eca6f783a81e292a55725af6b85",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"bower-asset/qunit": "1.14.0",
|
||||||
|
"bower-asset/requirejs": "2.1.10",
|
||||||
|
"bower-asset/sinon": "1.8.1",
|
||||||
|
"bower-asset/sizzle": "2.1.1-patch2"
|
||||||
|
},
|
||||||
|
"type": "bower-asset-library",
|
||||||
|
"extra": {
|
||||||
|
"bower-asset-main": "dist/jquery.js",
|
||||||
|
"bower-asset-ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"build",
|
||||||
|
"dist/cdn",
|
||||||
|
"speed",
|
||||||
|
"test",
|
||||||
|
"*.md",
|
||||||
|
"AUTHORS.txt",
|
||||||
|
"Gruntfile.js",
|
||||||
|
"package.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"javascript",
|
||||||
|
"jquery",
|
||||||
|
"library"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bower-asset/jquery.inputmask",
|
||||||
|
"version": "3.1.63",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/RobinHerbots/jquery.inputmask.git",
|
||||||
|
"reference": "c40c7287eadc31e341ebbf0c02352eb55b9cbc48"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/c40c7287eadc31e341ebbf0c02352eb55b9cbc48",
|
||||||
|
"reference": "c40c7287eadc31e341ebbf0c02352eb55b9cbc48",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/jquery": ">=1.7"
|
||||||
|
},
|
||||||
|
"type": "bower-asset-library",
|
||||||
|
"extra": {
|
||||||
|
"bower-asset-main": [
|
||||||
|
"./dist/inputmask/jquery.inputmask.js",
|
||||||
|
"./dist/inputmask/jquery.inputmask.extensions.js",
|
||||||
|
"./dist/inputmask/jquery.inputmask.date.extensions.js",
|
||||||
|
"./dist/inputmask/jquery.inputmask.numeric.extensions.js",
|
||||||
|
"./dist/inputmask/jquery.inputmask.phone.extensions.js",
|
||||||
|
"./dist/inputmask/jquery.inputmask.regex.extensions.js"
|
||||||
|
],
|
||||||
|
"bower-asset-ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"qunit/",
|
||||||
|
"nuget/",
|
||||||
|
"tools/",
|
||||||
|
"js/",
|
||||||
|
"*.md",
|
||||||
|
"build.properties",
|
||||||
|
"build.xml",
|
||||||
|
"jquery.inputmask.jquery.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": [
|
||||||
|
"http://opensource.org/licenses/mit-license.php"
|
||||||
|
],
|
||||||
|
"description": "jquery.inputmask is a jquery plugin which create an input mask.",
|
||||||
|
"keywords": [
|
||||||
|
"form",
|
||||||
|
"input",
|
||||||
|
"inputmask",
|
||||||
|
"jquery",
|
||||||
|
"mask",
|
||||||
|
"plugins"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bower-asset/punycode",
|
||||||
|
"version": "v1.3.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/bestiejs/punycode.js.git",
|
||||||
|
"reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3",
|
||||||
|
"reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"type": "bower-asset-library",
|
||||||
|
"extra": {
|
||||||
|
"bower-asset-main": "punycode.js",
|
||||||
|
"bower-asset-ignore": [
|
||||||
|
"coverage",
|
||||||
|
"tests",
|
||||||
|
".*",
|
||||||
|
"component.json",
|
||||||
|
"Gruntfile.js",
|
||||||
|
"node_modules",
|
||||||
|
"package.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bower-asset/yii2-pjax",
|
||||||
|
"version": "v2.0.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/jquery-pjax.git",
|
||||||
|
"reference": "3f20897307cca046fca5323b318475ae9dac0ca0"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/3f20897307cca046fca5323b318475ae9dac0ca0",
|
||||||
|
"reference": "3f20897307cca046fca5323b318475ae9dac0ca0",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/jquery": ">=1.8"
|
||||||
|
},
|
||||||
|
"type": "bower-asset-library",
|
||||||
|
"extra": {
|
||||||
|
"bower-asset-main": "./jquery.pjax.js",
|
||||||
|
"bower-asset-ignore": [
|
||||||
|
".travis.yml",
|
||||||
|
"Gemfile",
|
||||||
|
"Gemfile.lock",
|
||||||
|
"vendor/",
|
||||||
|
"script/",
|
||||||
|
"test/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cebe/markdown",
|
||||||
|
"version": "1.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/cebe/markdown.git",
|
||||||
|
"reference": "54a2c49de31cc44e864ebf0500a35ef21d0010b2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/cebe/markdown/zipball/54a2c49de31cc44e864ebf0500a35ef21d0010b2",
|
||||||
|
"reference": "54a2c49de31cc44e864ebf0500a35ef21d0010b2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"lib-pcre": "*",
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"cebe/indent": "*",
|
||||||
|
"facebook/xhprof": "*@dev",
|
||||||
|
"phpunit/phpunit": "4.1.*"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/markdown"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.1.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"cebe\\markdown\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Carsten Brandt",
|
||||||
|
"email": "mail@cebe.cc",
|
||||||
|
"homepage": "http://cebe.cc/",
|
||||||
|
"role": "Creator"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A super fast, highly extensible markdown parser for PHP",
|
||||||
|
"homepage": "https://github.com/cebe/markdown#readme",
|
||||||
|
"keywords": [
|
||||||
|
"extensible",
|
||||||
|
"fast",
|
||||||
|
"gfm",
|
||||||
|
"markdown",
|
||||||
|
"markdown-extra"
|
||||||
|
],
|
||||||
|
"time": "2015-03-06 05:28:07"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ezyang/htmlpurifier",
|
||||||
|
"version": "v4.6.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/ezyang/htmlpurifier.git",
|
||||||
|
"reference": "6f389f0f25b90d0b495308efcfa073981177f0fd"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6f389f0f25b90d0b495308efcfa073981177f0fd",
|
||||||
|
"reference": "6f389f0f25b90d0b495308efcfa073981177f0fd",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.2"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"HTMLPurifier": "library/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"library/HTMLPurifier.composer.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Edward Z. Yang",
|
||||||
|
"email": "admin@htmlpurifier.org",
|
||||||
|
"homepage": "http://ezyang.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Standards compliant HTML filter written in PHP",
|
||||||
|
"homepage": "http://htmlpurifier.org/",
|
||||||
|
"keywords": [
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"time": "2013-11-30 08:25:19"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "swiftmailer/swiftmailer",
|
||||||
|
"version": "v5.4.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/swiftmailer/swiftmailer.git",
|
||||||
|
"reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421",
|
||||||
|
"reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "~0.9.1,<0.9.4"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "5.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"lib/swift_required.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Chris Corbyn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Swiftmailer, free feature-rich PHP mailer",
|
||||||
|
"homepage": "http://swiftmailer.org",
|
||||||
|
"keywords": [
|
||||||
|
"email",
|
||||||
|
"mail",
|
||||||
|
"mailer"
|
||||||
|
],
|
||||||
|
"time": "2015-06-06 14:19:39"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2",
|
||||||
|
"version": "2.0.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-framework.git",
|
||||||
|
"reference": "f42b2eb80f61992438661b01d0d74c6738e2ff38"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/f42b2eb80f61992438661b01d0d74c6738e2ff38",
|
||||||
|
"reference": "f42b2eb80f61992438661b01d0d74c6738e2ff38",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/jquery": "2.1.*@stable | 1.11.*@stable",
|
||||||
|
"bower-asset/jquery.inputmask": "3.1.*",
|
||||||
|
"bower-asset/punycode": "1.3.*",
|
||||||
|
"bower-asset/yii2-pjax": ">=2.0.1",
|
||||||
|
"cebe/markdown": "~1.0.0 | ~1.1.0",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"ezyang/htmlpurifier": "4.6.*",
|
||||||
|
"lib-pcre": "*",
|
||||||
|
"php": ">=5.4.0",
|
||||||
|
"yiisoft/yii2-composer": "*"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"yii"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Qiang Xue",
|
||||||
|
"email": "qiang.xue@gmail.com",
|
||||||
|
"homepage": "http://www.yiiframework.com/",
|
||||||
|
"role": "Founder and project lead"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Alexander Makarov",
|
||||||
|
"email": "sam@rmcreative.ru",
|
||||||
|
"homepage": "http://rmcreative.ru/",
|
||||||
|
"role": "Core framework development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Maurizio Domba",
|
||||||
|
"homepage": "http://mdomba.info/",
|
||||||
|
"role": "Core framework development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Carsten Brandt",
|
||||||
|
"email": "mail@cebe.cc",
|
||||||
|
"homepage": "http://cebe.cc/",
|
||||||
|
"role": "Core framework development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Timur Ruziev",
|
||||||
|
"email": "resurtm@gmail.com",
|
||||||
|
"homepage": "http://resurtm.com/",
|
||||||
|
"role": "Core framework development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Paul Klimov",
|
||||||
|
"email": "klimov.paul@gmail.com",
|
||||||
|
"role": "Core framework development"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Yii PHP Framework Version 2",
|
||||||
|
"homepage": "http://www.yiiframework.com/",
|
||||||
|
"keywords": [
|
||||||
|
"framework",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-08-05 22:00:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-bootstrap",
|
||||||
|
"version": "2.0.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-bootstrap.git",
|
||||||
|
"reference": "1b6b1e61cf91c3cdd517d6a7e71d30bb212e4af0"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/1b6b1e61cf91c3cdd517d6a7e71d30bb212e4af0",
|
||||||
|
"reference": "1b6b1e61cf91c3cdd517d6a7e71d30bb212e4af0",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*",
|
||||||
|
"yiisoft/yii2": ">=2.0.4"
|
||||||
|
},
|
||||||
|
"type": "yii2-extension",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
},
|
||||||
|
"asset-installer-paths": {
|
||||||
|
"npm-asset-library": "vendor/npm",
|
||||||
|
"bower-asset-library": "vendor/bower"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\bootstrap\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Qiang Xue",
|
||||||
|
"email": "qiang.xue@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Twitter Bootstrap extension for the Yii framework",
|
||||||
|
"keywords": [
|
||||||
|
"bootstrap",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-05-10 22:08:17"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-composer",
|
||||||
|
"version": "2.0.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-composer.git",
|
||||||
|
"reference": "ca8d23707ae47d20b0454e4b135c156f6da6d7be"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/ca8d23707ae47d20b0454e4b135c156f6da6d7be",
|
||||||
|
"reference": "ca8d23707ae47d20b0454e4b135c156f6da6d7be",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"composer-plugin-api": "1.0.0"
|
||||||
|
},
|
||||||
|
"type": "composer-plugin",
|
||||||
|
"extra": {
|
||||||
|
"class": "yii\\composer\\Plugin",
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\composer\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Qiang Xue",
|
||||||
|
"email": "qiang.xue@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The composer plugin for Yii extension installer",
|
||||||
|
"keywords": [
|
||||||
|
"composer",
|
||||||
|
"extension installer",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-03-01 06:22:44"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-swiftmailer",
|
||||||
|
"version": "2.0.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-swiftmailer.git",
|
||||||
|
"reference": "4ec435a89e30b203cea99770910fb5499cb3627a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/4ec435a89e30b203cea99770910fb5499cb3627a",
|
||||||
|
"reference": "4ec435a89e30b203cea99770910fb5499cb3627a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"swiftmailer/swiftmailer": "~5.0",
|
||||||
|
"yiisoft/yii2": ">=2.0.4"
|
||||||
|
},
|
||||||
|
"type": "yii2-extension",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\swiftmailer\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paul Klimov",
|
||||||
|
"email": "klimov.paul@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The SwiftMailer integration for the Yii framework",
|
||||||
|
"keywords": [
|
||||||
|
"email",
|
||||||
|
"mail",
|
||||||
|
"mailer",
|
||||||
|
"swift",
|
||||||
|
"swiftmailer",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-05-10 22:12:32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packages-dev": [
|
||||||
|
{
|
||||||
|
"name": "bower-asset/typeahead.js",
|
||||||
|
"version": "v0.10.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/twitter/typeahead.js.git",
|
||||||
|
"reference": "5f198b87d1af845da502ea9df93a5e84801ce742"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/twitter/typeahead.js/zipball/5f198b87d1af845da502ea9df93a5e84801ce742",
|
||||||
|
"reference": "5f198b87d1af845da502ea9df93a5e84801ce742",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/jquery": ">=1.7"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"bower-asset/jasmine-ajax": "~1.3.1",
|
||||||
|
"bower-asset/jasmine-jquery": "~1.5.2",
|
||||||
|
"bower-asset/jquery": "~1.7"
|
||||||
|
},
|
||||||
|
"type": "bower-asset-library",
|
||||||
|
"extra": {
|
||||||
|
"bower-asset-main": "dist/typeahead.bundle.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fzaninotto/faker",
|
||||||
|
"version": "v1.5.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/fzaninotto/Faker.git",
|
||||||
|
"reference": "d0190b156bcca848d401fb80f31f504f37141c8d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d",
|
||||||
|
"reference": "d0190b156bcca848d401fb80f31f504f37141c8d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.0",
|
||||||
|
"squizlabs/php_codesniffer": "~1.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-intl": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.5.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Faker\\": "src/Faker/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "François Zaninotto"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Faker is a PHP library that generates fake data for you.",
|
||||||
|
"keywords": [
|
||||||
|
"data",
|
||||||
|
"faker",
|
||||||
|
"fixtures"
|
||||||
|
],
|
||||||
|
"time": "2015-05-29 06:29:14"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpspec/php-diff",
|
||||||
|
"version": "v1.0.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpspec/php-diff.git",
|
||||||
|
"reference": "30e103d19519fe678ae64a60d77884ef3d71b28a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a",
|
||||||
|
"reference": "30e103d19519fe678ae64a60d77884ef3d71b28a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Diff": "lib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Chris Boulton",
|
||||||
|
"homepage": "http://github.com/chrisboulton",
|
||||||
|
"role": "Original developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).",
|
||||||
|
"time": "2013-11-01 13:02:21"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-codeception",
|
||||||
|
"version": "2.0.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-codeception.git",
|
||||||
|
"reference": "de5007e7a99359597abbfe1c88dca3ce620061c5"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-codeception/zipball/de5007e7a99359597abbfe1c88dca3ce620061c5",
|
||||||
|
"reference": "de5007e7a99359597abbfe1c88dca3ce620061c5",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"yiisoft/yii2": ">=2.0.4"
|
||||||
|
},
|
||||||
|
"type": "yii2-extension",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\codeception\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mark Jebri",
|
||||||
|
"email": "mark.github@yandex.ru"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Codeception integration for the Yii framework",
|
||||||
|
"keywords": [
|
||||||
|
"codeception",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-05-10 22:08:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-debug",
|
||||||
|
"version": "2.0.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-debug.git",
|
||||||
|
"reference": "1b302e67521d46feb2413d9d96ca94ed82b39b0e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/1b302e67521d46feb2413d9d96ca94ed82b39b0e",
|
||||||
|
"reference": "1b302e67521d46feb2413d9d96ca94ed82b39b0e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"yiisoft/yii2": ">=2.0.4",
|
||||||
|
"yiisoft/yii2-bootstrap": "*"
|
||||||
|
},
|
||||||
|
"type": "yii2-extension",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\debug\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Qiang Xue",
|
||||||
|
"email": "qiang.xue@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The debugger extension for the Yii framework",
|
||||||
|
"keywords": [
|
||||||
|
"debug",
|
||||||
|
"debugger",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-08-06 16:14:06"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-faker",
|
||||||
|
"version": "2.0.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-faker.git",
|
||||||
|
"reference": "b88ca69ee226a3610b2c26c026c3203d7ac50f6c"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/b88ca69ee226a3610b2c26c026c3203d7ac50f6c",
|
||||||
|
"reference": "b88ca69ee226a3610b2c26c026c3203d7ac50f6c",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"fzaninotto/faker": "*",
|
||||||
|
"yiisoft/yii2": "*"
|
||||||
|
},
|
||||||
|
"type": "yii2-extension",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\faker\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mark Jebri",
|
||||||
|
"email": "mark.github@yandex.ru"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Fixture generator. The Faker integration for the Yii framework.",
|
||||||
|
"keywords": [
|
||||||
|
"Fixture",
|
||||||
|
"faker",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-03-01 06:22:44"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "yiisoft/yii2-gii",
|
||||||
|
"version": "2.0.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/yiisoft/yii2-gii.git",
|
||||||
|
"reference": "e5a023e8779bd774194842ec1b8fb4917cf04007"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/e5a023e8779bd774194842ec1b8fb4917cf04007",
|
||||||
|
"reference": "e5a023e8779bd774194842ec1b8fb4917cf04007",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"bower-asset/typeahead.js": "0.10.*",
|
||||||
|
"phpspec/php-diff": ">=1.0.2",
|
||||||
|
"yiisoft/yii2": ">=2.0.4",
|
||||||
|
"yiisoft/yii2-bootstrap": "~2.0"
|
||||||
|
},
|
||||||
|
"type": "yii2-extension",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
},
|
||||||
|
"asset-installer-paths": {
|
||||||
|
"npm-asset-library": "vendor/npm",
|
||||||
|
"bower-asset-library": "vendor/bower"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"yii\\gii\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Qiang Xue",
|
||||||
|
"email": "qiang.xue@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Gii extension for the Yii framework",
|
||||||
|
"keywords": [
|
||||||
|
"code generator",
|
||||||
|
"gii",
|
||||||
|
"yii2"
|
||||||
|
],
|
||||||
|
"time": "2015-05-10 22:09:31"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"stability-flags": [],
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"platform-dev": []
|
||||||
|
}
|
||||||
2
console/config/.gitignore
vendored
Normal file
2
console/config/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
main-local.php
|
||||||
|
params-local.php
|
||||||
1
console/config/bootstrap.php
Normal file
1
console/config/bootstrap.php
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?php
|
||||||
25
console/config/main.php
Normal file
25
console/config/main.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
$params = array_merge(
|
||||||
|
require(__DIR__ . '/../../common/config/params.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/params-local.php'),
|
||||||
|
require(__DIR__ . '/params.php'),
|
||||||
|
require(__DIR__ . '/params-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => 'app-console',
|
||||||
|
'basePath' => dirname(__DIR__),
|
||||||
|
'bootstrap' => ['log'],
|
||||||
|
'controllerNamespace' => 'console\controllers',
|
||||||
|
'components' => [
|
||||||
|
'log' => [
|
||||||
|
'targets' => [
|
||||||
|
[
|
||||||
|
'class' => 'yii\log\FileTarget',
|
||||||
|
'levels' => ['error', 'warning'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'params' => $params,
|
||||||
|
];
|
||||||
4
console/config/params.php
Normal file
4
console/config/params.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'adminEmail' => 'admin@example.com',
|
||||||
|
];
|
||||||
0
console/controllers/.gitkeep
Normal file
0
console/controllers/.gitkeep
Normal file
34
console/migrations/m130524_201442_init.php
Normal file
34
console/migrations/m130524_201442_init.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use yii\db\Schema;
|
||||||
|
use yii\db\Migration;
|
||||||
|
|
||||||
|
class m130524_201442_init extends Migration
|
||||||
|
{
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
$tableOptions = null;
|
||||||
|
if ($this->db->driverName === 'mysql') {
|
||||||
|
// http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
|
||||||
|
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->createTable('{{%user}}', [
|
||||||
|
'id' => $this->primaryKey(),
|
||||||
|
'username' => $this->string()->notNull()->unique(),
|
||||||
|
'auth_key' => $this->string(32)->notNull(),
|
||||||
|
'password_hash' => $this->string()->notNull(),
|
||||||
|
'password_reset_token' => $this->string()->unique(),
|
||||||
|
'email' => $this->string()->notNull()->unique(),
|
||||||
|
|
||||||
|
'status' => $this->smallInteger()->notNull()->defaultValue(10),
|
||||||
|
'created_at' => $this->integer()->notNull(),
|
||||||
|
'updated_at' => $this->integer()->notNull(),
|
||||||
|
], $tableOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
$this->dropTable('{{%user}}');
|
||||||
|
}
|
||||||
|
}
|
||||||
1
console/models/.gitkeep
Normal file
1
console/models/.gitkeep
Normal file
@ -0,0 +1 @@
|
|||||||
|
*
|
||||||
2
console/runtime/.gitignore
vendored
Normal file
2
console/runtime/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
25
environments/dev/backend/config/main-local.php
Normal file
25
environments/dev/backend/config/main-local.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$config = [
|
||||||
|
'components' => [
|
||||||
|
'request' => [
|
||||||
|
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
|
||||||
|
'cookieValidationKey' => '',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!YII_ENV_TEST) {
|
||||||
|
// configuration adjustments for 'dev' environment
|
||||||
|
$config['bootstrap'][] = 'debug';
|
||||||
|
$config['modules']['debug'] = [
|
||||||
|
'class' => 'yii\debug\Module',
|
||||||
|
];
|
||||||
|
|
||||||
|
$config['bootstrap'][] = 'gii';
|
||||||
|
$config['modules']['gii'] = [
|
||||||
|
'class' => 'yii\gii\Module',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $config;
|
||||||
3
environments/dev/backend/config/params-local.php
Normal file
3
environments/dev/backend/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
19
environments/dev/backend/web/index-test.php
Normal file
19
environments/dev/backend/web/index-test.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// NOTE: Make sure this file is not accessible when deployed to production
|
||||||
|
if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
|
||||||
|
die('You are not allowed to access this file.');
|
||||||
|
}
|
||||||
|
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'test');
|
||||||
|
|
||||||
|
require(__DIR__ . '/../../vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/../../common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/../config/bootstrap.php');
|
||||||
|
|
||||||
|
|
||||||
|
$config = require(__DIR__ . '/../../tests/codeception/config/backend/acceptance.php');
|
||||||
|
|
||||||
|
(new yii\web\Application($config))->run();
|
||||||
18
environments/dev/backend/web/index.php
Normal file
18
environments/dev/backend/web/index.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'dev');
|
||||||
|
|
||||||
|
require(__DIR__ . '/../../vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/../../common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/../config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = yii\helpers\ArrayHelper::merge(
|
||||||
|
require(__DIR__ . '/../../common/config/main.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/main-local.php'),
|
||||||
|
require(__DIR__ . '/../config/main.php'),
|
||||||
|
require(__DIR__ . '/../config/main-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
$application = new yii\web\Application($config);
|
||||||
|
$application->run();
|
||||||
20
environments/dev/common/config/main-local.php
Normal file
20
environments/dev/common/config/main-local.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'components' => [
|
||||||
|
'db' => [
|
||||||
|
'class' => 'yii\db\Connection',
|
||||||
|
'dsn' => 'mysql:host=localhost;dbname=botond_fitness',
|
||||||
|
'username' => 'root',
|
||||||
|
'password' => '',
|
||||||
|
'charset' => 'utf8',
|
||||||
|
],
|
||||||
|
'mailer' => [
|
||||||
|
'class' => 'yii\swiftmailer\Mailer',
|
||||||
|
'viewPath' => '@common/mail',
|
||||||
|
// send all mails to a file by default. You have to set
|
||||||
|
// 'useFileTransport' to false and configure a transport
|
||||||
|
// for the mailer to send real emails.
|
||||||
|
'useFileTransport' => true,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
3
environments/dev/common/config/params-local.php
Normal file
3
environments/dev/common/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
7
environments/dev/console/config/main-local.php
Normal file
7
environments/dev/console/config/main-local.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'bootstrap' => ['gii'],
|
||||||
|
'modules' => [
|
||||||
|
'gii' => 'yii\gii\Module',
|
||||||
|
],
|
||||||
|
];
|
||||||
3
environments/dev/console/config/params-local.php
Normal file
3
environments/dev/console/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
21
environments/dev/frontend/config/main-local.php
Normal file
21
environments/dev/frontend/config/main-local.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$config = [
|
||||||
|
'components' => [
|
||||||
|
'request' => [
|
||||||
|
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
|
||||||
|
'cookieValidationKey' => '',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!YII_ENV_TEST) {
|
||||||
|
// configuration adjustments for 'dev' environment
|
||||||
|
$config['bootstrap'][] = 'debug';
|
||||||
|
$config['modules']['debug'] = 'yii\debug\Module';
|
||||||
|
|
||||||
|
$config['bootstrap'][] = 'gii';
|
||||||
|
$config['modules']['gii'] = 'yii\gii\Module';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $config;
|
||||||
3
environments/dev/frontend/config/params-local.php
Normal file
3
environments/dev/frontend/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
18
environments/dev/frontend/web/index-test.php
Normal file
18
environments/dev/frontend/web/index-test.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// NOTE: Make sure this file is not accessible when deployed to production
|
||||||
|
if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
|
||||||
|
die('You are not allowed to access this file.');
|
||||||
|
}
|
||||||
|
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'test');
|
||||||
|
|
||||||
|
require(__DIR__ . '/../../vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/../../common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/../config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = require(__DIR__ . '/../../tests/codeception/config/frontend/acceptance.php');
|
||||||
|
|
||||||
|
(new yii\web\Application($config))->run();
|
||||||
18
environments/dev/frontend/web/index.php
Normal file
18
environments/dev/frontend/web/index.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'dev');
|
||||||
|
|
||||||
|
require(__DIR__ . '/../../vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/../../common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/../config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = yii\helpers\ArrayHelper::merge(
|
||||||
|
require(__DIR__ . '/../../common/config/main.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/main-local.php'),
|
||||||
|
require(__DIR__ . '/../config/main.php'),
|
||||||
|
require(__DIR__ . '/../config/main-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
$application = new yii\web\Application($config);
|
||||||
|
$application->run();
|
||||||
28
environments/dev/yii
Normal file
28
environments/dev/yii
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Yii console bootstrap file.
|
||||||
|
*
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'dev');
|
||||||
|
|
||||||
|
require(__DIR__ . '/vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/console/config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = yii\helpers\ArrayHelper::merge(
|
||||||
|
require(__DIR__ . '/common/config/main.php'),
|
||||||
|
require(__DIR__ . '/common/config/main-local.php'),
|
||||||
|
require(__DIR__ . '/console/config/main.php'),
|
||||||
|
require(__DIR__ . '/console/config/main-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
$application = new yii\console\Application($config);
|
||||||
|
$exitCode = $application->run();
|
||||||
|
exit($exitCode);
|
||||||
65
environments/index.php
Normal file
65
environments/index.php
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* The manifest of files that are local to specific environment.
|
||||||
|
* This file returns a list of environments that the application
|
||||||
|
* may be installed under. The returned data must be in the following
|
||||||
|
* format:
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* return [
|
||||||
|
* 'environment name' => [
|
||||||
|
* 'path' => 'directory storing the local files',
|
||||||
|
* 'skipFiles' => [
|
||||||
|
* // list of files that should only copied once and skipped if they already exist
|
||||||
|
* ],
|
||||||
|
* 'setWritable' => [
|
||||||
|
* // list of directories that should be set writable
|
||||||
|
* ],
|
||||||
|
* 'setExecutable' => [
|
||||||
|
* // list of files that should be set executable
|
||||||
|
* ],
|
||||||
|
* 'setCookieValidationKey' => [
|
||||||
|
* // list of config files that need to be inserted with automatically generated cookie validation keys
|
||||||
|
* ],
|
||||||
|
* 'createSymlink' => [
|
||||||
|
* // list of symlinks to be created. Keys are symlinks, and values are the targets.
|
||||||
|
* ],
|
||||||
|
* ],
|
||||||
|
* ];
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
'Development' => [
|
||||||
|
'path' => 'dev',
|
||||||
|
'setWritable' => [
|
||||||
|
'backend/runtime',
|
||||||
|
'backend/web/assets',
|
||||||
|
'frontend/runtime',
|
||||||
|
'frontend/web/assets',
|
||||||
|
],
|
||||||
|
'setExecutable' => [
|
||||||
|
'yii',
|
||||||
|
'tests/codeception/bin/yii',
|
||||||
|
],
|
||||||
|
'setCookieValidationKey' => [
|
||||||
|
'backend/config/main-local.php',
|
||||||
|
'frontend/config/main-local.php',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'Production' => [
|
||||||
|
'path' => 'prod',
|
||||||
|
'setWritable' => [
|
||||||
|
'backend/runtime',
|
||||||
|
'backend/web/assets',
|
||||||
|
'frontend/runtime',
|
||||||
|
'frontend/web/assets',
|
||||||
|
],
|
||||||
|
'setExecutable' => [
|
||||||
|
'yii',
|
||||||
|
],
|
||||||
|
'setCookieValidationKey' => [
|
||||||
|
'backend/config/main-local.php',
|
||||||
|
'frontend/config/main-local.php',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
9
environments/prod/backend/config/main-local.php
Normal file
9
environments/prod/backend/config/main-local.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'components' => [
|
||||||
|
'request' => [
|
||||||
|
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
|
||||||
|
'cookieValidationKey' => '',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
3
environments/prod/backend/config/params-local.php
Normal file
3
environments/prod/backend/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
18
environments/prod/backend/web/index.php
Normal file
18
environments/prod/backend/web/index.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', false);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'prod');
|
||||||
|
|
||||||
|
require(__DIR__ . '/../../vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/../../common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/../config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = yii\helpers\ArrayHelper::merge(
|
||||||
|
require(__DIR__ . '/../../common/config/main.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/main-local.php'),
|
||||||
|
require(__DIR__ . '/../config/main.php'),
|
||||||
|
require(__DIR__ . '/../config/main-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
$application = new yii\web\Application($config);
|
||||||
|
$application->run();
|
||||||
16
environments/prod/common/config/main-local.php
Normal file
16
environments/prod/common/config/main-local.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'components' => [
|
||||||
|
'db' => [
|
||||||
|
'class' => 'yii\db\Connection',
|
||||||
|
'dsn' => 'mysql:host=localhost;dbname=botond_fitness',
|
||||||
|
'username' => 'root',
|
||||||
|
'password' => '',
|
||||||
|
'charset' => 'utf8',
|
||||||
|
],
|
||||||
|
'mailer' => [
|
||||||
|
'class' => 'yii\swiftmailer\Mailer',
|
||||||
|
'viewPath' => '@common/mail',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
3
environments/prod/common/config/params-local.php
Normal file
3
environments/prod/common/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
3
environments/prod/console/config/main-local.php
Normal file
3
environments/prod/console/config/main-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
3
environments/prod/console/config/params-local.php
Normal file
3
environments/prod/console/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
9
environments/prod/frontend/config/main-local.php
Normal file
9
environments/prod/frontend/config/main-local.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'components' => [
|
||||||
|
'request' => [
|
||||||
|
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
|
||||||
|
'cookieValidationKey' => '',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
3
environments/prod/frontend/config/params-local.php
Normal file
3
environments/prod/frontend/config/params-local.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
];
|
||||||
18
environments/prod/frontend/web/index.php
Normal file
18
environments/prod/frontend/web/index.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', false);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'prod');
|
||||||
|
|
||||||
|
require(__DIR__ . '/../../vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/../../common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/../config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = yii\helpers\ArrayHelper::merge(
|
||||||
|
require(__DIR__ . '/../../common/config/main.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/main-local.php'),
|
||||||
|
require(__DIR__ . '/../config/main.php'),
|
||||||
|
require(__DIR__ . '/../config/main-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
$application = new yii\web\Application($config);
|
||||||
|
$application->run();
|
||||||
28
environments/prod/yii
Normal file
28
environments/prod/yii
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Yii console bootstrap file.
|
||||||
|
*
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', false);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'prod');
|
||||||
|
|
||||||
|
require(__DIR__ . '/vendor/autoload.php');
|
||||||
|
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require(__DIR__ . '/common/config/bootstrap.php');
|
||||||
|
require(__DIR__ . '/console/config/bootstrap.php');
|
||||||
|
|
||||||
|
$config = yii\helpers\ArrayHelper::merge(
|
||||||
|
require(__DIR__ . '/common/config/main.php'),
|
||||||
|
require(__DIR__ . '/common/config/main-local.php'),
|
||||||
|
require(__DIR__ . '/console/config/main.php'),
|
||||||
|
require(__DIR__ . '/console/config/main-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
$application = new yii\console\Application($config);
|
||||||
|
$exitCode = $application->run();
|
||||||
|
exit($exitCode);
|
||||||
29
frontend/assets/AppAsset.php
Normal file
29
frontend/assets/AppAsset.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace frontend\assets;
|
||||||
|
|
||||||
|
use yii\web\AssetBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class AppAsset extends AssetBundle
|
||||||
|
{
|
||||||
|
public $basePath = '@webroot';
|
||||||
|
public $baseUrl = '@web';
|
||||||
|
public $css = [
|
||||||
|
'css/site.css',
|
||||||
|
];
|
||||||
|
public $js = [
|
||||||
|
];
|
||||||
|
public $depends = [
|
||||||
|
'yii\web\YiiAsset',
|
||||||
|
'yii\bootstrap\BootstrapAsset',
|
||||||
|
];
|
||||||
|
}
|
||||||
2
frontend/config/.gitignore
vendored
Normal file
2
frontend/config/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
main-local.php
|
||||||
|
params-local.php
|
||||||
1
frontend/config/bootstrap.php
Normal file
1
frontend/config/bootstrap.php
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?php
|
||||||
33
frontend/config/main.php
Normal file
33
frontend/config/main.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
$params = array_merge(
|
||||||
|
require(__DIR__ . '/../../common/config/params.php'),
|
||||||
|
require(__DIR__ . '/../../common/config/params-local.php'),
|
||||||
|
require(__DIR__ . '/params.php'),
|
||||||
|
require(__DIR__ . '/params-local.php')
|
||||||
|
);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => 'app-frontend',
|
||||||
|
'basePath' => dirname(__DIR__),
|
||||||
|
'bootstrap' => ['log'],
|
||||||
|
'controllerNamespace' => 'frontend\controllers',
|
||||||
|
'components' => [
|
||||||
|
'user' => [
|
||||||
|
'identityClass' => 'common\models\User',
|
||||||
|
'enableAutoLogin' => true,
|
||||||
|
],
|
||||||
|
'log' => [
|
||||||
|
'traceLevel' => YII_DEBUG ? 3 : 0,
|
||||||
|
'targets' => [
|
||||||
|
[
|
||||||
|
'class' => 'yii\log\FileTarget',
|
||||||
|
'levels' => ['error', 'warning'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'errorHandler' => [
|
||||||
|
'errorAction' => 'site/error',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'params' => $params,
|
||||||
|
];
|
||||||
4
frontend/config/params.php
Normal file
4
frontend/config/params.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
return [
|
||||||
|
'adminEmail' => 'admin@example.com',
|
||||||
|
];
|
||||||
213
frontend/controllers/SiteController.php
Normal file
213
frontend/controllers/SiteController.php
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
<?php
|
||||||
|
namespace frontend\controllers;
|
||||||
|
|
||||||
|
use Yii;
|
||||||
|
use common\models\LoginForm;
|
||||||
|
use frontend\models\PasswordResetRequestForm;
|
||||||
|
use frontend\models\ResetPasswordForm;
|
||||||
|
use frontend\models\SignupForm;
|
||||||
|
use frontend\models\ContactForm;
|
||||||
|
use yii\base\InvalidParamException;
|
||||||
|
use yii\web\BadRequestHttpException;
|
||||||
|
use yii\web\Controller;
|
||||||
|
use yii\filters\VerbFilter;
|
||||||
|
use yii\filters\AccessControl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Site controller
|
||||||
|
*/
|
||||||
|
class SiteController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function behaviors()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'access' => [
|
||||||
|
'class' => AccessControl::className(),
|
||||||
|
'only' => ['logout', 'signup'],
|
||||||
|
'rules' => [
|
||||||
|
[
|
||||||
|
'actions' => ['signup'],
|
||||||
|
'allow' => true,
|
||||||
|
'roles' => ['?'],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'actions' => ['logout'],
|
||||||
|
'allow' => true,
|
||||||
|
'roles' => ['@'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'verbs' => [
|
||||||
|
'class' => VerbFilter::className(),
|
||||||
|
'actions' => [
|
||||||
|
'logout' => ['post'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function actions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'error' => [
|
||||||
|
'class' => 'yii\web\ErrorAction',
|
||||||
|
],
|
||||||
|
'captcha' => [
|
||||||
|
'class' => 'yii\captcha\CaptchaAction',
|
||||||
|
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays homepage.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionIndex()
|
||||||
|
{
|
||||||
|
return $this->render('index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs in a user.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionLogin()
|
||||||
|
{
|
||||||
|
if (!\Yii::$app->user->isGuest) {
|
||||||
|
return $this->goHome();
|
||||||
|
}
|
||||||
|
|
||||||
|
$model = new LoginForm();
|
||||||
|
if ($model->load(Yii::$app->request->post()) && $model->login()) {
|
||||||
|
return $this->goBack();
|
||||||
|
} else {
|
||||||
|
return $this->render('login', [
|
||||||
|
'model' => $model,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs out the current user.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionLogout()
|
||||||
|
{
|
||||||
|
Yii::$app->user->logout();
|
||||||
|
|
||||||
|
return $this->goHome();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays contact page.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionContact()
|
||||||
|
{
|
||||||
|
$model = new ContactForm();
|
||||||
|
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
|
||||||
|
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
|
||||||
|
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
|
||||||
|
} else {
|
||||||
|
Yii::$app->session->setFlash('error', 'There was an error sending email.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->refresh();
|
||||||
|
} else {
|
||||||
|
return $this->render('contact', [
|
||||||
|
'model' => $model,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays about page.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionAbout()
|
||||||
|
{
|
||||||
|
return $this->render('about');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signs user up.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionSignup()
|
||||||
|
{
|
||||||
|
$model = new SignupForm();
|
||||||
|
if ($model->load(Yii::$app->request->post())) {
|
||||||
|
if ($user = $model->signup()) {
|
||||||
|
if (Yii::$app->getUser()->login($user)) {
|
||||||
|
return $this->goHome();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('signup', [
|
||||||
|
'model' => $model,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests password reset.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function actionRequestPasswordReset()
|
||||||
|
{
|
||||||
|
$model = new PasswordResetRequestForm();
|
||||||
|
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
|
||||||
|
if ($model->sendEmail()) {
|
||||||
|
Yii::$app->session->setFlash('success', 'Check your email for further instructions.');
|
||||||
|
|
||||||
|
return $this->goHome();
|
||||||
|
} else {
|
||||||
|
Yii::$app->session->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('requestPasswordResetToken', [
|
||||||
|
'model' => $model,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets password.
|
||||||
|
*
|
||||||
|
* @param string $token
|
||||||
|
* @return mixed
|
||||||
|
* @throws BadRequestHttpException
|
||||||
|
*/
|
||||||
|
public function actionResetPassword($token)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$model = new ResetPasswordForm($token);
|
||||||
|
} catch (InvalidParamException $e) {
|
||||||
|
throw new BadRequestHttpException($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
|
||||||
|
Yii::$app->session->setFlash('success', 'New password was saved.');
|
||||||
|
|
||||||
|
return $this->goHome();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('resetPassword', [
|
||||||
|
'model' => $model,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
59
frontend/models/ContactForm.php
Normal file
59
frontend/models/ContactForm.php
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace frontend\models;
|
||||||
|
|
||||||
|
use Yii;
|
||||||
|
use yii\base\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ContactForm is the model behind the contact form.
|
||||||
|
*/
|
||||||
|
class ContactForm extends Model
|
||||||
|
{
|
||||||
|
public $name;
|
||||||
|
public $email;
|
||||||
|
public $subject;
|
||||||
|
public $body;
|
||||||
|
public $verifyCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// name, email, subject and body are required
|
||||||
|
[['name', 'email', 'subject', 'body'], 'required'],
|
||||||
|
// email has to be a valid email address
|
||||||
|
['email', 'email'],
|
||||||
|
// verifyCode needs to be entered correctly
|
||||||
|
['verifyCode', 'captcha'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function attributeLabels()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'verifyCode' => 'Verification Code',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an email to the specified email address using the information collected by this model.
|
||||||
|
*
|
||||||
|
* @param string $email the target email address
|
||||||
|
* @return boolean whether the email was sent
|
||||||
|
*/
|
||||||
|
public function sendEmail($email)
|
||||||
|
{
|
||||||
|
return Yii::$app->mailer->compose()
|
||||||
|
->setTo($email)
|
||||||
|
->setFrom([$this->email => $this->name])
|
||||||
|
->setSubject($this->subject)
|
||||||
|
->setTextBody($this->body)
|
||||||
|
->send();
|
||||||
|
}
|
||||||
|
}
|
||||||
60
frontend/models/PasswordResetRequestForm.php
Normal file
60
frontend/models/PasswordResetRequestForm.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
namespace frontend\models;
|
||||||
|
|
||||||
|
use common\models\User;
|
||||||
|
use yii\base\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Password reset request form
|
||||||
|
*/
|
||||||
|
class PasswordResetRequestForm extends Model
|
||||||
|
{
|
||||||
|
public $email;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['email', 'filter', 'filter' => 'trim'],
|
||||||
|
['email', 'required'],
|
||||||
|
['email', 'email'],
|
||||||
|
['email', 'exist',
|
||||||
|
'targetClass' => '\common\models\User',
|
||||||
|
'filter' => ['status' => User::STATUS_ACTIVE],
|
||||||
|
'message' => 'There is no user with such email.'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an email with a link, for resetting the password.
|
||||||
|
*
|
||||||
|
* @return boolean whether the email was send
|
||||||
|
*/
|
||||||
|
public function sendEmail()
|
||||||
|
{
|
||||||
|
/* @var $user User */
|
||||||
|
$user = User::findOne([
|
||||||
|
'status' => User::STATUS_ACTIVE,
|
||||||
|
'email' => $this->email,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($user) {
|
||||||
|
if (!User::isPasswordResetTokenValid($user->password_reset_token)) {
|
||||||
|
$user->generatePasswordResetToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user->save()) {
|
||||||
|
return \Yii::$app->mailer->compose(['html' => 'passwordResetToken-html', 'text' => 'passwordResetToken-text'], ['user' => $user])
|
||||||
|
->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot'])
|
||||||
|
->setTo($this->email)
|
||||||
|
->setSubject('Password reset for ' . \Yii::$app->name)
|
||||||
|
->send();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
65
frontend/models/ResetPasswordForm.php
Normal file
65
frontend/models/ResetPasswordForm.php
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?php
|
||||||
|
namespace frontend\models;
|
||||||
|
|
||||||
|
use common\models\User;
|
||||||
|
use yii\base\InvalidParamException;
|
||||||
|
use yii\base\Model;
|
||||||
|
use Yii;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Password reset form
|
||||||
|
*/
|
||||||
|
class ResetPasswordForm extends Model
|
||||||
|
{
|
||||||
|
public $password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \common\models\User
|
||||||
|
*/
|
||||||
|
private $_user;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a form model given a token.
|
||||||
|
*
|
||||||
|
* @param string $token
|
||||||
|
* @param array $config name-value pairs that will be used to initialize the object properties
|
||||||
|
* @throws \yii\base\InvalidParamException if token is empty or not valid
|
||||||
|
*/
|
||||||
|
public function __construct($token, $config = [])
|
||||||
|
{
|
||||||
|
if (empty($token) || !is_string($token)) {
|
||||||
|
throw new InvalidParamException('Password reset token cannot be blank.');
|
||||||
|
}
|
||||||
|
$this->_user = User::findByPasswordResetToken($token);
|
||||||
|
if (!$this->_user) {
|
||||||
|
throw new InvalidParamException('Wrong password reset token.');
|
||||||
|
}
|
||||||
|
parent::__construct($config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['password', 'required'],
|
||||||
|
['password', 'string', 'min' => 6],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets password.
|
||||||
|
*
|
||||||
|
* @return boolean if password was reset.
|
||||||
|
*/
|
||||||
|
public function resetPassword()
|
||||||
|
{
|
||||||
|
$user = $this->_user;
|
||||||
|
$user->setPassword($this->password);
|
||||||
|
$user->removePasswordResetToken();
|
||||||
|
|
||||||
|
return $user->save(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
59
frontend/models/SignupForm.php
Normal file
59
frontend/models/SignupForm.php
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
namespace frontend\models;
|
||||||
|
|
||||||
|
use common\models\User;
|
||||||
|
use yii\base\Model;
|
||||||
|
use Yii;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signup form
|
||||||
|
*/
|
||||||
|
class SignupForm extends Model
|
||||||
|
{
|
||||||
|
public $username;
|
||||||
|
public $email;
|
||||||
|
public $password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['username', 'filter', 'filter' => 'trim'],
|
||||||
|
['username', 'required'],
|
||||||
|
['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
|
||||||
|
['username', 'string', 'min' => 2, 'max' => 255],
|
||||||
|
|
||||||
|
['email', 'filter', 'filter' => 'trim'],
|
||||||
|
['email', 'required'],
|
||||||
|
['email', 'email'],
|
||||||
|
['email', 'string', 'max' => 255],
|
||||||
|
['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],
|
||||||
|
|
||||||
|
['password', 'required'],
|
||||||
|
['password', 'string', 'min' => 6],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signs user up.
|
||||||
|
*
|
||||||
|
* @return User|null the saved model or null if saving fails
|
||||||
|
*/
|
||||||
|
public function signup()
|
||||||
|
{
|
||||||
|
if ($this->validate()) {
|
||||||
|
$user = new User();
|
||||||
|
$user->username = $this->username;
|
||||||
|
$user->email = $this->email;
|
||||||
|
$user->setPassword($this->password);
|
||||||
|
$user->generateAuthKey();
|
||||||
|
if ($user->save()) {
|
||||||
|
return $user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
frontend/runtime/.gitignore
vendored
Normal file
2
frontend/runtime/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
79
frontend/views/layouts/main.php
Normal file
79
frontend/views/layouts/main.php
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this \yii\web\View */
|
||||||
|
/* @var $content string */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\Nav;
|
||||||
|
use yii\bootstrap\NavBar;
|
||||||
|
use yii\widgets\Breadcrumbs;
|
||||||
|
use frontend\assets\AppAsset;
|
||||||
|
use common\widgets\Alert;
|
||||||
|
|
||||||
|
AppAsset::register($this);
|
||||||
|
?>
|
||||||
|
<?php $this->beginPage() ?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="<?= Yii::$app->language ?>">
|
||||||
|
<head>
|
||||||
|
<meta charset="<?= Yii::$app->charset ?>">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<?= Html::csrfMetaTags() ?>
|
||||||
|
<title><?= Html::encode($this->title) ?></title>
|
||||||
|
<?php $this->head() ?>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?php $this->beginBody() ?>
|
||||||
|
|
||||||
|
<div class="wrap">
|
||||||
|
<?php
|
||||||
|
NavBar::begin([
|
||||||
|
'brandLabel' => 'My Company',
|
||||||
|
'brandUrl' => Yii::$app->homeUrl,
|
||||||
|
'options' => [
|
||||||
|
'class' => 'navbar-inverse navbar-fixed-top',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$menuItems = [
|
||||||
|
['label' => 'Home', 'url' => ['/site/index']],
|
||||||
|
['label' => 'About', 'url' => ['/site/about']],
|
||||||
|
['label' => 'Contact', 'url' => ['/site/contact']],
|
||||||
|
];
|
||||||
|
if (Yii::$app->user->isGuest) {
|
||||||
|
$menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
|
||||||
|
$menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
|
||||||
|
} else {
|
||||||
|
$menuItems[] = [
|
||||||
|
'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
|
||||||
|
'url' => ['/site/logout'],
|
||||||
|
'linkOptions' => ['data-method' => 'post']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
echo Nav::widget([
|
||||||
|
'options' => ['class' => 'navbar-nav navbar-right'],
|
||||||
|
'items' => $menuItems,
|
||||||
|
]);
|
||||||
|
NavBar::end();
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<?= Breadcrumbs::widget([
|
||||||
|
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
|
||||||
|
]) ?>
|
||||||
|
<?= Alert::widget() ?>
|
||||||
|
<?= $content ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
<p class="pull-left">© My Company <?= date('Y') ?></p>
|
||||||
|
|
||||||
|
<p class="pull-right"><?= Yii::powered() ?></p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<?php $this->endBody() ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php $this->endPage() ?>
|
||||||
16
frontend/views/site/about.php
Normal file
16
frontend/views/site/about.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
|
||||||
|
$this->title = 'About';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-about">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>This is the About page. You may modify the following file to customize its content:</p>
|
||||||
|
|
||||||
|
<code><?= __FILE__ ?></code>
|
||||||
|
</div>
|
||||||
45
frontend/views/site/contact.php
Normal file
45
frontend/views/site/contact.php
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $form yii\bootstrap\ActiveForm */
|
||||||
|
/* @var $model \frontend\models\ContactForm */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\ActiveForm;
|
||||||
|
use yii\captcha\Captcha;
|
||||||
|
|
||||||
|
$this->title = 'Contact';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-contact">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'name') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'email') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'subject') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
|
||||||
|
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
|
||||||
|
]) ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php ActiveForm::end(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
27
frontend/views/site/error.php
Normal file
27
frontend/views/site/error.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $name string */
|
||||||
|
/* @var $message string */
|
||||||
|
/* @var $exception Exception */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
|
||||||
|
$this->title = $name;
|
||||||
|
?>
|
||||||
|
<div class="site-error">
|
||||||
|
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<?= nl2br(Html::encode($message)) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The above error occurred while the Web server was processing your request.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Please contact us if you think this is a server error. Thank you.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
53
frontend/views/site/index.php
Normal file
53
frontend/views/site/index.php
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
|
||||||
|
$this->title = 'My Yii Application';
|
||||||
|
?>
|
||||||
|
<div class="site-index">
|
||||||
|
|
||||||
|
<div class="jumbotron">
|
||||||
|
<h1>Congratulations!</h1>
|
||||||
|
|
||||||
|
<p class="lead">You have successfully created your Yii-powered application.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="body-content">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h2>Heading</h2>
|
||||||
|
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
|
||||||
|
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
||||||
|
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
||||||
|
fugiat nulla pariatur.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation »</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h2>Heading</h2>
|
||||||
|
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
|
||||||
|
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
||||||
|
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
||||||
|
fugiat nulla pariatur.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum »</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h2>Heading</h2>
|
||||||
|
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
|
||||||
|
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
|
||||||
|
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
|
||||||
|
fugiat nulla pariatur.</p>
|
||||||
|
|
||||||
|
<p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions »</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
39
frontend/views/site/login.php
Normal file
39
frontend/views/site/login.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $form yii\bootstrap\ActiveForm */
|
||||||
|
/* @var $model \common\models\LoginForm */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\ActiveForm;
|
||||||
|
|
||||||
|
$this->title = 'Login';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-login">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>Please fill out the following fields to login:</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'username') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'password')->passwordInput() ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'rememberMe')->checkbox() ?>
|
||||||
|
|
||||||
|
<div style="color:#999;margin:1em 0">
|
||||||
|
If you forgot your password you can <?= Html::a('reset it', ['site/request-password-reset']) ?>.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php ActiveForm::end(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
31
frontend/views/site/requestPasswordResetToken.php
Normal file
31
frontend/views/site/requestPasswordResetToken.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $form yii\bootstrap\ActiveForm */
|
||||||
|
/* @var $model \frontend\models\PasswordResetRequestForm */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\ActiveForm;
|
||||||
|
|
||||||
|
$this->title = 'Request password reset';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-request-password-reset">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>Please fill out your email. A link to reset password will be sent there.</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<?php $form = ActiveForm::begin(['id' => 'request-password-reset-form']); ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'email') ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<?= Html::submitButton('Send', ['class' => 'btn btn-primary']) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php ActiveForm::end(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
31
frontend/views/site/resetPassword.php
Normal file
31
frontend/views/site/resetPassword.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $form yii\bootstrap\ActiveForm */
|
||||||
|
/* @var $model \frontend\models\ResetPasswordForm */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\ActiveForm;
|
||||||
|
|
||||||
|
$this->title = 'Reset password';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-reset-password">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>Please choose your new password:</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<?php $form = ActiveForm::begin(['id' => 'reset-password-form']); ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'password')->passwordInput() ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php ActiveForm::end(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
35
frontend/views/site/signup.php
Normal file
35
frontend/views/site/signup.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* @var $this yii\web\View */
|
||||||
|
/* @var $form yii\bootstrap\ActiveForm */
|
||||||
|
/* @var $model \frontend\models\SignupForm */
|
||||||
|
|
||||||
|
use yii\helpers\Html;
|
||||||
|
use yii\bootstrap\ActiveForm;
|
||||||
|
|
||||||
|
$this->title = 'Signup';
|
||||||
|
$this->params['breadcrumbs'][] = $this->title;
|
||||||
|
?>
|
||||||
|
<div class="site-signup">
|
||||||
|
<h1><?= Html::encode($this->title) ?></h1>
|
||||||
|
|
||||||
|
<p>Please fill out the following fields to signup:</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'username') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'email') ?>
|
||||||
|
|
||||||
|
<?= $form->field($model, 'password')->passwordInput() ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php ActiveForm::end(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
2
frontend/web/.gitignore
vendored
Normal file
2
frontend/web/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/index.php
|
||||||
|
/index-test.php
|
||||||
2
frontend/web/assets/.gitignore
vendored
Normal file
2
frontend/web/assets/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
91
frontend/web/css/site.css
Normal file
91
frontend/web/css/site.css
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrap {
|
||||||
|
min-height: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin: 0 auto -60px;
|
||||||
|
padding: 0 0 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrap > .container {
|
||||||
|
padding: 70px 15px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
height: 60px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jumbotron {
|
||||||
|
text-align: center;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jumbotron .btn {
|
||||||
|
font-size: 21px;
|
||||||
|
padding: 14px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.not-set {
|
||||||
|
color: #c55;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add sorting icons to gridview sort links */
|
||||||
|
a.asc:after, a.desc:after {
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
display: inline-block;
|
||||||
|
font-family: 'Glyphicons Halflings';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.asc:after {
|
||||||
|
content: /*"\e113"*/ "\e151";
|
||||||
|
}
|
||||||
|
|
||||||
|
a.desc:after {
|
||||||
|
content: /*"\e114"*/ "\e152";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-numerical a.asc:after {
|
||||||
|
content: "\e153";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-numerical a.desc:after {
|
||||||
|
content: "\e154";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-ordinal a.asc:after {
|
||||||
|
content: "\e155";
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-ordinal a.desc:after {
|
||||||
|
content: "\e156";
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-view th {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hint-block {
|
||||||
|
display: block;
|
||||||
|
margin-top: 5px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-summary {
|
||||||
|
color: #a94442;
|
||||||
|
background: #fdf7f7;
|
||||||
|
border-left: 3px solid #eed3d7;
|
||||||
|
padding: 10px 20px;
|
||||||
|
margin: 0 0 15px 0;
|
||||||
|
}
|
||||||
BIN
frontend/web/favicon.ico
Normal file
BIN
frontend/web/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 318 B |
2
frontend/web/robots.txt
Normal file
2
frontend/web/robots.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow:
|
||||||
209
init
Normal file
209
init
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Yii Application Initialization Tool
|
||||||
|
*
|
||||||
|
* In order to run in non-interactive mode:
|
||||||
|
*
|
||||||
|
* init --env=Development --overwrite=n
|
||||||
|
*
|
||||||
|
* @author Alexander Makarov <sam@rmcreative.ru>
|
||||||
|
*
|
||||||
|
* @link http://www.yiiframework.com/
|
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
* @license http://www.yiiframework.com/license/
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!extension_loaded('openssl')) {
|
||||||
|
die('The OpenSSL PHP extension is required by Yii2.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = getParams();
|
||||||
|
$root = str_replace('\\', '/', __DIR__);
|
||||||
|
$envs = require("$root/environments/index.php");
|
||||||
|
$envNames = array_keys($envs);
|
||||||
|
|
||||||
|
echo "Yii Application Initialization Tool v1.0\n\n";
|
||||||
|
|
||||||
|
$envName = null;
|
||||||
|
if (empty($params['env']) || $params['env'] === '1') {
|
||||||
|
echo "Which environment do you want the application to be initialized in?\n\n";
|
||||||
|
foreach ($envNames as $i => $name) {
|
||||||
|
echo " [$i] $name\n";
|
||||||
|
}
|
||||||
|
echo "\n Your choice [0-" . (count($envs) - 1) . ', or "q" to quit] ';
|
||||||
|
$answer = trim(fgets(STDIN));
|
||||||
|
|
||||||
|
if (!ctype_digit($answer) || !in_array($answer, range(0, count($envs) - 1))) {
|
||||||
|
echo "\n Quit initialization.\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($envNames[$answer])) {
|
||||||
|
$envName = $envNames[$answer];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$envName = $params['env'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!in_array($envName, $envNames)) {
|
||||||
|
$envsList = implode(', ', $envNames);
|
||||||
|
echo "\n $envName is not a valid environment. Try one of the following: $envsList. \n";
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$env = $envs[$envName];
|
||||||
|
|
||||||
|
if (empty($params['env'])) {
|
||||||
|
echo "\n Initialize the application under '{$envNames[$answer]}' environment? [yes|no] ";
|
||||||
|
$answer = trim(fgets(STDIN));
|
||||||
|
if (strncasecmp($answer, 'y', 1)) {
|
||||||
|
echo "\n Quit initialization.\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n Start initialization ...\n\n";
|
||||||
|
$files = getFileList("$root/environments/{$env['path']}");
|
||||||
|
if (isset($env['skipFiles'])) {
|
||||||
|
$skipFiles = $env['skipFiles'];
|
||||||
|
array_walk($skipFiles, function(&$value) use($env, $root) { $value = "$root/$value"; });
|
||||||
|
$files = array_diff($files, array_intersect_key($env['skipFiles'], array_filter($skipFiles, 'file_exists')));
|
||||||
|
}
|
||||||
|
$all = false;
|
||||||
|
foreach ($files as $file) {
|
||||||
|
if (!copyFile($root, "environments/{$env['path']}/$file", $file, $all, $params)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$callbacks = ['setCookieValidationKey', 'setWritable', 'setExecutable', 'createSymlink'];
|
||||||
|
foreach ($callbacks as $callback) {
|
||||||
|
if (!empty($env[$callback])) {
|
||||||
|
$callback($root, $env[$callback]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n ... initialization completed.\n\n";
|
||||||
|
|
||||||
|
function getFileList($root, $basePath = '')
|
||||||
|
{
|
||||||
|
$files = [];
|
||||||
|
$handle = opendir($root);
|
||||||
|
while (($path = readdir($handle)) !== false) {
|
||||||
|
if ($path === '.git' || $path === '.svn' || $path === '.' || $path === '..') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$fullPath = "$root/$path";
|
||||||
|
$relativePath = $basePath === '' ? $path : "$basePath/$path";
|
||||||
|
if (is_dir($fullPath)) {
|
||||||
|
$files = array_merge($files, getFileList($fullPath, $relativePath));
|
||||||
|
} else {
|
||||||
|
$files[] = $relativePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir($handle);
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyFile($root, $source, $target, &$all, $params)
|
||||||
|
{
|
||||||
|
if (!is_file($root . '/' . $source)) {
|
||||||
|
echo " skip $target ($source not exist)\n";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (is_file($root . '/' . $target)) {
|
||||||
|
if (file_get_contents($root . '/' . $source) === file_get_contents($root . '/' . $target)) {
|
||||||
|
echo " unchanged $target\n";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ($all) {
|
||||||
|
echo " overwrite $target\n";
|
||||||
|
} else {
|
||||||
|
echo " exist $target\n";
|
||||||
|
echo " ...overwrite? [Yes|No|All|Quit] ";
|
||||||
|
|
||||||
|
|
||||||
|
$answer = !empty($params['overwrite']) ? $params['overwrite'] : trim(fgets(STDIN));
|
||||||
|
if (!strncasecmp($answer, 'q', 1)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (!strncasecmp($answer, 'y', 1)) {
|
||||||
|
echo " overwrite $target\n";
|
||||||
|
} else {
|
||||||
|
if (!strncasecmp($answer, 'a', 1)) {
|
||||||
|
echo " overwrite $target\n";
|
||||||
|
$all = true;
|
||||||
|
} else {
|
||||||
|
echo " skip $target\n";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
echo " generate $target\n";
|
||||||
|
@mkdir(dirname($root . '/' . $target), 0777, true);
|
||||||
|
file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getParams()
|
||||||
|
{
|
||||||
|
$rawParams = [];
|
||||||
|
if (isset($_SERVER['argv'])) {
|
||||||
|
$rawParams = $_SERVER['argv'];
|
||||||
|
array_shift($rawParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [];
|
||||||
|
foreach ($rawParams as $param) {
|
||||||
|
if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) {
|
||||||
|
$name = $matches[1];
|
||||||
|
$params[$name] = isset($matches[3]) ? $matches[3] : true;
|
||||||
|
} else {
|
||||||
|
$params[] = $param;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setWritable($root, $paths)
|
||||||
|
{
|
||||||
|
foreach ($paths as $writable) {
|
||||||
|
echo " chmod 0777 $writable\n";
|
||||||
|
@chmod("$root/$writable", 0777);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setExecutable($root, $paths)
|
||||||
|
{
|
||||||
|
foreach ($paths as $executable) {
|
||||||
|
echo " chmod 0755 $executable\n";
|
||||||
|
@chmod("$root/$executable", 0755);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setCookieValidationKey($root, $paths)
|
||||||
|
{
|
||||||
|
foreach ($paths as $file) {
|
||||||
|
echo " generate cookie validation key in $file\n";
|
||||||
|
$file = $root . '/' . $file;
|
||||||
|
$length = 32;
|
||||||
|
$bytes = openssl_random_pseudo_bytes($length);
|
||||||
|
$key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.');
|
||||||
|
$content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file));
|
||||||
|
file_put_contents($file, $content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSymlink($root, $links) {
|
||||||
|
foreach ($links as $link => $target) {
|
||||||
|
echo " symlink " . $root . "/" . $target . " " . $root . "/" . $link . "\n";
|
||||||
|
//first removing folders to avoid errors if the folder already exists
|
||||||
|
@rmdir($root . "/" . $link);
|
||||||
|
@symlink($root . "/" . $target, $root . "/" . $link);
|
||||||
|
}
|
||||||
|
}
|
||||||
20
init.bat
Normal file
20
init.bat
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
rem -------------------------------------------------------------
|
||||||
|
rem Yii command line init script for Windows.
|
||||||
|
rem
|
||||||
|
rem @author Qiang Xue <qiang.xue@gmail.com>
|
||||||
|
rem @link http://www.yiiframework.com/
|
||||||
|
rem @copyright Copyright (c) 2008 Yii Software LLC
|
||||||
|
rem @license http://www.yiiframework.com/license/
|
||||||
|
rem -------------------------------------------------------------
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
set YII_PATH=%~dp0
|
||||||
|
|
||||||
|
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
|
||||||
|
|
||||||
|
"%PHP_COMMAND%" "%YII_PATH%init" %*
|
||||||
|
|
||||||
|
@endlocal
|
||||||
132
requirements.php
Normal file
132
requirements.php
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Application requirement checker script.
|
||||||
|
*
|
||||||
|
* In order to run this script use the following console command:
|
||||||
|
* php requirements.php
|
||||||
|
*
|
||||||
|
* In order to run this script from the web, you should copy it to the web root.
|
||||||
|
* If you are using Linux you can create a hard link instead, using the following command:
|
||||||
|
* ln requirements.php ../requirements.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
// you may need to adjust this path to the correct Yii framework path
|
||||||
|
$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2';
|
||||||
|
|
||||||
|
if (!is_dir($frameworkPath)) {
|
||||||
|
echo '<h1>Error</h1>';
|
||||||
|
echo '<p><strong>The path to yii framework seems to be incorrect.</strong></p>';
|
||||||
|
echo '<p>You need to install Yii framework via composer or adjust the framework path in file <abbr title="' . __FILE__ . '">' . basename(__FILE__) . '</abbr>.</p>';
|
||||||
|
echo '<p>Please refer to the <abbr title="' . dirname(__FILE__) . '/README.md">README</abbr> on how to install Yii.</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once($frameworkPath . '/requirements/YiiRequirementChecker.php');
|
||||||
|
$requirementsChecker = new YiiRequirementChecker();
|
||||||
|
|
||||||
|
$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.';
|
||||||
|
$gdOK = $imagickOK = false;
|
||||||
|
|
||||||
|
if (extension_loaded('imagick')) {
|
||||||
|
$imagick = new Imagick();
|
||||||
|
$imagickFormats = $imagick->queryFormats('PNG');
|
||||||
|
if (in_array('PNG', $imagickFormats)) {
|
||||||
|
$imagickOK = true;
|
||||||
|
} else {
|
||||||
|
$imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extension_loaded('gd')) {
|
||||||
|
$gdInfo = gd_info();
|
||||||
|
if (!empty($gdInfo['FreeType Support'])) {
|
||||||
|
$gdOK = true;
|
||||||
|
} else {
|
||||||
|
$gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust requirements according to your application specifics.
|
||||||
|
*/
|
||||||
|
$requirements = array(
|
||||||
|
// Database :
|
||||||
|
array(
|
||||||
|
'name' => 'PDO extension',
|
||||||
|
'mandatory' => true,
|
||||||
|
'condition' => extension_loaded('pdo'),
|
||||||
|
'by' => 'All DB-related classes',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'PDO SQLite extension',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => extension_loaded('pdo_sqlite'),
|
||||||
|
'by' => 'All DB-related classes',
|
||||||
|
'memo' => 'Required for SQLite database.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'PDO MySQL extension',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => extension_loaded('pdo_mysql'),
|
||||||
|
'by' => 'All DB-related classes',
|
||||||
|
'memo' => 'Required for MySQL database.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'PDO PostgreSQL extension',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => extension_loaded('pdo_pgsql'),
|
||||||
|
'by' => 'All DB-related classes',
|
||||||
|
'memo' => 'Required for PostgreSQL database.',
|
||||||
|
),
|
||||||
|
// Cache :
|
||||||
|
array(
|
||||||
|
'name' => 'Memcache extension',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => extension_loaded('memcache') || extension_loaded('memcached'),
|
||||||
|
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html">MemCache</a>',
|
||||||
|
'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>.' : ''
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'APC extension',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => extension_loaded('apc'),
|
||||||
|
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
|
||||||
|
),
|
||||||
|
// CAPTCHA:
|
||||||
|
array(
|
||||||
|
'name' => 'GD PHP extension with FreeType support',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => $gdOK,
|
||||||
|
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
|
||||||
|
'memo' => $gdMemo,
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'ImageMagick PHP extension with PNG support',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => $imagickOK,
|
||||||
|
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
|
||||||
|
'memo' => $imagickMemo,
|
||||||
|
),
|
||||||
|
// PHP ini :
|
||||||
|
'phpExposePhp' => array(
|
||||||
|
'name' => 'Expose PHP',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => $requirementsChecker->checkPhpIniOff("expose_php"),
|
||||||
|
'by' => 'Security reasons',
|
||||||
|
'memo' => '"expose_php" should be disabled at php.ini',
|
||||||
|
),
|
||||||
|
'phpAllowUrlInclude' => array(
|
||||||
|
'name' => 'PHP allow url include',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"),
|
||||||
|
'by' => 'Security reasons',
|
||||||
|
'memo' => '"allow_url_include" should be disabled at php.ini',
|
||||||
|
),
|
||||||
|
'phpSmtp' => array(
|
||||||
|
'name' => 'PHP mail SMTP',
|
||||||
|
'mandatory' => false,
|
||||||
|
'condition' => strlen(ini_get('SMTP')) > 0,
|
||||||
|
'by' => 'Email sending',
|
||||||
|
'memo' => 'PHP mail SMTP server required',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
$requirementsChecker->checkYii()->check($requirements)->render();
|
||||||
58
tests/README.md
Normal file
58
tests/README.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
This directory contains various tests for the advanced applications.
|
||||||
|
|
||||||
|
Tests in `codeception` directory are developed with [Codeception PHP Testing Framework](http://codeception.com/).
|
||||||
|
|
||||||
|
After creating and setting up the advanced application, follow these steps to prepare for the tests:
|
||||||
|
|
||||||
|
1. Install Codeception if it's not yet installed:
|
||||||
|
|
||||||
|
```
|
||||||
|
composer global require "codeception/codeception=2.0.*" "codeception/specify=*" "codeception/verify=*"
|
||||||
|
```
|
||||||
|
|
||||||
|
If you've never used Composer for global packages run `composer global status`. It should output:
|
||||||
|
|
||||||
|
```
|
||||||
|
Changed current directory to <directory>
|
||||||
|
```
|
||||||
|
|
||||||
|
Then add `<directory>/vendor/bin` to you `PATH` environment variable. Now you're able to use `codecept` from command
|
||||||
|
line globally.
|
||||||
|
|
||||||
|
2. Install faker extension by running the following from template root directory where `composer.json` is:
|
||||||
|
|
||||||
|
```
|
||||||
|
composer require --dev yiisoft/yii2-faker:*
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create `yii2_advanced_tests` database then update it by applying migrations:
|
||||||
|
|
||||||
|
```
|
||||||
|
codeception/bin/yii migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
4. In order to be able to run acceptance tests you need to start a webserver. The simplest way is to use PHP built in
|
||||||
|
webserver. In the root directory where `common`, `frontend` etc. are execute the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
php -S localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Now you can run the tests with the following commands, assuming you are in the `tests/codeception` directory:
|
||||||
|
|
||||||
|
```
|
||||||
|
# frontend tests
|
||||||
|
cd frontend
|
||||||
|
codecept build
|
||||||
|
codecept run
|
||||||
|
|
||||||
|
# backend tests
|
||||||
|
|
||||||
|
cd backend
|
||||||
|
codecept build
|
||||||
|
codecept run
|
||||||
|
|
||||||
|
# etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
If you already have run `codecept build` for each application, you can skip that step and run all tests by a single `codecept run`.
|
||||||
11
tests/codeception.yml
Normal file
11
tests/codeception.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
include:
|
||||||
|
- codeception/common
|
||||||
|
- codeception/console
|
||||||
|
- codeception/backend
|
||||||
|
- codeception/frontend
|
||||||
|
|
||||||
|
paths:
|
||||||
|
log: codeception/_output
|
||||||
|
|
||||||
|
settings:
|
||||||
|
colors: true
|
||||||
2
tests/codeception/_output/.gitignore
vendored
Normal file
2
tests/codeception/_output/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
4
tests/codeception/backend/.gitignore
vendored
Normal file
4
tests/codeception/backend/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# these files are auto generated by codeception build
|
||||||
|
/unit/UnitTester.php
|
||||||
|
/functional/FunctionalTester.php
|
||||||
|
/acceptance/AcceptanceTester.php
|
||||||
23
tests/codeception/backend/_bootstrap.php
Normal file
23
tests/codeception/backend/_bootstrap.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||||
|
defined('YII_ENV') or define('YII_ENV', 'test');
|
||||||
|
|
||||||
|
defined('YII_APP_BASE_PATH') or define('YII_APP_BASE_PATH', dirname(dirname(dirname(__DIR__))));
|
||||||
|
|
||||||
|
defined('YII_BACKEND_TEST_ENTRY_URL') or define('YII_BACKEND_TEST_ENTRY_URL', parse_url(\Codeception\Configuration::config()['config']['test_entry_url'], PHP_URL_PATH));
|
||||||
|
defined('YII_TEST_BACKEND_ENTRY_FILE') or define('YII_TEST_BACKEND_ENTRY_FILE', YII_APP_BASE_PATH . '/backend/web/index-test.php');
|
||||||
|
|
||||||
|
require_once(YII_APP_BASE_PATH . '/vendor/autoload.php');
|
||||||
|
require_once(YII_APP_BASE_PATH . '/vendor/yiisoft/yii2/Yii.php');
|
||||||
|
require_once(YII_APP_BASE_PATH . '/common/config/bootstrap.php');
|
||||||
|
require_once(YII_APP_BASE_PATH . '/backend/config/bootstrap.php');
|
||||||
|
|
||||||
|
// set correct script paths
|
||||||
|
|
||||||
|
// the entry script file path for functional and acceptance tests
|
||||||
|
$_SERVER['SCRIPT_FILENAME'] = YII_TEST_BACKEND_ENTRY_FILE;
|
||||||
|
$_SERVER['SCRIPT_NAME'] = YII_BACKEND_TEST_ENTRY_URL;
|
||||||
|
$_SERVER['SERVER_NAME'] = parse_url(\Codeception\Configuration::config()['config']['test_entry_url'], PHP_URL_HOST);
|
||||||
|
$_SERVER['SERVER_PORT'] = parse_url(\Codeception\Configuration::config()['config']['test_entry_url'], PHP_URL_PORT) ?: '80';
|
||||||
|
|
||||||
|
Yii::setAlias('@tests', dirname(dirname(__DIR__)));
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user