Browse Source

Merge branch 'master' into redis

* master: (806 commits)
  avoid confusing docs about autoload return value
  doc fix.
  Fixed doc.
  Fixed autoloader behavior according to leading \
  Fix in RequestPanel
  changed to trace from info.
  Removed yii\debug\Module::enabled.
  minor enhancement of debugger.
  Refactored the basic app.
  Added ErrorAction.
  Use `hasAttribute()` instead to avoid code duplication
  refactored NavBar and basic app navbar.
  test break fix.
  test break fix.
  Fixed test breaks.
  #735: removed hiddenInput to avoid confusion.
  ResizableAsset typo fix!
  Update radio and checkbox due to e3801fbf6b
  css fix.
  Fixed the basic app template.
  ...

Conflicts:
	.travis.yml
	tests/unit/data/config.php
tags/2.0.0-beta
Carsten Brandt 11 years ago
parent
commit
133e5c6e35
  1. 4
      .coveralls.yml
  2. 23
      .gitattributes
  3. 14
      .travis.yml
  4. 13
      README.md
  5. 2
      apps/advanced/.gitignore
  6. 0
      apps/advanced/LICENSE.md
  7. 114
      apps/advanced/README.md
  8. 0
      apps/advanced/backend/assets/.gitkeep
  9. 2
      apps/advanced/backend/config/.gitignore
  10. 28
      apps/advanced/backend/config/AppAsset.php
  11. 36
      apps/advanced/backend/config/main.php
  12. 0
      apps/advanced/backend/config/params.php
  13. 33
      apps/advanced/backend/controllers/SiteController.php
  14. 0
      apps/advanced/backend/models/.gitkeep
  15. 2
      apps/advanced/backend/runtime/.gitignore
  16. 9
      apps/advanced/backend/views/layouts/main.php
  17. 0
      apps/advanced/backend/views/site/index.php
  18. 2
      apps/advanced/backend/views/site/login.php
  19. 1
      apps/advanced/backend/web/.gitignore
  20. 2
      apps/advanced/backend/web/assets/.gitignore
  21. 12
      apps/advanced/backend/web/css/site.css
  22. 1
      apps/advanced/common/config/.gitignore
  23. 22
      apps/advanced/common/config/params.php
  24. 58
      apps/advanced/common/models/LoginForm.php
  25. 145
      apps/advanced/common/models/User.php
  26. 38
      apps/advanced/composer.json
  27. 2
      apps/advanced/console/config/.gitignore
  28. 31
      apps/advanced/console/config/main.php
  29. 5
      apps/advanced/console/config/params.php
  30. 0
      apps/advanced/console/controllers/.gitkeep
  31. 31
      apps/advanced/console/migrations/m130524_201442_init.php
  32. 0
      apps/advanced/console/models/.gitkeep
  33. 2
      apps/advanced/console/runtime/.gitignore
  34. 17
      apps/advanced/environments/dev/backend/config/main-local.php
  35. 3
      apps/advanced/environments/dev/backend/config/params-local.php
  36. 14
      apps/advanced/environments/dev/backend/web/index.php
  37. 3
      apps/advanced/environments/dev/common/config/params-local.php
  38. 3
      apps/advanced/environments/dev/console/config/main-local.php
  39. 3
      apps/advanced/environments/dev/console/config/params-local.php
  40. 17
      apps/advanced/environments/dev/frontend/config/main-local.php
  41. 3
      apps/advanced/environments/dev/frontend/config/params-local.php
  42. 16
      apps/advanced/environments/dev/frontend/web/index.php
  43. 26
      apps/advanced/environments/dev/yii
  44. 38
      apps/advanced/environments/index.php
  45. 3
      apps/advanced/environments/prod/backend/config/main-local.php
  46. 3
      apps/advanced/environments/prod/backend/config/params-local.php
  47. 14
      apps/advanced/environments/prod/backend/web/index.php
  48. 3
      apps/advanced/environments/prod/common/config/params-local.php
  49. 3
      apps/advanced/environments/prod/console/config/main-local.php
  50. 3
      apps/advanced/environments/prod/console/config/params-local.php
  51. 3
      apps/advanced/environments/prod/frontend/config/main-local.php
  52. 3
      apps/advanced/environments/prod/frontend/config/params-local.php
  53. 16
      apps/advanced/environments/prod/frontend/web/index.php
  54. 26
      apps/advanced/environments/prod/yii
  55. 2
      apps/advanced/frontend/assets/.gitkeep
  56. 2
      apps/advanced/frontend/config/.gitignore
  57. 28
      apps/advanced/frontend/config/AppAsset.php
  58. 35
      apps/advanced/frontend/config/main.php
  59. 5
      apps/advanced/frontend/config/params.php
  60. 146
      apps/advanced/frontend/controllers/SiteController.php
  61. 63
      apps/advanced/frontend/models/ContactForm.php
  62. 2
      apps/advanced/frontend/runtime/.gitignore
  63. 16
      apps/advanced/frontend/views/emails/passwordResetToken.php
  64. 76
      apps/advanced/frontend/views/layouts/main.php
  65. 0
      apps/advanced/frontend/views/site/about.php
  66. 22
      apps/advanced/frontend/views/site/contact.php
  67. 47
      apps/advanced/frontend/views/site/index.php
  68. 26
      apps/advanced/frontend/views/site/login.php
  69. 22
      apps/advanced/frontend/views/site/requestPasswordResetToken.php
  70. 22
      apps/advanced/frontend/views/site/resetPassword.php
  71. 24
      apps/advanced/frontend/views/site/signup.php
  72. 1
      apps/advanced/frontend/web/.gitignore
  73. 2
      apps/advanced/frontend/web/assets/.gitignore
  74. 78
      apps/advanced/frontend/web/css/site.css
  75. 48
      apps/advanced/frontend/widgets/Alert.php
  76. 112
      apps/advanced/init
  77. 20
      apps/advanced/init.bat
  78. 9
      apps/advanced/requirements.php
  79. 2
      apps/advanced/vendor/.gitignore
  80. 0
      apps/advanced/yii.bat
  81. 1
      apps/basic/.gitignore
  82. 32
      apps/basic/LICENSE.md
  83. 34
      apps/basic/README.md
  84. 18
      apps/basic/codeception.yml
  85. 11
      apps/basic/commands/HelloController.php
  86. 17
      apps/basic/composer.json
  87. 29
      apps/basic/config/AppAsset.php
  88. 7
      apps/basic/config/console.php
  89. 5
      apps/basic/config/params.php
  90. 7
      apps/basic/config/web-test.php
  91. 35
      apps/basic/config/web.php
  92. 26
      apps/basic/controllers/SiteController.php
  93. 0
      apps/basic/models/ContactForm.php
  94. 0
      apps/basic/models/LoginForm.php
  95. 0
      apps/basic/models/User.php
  96. 103
      apps/basic/requirements.php
  97. 2
      apps/basic/runtime/.gitignore
  98. 1
      apps/basic/tests/_data/dump.sql
  99. 8
      apps/basic/tests/_helpers/CodeHelper.php
  100. 8
      apps/basic/tests/_helpers/TestHelper.php
  101. Some files were not shown because too many files have changed in this diff Show More

4
.coveralls.yml

@ -0,0 +1,4 @@
service_name: travis-ci
src_dir: framework/yii
coverage_clover: tests/unit/runtime/coveralls/clover.xml
json_path: tests/unit/runtime/coveralls/coveralls-upload.json

23
.gitattributes vendored

@ -0,0 +1,23 @@
# Autodetect text files
* text=auto
# ...Unless the name matches the following overriding patterns
# Definitively text files
*.php text
*.css text
*.js text
*.txt text
*.md text
*.xml text
*.json text
*.bat text
*.sql text
*.xml text
*.yml text
# Ensure those won't be messed up with
*.png binary
*.jpg binary
*.gif binary
*.ttf binary

14
.travis.yml

@ -8,10 +8,14 @@ php:
services:
- redis-server
env:
- DB=mysql
before_script:
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS yiitest;'; fi"
- composer self-update && composer --version
- composer require satooshi/php-coveralls 0.6.*
- mysql -e 'CREATE DATABASE yiitest;';
- psql -U postgres -c 'CREATE DATABASE yiitest;';
script:
- phpunit --coverage-clover tests/unit/runtime/coveralls/clover.xml
script: phpunit
after_script:
- php vendor/bin/coveralls

13
README.md

@ -9,17 +9,24 @@ If you are looking for a production-ready PHP framework, please use
Yii 2.0 is still under heavy development. We may make significant changes
without prior notices. **Yii 2.0 is not ready for production use yet.**
[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2)
[![Latest Stable Version](https://poser.pugx.org/yiisoft/yii2/v/stable.png)](https://packagist.org/packages/yiisoft/yii2)
[![Total Downloads](https://poser.pugx.org/yiisoft/yii2/downloads.png)](https://packagist.org/packages/yiisoft/yii2)
[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2)
[![Dependency Status](https://www.versioneye.com/php/yiisoft:yii2/dev-master/badge.png)](https://www.versioneye.com/php/yiisoft:yii2/dev-master)
DIRECTORY STRUCTURE
-------------------
apps/ ready-to-use Web apps built on Yii 2
bootstrap/ a simple app supporting user login and contact page
advanced/ advanced app template with complex features
basic/ a simple app supporting user login and contact page
benchmark/ app demonstrating the minimal overhead introduced by the framework
build/ internally used build tools
docs/ documentation
yii/ framework source files
extensions/ extensions
framework/ framework files
yii/ framework source files
tests/ tests of the core framework code

2
apps/advanced/.gitignore vendored

@ -0,0 +1,2 @@
/yii
/composer.lock

0
apps/bootstrap/LICENSE.md → apps/advanced/LICENSE.md

114
apps/advanced/README.md

@ -0,0 +1,114 @@
Yii 2 Advanced Application Template
===================================
**NOTE** Yii 2 and the relevant applications and extensions are still under heavy
development. We may make significant changes without prior notices. Please do not
use them for production. Please consider using [Yii v1.1](https://github.com/yiisoft/yii)
if you have a project to be deployed for production soon.
Thank you for using Yii 2 Advanced Application Template - an application template
that works out-of-box and can be easily customized to fit for your needs.
Yii 2 Advanced Application Template is best suitable for large projects requiring frontend and backend separation,
deployment in different environments, configuration nesting etc.
DIRECTORY STRUCTURE
-------------------
```
common
config/ contains shared configurations
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
vendor/ contains dependent 3rd-party packages
environments/ contains environment-based overrides
```
REQUIREMENTS
------------
The minimum requirement by Yii is that your Web server supports PHP 5.3.?.
In order for captcha to work you need either GD2 extension or ImageMagick PHP extension.
INSTALLATION
------------
### Install via Composer
If you do not have [Composer](http://getcomposer.org/), you may download it from
[http://getcomposer.org/](http://getcomposer.org/) or run the following command on Linux/Unix/MacOS:
~~~
curl -s http://getcomposer.org/installer | php
~~~
You can then install the application using the following command:
~~~
php composer.phar create-project --stability=dev yiisoft/yii2-app-advanced yii-advanced
~~~
### Install from an Archive File
This is not currently available. We will provide it when Yii 2 is formally released.
### Install from development repository
If you've cloned the [Yii 2 framework main development repository](https://github.com/yiisoft/yii2) you
can bootstrap your application with:
~~~
cd yii2/apps/advanced
php composer.phar create-project
~~~
*Note: If the above command fails with `[RuntimeException] Not enough arguments.` run
`php composer.phar self-update` to obtain an updated version of composer which supports creating projects
from local packages.*
GETTING STARTED
---------------
After you install the application, you have to conduct the following steps to initialize
the installed application. You only need to do these once for all.
1. Execute the `init` command and select `dev` as environment.
2. Create a new database. It is assumed that MySQL InnoDB is used. If not, adjust `console/migrations/m130524_201442_init.php`.
3. In `common/config/params.php` set your database details in `components.db` values.
Now you should be able to access:
- the frontend using the URL `http://localhost/yii-advanced/frontend/web/`
- the backend using the URL `http://localhost/yii-advanced/backend/web/`
assuming `yii-advanced` is directly under the document root of your Web server.

0
apps/bootstrap/assets/.gitignore → apps/advanced/backend/assets/.gitkeep

2
apps/advanced/backend/config/.gitignore vendored

@ -0,0 +1,2 @@
main-local.php
params-local.php

28
apps/advanced/backend/config/AppAsset.php

@ -0,0 +1,28 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace backend\config;
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 = array(
'css/site.css',
);
public $js = array(
);
public $depends = array(
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
);
}

36
apps/advanced/backend/config/main.php

@ -0,0 +1,36 @@
<?php
$rootDir = __DIR__ . '/../..';
$params = array_merge(
require($rootDir . '/common/config/params.php'),
require($rootDir . '/common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return array(
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'preload' => array('log'),
'controllerNamespace' => 'backend\controllers',
'modules' => array(
),
'components' => array(
'db' => $params['components.db'],
'cache' => $params['components.cache'],
'user' => array(
'class' => 'yii\web\User',
'identityClass' => 'common\models\User',
),
'log' => array(
'targets' => array(
array(
'class' => 'yii\log\FileTarget',
'levels' => array('error', 'warning'),
),
),
),
),
'params' => $params,
);

0
apps/bootstrap/config/params.php → apps/advanced/backend/config/params.php

33
apps/advanced/backend/controllers/SiteController.php

@ -0,0 +1,33 @@
<?php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use common\models\LoginForm;
class SiteController extends Controller
{
public function actionIndex()
{
return $this->render('index');
}
public function actionLogin()
{
$model = new LoginForm();
if ($model->load($_POST) && $model->login()) {
return $this->redirect(array('site/index'));
} else {
return $this->render('login', array(
'model' => $model,
));
}
}
public function actionLogout()
{
Yii::$app->user->logout();
return $this->redirect(array('site/index'));
}
}

0
apps/bootstrap/runtime/.gitignore → apps/advanced/backend/models/.gitkeep

2
apps/advanced/backend/runtime/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

9
apps/bootstrap/views/layouts/main.php → apps/advanced/backend/views/layouts/main.php

@ -1,14 +1,14 @@
<?php
use backend\config\AppAsset;
use yii\helpers\Html;
use yii\widgets\Menu;
use yii\widgets\Breadcrumbs;
use yii\debug\Toolbar;
/**
* @var $this \yii\base\View
* @var $content string
*/
$this->registerAssetBundle('app');
AppAsset::register($this);
?>
<?php $this->beginPage(); ?>
<!DOCTYPE html>
@ -24,15 +24,13 @@ $this->registerAssetBundle('app');
<div class="masthead">
<h3 class="muted">My Company</h3>
<div class="navbar">
<div class="navbar fullwidth">
<div class="navbar-inner">
<div class="container">
<?php echo Menu::widget(array(
'options' => array('class' => 'nav'),
'items' => array(
array('label' => 'Home', 'url' => array('/site/index')),
array('label' => 'About', 'url' => array('/site/about')),
array('label' => 'Contact', 'url' => array('/site/contact')),
Yii::$app->user->isGuest ?
array('label' => 'Login', 'url' => array('/site/login')) :
array('label' => 'Logout (' . Yii::$app->user->identity->username .')' , 'url' => array('/site/logout')),
@ -60,7 +58,6 @@ $this->registerAssetBundle('app');
</div>
<?php $this->endBody(); ?>
</div>
<?php echo Toolbar::widget(); ?>
</body>
</html>
<?php $this->endPage(); ?>

0
apps/bootstrap/views/site/index.php → apps/advanced/backend/views/site/index.php

2
apps/bootstrap/views/site/login.php → apps/advanced/backend/views/site/login.php

@ -19,6 +19,6 @@ $this->params['breadcrumbs'][] = $this->title;
<?php echo $form->field($model, 'password')->passwordInput(); ?>
<?php echo $form->field($model, 'rememberMe')->checkbox(); ?>
<div class="form-actions">
<?php echo Html::submitButton('Login', null, null, array('class' => 'btn btn-primary')); ?>
<?php echo Html::submitButton('Login', array('class' => 'btn btn-primary')); ?>
</div>
<?php ActiveForm::end(); ?>

1
apps/advanced/backend/web/.gitignore vendored

@ -0,0 +1 @@
/index.php

2
apps/advanced/backend/web/assets/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

12
apps/bootstrap/www/css/site.css → apps/advanced/backend/web/css/site.css

@ -44,35 +44,35 @@ body {
}
/* Customize the navbar links to be fill the entire space of the .navbar */
.navbar .navbar-inner {
.navbar.fullwidth .navbar-inner {
padding: 0;
}
.navbar .nav {
.navbar.fullwidth .nav {
margin: 0;
display: table;
width: 100%;
}
.navbar .nav li {
.navbar.fullwidth .nav li {
display: table-cell;
width: 1%;
float: none;
}
.navbar .nav li a {
.navbar.fullwidth .nav li a {
font-weight: bold;
text-align: center;
border-left: 1px solid rgba(255, 255, 255, .75);
border-right: 1px solid rgba(0, 0, 0, .1);
}
.navbar .nav li:first-child a {
.navbar.fullwidth .nav li:first-child a {
border-left: 0;
border-radius: 3px 0 0 3px;
}
.navbar .nav li:last-child a {
.navbar.fullwidth .nav li:last-child a {
border-right: 0;
border-radius: 0 3px 3px 0;
}

1
apps/advanced/common/config/.gitignore vendored

@ -0,0 +1 @@
params-local.php

22
apps/advanced/common/config/params.php

@ -0,0 +1,22 @@
<?php
Yii::setAlias('common', __DIR__ . '/../');
Yii::setAlias('frontend', __DIR__ . '/../../frontend');
Yii::setAlias('backend', __DIR__ . '/../../backend');
return array(
'adminEmail' => 'admin@example.com',
'supportEmail' => 'support@example.com',
'components.cache' => array(
'class' => 'yii\caching\FileCache',
),
'components.db' => array(
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
),
);

58
apps/advanced/common/models/LoginForm.php

@ -0,0 +1,58 @@
<?php
namespace common\models;
use Yii;
use yii\base\Model;
/**
* LoginForm is the model behind the login form.
*/
class LoginForm extends Model
{
public $username;
public $password;
public $rememberMe = true;
/**
* @return array the validation rules.
*/
public function rules()
{
return array(
// username and password are both required
array('username, password', 'required'),
// password is validated by validatePassword()
array('password', 'validatePassword'),
// rememberMe must be a boolean value
array('rememberMe', 'boolean'),
);
}
/**
* Validates the password.
* This method serves as the inline validation for password.
*/
public function validatePassword()
{
$user = User::findByUsername($this->username);
if (!$user || !$user->validatePassword($this->password)) {
$this->addError('password', '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()) {
$user = User::findByUsername($this->username);
Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);
return true;
} else {
return false;
}
}
}

145
apps/advanced/common/models/User.php

@ -0,0 +1,145 @@
<?php
namespace common\models;
use yii\db\ActiveRecord;
use yii\helpers\Security;
use yii\web\Identity;
/**
* Class User
* @package common\models
*
* @property integer $id
* @property string $username
* @property string $password_hash
* @property string $password_reset_token
* @property string $email
* @property string $auth_key
* @property integer $role
* @property integer $status
* @property integer $create_time
* @property integer $update_time
*/
class User extends ActiveRecord implements Identity
{
/**
* @var string the raw password. Used to collect password input and isn't saved in database
*/
public $password;
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
const ROLE_USER = 10;
public function behaviors()
{
return array(
'timestamp' => array(
'class' => 'yii\behaviors\AutoTimestamp',
'attributes' => array(
ActiveRecord::EVENT_BEFORE_INSERT => array('create_time', 'update_time'),
ActiveRecord::EVENT_BEFORE_UPDATE => 'update_time',
),
),
);
}
/**
* Finds an identity by the given ID.
*
* @param string|integer $id the ID to be looked for
* @return Identity|null the identity object that matches the given ID.
*/
public static function findIdentity($id)
{
return static::find($id);
}
/**
* Finds user by username
*
* @param string $username
* @return null|User
*/
public static function findByUsername($username)
{
return static::find(array('username' => $username, 'status' => static::STATUS_ACTIVE));
}
/**
* @return int|string current user ID
*/
public function getId()
{
return $this->id;
}
/**
* @return string current user auth key
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @param string $authKey
* @return boolean if auth key is valid for current user
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
/**
* @param string $password password to validate
* @return bool if password provided is valid for current user
*/
public function validatePassword($password)
{
return Security::validatePassword($password, $this->password_hash);
}
public function rules()
{
return array(
array('username', 'filter', 'filter' => 'trim'),
array('username', 'required'),
array('username', 'string', 'min' => 2, 'max' => 255),
array('email', 'filter', 'filter' => 'trim'),
array('email', 'required'),
array('email', 'email'),
array('email', 'unique', 'message' => 'This email address has already been taken.', 'on' => 'signup'),
array('email', 'exist', 'message' => 'There is no user with such email.', 'on' => 'requestPasswordResetToken'),
array('password', 'required'),
array('password', 'string', 'min' => 6),
);
}
public function scenarios()
{
return array(
'signup' => array('username', 'email', 'password'),
'login' => array('username', 'password'),
'resetPassword' => array('password'),
'requestPasswordResetToken' => array('email'),
);
}
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if (($this->isNewRecord || $this->getScenario() === 'resetPassword') && !empty($this->password)) {
$this->password_hash = Security::generatePasswordHash($this->password);
}
if ($this->isNewRecord) {
$this->auth_key = Security::generateRandomKey();
}
return true;
}
return false;
}
}

38
apps/advanced/composer.json

@ -0,0 +1,38 @@
{
"name": "yiisoft/yii2-app-advanced",
"description": "Yii 2 Advanced Application Template",
"keywords": ["yii", "framework", "advanced", "application template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "dev",
"require": {
"php": ">=5.3.0",
"yiisoft/yii2": "dev-master",
"yiisoft/yii2-composer": "dev-master"
},
"scripts": {
"post-create-project-cmd": [
"yii\\composer\\InstallHandler::setPermissions"
]
},
"extra": {
"yii-install-writable": [
"backend/runtime",
"backend/web/assets",
"console/runtime",
"console/migrations",
"frontend/runtime",
"frontend/web/assets"
]
}
}

2
apps/advanced/console/config/.gitignore vendored

@ -0,0 +1,2 @@
main-local.php
params-local.php

31
apps/advanced/console/config/main.php

@ -0,0 +1,31 @@
<?php
$rootDir = __DIR__ . '/../..';
$params = array_merge(
require($rootDir . '/common/config/params.php'),
require($rootDir . '/common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return array(
'id' => 'app-console',
'basePath' => dirname(__DIR__),
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'controllerNamespace' => 'console\controllers',
'modules' => array(
),
'components' => array(
'db' => $params['components.db'],
'cache' => $params['components.cache'],
'log' => array(
'targets' => array(
array(
'class' => 'yii\log\FileTarget',
'levels' => array('error', 'warning'),
),
),
),
),
'params' => $params,
);

5
apps/advanced/console/config/params.php

@ -0,0 +1,5 @@
<?php
return array(
'adminEmail' => 'admin@example.com',
);

0
docs/guide/dao.md → apps/advanced/console/controllers/.gitkeep

31
apps/advanced/console/migrations/m130524_201442_init.php

@ -0,0 +1,31 @@
<?php
use yii\db\Schema;
class m130524_201442_init extends \yii\db\Migration
{
public function up()
{
// MySQL-specific table options. Adjust if you plan working with another DBMS
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB';
$this->createTable('tbl_user', array(
'id' => Schema::TYPE_PK,
'username' => Schema::TYPE_STRING.' NOT NULL',
'auth_key' => Schema::TYPE_STRING.'(32) NOT NULL',
'password_hash' => Schema::TYPE_STRING.' NOT NULL',
'password_reset_token' => Schema::TYPE_STRING.'(32)',
'email' => Schema::TYPE_STRING.' NOT NULL',
'role' => 'tinyint NOT NULL DEFAULT 10',
'status' => 'tinyint NOT NULL DEFAULT 10',
'create_time' => Schema::TYPE_INTEGER.' NOT NULL',
'update_time' => Schema::TYPE_INTEGER.' NOT NULL',
), $tableOptions);
}
public function down()
{
$this->dropTable('tbl_user');
}
}

0
apps/bootstrap/vendor/.gitignore → apps/advanced/console/models/.gitkeep

2
apps/advanced/console/runtime/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

17
apps/advanced/environments/dev/backend/config/main-local.php

@ -0,0 +1,17 @@
<?php
return array(
'modules' => array(
// 'debug' => array(
// 'class' => 'yii\debug\Module',
// ),
),
'components' => array(
'log' => array(
'targets' => array(
// array(
// 'class' => 'yii\log\DebugTarget',
// )
),
),
),
);

3
apps/advanced/environments/dev/backend/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

14
apps/advanced/environments/dev/backend/web/index.php

@ -0,0 +1,14 @@
<?php
// comment out the following line to disable debug mode
defined('YII_DEBUG') or define('YII_DEBUG', true);
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/../../vendor/autoload.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();

3
apps/advanced/environments/dev/common/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/dev/console/config/main-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/dev/console/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

17
apps/advanced/environments/dev/frontend/config/main-local.php

@ -0,0 +1,17 @@
<?php
return array(
'modules' => array(
// 'debug' => array(
// 'class' => 'yii\debug\Module',
// ),
),
'components' => array(
'log' => array(
'targets' => array(
// array(
// 'class' => 'yii\log\DebugTarget',
// )
),
),
),
);

3
apps/advanced/environments/dev/frontend/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

16
apps/advanced/environments/dev/frontend/web/index.php

@ -0,0 +1,16 @@
<?php
// comment out the following line to disable debug mode
defined('YII_DEBUG') or define('YII_DEBUG', true);
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/../../vendor/autoload.php');
Yii::importNamespaces(require(__DIR__ . '/../../vendor/composer/autoload_namespaces.php'));
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();

26
apps/advanced/environments/dev/yii

@ -0,0 +1,26 @@
#!/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);
// fcgi doesn't have STDIN defined by default
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/vendor/autoload.php');
Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php'));
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/console/config/main.php'),
require(__DIR__ . '/console/config/main-local.php')
);
$application = new yii\console\Application($config);
return $application->run();

38
apps/advanced/environments/index.php

@ -0,0 +1,38 @@
<?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 array(
* 'environment name' => array(
* 'path' => 'directory storing the local files',
* 'writable' => array(
* // list of directories that should be set writable
* ),
* ),
* );
* ```
*/
return array(
'Development' => array(
'path' => 'dev',
'writable' => array(
// handled by composer.json already
),
'executable' => array(
'yii',
),
),
'Production' => array(
'path' => 'prod',
'writable' => array(
// handled by composer.json already
),
'executable' => array(
'yii',
),
),
);

3
apps/advanced/environments/prod/backend/config/main-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/prod/backend/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

14
apps/advanced/environments/prod/backend/web/index.php

@ -0,0 +1,14 @@
<?php
// comment out the following line to disable debug mode
defined('YII_DEBUG') or define('YII_DEBUG', false);
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/../../vendor/autoload.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();

3
apps/advanced/environments/prod/common/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/prod/console/config/main-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/prod/console/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/prod/frontend/config/main-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

3
apps/advanced/environments/prod/frontend/config/params-local.php

@ -0,0 +1,3 @@
<?php
return array(
);

16
apps/advanced/environments/prod/frontend/web/index.php

@ -0,0 +1,16 @@
<?php
// comment out the following line to disable debug mode
defined('YII_DEBUG') or define('YII_DEBUG', false);
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/../../vendor/autoload.php');
Yii::importNamespaces(require(__DIR__ . '/../../vendor/composer/autoload_namespaces.php'));
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();

26
apps/advanced/environments/prod/yii

@ -0,0 +1,26 @@
#!/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);
// fcgi doesn't have STDIN defined by default
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/vendor/autoload.php');
Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php'));
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/console/config/main.php'),
require(__DIR__ . '/console/config/main-local.php')
);
$application = new yii\console\Application($config);
return $application->run();

2
apps/advanced/frontend/assets/.gitkeep

@ -0,0 +1,2 @@
*
!.gitignore

2
apps/advanced/frontend/config/.gitignore vendored

@ -0,0 +1,2 @@
main-local.php
params-local.php

28
apps/advanced/frontend/config/AppAsset.php

@ -0,0 +1,28 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace frontend\config;
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 = array(
'css/site.css',
);
public $js = array(
);
public $depends = array(
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
);
}

35
apps/advanced/frontend/config/main.php

@ -0,0 +1,35 @@
<?php
$rootDir = __DIR__ . '/../..';
$params = array_merge(
require($rootDir . '/common/config/params.php'),
require($rootDir . '/common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return array(
'id' => 'app-frontend',
'basePath' => dirname(__DIR__),
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'controllerNamespace' => 'frontend\controllers',
'modules' => array(
),
'components' => array(
'db' => $params['components.db'],
'cache' => $params['components.cache'],
'user' => array(
'class' => 'yii\web\User',
'identityClass' => 'common\models\User',
),
'log' => array(
'targets' => array(
array(
'class' => 'yii\log\FileTarget',
'levels' => array('error', 'warning'),
),
),
),
),
'params' => $params,
);

5
apps/advanced/frontend/config/params.php

@ -0,0 +1,5 @@
<?php
return array(
'adminEmail' => 'admin@example.com',
);

146
apps/advanced/frontend/controllers/SiteController.php

@ -0,0 +1,146 @@
<?php
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
use common\models\LoginForm;
use frontend\models\ContactForm;
use common\models\User;
use yii\web\HttpException;
use yii\helpers\Security;
class SiteController extends Controller
{
public function actions()
{
return array(
'captcha' => array(
'class' => 'yii\captcha\CaptchaAction',
),
);
}
public function actionIndex()
{
return $this->render('index');
}
public function actionLogin()
{
$model = new LoginForm();
if ($model->load($_POST) && $model->login()) {
return $this->redirect(array('site/index'));
} else {
return $this->render('login', array(
'model' => $model,
));
}
}
public function actionLogout()
{
Yii::$app->user->logout();
return $this->redirect(array('site/index'));
}
public function actionContact()
{
$model = new ContactForm;
if ($model->load($_POST) && $model->contact(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
return $this->refresh();
} else {
return $this->render('contact', array(
'model' => $model,
));
}
}
public function actionAbout()
{
return $this->render('about');
}
public function actionSignup()
{
$model = new User();
$model->setScenario('signup');
if ($model->load($_POST) && $model->save()) {
if (Yii::$app->getUser()->login($model)) {
$this->redirect('index');
}
}
return $this->render('signup', array(
'model' => $model,
));
}
public function actionRequestPasswordReset()
{
$model = new User();
$model->scenario = 'requestPasswordResetToken';
if ($model->load($_POST) && $model->validate()) {
if ($this->sendPasswordResetEmail($model->email)) {
Yii::$app->getSession()->setFlash('success', 'Check your email for further instructions.');
$this->redirect('index');
} else {
Yii::$app->getSession()->setFlash('error', 'There was an error sending email.');
}
}
return $this->render('requestPasswordResetToken', array(
'model' => $model,
));
}
public function actionResetPassword($token)
{
$model = User::find(array(
'password_reset_token' => $token,
'status' => User::STATUS_ACTIVE,
));
if (!$model) {
throw new HttpException(400, 'Wrong password reset token.');
}
$model->scenario = 'resetPassword';
if ($model->load($_POST) && $model->save()) {
Yii::$app->getSession()->setFlash('success', 'New password was saved.');
$this->redirect('index');
}
return $this->render('resetPassword', array(
'model' => $model,
));
}
private function sendPasswordResetEmail($email)
{
$user = User::find(array(
'status' => User::STATUS_ACTIVE,
'email' => $email,
));
if (!$user) {
return false;
}
$user->password_reset_token = Security::generateRandomKey();
if ($user->save(false)) {
$fromEmail = \Yii::$app->params['supportEmail'];
$name = '=?UTF-8?B?' . base64_encode(\Yii::$app->name . ' robot') . '?=';
$subject = '=?UTF-8?B?' . base64_encode('Password reset for ' . \Yii::$app->name) . '?=';
$body = $this->renderPartial('/emails/passwordResetToken', array(
'user' => $user,
));
$headers = "From: $name <{$fromEmail}>\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-type: text/plain; charset=UTF-8";
return mail($fromEmail, $subject, $body, $headers);
}
return false;
}
}

63
apps/advanced/frontend/models/ContactForm.php

@ -0,0 +1,63 @@
<?php
namespace frontend\models;
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;
/**
* @return array the validation rules.
*/
public function rules()
{
return array(
// name, email, subject and body are required
array('name, email, subject, body', 'required'),
// email has to be a valid email address
array('email', 'email'),
// verifyCode needs to be entered correctly
array('verifyCode', 'captcha'),
);
}
/**
* @return array customized attribute labels
*/
public function attributeLabels()
{
return array(
'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 model passes validation
*/
public function contact($email)
{
if ($this->validate()) {
$name = '=?UTF-8?B?' . base64_encode($this->name) . '?=';
$subject = '=?UTF-8?B?' . base64_encode($this->subject) . '?=';
$headers = "From: $name <{$this->email}>\r\n" .
"Reply-To: {$this->email}\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-type: text/plain; charset=UTF-8";
mail($email, $subject, $this->body, $headers);
return true;
} else {
return false;
}
}
}

2
apps/advanced/frontend/runtime/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

16
apps/advanced/frontend/views/emails/passwordResetToken.php

@ -0,0 +1,16 @@
<?php
use yii\helpers\Html;
/**
* @var yii\base\View $this
* @var common\models\User $user;
*/
$resetLink = Yii::$app->urlManager->createAbsoluteUrl('site/reset-password', array('token' => $user->password_reset_token));
?>
Hello <?php echo Html::encode($user->username)?>,
Follow the link below to reset your password:
<?php Html::a(Html::encode($resetLink), $resetLink)?>

76
apps/advanced/frontend/views/layouts/main.php

@ -0,0 +1,76 @@
<?php
use frontend\config\AppAsset;
use yii\helpers\Html;
use yii\widgets\Menu;
use yii\widgets\Breadcrumbs;
use frontend\widgets\Alert;
/**
* @var $this \yii\base\View
* @var $content string
*/
AppAsset::register($this);
?>
<?php $this->beginPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title><?php echo Html::encode($this->title); ?></title>
<?php $this->head(); ?>
</head>
<body>
<div class="container">
<?php $this->beginBody(); ?>
<div class="masthead">
<h3 class="muted">My Company</h3>
<div class="navbar fullwidth">
<div class="navbar-inner">
<div class="container">
<?php
$menuItems = array(
array('label' => 'Home', 'url' => array('/site/index')),
array('label' => 'About', 'url' => array('/site/about')),
array('label' => 'Contact', 'url' => array('/site/contact')),
);
if (Yii::$app->user->isGuest) {
$menuItems[] = array('label' => 'Signup', 'url' => array('/site/signup'));
$menuItems[] = array('label' => 'Login', 'url' => array('/site/login'));
}
else {
$menuItems[] = array('label' => 'Logout (' . Yii::$app->user->identity->username .')' , 'url' => array('/site/logout'));
}
echo Menu::widget(array(
'options' => array('class' => 'nav'),
'items' => $menuItems,
));
?>
</div>
</div>
</div>
<!-- /.navbar -->
</div>
<?php echo Breadcrumbs::widget(array(
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : array(),
)); ?>
<?php echo Alert::widget()?>
<?php echo $content; ?>
<hr>
<div class="footer">
<p>&copy; My Company <?php echo date('Y'); ?></p>
<p>
<?php echo Yii::powered(); ?>
Template by <a href="http://twitter.github.io/bootstrap/">Twitter Bootstrap</a>
</p>
</div>
<?php $this->endBody(); ?>
</div>
</body>
</html>
<?php $this->endPage(); ?>

0
apps/bootstrap/views/site/about.php → apps/advanced/frontend/views/site/about.php

22
apps/bootstrap/views/site/contact.php → apps/advanced/frontend/views/site/contact.php

@ -1,7 +1,7 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\Captcha;
use yii\captcha\Captcha;
/**
* @var yii\base\View $this
@ -13,12 +13,6 @@ $this->params['breadcrumbs'][] = $this->title;
?>
<h1><?php echo Html::encode($this->title); ?></h1>
<?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>
<div class="alert alert-success">
Thank you for contacting us. We will respond to you as soon as possible.
</div>
<?php return; endif; ?>
<p>
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
</p>
@ -31,16 +25,10 @@ $this->params['breadcrumbs'][] = $this->title;
<?php echo $form->field($model, 'email')->textInput(); ?>
<?php echo $form->field($model, 'subject')->textInput(); ?>
<?php echo $form->field($model, 'body')->textArea(array('rows' => 6)); ?>
<?php
$field = $form->field($model, 'verifyCode');
echo $field->begin()
. $field->label()
. Captcha::widget()
. Html::activeTextInput($model, 'verifyCode', array('class' => 'input-medium'))
. $field->error()
. $field->end();
?>
<?php echo $form->field($model, 'verifyCode')->widget(Captcha::className(), array(
'options' => array('class' => 'input-medium'),
)); ?>
<div class="form-actions">
<?php echo Html::submitButton('Submit', null, null, array('class' => 'btn btn-primary')); ?>
<?php echo Html::submitButton('Submit', array('class' => 'btn btn-primary')); ?>
</div>
<?php ActiveForm::end(); ?>

47
apps/advanced/frontend/views/site/index.php

@ -0,0 +1,47 @@
<?php
/**
* @var yii\base\View $this
*/
$this->title = 'Welcome';
?>
<div class="jumbotron">
<h1>Welcome!</h1>
<p class="lead">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus
commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
<a class="btn btn-large btn-success" href="http://www.yiiframework.com">Get started with Yii</a>
</div>
<hr>
<!-- Example row of columns -->
<div class="row-fluid">
<div class="span4">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris
condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod.
Donec sed odio dui. </p>
<p><a class="btn" href="#">View details &raquo;</a></p>
</div>
<div class="span4">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris
condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod.
Donec sed odio dui. </p>
<p><a class="btn" href="#">View details &raquo;</a></p>
</div>
<div class="span4">
<h2>Heading</h2>
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta
felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum
massa.</p>
<p><a class="btn" href="#">View details &raquo;</a></p>
</div>
</div>

26
apps/advanced/frontend/views/site/login.php

@ -0,0 +1,26 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/**
* @var yii\base\View $this
* @var yii\widgets\ActiveForm $form
* @var app\models\LoginForm $model
*/
$this->title = 'Login';
$this->params['breadcrumbs'][] = $this->title;
?>
<h1><?php echo Html::encode($this->title); ?></h1>
<p>Please fill out the following fields to login:</p>
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?>
<?php echo $form->field($model, 'username')->textInput(); ?>
<?php echo $form->field($model, 'password')->passwordInput(); ?>
<?php echo $form->field($model, 'rememberMe')->checkbox(); ?>
<div class="form-actions">
<?php echo Html::submitButton('Login', array('class' => 'btn btn-primary')); ?>
</div>
<?php ActiveForm::end(); ?>
<p>If you forgot your password you can <?php echo Html::a('reset it', array('site/request-password-reset'))?>.</p>

22
apps/advanced/frontend/views/site/requestPasswordResetToken.php

@ -0,0 +1,22 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/**
* @var yii\base\View $this
* @var yii\widgets\ActiveForm $form
* @var frontend\models\User $model
*/
$this->title = 'Request password reset';
$this->params['breadcrumbs'][] = $this->title;
?>
<h1><?php echo Html::encode($this->title); ?></h1>
<p>Please fill out your email. A link to reset password will be sent there.</p>
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?>
<?php echo $form->field($model, 'email')->textInput(); ?>
<div class="form-actions">
<?php echo Html::submitButton('Send', array('class' => 'btn btn-primary')); ?>
</div>
<?php ActiveForm::end(); ?>

22
apps/advanced/frontend/views/site/resetPassword.php

@ -0,0 +1,22 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/**
* @var yii\base\View $this
* @var yii\widgets\ActiveForm $form
* @var common\models\User $model
*/
$this->title = 'Reset password';
$this->params['breadcrumbs'][] = $this->title;
?>
<h1><?php echo Html::encode($this->title); ?></h1>
<p>Please choose your new password:</p>
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?>
<?php echo $form->field($model, 'password')->passwordInput(); ?>
<div class="form-actions">
<?php echo Html::submitButton('Save', array('class' => 'btn btn-primary')); ?>
</div>
<?php ActiveForm::end(); ?>

24
apps/advanced/frontend/views/site/signup.php

@ -0,0 +1,24 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/**
* @var yii\base\View $this
* @var yii\widgets\ActiveForm $form
* @var common\models\User $model
*/
$this->title = 'Signup';
$this->params['breadcrumbs'][] = $this->title;
?>
<h1><?php echo Html::encode($this->title); ?></h1>
<p>Please fill out the following fields to signup:</p>
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?>
<?php echo $form->field($model, 'username')->textInput(); ?>
<?php echo $form->field($model, 'email')->textInput(); ?>
<?php echo $form->field($model, 'password')->passwordInput(); ?>
<div class="form-actions">
<?php echo Html::submitButton('Signup', array('class' => 'btn btn-primary')); ?>
</div>
<?php ActiveForm::end(); ?>

1
apps/advanced/frontend/web/.gitignore vendored

@ -0,0 +1 @@
/index.php

2
apps/advanced/frontend/web/assets/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

78
apps/advanced/frontend/web/css/site.css

@ -0,0 +1,78 @@
body {
padding-top: 20px;
padding-bottom: 60px;
}
/* Custom container */
.container {
margin: 0 auto;
max-width: 1000px;
}
.container > hr {
margin: 60px 0;
}
/* Main marketing message and sign up button */
.jumbotron {
margin: 80px 0;
text-align: center;
}
.jumbotron h1 {
font-size: 100px;
line-height: 1;
}
.jumbotron .lead {
font-size: 24px;
line-height: 1.25;
}
.jumbotron .btn {
font-size: 21px;
padding: 14px 24px;
}
/* Supporting marketing content */
.marketing {
margin: 60px 0;
}
.marketing p + h4 {
margin-top: 28px;
}
/* Customize the navbar links to be fill the entire space of the .navbar */
.navbar.fullwidth .navbar-inner {
padding: 0;
}
.navbar.fullwidth .nav {
margin: 0;
display: table;
width: 100%;
}
.navbar.fullwidth .nav li {
display: table-cell;
width: 1%;
float: none;
}
.navbar.fullwidth .nav li a {
font-weight: bold;
text-align: center;
border-left: 1px solid rgba(255, 255, 255, .75);
border-right: 1px solid rgba(0, 0, 0, .1);
}
.navbar.fullwidth .nav li:first-child a {
border-left: 0;
border-radius: 3px 0 0 3px;
}
.navbar.fullwidth .nav li:last-child a {
border-right: 0;
border-radius: 0 3px 3px 0;
}

48
apps/advanced/frontend/widgets/Alert.php

@ -0,0 +1,48 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace frontend\widgets;
use yii\helpers\Html;
/**
* Alert widget renders a message from session flash. You can set message as following:
*
* - \Yii::$app->getSession()->setFlash('error', 'This is the message');
* - \Yii::$app->getSession()->setFlash('success', 'This is the message');
* - \Yii::$app->getSession()->setFlash('info', 'This is the message');
*
* @author Alexander Makarov <sam@rmcerative.ru>
*/
class Alert extends \yii\bootstrap\Alert
{
private $_doNotRender = false;
public function init()
{
if ($this->body = \Yii::$app->getSession()->getFlash('error')) {
Html::addCssClass($this->options, 'alert-error');
} elseif ($this->body = \Yii::$app->getSession()->getFlash('success')) {
Html::addCssClass($this->options, 'alert-success');
} elseif ($this->body = \Yii::$app->getSession()->getFlash('info')) {
Html::addCssClass($this->options, 'alert-info');
} elseif ($this->body = \Yii::$app->getSession()->getFlash('warning')) {
} else {
$this->_doNotRender = true;
return;
}
parent::init();
}
public function run()
{
if (!$this->_doNotRender) {
parent::run();
}
}
}

112
apps/advanced/init

@ -0,0 +1,112 @@
#!/usr/bin/env php
<?php
$root = str_replace('\\', '/', __DIR__);
$envs = require("$root/environments/index.php");
$envNames = array_keys($envs);
echo "Yii Application Init Tool v1.0\n\n";
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) || !isset($envNames[$answer])) {
echo "\n Quit initialization.\n";
return;
}
$env = $envs[$envNames[$answer]];
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";
return;
}
echo "\n Start initialization ...\n\n";
$files = getFileList("$root/environments/{$env['path']}");
$all = false;
foreach ($files as $file) {
if (!copyFile($root, "environments/{$env['path']}/$file", $file, $all)) {
break;
}
}
if (isset($env['writable'])) {
foreach ($env['writable'] as $writable) {
echo " chmod 0777 $writable\n";
@chmod("$root/$writable", 0777);
}
}
if (isset($env['executable'])) {
foreach ($env['executable'] as $executable) {
echo " chmod 0755 $executable\n";
@chmod("$root/$executable", 0755);
}
}
echo "\n ... initialization completed.\n\n";
function getFileList($root, $basePath = '')
{
$files = array();
$handle = opendir($root);
while (($path = readdir($handle)) !== false) {
if ($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)
{
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 = 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;
}

20
apps/advanced/init.bat

@ -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 &copy; 2012 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

9
apps/bootstrap/requirements.php → apps/advanced/requirements.php

@ -11,7 +11,14 @@
*/
// you may need to adjust this path to the correct Yii framework path
$frameworkPath = dirname(__FILE__) . '/../../yii';
$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2/yii';
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();

2
apps/advanced/vendor/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

0
apps/bootstrap/yii.bat → apps/advanced/yii.bat

1
apps/basic/.gitignore vendored

@ -0,0 +1 @@
/composer.lock

32
apps/basic/LICENSE.md

@ -0,0 +1,32 @@
The Yii framework is free software. It is released under the terms of
the following BSD License.
Copyright © 2008-2013 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.

34
apps/bootstrap/README.md → apps/basic/README.md

@ -1,5 +1,5 @@
Yii 2 Bootstrap Application
===========================
Yii 2 Basic Application Template
================================
**NOTE** Yii 2 and the relevant applications and extensions are still under heavy
development. We may make significant changes without prior notices. Please do not
@ -7,10 +7,10 @@ use them for production. Please consider using [Yii v1.1](https://github.com/yii
if you have a project to be deployed for production soon.
Thank you for choosing Yii 2 - the new generation of high-performance PHP framework.
Thank you for using Yii 2 Basic Application Template - an application template
that works out-of-box and can be easily customized to fit for your needs.
The Yii 2 Bootstrap Application is a Web application template that you can easily customize
to fit for your needs. It is particularly suitable for small Websites which mainly contain
Yii 2 Basic Application Template is best suitable for small Websites which mainly contain
a few informational pages.
@ -24,7 +24,7 @@ DIRECTORY STRUCTURE
runtime/ contains files generated during runtime
vendor/ contains dependent 3rd-party packages
views/ contains view files for the Web application
www/ contains the entry script and Web resources
web/ contains the entry script and Web resources
@ -33,6 +33,7 @@ REQUIREMENTS
The minimum requirement by Yii is that your Web server supports PHP 5.3.?.
In order for captcha to work you need either GD2 extension or ImageMagick PHP extension.
INSTALLATION
------------
@ -49,13 +50,28 @@ curl -s http://getcomposer.org/installer | php
You can then install the Bootstrap Application using the following command:
~~~
php composer.phar create-project --stability=dev yiisoft/yii2-bootstrap bootstrap
php composer.phar create-project --stability=dev yiisoft/yii2-app-basic yii-basic
~~~
Now you should be able to access the Bootstrap Application using the URL `http://localhost/bootstrap/www/`,
assuming `bootstrap` is directly under the document root of your Web server.
Now you should be able to access the application using the URL `http://localhost/yii-basic/web/`,
assuming `yii-basic` is directly under the document root of your Web server.
### Install from an Archive File
This is not currently available. We will provide it when Yii 2 is formally released.
### Install from development repository
If you've cloned the [Yii 2 framework main development repository](https://github.com/yiisoft/yii2) you
can bootstrap your application with:
~~~
cd yii2/apps/basic
php composer.phar create-project
~~~
*Note: If the above command fails with `[RuntimeException] Not enough arguments.` run
`php composer.phar self-update` to obtain an updated version of composer which supports creating projects
from local packages.*

18
apps/basic/codeception.yml

@ -0,0 +1,18 @@
paths:
tests: tests
log: tests/_log
data: tests/_data
helpers: tests/_helpers
settings:
bootstrap: _bootstrap.php
suite_class: \PHPUnit_Framework_TestSuite
colors: true
memory_limit: 1024M
log: true
modules:
config:
Db:
dsn: ''
user: ''
password: ''
dump: tests/_data/dump.sql

11
apps/bootstrap/commands/HelloController.php → apps/basic/commands/HelloController.php

@ -6,24 +6,25 @@
*/
namespace app\commands;
use yii\console\Controller;
/**
* This command echos what the first argument that you have entered.
* This command echoes what the first argument that you have entered.
*
* This command is provided as an example for you to learn how to create console commands.
*
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class HelloController extends Controller
{
/**
* This command echos what you have entered as the message.
* This command echoes what you have entered as the message.
* @param string $message the message to be echoed.
*/
public function actionIndex($message = 'hello world')
{
echo $message;
echo $message."\n";
}
}
}

17
apps/bootstrap/composer.json → apps/basic/composer.json

@ -1,7 +1,7 @@
{
"name": "yiisoft/yii2-bootstrap",
"description": "Yii 2 Bootstrap Application",
"keywords": ["yii", "framework", "bootstrap"],
"name": "yiisoft/yii2-app-basic",
"description": "Yii 2 Basic Application Template",
"keywords": ["yii", "framework", "basic", "application template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
@ -19,19 +19,16 @@
"yiisoft/yii2-composer": "dev-master"
},
"scripts": {
"post-install-cmd": [
"yii\\composer\\InstallHandler::setPermissions"
],
"post-update-cmd": [
"post-create-project-cmd": [
"yii\\composer\\InstallHandler::setPermissions"
]
},
"extra": {
"writable": [
"yii-install-writable": [
"runtime",
"www/assets"
"web/assets"
],
"executable": [
"yii-install-executable": [
"yii"
]
}

29
apps/basic/config/AppAsset.php

@ -0,0 +1,29 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace app\config;
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 = array(
'css/site.css',
);
public $js = array(
);
public $depends = array(
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
);
}

7
apps/bootstrap/config/console.php → apps/basic/config/console.php

@ -1,5 +1,5 @@
<?php
$params = require(__DIR__ . '/params.php');
return array(
'id' => 'bootstrap-console',
'basePath' => dirname(__DIR__),
@ -13,14 +13,13 @@ return array(
'class' => 'yii\caching\FileCache',
),
'log' => array(
'class' => 'yii\logging\Router',
'targets' => array(
array(
'class' => 'yii\logging\FileTarget',
'class' => 'yii\log\FileTarget',
'levels' => array('error', 'warning'),
),
),
),
),
'params' => require(__DIR__ . '/params.php'),
'params' => $params,
);

5
apps/basic/config/params.php

@ -0,0 +1,5 @@
<?php
return array(
'adminEmail' => 'admin@example.com',
);

7
apps/basic/config/web-test.php

@ -0,0 +1,7 @@
<?php
$config = require(__DIR__ . '/web.php');
// ... customize $config for the "test" environment here...
return $config;

35
apps/basic/config/web.php

@ -0,0 +1,35 @@
<?php
$config = array(
'id' => 'bootstrap',
'basePath' => dirname(__DIR__),
'components' => array(
'cache' => array(
'class' => 'yii\caching\FileCache',
),
'user' => array(
'identityClass' => 'app\models\User',
),
'errorHandler' => array(
'errorAction' => 'site/error',
),
'log' => array(
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => array(
array(
'class' => 'yii\log\FileTarget',
'levels' => array('error', 'warning'),
),
),
),
),
'params' => require(__DIR__ . '/params.php'),
);
if (YII_ENV_DEV) {
$config['preload'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
$config['modules']['gii'] = 'yii\gii\Module';
}
return $config;

26
apps/bootstrap/controllers/SiteController.php → apps/basic/controllers/SiteController.php

@ -12,24 +12,28 @@ class SiteController extends Controller
public function actions()
{
return array(
'error' => array(
'class' => 'yii\web\ErrorAction',
),
'captcha' => array(
'class' => 'yii\web\CaptchaAction',
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
),
);
}
public function actionIndex()
{
echo $this->render('index');
return $this->render('index');
}
public function actionLogin()
{
$model = new LoginForm();
if ($this->populate($_POST, $model) && $model->login()) {
Yii::$app->response->redirect(array('site/index'));
if ($model->load($_POST) && $model->login()) {
return $this->redirect(array('site/index'));
} else {
echo $this->render('login', array(
return $this->render('login', array(
'model' => $model,
));
}
@ -37,18 +41,18 @@ class SiteController extends Controller
public function actionLogout()
{
Yii::$app->getUser()->logout();
Yii::$app->getResponse()->redirect(array('site/index'));
Yii::$app->user->logout();
return $this->redirect(array('site/index'));
}
public function actionContact()
{
$model = new ContactForm;
if ($this->populate($_POST, $model) && $model->contact(Yii::$app->params['adminEmail'])) {
if ($model->load($_POST) && $model->contact(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted');
Yii::$app->response->refresh();
return $this->refresh();
} else {
echo $this->render('contact', array(
return $this->render('contact', array(
'model' => $model,
));
}
@ -56,6 +60,6 @@ class SiteController extends Controller
public function actionAbout()
{
echo $this->render('about');
return $this->render('about');
}
}

0
apps/bootstrap/models/ContactForm.php → apps/basic/models/ContactForm.php

0
apps/bootstrap/models/LoginForm.php → apps/basic/models/LoginForm.php

0
apps/bootstrap/models/User.php → apps/basic/models/User.php

103
apps/basic/requirements.php

@ -0,0 +1,103 @@
<?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/yii';
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();
/**
* Adjust requirements according to your application specifics.
*/
$requirements = array(
// Database :
array(
'name' => 'PDO extension',
'mandatory' => true,
'condition' => extension_loaded('pdo'),
'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>',
),
array(
'name' => 'PDO SQLite extension',
'mandatory' => false,
'condition' => extension_loaded('pdo_sqlite'),
'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>',
'memo' => 'Required for SQLite database.',
),
array(
'name' => 'PDO MySQL extension',
'mandatory' => false,
'condition' => extension_loaded('pdo_mysql'),
'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>',
'memo' => 'Required for MySQL database.',
),
// Cache :
array(
'name' => 'Memcache extension',
'mandatory' => false,
'condition' => extension_loaded('memcache') || extension_loaded('memcached'),
'by' => '<a href="http://www.yiiframework.com/doc/api/CMemCache">CMemCache</a>',
'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="http://www.yiiframework.com/doc/api/CMemCache#useMemcached-detail">CMemCache::useMemcached</a> to <code>true</code>.' : ''
),
array(
'name' => 'APC extension',
'mandatory' => false,
'condition' => extension_loaded('apc') || extension_loaded('apc'),
'by' => '<a href="http://www.yiiframework.com/doc/api/CApcCache">CApcCache</a>',
),
// Additional PHP extensions :
array(
'name' => 'Mcrypt extension',
'mandatory' => false,
'condition' => extension_loaded('mcrypt'),
'by' => '<a href="http://www.yiiframework.com/doc/api/CSecurityManager">CSecurityManager</a>',
'memo' => 'Required by encrypt and decrypt methods.'
),
// PHP ini :
'phpSafeMode' => array(
'name' => 'PHP safe mode',
'mandatory' => false,
'condition' => $requirementsChecker->checkPhpIniOff("safe_mode"),
'by' => 'File uploading and console command execution',
'memo' => '"safe_mode" should be disabled at 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();

2
apps/basic/runtime/.gitignore vendored

@ -0,0 +1,2 @@
*
!.gitignore

1
apps/basic/tests/_data/dump.sql

@ -0,0 +1 @@
/* Replace this file with actual dump of your database */

8
apps/basic/tests/_helpers/CodeHelper.php

@ -0,0 +1,8 @@
<?php
namespace Codeception\Module;
// here you can define custom functions for CodeGuy
class CodeHelper extends \Codeception\Module
{
}

8
apps/basic/tests/_helpers/TestHelper.php

@ -0,0 +1,8 @@
<?php
namespace Codeception\Module;
// here you can define custom functions for TestGuy
class TestHelper extends \Codeception\Module
{
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save