From f94989c28c59a4fb66af4b44653d992c867f476f Mon Sep 17 00:00:00 2001
From: RedHood
Date: Sun, 6 Dec 2020 00:59:46 +1000
Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D1=84?=
=?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=B0=D1=86=D0=B8=D1=8F=20(=D1=87=D0=B0?=
=?UTF-8?q?=D1=81=D1=82=D1=8C)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 2 +
codeception.yml | 27 ++
mirzaev/skillparts/system/.bowerrc | 3 +
mirzaev/skillparts/system/.gitignore | 33 +++
mirzaev/skillparts/system/LICENSE.md | 29 +++
mirzaev/skillparts/system/README.md | 233 ++++++++++++++++++
mirzaev/skillparts/system/Vagrantfile | 92 +++++++
mirzaev/skillparts/system/assets/AppAsset.php | 42 ++++
.../system/commands/HelloController.php | 34 +++
mirzaev/skillparts/system/docker-compose.yml | 9 +
mirzaev/skillparts/system/requirements.php | 162 ++++++++++++
.../system/vagrant/config/.gitignore | 2 +
.../vagrant/config/vagrant-local.example.yml | 22 ++
.../skillparts/system/vagrant/nginx/app.conf | 38 +++
.../system/vagrant/nginx/log/.gitignore | 3 +
.../vagrant/provision/always-as-root.sh | 18 ++
.../system/vagrant/provision/once-as-root.sh | 79 ++++++
.../vagrant/provision/once-as-vagrant.sh | 31 +++
.../system/vagrant/provision/provision.awk | 50 ++++
mirzaev/skillparts/system/widgets/Alert.php | 75 ++++++
mirzaev/skillparts/system/yii | 21 ++
mirzaev/skillparts/system/yii.bat | 20 ++
22 files changed, 1025 insertions(+)
create mode 100644 .gitignore
create mode 100644 codeception.yml
create mode 100644 mirzaev/skillparts/system/.bowerrc
create mode 100644 mirzaev/skillparts/system/.gitignore
create mode 100644 mirzaev/skillparts/system/LICENSE.md
create mode 100644 mirzaev/skillparts/system/README.md
create mode 100644 mirzaev/skillparts/system/Vagrantfile
create mode 100644 mirzaev/skillparts/system/assets/AppAsset.php
create mode 100644 mirzaev/skillparts/system/commands/HelloController.php
create mode 100644 mirzaev/skillparts/system/docker-compose.yml
create mode 100644 mirzaev/skillparts/system/requirements.php
create mode 100644 mirzaev/skillparts/system/vagrant/config/.gitignore
create mode 100644 mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml
create mode 100644 mirzaev/skillparts/system/vagrant/nginx/app.conf
create mode 100644 mirzaev/skillparts/system/vagrant/nginx/log/.gitignore
create mode 100644 mirzaev/skillparts/system/vagrant/provision/always-as-root.sh
create mode 100644 mirzaev/skillparts/system/vagrant/provision/once-as-root.sh
create mode 100644 mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh
create mode 100644 mirzaev/skillparts/system/vagrant/provision/provision.awk
create mode 100644 mirzaev/skillparts/system/widgets/Alert.php
create mode 100644 mirzaev/skillparts/system/yii
create mode 100644 mirzaev/skillparts/system/yii.bat
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e851f6c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+vendor/
+cache/
\ No newline at end of file
diff --git a/codeception.yml b/codeception.yml
new file mode 100644
index 0000000..c8c2169
--- /dev/null
+++ b/codeception.yml
@@ -0,0 +1,27 @@
+actor: Tester
+bootstrap: _bootstrap.php
+paths:
+ tests: tests
+ log: tests/_output
+ data: tests/_data
+ helpers: tests/_support
+settings:
+ memory_limit: 1024M
+ colors: true
+modules:
+ config:
+ Yii2:
+ configFile: 'config/test.php'
+
+# To enable code coverage:
+#coverage:
+# #c3_url: http://localhost:8080/index-test.php/
+# enabled: true
+# #remote: true
+# #remote_config: '../codeception.yml'
+# whitelist:
+# include:
+# - models/*
+# - controllers/*
+# - commands/*
+# - mail/*
diff --git a/mirzaev/skillparts/system/.bowerrc b/mirzaev/skillparts/system/.bowerrc
new file mode 100644
index 0000000..a39b5b0
--- /dev/null
+++ b/mirzaev/skillparts/system/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory" : "vendor/bower-asset"
+}
diff --git a/mirzaev/skillparts/system/.gitignore b/mirzaev/skillparts/system/.gitignore
new file mode 100644
index 0000000..5bd9be8
--- /dev/null
+++ b/mirzaev/skillparts/system/.gitignore
@@ -0,0 +1,33 @@
+# 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
+
+tests/_output/*
+tests/_support/_generated
+
+#vagrant folder
+/.vagrant
\ No newline at end of file
diff --git a/mirzaev/skillparts/system/LICENSE.md b/mirzaev/skillparts/system/LICENSE.md
new file mode 100644
index 0000000..ee872b9
--- /dev/null
+++ b/mirzaev/skillparts/system/LICENSE.md
@@ -0,0 +1,29 @@
+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.
diff --git a/mirzaev/skillparts/system/README.md b/mirzaev/skillparts/system/README.md
new file mode 100644
index 0000000..6db290b
--- /dev/null
+++ b/mirzaev/skillparts/system/README.md
@@ -0,0 +1,233 @@
+
+
+
+
+
Yii 2 Basic Project Template
+
+
+
+Yii 2 Basic Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for
+rapidly creating small projects.
+
+The template contains the basic features including user login/logout and a contact page.
+It includes all commonly used configurations that would allow you to focus on adding new
+features to your application.
+
+[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
+[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
+[![build](https://github.com/yiisoft/yii2-app-basic/workflows/build/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Abuild)
+
+DIRECTORY STRUCTURE
+-------------------
+
+ assets/ contains assets definition
+ commands/ contains console commands (controllers)
+ config/ contains application configurations
+ controllers/ contains Web controller classes
+ mail/ contains view files for e-mails
+ models/ contains model classes
+ runtime/ contains files generated during runtime
+ tests/ contains various tests for the basic application
+ vendor/ contains dependent 3rd-party packages
+ views/ contains view files for the Web application
+ web/ contains the entry script and Web resources
+
+
+
+REQUIREMENTS
+------------
+
+The minimum requirement by this project template that your Web server supports PHP 5.6.0.
+
+
+INSTALLATION
+------------
+
+### Install via Composer
+
+If you do not have [Composer](http://getcomposer.org/), you may install it by following the instructions
+at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).
+
+You can then install this project template using the following command:
+
+~~~
+composer create-project --prefer-dist yiisoft/yii2-app-basic basic
+~~~
+
+Now you should be able to access the application through the following URL, assuming `basic` is the directory
+directly under the Web root.
+
+~~~
+http://localhost/basic/web/
+~~~
+
+### Install from an Archive File
+
+Extract the archive file downloaded from [yiiframework.com](http://www.yiiframework.com/download/) to
+a directory named `basic` that is directly under the Web root.
+
+Set cookie validation key in `config/web.php` file to some random secret string:
+
+```php
+'request' => [
+ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
+ 'cookieValidationKey' => '',
+],
+```
+
+You can then access the application through the following URL:
+
+~~~
+http://localhost/basic/web/
+~~~
+
+
+### Install with Docker
+
+Update your vendor packages
+
+ docker-compose run --rm php composer update --prefer-dist
+
+Run the installation triggers (creating cookie validation code)
+
+ docker-compose run --rm php composer install
+
+Start the container
+
+ docker-compose up -d
+
+You can then access the application through the following URL:
+
+ http://127.0.0.1:8000
+
+**NOTES:**
+- Minimum required Docker engine version `17.04` for development (see [Performance tuning for volume mounts](https://docs.docker.com/docker-for-mac/osxfs-caching/))
+- The default configuration uses a host-volume in your home directory `.docker-composer` for composer caches
+
+
+CONFIGURATION
+-------------
+
+### Database
+
+Edit the file `config/db.php` with real data, for example:
+
+```php
+return [
+ 'class' => 'yii\db\Connection',
+ 'dsn' => 'mysql:host=localhost;dbname=yii2basic',
+ 'username' => 'root',
+ 'password' => '1234',
+ 'charset' => 'utf8',
+];
+```
+
+**NOTES:**
+- Yii won't create the database for you, this has to be done manually before you can access it.
+- Check and edit the other files in the `config/` directory to customize your application as required.
+- Refer to the README in the `tests` directory for information specific to basic application tests.
+
+
+TESTING
+-------
+
+Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](http://codeception.com/).
+By default there are 3 test suites:
+
+- `unit`
+- `functional`
+- `acceptance`
+
+Tests can be executed by running
+
+```
+vendor/bin/codecept run
+```
+
+The command above will execute unit and functional tests. Unit tests are testing the system components, while functional
+tests are for testing user interaction. Acceptance tests are disabled by default as they require additional setup since
+they perform testing in real browser.
+
+
+### Running acceptance tests
+
+To execute acceptance tests do the following:
+
+1. Rename `tests/acceptance.suite.yml.example` to `tests/acceptance.suite.yml` to enable suite configuration
+
+2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full featured
+ version of Codeception
+
+3. Update dependencies with Composer
+
+ ```
+ composer update
+ ```
+
+4. Download [Selenium Server](http://www.seleniumhq.org/download/) and launch it:
+
+ ```
+ java -jar ~/selenium-server-standalone-x.xx.x.jar
+ ```
+
+ In case of using Selenium Server 3.0 with Firefox browser since v48 or Google Chrome since v53 you must download [GeckoDriver](https://github.com/mozilla/geckodriver/releases) or [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) and launch Selenium with it:
+
+ ```
+ # for Firefox
+ java -jar -Dwebdriver.gecko.driver=~/geckodriver ~/selenium-server-standalone-3.xx.x.jar
+
+ # for Google Chrome
+ java -jar -Dwebdriver.chrome.driver=~/chromedriver ~/selenium-server-standalone-3.xx.x.jar
+ ```
+
+ As an alternative way you can use already configured Docker container with older versions of Selenium and Firefox:
+
+ ```
+ docker run --net=host selenium/standalone-firefox:2.53.0
+ ```
+
+5. (Optional) Create `yii2basic_test` database and update it by applying migrations if you have them.
+
+ ```
+ tests/bin/yii migrate
+ ```
+
+ The database configuration can be found at `config/test_db.php`.
+
+
+6. Start web server:
+
+ ```
+ tests/bin/yii serve
+ ```
+
+7. Now you can run all available tests
+
+ ```
+ # run all available tests
+ vendor/bin/codecept run
+
+ # run acceptance tests
+ vendor/bin/codecept run acceptance
+
+ # run only unit and functional tests
+ vendor/bin/codecept run unit,functional
+ ```
+
+### Code coverage support
+
+By default, code coverage is disabled in `codeception.yml` configuration file, you should uncomment needed rows to be able
+to collect code coverage. You can run your tests and collect coverage with the following command:
+
+```
+#collect coverage for all tests
+vendor/bin/codecept run --coverage --coverage-html --coverage-xml
+
+#collect coverage only for unit tests
+vendor/bin/codecept run unit --coverage --coverage-html --coverage-xml
+
+#collect coverage for unit and functional tests
+vendor/bin/codecept run functional,unit --coverage --coverage-html --coverage-xml
+```
+
+You can see code coverage output under the `tests/_output` directory.
diff --git a/mirzaev/skillparts/system/Vagrantfile b/mirzaev/skillparts/system/Vagrantfile
new file mode 100644
index 0000000..258aea6
--- /dev/null
+++ b/mirzaev/skillparts/system/Vagrantfile
@@ -0,0 +1,92 @@
+require 'yaml'
+require 'fileutils'
+
+required_plugins_installed = nil
+required_plugins = %w( vagrant-hostmanager vagrant-vbguest )
+required_plugins.each do |plugin|
+ unless Vagrant.has_plugin? plugin
+ system "vagrant plugin install #{plugin}"
+ required_plugins_installed = true
+ end
+end
+
+# IF plugin[s] was just installed - restart required
+if required_plugins_installed
+ # Get CLI command[s] and call again
+ system 'vagrant' + ARGV.to_s.gsub(/\[\"|\", \"|\"\]/, ' ')
+ exit
+end
+
+domains = {
+ app: 'yii2basic.test'
+}
+
+vagrantfile_dir_path = File.dirname(__FILE__)
+
+config = {
+ local: vagrantfile_dir_path + '/vagrant/config/vagrant-local.yml',
+ example: vagrantfile_dir_path + '/vagrant/config/vagrant-local.example.yml'
+}
+
+# copy config from example if local config not exists
+FileUtils.cp config[:example], config[:local] unless File.exist?(config[:local])
+# read config
+options = YAML.load_file config[:local]
+
+# check github token
+if options['github_token'].nil? || options['github_token'].to_s.length != 40
+ puts "You must place REAL GitHub token into configuration:\n/yii2-app-basic/vagrant/config/vagrant-local.yml"
+ exit
+end
+
+# vagrant configurate
+Vagrant.configure(2) do |config|
+ # select the box
+ config.vm.box = 'bento/ubuntu-18.04'
+
+ # should we ask about box updates?
+ config.vm.box_check_update = options['box_check_update']
+
+ config.vm.provider 'virtualbox' do |vb|
+ # machine cpus count
+ vb.cpus = options['cpus']
+ # machine memory size
+ vb.memory = options['memory']
+ # machine name (for VirtualBox UI)
+ vb.name = options['machine_name']
+ end
+
+ # machine name (for vagrant console)
+ config.vm.define options['machine_name']
+
+ # machine name (for guest machine console)
+ config.vm.hostname = options['machine_name']
+
+ # network settings
+ config.vm.network 'private_network', ip: options['ip']
+
+ # sync: folder 'yii2-app-advanced' (host machine) -> folder '/app' (guest machine)
+ config.vm.synced_folder './', '/app', owner: 'vagrant', group: 'vagrant'
+
+ # disable folder '/vagrant' (guest machine)
+ config.vm.synced_folder '.', '/vagrant', disabled: true
+
+ # hosts settings (host machine)
+ config.vm.provision :hostmanager
+ config.hostmanager.enabled = true
+ config.hostmanager.manage_host = true
+ config.hostmanager.ignore_private_ip = false
+ config.hostmanager.include_offline = true
+ config.hostmanager.aliases = domains.values
+
+ # quick fix for failed guest additions installations
+ # config.vbguest.auto_update = false
+
+ # provisioners
+ config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone'], options['ip']]
+ config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false
+ config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always'
+
+ # post-install message (vagrant console)
+ config.vm.post_up_message = "App URL: http://#{domains[:app]}"
+end
diff --git a/mirzaev/skillparts/system/assets/AppAsset.php b/mirzaev/skillparts/system/assets/AppAsset.php
new file mode 100644
index 0000000..d8d6b20
--- /dev/null
+++ b/mirzaev/skillparts/system/assets/AppAsset.php
@@ -0,0 +1,42 @@
+
+ * @since 2.0
+ */
+class AppAsset extends AssetBundle
+{
+ public $basePath = '@webroot';
+ public $baseUrl = '@web';
+ public $css = [
+ '//fonts.googleapis.com/css?family=Open+Sans:400,700',
+ 'css/bootstrap/bootstrap.min.css',
+ 'css/main.css',
+ 'css/header.css',
+ 'css/info_panel.css',
+ 'css/categories_blocks_panel.css',
+ 'css/footer.css'
+ ];
+ public $js = [
+ 'https://code.jquery.com/jquery-3.5.1.min.js',
+ 'js/bootstrap/popper.min.js',
+ 'js/bootstrap/bootstrap.min.js',
+ 'https://kit.fontawesome.com/d7e922c226.js'
+ ];
+ public $depends = [
+ 'yii\web\YiiAsset',
+ // 'yii\bootstrap\BootstrapAsset'
+ ];
+}
diff --git a/mirzaev/skillparts/system/commands/HelloController.php b/mirzaev/skillparts/system/commands/HelloController.php
new file mode 100644
index 0000000..20066c4
--- /dev/null
+++ b/mirzaev/skillparts/system/commands/HelloController.php
@@ -0,0 +1,34 @@
+
+ * @since 2.0
+ */
+class HelloController extends Controller
+{
+ /**
+ * This command echoes what you have entered as the message.
+ * @param string $message the message to be echoed.
+ * @return int Exit code
+ */
+ public function actionIndex($message = 'hello world')
+ {
+ echo $message . "\n";
+
+ return ExitCode::OK;
+ }
+}
diff --git a/mirzaev/skillparts/system/docker-compose.yml b/mirzaev/skillparts/system/docker-compose.yml
new file mode 100644
index 0000000..86be3bd
--- /dev/null
+++ b/mirzaev/skillparts/system/docker-compose.yml
@@ -0,0 +1,9 @@
+version: '2'
+services:
+ php:
+ image: yiisoftware/yii2-php:7.4-apache
+ volumes:
+ - ~/.composer-docker/cache:/root/.composer/cache:delegated
+ - ./:/app:delegated
+ ports:
+ - '8000:80'
diff --git a/mirzaev/skillparts/system/requirements.php b/mirzaev/skillparts/system/requirements.php
new file mode 100644
index 0000000..039d835
--- /dev/null
+++ b/mirzaev/skillparts/system/requirements.php
@@ -0,0 +1,162 @@
+Error\n\n"
+ . "The path to yii framework seems to be incorrect.
\n"
+ . 'You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . ".
\n"
+ . 'Please refer to the README on how to install Yii.
\n";
+
+ if (!empty($_SERVER['argv'])) {
+ // do not print HTML when used in console mode
+ echo strip_tags($message);
+ } else {
+ echo $message;
+ }
+ exit(1);
+}
+
+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' => 'MemCache',
+ 'memo' => extension_loaded('memcached') ? 'To use memcached set MemCache::useMemcached to true
.' : ''
+ ),
+ // CAPTCHA:
+ array(
+ 'name' => 'GD PHP extension with FreeType support',
+ 'mandatory' => false,
+ 'condition' => $gdOK,
+ 'by' => 'Captcha',
+ 'memo' => $gdMemo,
+ ),
+ array(
+ 'name' => 'ImageMagick PHP extension with PNG support',
+ 'mandatory' => false,
+ 'condition' => $imagickOK,
+ 'by' => 'Captcha',
+ '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',
+ ),
+);
+
+// OPcache check
+if (!version_compare(phpversion(), '5.5', '>=')) {
+ $requirements[] = array(
+ 'name' => 'APC extension',
+ 'mandatory' => false,
+ 'condition' => extension_loaded('apc'),
+ 'by' => 'ApcCache',
+ );
+}
+
+$result = $requirementsChecker->checkYii()->check($requirements)->getResult();
+$requirementsChecker->render();
+exit($result['summary']['errors'] === 0 ? 0 : 1);
diff --git a/mirzaev/skillparts/system/vagrant/config/.gitignore b/mirzaev/skillparts/system/vagrant/config/.gitignore
new file mode 100644
index 0000000..0685a56
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/config/.gitignore
@@ -0,0 +1,2 @@
+# local configuration
+vagrant-local.yml
\ No newline at end of file
diff --git a/mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml b/mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml
new file mode 100644
index 0000000..919aec0
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml
@@ -0,0 +1,22 @@
+# Your personal GitHub token
+github_token:
+# Read more: https://github.com/blog/1509-personal-api-tokens
+# You can generate it here: https://github.com/settings/tokens
+
+# Guest OS timezone
+timezone: Europe/London
+
+# Are we need check box updates for every 'vagrant up'?
+box_check_update: false
+
+# Virtual machine name
+machine_name: yii2basic
+
+# Virtual machine IP
+ip: 192.168.83.137
+
+# Virtual machine CPU cores number
+cpus: 1
+
+# Virtual machine RAM
+memory: 1024
diff --git a/mirzaev/skillparts/system/vagrant/nginx/app.conf b/mirzaev/skillparts/system/vagrant/nginx/app.conf
new file mode 100644
index 0000000..1bfc0d5
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/nginx/app.conf
@@ -0,0 +1,38 @@
+server {
+ charset utf-8;
+ client_max_body_size 128M;
+ sendfile off;
+
+ listen 80; ## listen for ipv4
+ #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
+
+ server_name yii2basic.test;
+ root /app/web/;
+ index index.php;
+
+ access_log /app/vagrant/nginx/log/yii2basic.access.log;
+ error_log /app/vagrant/nginx/log/yii2basic.error.log;
+
+ location / {
+ # Redirect everything that isn't a real file to index.php
+ try_files $uri $uri/ /index.php$is_args$args;
+ }
+
+ # uncomment to avoid processing of calls to non-existing static files by Yii
+ #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
+ # try_files $uri =404;
+ #}
+ #error_page 404 /404.html;
+
+ location ~ \.php$ {
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ #fastcgi_pass 127.0.0.1:9000;
+ fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
+ try_files $uri =404;
+ }
+
+ location ~ /\.(ht|svn|git) {
+ deny all;
+ }
+}
diff --git a/mirzaev/skillparts/system/vagrant/nginx/log/.gitignore b/mirzaev/skillparts/system/vagrant/nginx/log/.gitignore
new file mode 100644
index 0000000..c0fbfdd
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/nginx/log/.gitignore
@@ -0,0 +1,3 @@
+#nginx logs
+yii2basic.access.log
+yii2basic.error.log
\ No newline at end of file
diff --git a/mirzaev/skillparts/system/vagrant/provision/always-as-root.sh b/mirzaev/skillparts/system/vagrant/provision/always-as-root.sh
new file mode 100644
index 0000000..17fb584
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/provision/always-as-root.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+#== Bash helpers ==
+
+function info {
+ echo " "
+ echo "--> $1"
+ echo " "
+}
+
+#== Provision script ==
+
+info "Provision-script user: `whoami`"
+
+info "Restart web-stack"
+service php7.2-fpm restart
+service nginx restart
+service mysql restart
diff --git a/mirzaev/skillparts/system/vagrant/provision/once-as-root.sh b/mirzaev/skillparts/system/vagrant/provision/once-as-root.sh
new file mode 100644
index 0000000..75cbf5a
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/provision/once-as-root.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+#== Import script args ==
+
+timezone=$(echo "$1")
+readonly IP=$2
+
+#== Bash helpers ==
+
+function info {
+ echo " "
+ echo "--> $1"
+ echo " "
+}
+
+#== Provision script ==
+
+info "Provision-script user: `whoami`"
+
+export DEBIAN_FRONTEND=noninteractive
+
+info "Configure timezone"
+timedatectl set-timezone ${timezone} --no-ask-password
+
+info "Add the VM IP to the list of allowed IPs"
+awk -v ip=$IP -f /app/vagrant/provision/provision.awk /app/config/web.php
+
+info "Prepare root password for MySQL"
+debconf-set-selections <<< 'mariadb-server mysql-server/root_password password'
+debconf-set-selections <<< 'mariadb-server mysql-server/root_password_again password'
+echo "Done!"
+
+info "Update OS software"
+apt-get update
+apt-get upgrade -y
+
+info "Install additional software"
+apt-get install -y php7.2-curl php7.2-cli php7.2-intl php7.2-mysqlnd php7.2-gd php7.2-fpm php7.2-mbstring php7.2-xml unzip nginx mariadb-server-10.1 php.xdebug
+
+info "Configure MySQL"
+sed -i 's/.*bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
+mysql <<< "CREATE USER 'root'@'%' IDENTIFIED BY ''"
+mysql <<< "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'"
+mysql <<< "DROP USER 'root'@'localhost'"
+mysql <<< 'FLUSH PRIVILEGES'
+echo "Done!"
+
+info "Configure PHP-FPM"
+sed -i 's/user = www-data/user = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf
+sed -i 's/group = www-data/group = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf
+sed -i 's/owner = www-data/owner = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf
+cat << EOF > /etc/php/7.2/mods-available/xdebug.ini
+zend_extension=xdebug.so
+xdebug.remote_enable=1
+xdebug.remote_connect_back=1
+xdebug.remote_port=9000
+xdebug.remote_autostart=1
+EOF
+echo "Done!"
+
+info "Configure NGINX"
+sed -i 's/user www-data/user vagrant/g' /etc/nginx/nginx.conf
+echo "Done!"
+
+info "Enabling site configuration"
+ln -s /app/vagrant/nginx/app.conf /etc/nginx/sites-enabled/app.conf
+echo "Done!"
+
+info "Removing default site configuration"
+rm /etc/nginx/sites-enabled/default
+echo "Done!"
+
+info "Initailize databases for MySQL"
+mysql <<< 'CREATE DATABASE yii2basic'
+mysql <<< 'CREATE DATABASE yii2basic_test'
+echo "Done!"
+
+info "Install composer"
+curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
diff --git a/mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh b/mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh
new file mode 100644
index 0000000..8da4721
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+#== Import script args ==
+
+github_token=$(echo "$1")
+
+#== Bash helpers ==
+
+function info {
+ echo " "
+ echo "--> $1"
+ echo " "
+}
+
+#== Provision script ==
+
+info "Provision-script user: `whoami`"
+
+info "Configure composer"
+composer config --global github-oauth.github.com ${github_token}
+echo "Done!"
+
+info "Install project dependencies"
+cd /app
+composer --no-progress --prefer-dist install
+
+info "Create bash-alias 'app' for vagrant user"
+echo 'alias app="cd /app"' | tee /home/vagrant/.bash_aliases
+
+info "Enabling colorized prompt for guest console"
+sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/" /home/vagrant/.bashrc
diff --git a/mirzaev/skillparts/system/vagrant/provision/provision.awk b/mirzaev/skillparts/system/vagrant/provision/provision.awk
new file mode 100644
index 0000000..bcf44d3
--- /dev/null
+++ b/mirzaev/skillparts/system/vagrant/provision/provision.awk
@@ -0,0 +1,50 @@
+###
+# Modifying Yii2's files for Vagrant VM
+#
+# @author HA3IK
+# @version 1.0.0
+
+BEGIN {
+ print "AWK BEGINs its work:"
+ IGNORECASE = 1
+
+ # Correct IP - wildcard last octet
+ match(ip, /(([0-9]+\.)+)/, arr)
+ ip = arr[1] "*"
+}
+# BODY
+{
+ # Check if it's the same file
+ if (FILENAME != isFile["same"]){
+ msg = "- Work with: " FILENAME
+ # Close a previous file
+ close(isFile["same"])
+ # Delete previous data
+ delete isFile
+ # Save current file
+ isFile["same"] = FILENAME
+ # Define array index for the file
+ switch (FILENAME){
+ case /config\/web\.php$/:
+ isFile["IsConfWeb"] = 1
+ msg = msg " - add allowed IP: " ip
+ break
+ }
+ # Print the concatenated message for the file
+ print msg
+ }
+
+ # IF config/web.php
+ if (isFile["IsConfWeb"]){
+ # IF line has "allowedIPs" and doesn't has our IP
+ if (match($0, "allowedIPs") && !match($0, ip)){
+ match($0, /([^\]]+)(.+)/, arr)
+ $0 = sprintf("%s, '%s'%s", arr[1], ip, arr[2])
+ }
+ # Rewrite the file
+ print $0 > FILENAME
+ }
+}
+END {
+ print "AWK ENDs its work."
+}
diff --git a/mirzaev/skillparts/system/widgets/Alert.php b/mirzaev/skillparts/system/widgets/Alert.php
new file mode 100644
index 0000000..ae6c1d8
--- /dev/null
+++ b/mirzaev/skillparts/system/widgets/Alert.php
@@ -0,0 +1,75 @@
+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
+ * @author Alexander Makarov
+ */
+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: the name of the session flash variable
+ * - value: 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.
+ * Array will be passed to [[\yii\bootstrap\Alert::closeButton]].
+ */
+ public $closeButton = [];
+
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $session = Yii::$app->session;
+ $flashes = $session->getAllFlashes();
+ $appendClass = isset($this->options['class']) ? ' ' . $this->options['class'] : '';
+
+ foreach ($flashes as $type => $flash) {
+ if (!isset($this->alertTypes[$type])) {
+ continue;
+ }
+
+ foreach ((array) $flash as $i => $message) {
+ echo \yii\bootstrap\Alert::widget([
+ 'body' => $message,
+ 'closeButton' => $this->closeButton,
+ 'options' => array_merge($this->options, [
+ 'id' => $this->getId() . '-' . $type . '-' . $i,
+ 'class' => $this->alertTypes[$type] . $appendClass,
+ ]),
+ ]);
+ }
+
+ $session->removeFlash($type);
+ }
+ }
+}
diff --git a/mirzaev/skillparts/system/yii b/mirzaev/skillparts/system/yii
new file mode 100644
index 0000000..f743758
--- /dev/null
+++ b/mirzaev/skillparts/system/yii
@@ -0,0 +1,21 @@
+#!/usr/bin/env php
+run();
+exit($exitCode);
diff --git a/mirzaev/skillparts/system/yii.bat b/mirzaev/skillparts/system/yii.bat
new file mode 100644
index 0000000..d516b3a
--- /dev/null
+++ b/mirzaev/skillparts/system/yii.bat
@@ -0,0 +1,20 @@
+@echo off
+
+rem -------------------------------------------------------------
+rem Yii command line bootstrap script for Windows.
+rem
+rem @author Qiang Xue
+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%yii" %*
+
+@endlocal