Введение


Yii2 — фреймворк для PHP, позволяющий рекордно быстро создать такие веб-сайты и компоненты веб-сайтов, как: блоги, комментарии, чаты, гостевые книги, а также прочие компоненты, где ключевую роль играют формы ввода (тэг input), списки и таблицы с пагинацией и, конечно же, база данных MySQL.

Советую уяснить сразу: Yii2 — это не CMS, это фреймворк. Поэтому он не содержит крупных готовых (весьма ущербно и криво реализованных) модулей, таких, как комментарии, гостевухи, корзины для интернет-магазинов и т.д. Вы создаете все это сами, имея при этом полную свободу действий, как и с «голыми» HTML&CSS&JS&PHP&MySQL. В то же время, на Yii2 все это делается гораздо легче, чем в «голом» варианте, потому что фреймворк содержит массу готовых элементов интерфейса и прочих фич.

Также, Yii2 поддерживает AJAX и местами содержит его готовую реализацию (впрочем, не очень удобную).

Давайте попробуем Yii2 Framework в деле, придумав какую-нибудь более-менее реалистичную задачу, для которой бы он подходил.

Задача


Реализуем простую страничку, содержащую:

  • Список комментариев, с пагинацией, но без иерархии (для простоты)
  • Форму публикации комментария с 3 полями input: Ник, E-mail и Текст комментария, с HTML5 Placeholders (для компактности интерфейса)
  • 2 обязательных к заполнению поля: Ник (по умолчанию «Анонимус») и Текст комментария; поле E-mail не обязательное, но валидируется на правильность формата введенного e-mail
  • Легкую и минималистичную тему Bootstrap (в Yii2 она входит по дефолту)
  • Не поддерживающую регистрацию и авторизации (для простоты)
  • Не поддерживающую AJAX для получения и постинга комментов (для простоты)

Ниже я, конечно, не буду расписывать все подробно, т.к. вы, в общем-то, сами все увидите, распишу лишь самые основы Yii2, после чего сразу перейду к готовому исходнику. Также в конце есть ссылка для скачивания.

Требования к серверу для запуска Yii2


Yii2 требует PHP 5.4.0 или выше. Старые версии PHP (такие, как 5.2 или 5.3 в Денвере) не поддерживают некоторые синтаксические фичи, примененные в Yii2. Нам придется использоваться современный удаленный или локальный сервер, такой, как XAMPP, Ampps, Open Server и т.д.

Также, я рекомендую юзать Yii2 именно с БД MySQL, хотя он может выполняться вообще без запущенного сервера MySQL, а в качестве БД использовать, например, SQLite.

Качаем Yii2 и готовим его к работе


Yii2 представляет собой готовый шаблон веб-сайта («application template»), уже содержащий index.php и пару примеров страничек. Этот шаблон нужно скачать, загрузить на сервер и слегка настроить — и все, «скелет» нашего веб-сайта готов.

Качаем Yii2

Есть 2 способа скачать Yii2 — либо просто скачать его вручную браузером (в виде архива TGZ), либо примерно сделать то же самое, но через пакетный менеджер Composer.

Первый способ — проще, и не требует ничего, кроме браузера и архиватора с поддержкой TGZ (я использую HaoZip, он бесплатен и мощен).

1. Зайдем на http://www.yiiframework.com/download/

2. Прокрутим страницу до заголовка «Install from an Archive File».

3. Кликнем ссылку «Yii2 with basic application template».

Загружаем Yii2 на сервер


Откроем архив и распакуем папку «basic» (именно она нам нужна) в корень веб-сайта, куда обычно кладут index.php.

Если у вас XAMPP, то это папка «htdocs» в директории с XAMPP, в моем случае это C:\xampp\htdocs.

Если у вас Ampps, то это папка «www» в директории с Ampps, в моем случае это C:\Program Files (x86)\Ampps\www.

Если у вас удаленный сервер, то опять же ориентируйтесь по index.php, часто это папка «public_html». Скорее всего, для загрузки файлов на сервер придется использовать FTP-клиент, такой, как FileZilla или SmartFTP, т.к. обычно если на хостинге и есть на админка с файловым менеджером, то загрузку таких больших объемов файлов, да с многоуровневыми папками, он не поддерживает.

Готовим Yii2 к работе


В любом браузере пройдем по ссылке http://localhost/basic/web/ (если у вас удаленный сервер, то, естественно, вместо localhost нужно вставить имя своего хоста).

И ничего толком не увидим — Yii2 не заработает! Мы увидим стандартную Yii2шную страницу с сообщением об ошибке, с заголовком «Invalid Configuration — yii\base\InvalidConfigException» и содержанием "yii\web\Request::cookieValidationKey must be configured with a secret key."

Чтобы исправить это, мы должны зайти в папку "\basic\config\" и открыть файл «web.php» в текстовом редакторе, «независимом от символов переносов строк», таком, как Notepad++, но желательно не таком, как Блокнот Windows.

В этом файле увидим такой код:

<?php

$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '',
        ],
...

Перед нами многомерный массив в стиле PHP 5.4, похожий на JSON (вот для таких фич Yii2 и нужен PHP 5.4!), содержащий часть настроек нашего веб-сайта на Yii2, включая Cookie Validation Secret Key.

По соображениям безопасности, этот ключ должен быть уникальным для каждого Yii2. Вот почему он не задан «из коробки», и мы должны задать его сами.

Давайте возьмем генератор паролей (такой, как http://passwordsgenerator.net/) и сгенерируем длинный пароль с буквами и цифрами, вида UQQOLez78Gprpy3LvSUb79bDe) и зададим его свойству cookieValidationKey:

...
    'components' => [
        'request' => [
            'cookieValidationKey' => 'UQQOLez78Gprpy3LvSUb79bDe',
        ],
...

Сохраним этот файл, и снова попробуем зайти на http://localhost/basic/web/

Ура! Все работает!

Таким образом, у нас есть простенький скелет веб-сайта с:
  • Главной страницей с lorem-ipsum-текстами (и парой интересных кнопочек)
  • Формой входа & базовой системой регистрации-входа с куками (но, к сожалению, логин-пароли «захардкожены», а не берутся из БД — надо «доработать напильником»)
  • Формой обратной связи, с капчой

Легкой и минималистичной темой Bootstrap Theme (по умолчанию в Yii2)

Чуть подправляем структуру каталогов


Очень, очень некрасиво, когда index.php лежит не в корне сайте. Давайте исправим это.

1. Зайдем в папку \basic\web\, выделим все ее содержимое (2 папки и 4 файла) и переместим его в корень.

2. Теперь, давайте откроем index.php в текстовом редакторе:

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/../config/web.php');

(new yii\web\Application($config))->run();

Все «require»-пути относятся к папке «basic/web». Мы должны поменять их на абсолютные:

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/basic/vendor/autoload.php');
require(__DIR__ . '/basic/vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/basic/config/web.php');

(new yii\web\Application($config))->run();

3. Файл и "/index-test.php" папку "/basic/web/" просто удалим. Они нам просто не нужны.

Все. Теперь, зайдя на http://localhost/ или http://localhost/index.php, мы увидим наш сайт.

Примечаниe: рекомендуется также папку «basic» переименовать в «framework» (и исправить все пути в index.php). Если использовать Advanced Application Template (вместо Basic), то папка будет называться «advanced». Чтобы избежать путаницы, лучше применять универсальный вариант — «framework».

Строим сайт на Yii2


Если вы еще не забыли, мы собираемся строить Очень Простые Комментарии с Пагинацией на Yii2.

Этот процесс можно условно разделить на 5 этапов:

  1. Создаем пустую страницу на Yii2 (для комментариев)
  2. Готовим БД MySQL, создаем в ней 1 таблицу для хранения комментариев
  3. Настраиваем Yii2 для использования MySQL
  4. Строим форму публикацию комментария, и пишем код, добавляющий комментарий в БД
  5. Делаем пагинированный список на странице, и пишем код, читающий комментарии из БД и показывающий их в этом списке

Создаем пустую страницу на Yii2

Давайте взглянем на страницу About, точнее, на ее URL:

http://localhost/index.php?r=site%2Fabout

Очевидно, что это не обычная статическая страница. Это «виртуальная страница», которая динамически рендерится движком Yii2.

Как работает движок рендеринга в Yii2? А вот как.

  1. Мы заходим на страницу в браузере. По факту, мы делаем HTTP GET запрос к index.php с 1 параметром по имени «r» со значением «site%2Fabout» (или «site/about»).
  2. Движок рендеринга Yii2 (проинклюденный «require»-ами в index.php) получает это значение и парсит его по маске "*/*" на 2 части — "site" и "about".
  3. 3. Движок сканирует папку /basic/controllers/ (или /framework/controllers) на предмет файла по имени "SiteController.php" (with SiteController class).
  4. 4. Далее, рендерер сканирует этот класс на предмет метода по имени «actionAbout», и вызывает его.
  5. 5. Этот метод возвращает полный HTML-код страницы (с <head>, хедерами и футерами), и рендерер возвращает его нам как результат GET-запроса.

Но как actionAbout() генерирует полный HTML-код страницы? Давайте посмотрим:

<?php

namespace app\controllers;

...

class SiteController extends Controller
{
    ...
    
    public function actionAbout()
    {
        return $this->render('about');
    }
}

Как видим, actionAbout() вызываем метод $this->render, и возвращает возвращаемое им значение.

$this->render читает View по имени «about», т.е. файл about.php (в папке /basic/views/site/). Вид — это файл, содержащий внутреннее содержимое страницы (возможно, с PHP)

Также, $this->render читает текущий Layout, т.е. /basic/views/layouts/main.php. Layout — это шаблон страницы, содержащий хедер и футер, но не содержащий контента.

$this->render «конкатенирует» Layout и View (вставляет View в Layout) и возвращает полученный при этом полный HTML-код страницы, который в дальнейшем возвращается actionAboutом.

Ладно, хватит всей этой MVC-теории, давайте перейдем к практики, и попробуем построить нашу первую страницу на Yii2.
Давайте объявим новую Action в /basic/controllers/SiteController.php. Объявим новый метод по имени «actionComments» в «SiteController» class:

class SiteController extends Controller
{
    ...

    public function actionComments()
    {
        return "Если вы внимательно прочитали теорию <s>M</s>VC, то вы знаете, что $this->render и View <b>не</b> обязательны. Мы можем просто вернуть HTML-строку из метода Action."; 
    }
}

Сохранить этот код и зайдем на http://localhost/index.php?r=site%2Fcomments. Как видим, очень простой обработчик GET-запроса — работает.

Но, почему этот простой обработчик такой уж простой? Где хедер и футер? Если вы внимательно читали теорию MVC, то вы знаете, что хедер и футер являются частями Layout, который рендерится методом $this->render(). Или методом $this->renderContent(), i.e.

public function actionComments()
{
    return $this->renderContent("If you don't want use <code>$this->render</code> and separated View file, you just can use <code>renderContent</code>.");
}

Сохраним это и снова зайдем на http://localhost/index.php?r=site%2Fcomments. Теперь мы видим полноценную Yii2-страницу с хедером и футером.

Но, согласитесь, было бы очень неудобно вот так составлять сколько-нибудь крупный код страницы. Теперь мы видим, почему в паттерне MVC недостаточно одного Controller, а нужен еще и View, так что зря мы выкинули метод render(). Исправим эту ошибку.

0. Поправим Action:

public function actionComments()
{
    return $this->render('comments');
}

1. Зайдем в папку views (/basic/views/site/).

2. Создадим там новый файл по имени «comments.php». Это будет наш View.

3. Вставим этот код в файл:

<?php

/* @var $this yii\web\View */

use yii\helpers\Html;

$this->title = 'Комментарии';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-comments">
    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= "Здесь будет страница." ?>
    </p>
</div>

4. Важно: Сохраним этот файл в UTF-8 без BOM. Это можно сделать с помощью Notepad++ (меню «Кодировки», далее «Конвертировать в UTF-8 без BOM»).

5. Теперь зайдем на localhost/index.php?r=site%2Fcomments.

Все. Мы успешно создали скелет для наше страницы комментариев. Теперь давайте немного отдохнем от Yii2 и займемся БД.

Спроектируем БД MySQL

1. Зайдем в PhpMyAdmin (для XAMPP это папка http://localhost/phpmyadmin/).

2. В левом столбце нажмем ссылку «Создать», и создадим новую БД по имени «yii2db».

3. Теперь создадим таблицу по имени «tbl_comments» с 4 полями.

4. Столбец «id» — типа INT, автоинкрементный (отметим флажок «A_I»).

5. Столбец «nick» — типа TEXT.

6. Столбец «email» — типа TEXT.

7. Столбец «body» — типа TEXT.

8. Важно: еще мы должны сменить набор символов нашей таблицы на UTF-8:

ALTER TABLE tbl_comments CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Это нужно для поддержки кириллицы в комментариях.

Настроим Yii2 для использования MySQL

Наверно, вы знаете, что для любого подключения к MySQL мы должны задать: имя хоста сервера (домен или IP), имя юзера и пароль, а также порт (если это не дефолтный 3306). Удобно задать эти параметры глобально.

Также и БД MySQL лучше задать глобально, т.к. она обычно одна и та же на весь сайт.

Yii2 содержит готовый глобальный файл конфигурации MySQL, это db.php (/basic/config/db.php)

Для XAMPP (по умолчанию и в нашем случае), в нем должен быть такой код:

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2db',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

Собственно код формы


Модель — CommentsForm.php


<?php

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * CommentsForm is the model behind the comments form.
 */
class CommentsForm extends Model
{
    public $nick = "Anonymous";
    public $email;
    public $body;

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            /* nick and comment body are both required */
            [['nick', 'body'], 'required'],
            [['email'], 'email'],
        ];
    }

    /**
     * Appends post to DB
     * @return boolean whether the post is appended successfully
     */
    public function post()
    {
        if ($this->validate()) {
            $db = Yii::$app->db;
    
            $nickSafe = htmlspecialchars($this->nick, ENT_QUOTES, "UTF-8");
            $emailSafe = htmlspecialchars($this->email, ENT_QUOTES, "UTF-8");
            $bodySafe = htmlspecialchars($this->body, ENT_QUOTES, "UTF-8");
            
            $db->createCommand('INSERT INTO tbl_comments (`nick`, `email`, `body`)' .
                ' VALUES (\'' . $nickSafe . '\', \'' . $emailSafe . '\', REPLACE("' . $bodySafe . '", "\n", "<br />"));')->execute();
        
            return true;
        }
        return false;
    }
}

Вид — comments.php


<?php

/* @var $this yii\web\View */

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\data\ArrayDataProvider;
use yii\widgets\ListView;

$this->title = 'Comments';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-comments">
    <h1><?= Html::encode($this->title) ?></h1>

    <?php
    
    $db = Yii::$app->db;
    
    $comments = $db->createCommand('SELECT * FROM tbl_comments ORDER BY id DESC;')->queryAll();
    
    ?>

    <?php 
    $provider = new ArrayDataProvider([
        'allModels' => $comments,
        'pagination' => [
            'pageSize' => 10,
        ]
    ]);

        echo ListView::widget([
            'dataProvider' => $provider,
            'itemView' => function ($model, $key, $index, $widget) {
                if ($model['email']) {
                    return $this->renderDynamic('echo \'<b>' . $model['nick'] . '</b> (' . $model['email'] . '):<br>' . $model['body'] . '<br><br>\';');
                } else {
                    return $this->renderDynamic('echo \'<b>' . $model['nick'] . '</b>:<br>' . $model['body'] . '<br><br>\';');
                }
            },
            'emptyText' => 'No comments yet. Be the first!'
        ])
    ?>
    
    
    <p>
        <?php $form = ActiveForm::begin([
        'id' => 'post-comment-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
            'labelOptions' => ['class' => 'col-lg-1 control-label'],
        ],
    ]); ?>

    <?php
    
    $field = $form->field($model, 'nick', [
        'inputOptions' => [
            'placeholder' => $model->getAttributeLabel('nick'),
        ],
    ])->label(false);
    echo $field;
    
    $field = $form->field($model, 'email', [
        'inputOptions' => [
            'placeholder' => $model->getAttributeLabel('email'),
        ],
    ])->label(false);
    echo $field;
    
    $field = $form->field($model, 'body', [
        'inputOptions' => [
            'placeholder' => $model->getAttributeLabel('body'),
        ],
    ])->label(false);
    $field->textArea([
        'rows' => '6'
    ]);
    echo $field;

    echo '<div class="form-group">';
    echo '<div class="col-lg-11">';
    echo Html::submitButton('Send', ['class' => 'btn btn-primary']);
    echo '</div>';
    echo '</div>';
    
    ?>

    <?php ActiveForm::end(); ?>
    </p>
</div>

Контроллер — actionComments()


public function actionComments()
{
    $model = new CommentsForm();
    
    if ($model->load(Yii::$app->request->post()) && $model->post()) {
        return $this->refresh();
    }
    
    return $this->render('comments', [
        'model' => $model,
    ]);
}

Готовый результат (архив со всеми файлами) можно скачать здесь.

Комментарии (64)


  1. Mylistryx
    18.09.2015 09:21
    +8

    Я вам крайне рекомендую немедленно скрыть этот «пост», дабы не допустить «хабрасуицид»!


    1. Rou1997
      18.09.2015 12:06
      -4

      Что в нем плохого? Почему такая реакция?


      1. Mylistryx
        18.09.2015 12:38
        +3

        0. Автор изменил статью, но многого это не меняет!
        1. Это все есть в мануале (+100500 переводов и видео).
        2. «Зайдем в папку \basic\web\, выделим все ее содержимое (2 папки и 4 файла) и переместим его в корень» — ЗАЧЕМ??? Только потому, что автор не умеет настраивать виртуальный хост? Или мы решили дать доступ к внутренней структуре извне?
        3. Там же было «Удалим index-test.php...», т.е. не понимаем, для чего тесты — в утиль.

        Продолжать можно долго, но смысл остается прежним.


  1. vlreshet
    18.09.2015 09:23
    +2

    Для кого предназначена сия статья? В черновики её, пока не слили карму в ноль. ИМО, это осваивается за 20 минут чтения мануала, этому не место на хабре.


  1. VirmarY
    18.09.2015 09:27
    +6

    1. Зайдем в папку \basic\web\, выделим все ее содержимое (2 папки и 4 файла) и переместим его в корень.

    Вам за такое по рукам бить надо. Много и долго.


    1. Rou1997
      18.09.2015 12:11
      -13

      Чтобы не было такого, мне надо деньги платить, много и долго. «Летела ракета, упала в болото — какая зарплата, такая работа». Всему своя ниша на рынке. Для проекта на фрилансе за 2-5к (курсач студенту или некий временный бложик, сегодня создал, через неделю забросил) — сойдет.

      Что я сделал неправильно? Чем лучше оставить index.php в \basic\web\?
      Почему у некоторых такая реакция, как будто я тут Bolgenos впариваю?


      1. MisterX
        18.09.2015 12:17
        +3

        Потому что файлы проекта должны быть за вебрутом. А вебрут должен указывать на каталог basic\web\, ну или реврайтом можете все запросы туда перекидывать ( на момент разработки). Другими словами, пользователю должно быть доступно только то, что находится в basic\web\


      1. VirmarY
        18.09.2015 12:17
        +3

        Да, давайте будет плевать на структуру проекта. Угу. Потом ведь за вами никто с ним работать не будет.

        Чтобы обращаться к сайту по

        localhost или localhost/index.php
        переносить файлы вообще не надо. Добавить пару строчек в конфиг апача так сложно? Они в документации черным по белому написаны.


      1. grayfolk
        18.09.2015 12:19
        +3

        Чем лучше оставить index.php в \basic\web\?

        Интересно, вы действительно думаете, что разработчики Yii — дураки? Что, мол, додумались — создать какую-то там папку web и предлагают по умолчанию заходить на сайт по ссылке типа example.com/basic/web
        Не пришло в голову вам, что такая структура папок — неслучайна, и в ней есть смысл, и не просто смысл, а, пожалуй, определенная необходимость?


      1. grayfolk
        18.09.2015 12:22
        +3

        какая зарплата, такая работа

        То есть, если вы будете кодить для себя — то напишете вообще нерабочий код, так? Бесплатно же, чего там стараться?


      1. vlreshet
        18.09.2015 13:08
        +9

        Спасибо. Правда, спасибо что вы есть. Пока есть такие «программисты» которые пишут говнокод под предлогом «так платят же мало» — у меня всегда будет работа. Потому что девиз программиста должен быть «или сделать хорошо, или не делать». Платят мало? Не берись. Но писать говно, а потом ещё и доказывать всем что это нормально, это ж не «премиум класс» — это удел быдлокодеров. Одно дело когда человек старается со всех сил, учится, но пишет плохо (это нормально, через такое все проходят), а другое когда осознанно лепит что-то тёплое и мягкое, на глину не похожее.


      1. de1vin
        18.09.2015 17:19
        +1

        какая зарплата, такая работа

        А-та-та вам по рукам!
        Если не нравиться программировать — лучше не портить жизнь себе и окружающим, а найти занятие по душе.
        Хороший специалист отличается от простого работника тем, что он получает удовольствие от своего занятие. А деньги — приятный бонус.
        Везде важен опыт. Если считаете, получать опыт написания плохого кода — полезно, хотя бы не советуйте этого другим.


  1. MelkoV
    18.09.2015 09:46
    +3

    Кто, кто плюсует этот пост? Его надо немедленно удалить, пока его мало кто прочитал! Серьезно. Сплошные антисоветы, даже перечислять не буду. Автор уроки сделал на завтра?


    1. hlogeon
      18.09.2015 10:07
      +2

      Меня бы, наверное, это бы не так разозлило, если бы автор был 2000 года рождения, или еще моложе, но, по ту сторону экрана, судя по логину сидит студент-первокурсник… Graham James Campbell тоже первокурсник…


    1. berezuev
      18.09.2015 11:28

      но ведь завтра же суббота...)


      1. Core2Duo
        18.09.2015 11:31
        -1

        Так учебный день же всегда был.


  1. hlogeon
    18.09.2015 10:00
    +4

    Сначала прочитал комментарии, потом начал читать пост с мылслями: «Почему хабр сегодня такой злой в комментах?». Скажу честно — до конца я читать не стал, а желание «заткнуть» автора появилось с первых строк.
    Хабр сегодня добрее, чем надо… Автор, срочно удаляй. Это просто какой-то антипост, даже комментировать не буду…


    1. Rou1997
      18.09.2015 12:23
      -6

      Действительно, такая реакция, как будто я тут Bolgenos впариваю. Между тем, написал нормальный туториал для новичков в Yii2, да, для сколько-нибудь серьезного сайта это небезопасное убожество не годится, ну тык везде есть «эконом», «премиум» и «люкс», это для труженников пока что «эконома».

      > срочно удаляй
      Удалять не буду, вы хотите сделать гадость — вы ее и делайте.

      > Это просто какой-то антипост, даже комментировать не буду…
      А зря.
      Если бы кто-нибудь прокомментировал по делу, поправил бы меня хоть в основных местах, объяснил конструктивно — глядишь кому-то стало бы лучше, может до меня бы дошло что-то.
      А пока я вижу только поток злобы (а еще говорят «хабр для спокойных людей»).


      1. grayfolk
        18.09.2015 12:29

        нормальный туториал

        Как не надо делать. На некоторые минусы указал oledje
        А Cage, по-моему, дал наиболее верный совет.


      1. MelkoV
        18.09.2015 12:34
        +1

        1) Все-таки лучше использовать composer. (при установке через него хеш для кук пропишется автоматически)
        2) PHP-код очень не зря вынесли из www-дирректории. Ваш веб-сервер должен смотреть как раз на дирректорию «web».
        3) «index-test.php» удалять не надо, это мегаполезная вещь для разработки и тестирования.
        4) Используйте миграции, на надо «вручную» создавать и изменять сущности базы.
        5) Посмотрите на модели в yii, генераторы моделей, контроллеров, представлений.
        6) Посмотрите на хелперы.

        Это для начала.


      1. Core2Duo
        18.09.2015 12:39
        +1

        Это не нормальный туториал.
        Вы феноменально добавляете и извлекаете записи из базы. Начните с изучения ActiveRecord.
        Использовать в шаблонах конструкции типа

        <?php
        echo '<div class="form-group">';
        echo '<div class="col-lg-11">';
        

        тоже очень сурово.
        Вас минусуют не просто так. Описывать почему все плохо — практически переписать всю статью за вас. Разумеется, делать этого никто не хочет. Конструктивно вам oledje написал ниже. Более того, сейчас вас еще дополнительно сольют за вашу позицию
        Для проекта на фрилансе за 2-5к (курсач студенту или некий временный бложик, сегодня создал, через неделю забросил) — сойдет.

        И сольют не потому что все тут злые, а потому что каждый из нас получал (или получит) в наследство проект от такого вот «программиста». И исправлять это, знаете ли, так себе удовольствие.

        Действительно, такая реакция, как будто я тут Bolgenos впариваю

        Ваша ситуация хуже. Проводя аналогию с тем же болгеносом — это как если бы взяли Debian и написали статью на хабр, как его установить, а потом сделать так, чтобы абсолютно все в системе работало от рута, пользователи в том числе. Ну а что, удобно, никаких тебе Permission denied.
        Потому что ваша статья именно об этом — как выстрелить себе в ногу с помощью Yii2.


  1. Cage
    18.09.2015 10:43
    +5

    Автор, размести это где нибудь в своем личном блоге, а через годик — два почитай и посмейся над собой нынешним.


    1. Rou1997
      18.09.2015 12:29
      -8

      Суть статьи — не чтобы посмеялись, а в качестве самого базового и примитивного туториала по Yii2. Уровень студенческих курсачей где-то. Дырявая убогая фигня, зато быстро и сразу видны преимущества Yii2.
      Решил вот попробовать опубликовать на хабре, аудитория огромная, пусть злыдней большинство, но кому-то и нравится, а кто-то пытается что-то конструктивное писать (это самая малочисленная часть).
      Если имеете власть удалить, пожаловаться — так удаляйте, жалуйтесь, делайте гадость, в конце-концов не мне же за эту вашу гадость мучаться, когда она к вам вернется бумерангом.


      1. grayfolk
        18.09.2015 12:32
        +1

        Дырявая убогая фигня, зато быстро и сразу видны преимущества Yii2

        Преимущества в чем?? В написании «дырявой убогой фигни»? И к слову, преимущества перед чем?


      1. grayfolk
        18.09.2015 12:40
        +2

        пусть злыдней большинство

        Вы ошибаетесь. Люди, говорящие вам правду — вовсе не злыдни, пусть вам эта правда и обидна. Просто большинству тут, на хабре, неинтересно читать посты с вольным (мягко говоря) трактованием общедоступной официальной документации, да еще и обильно сдобренные кусками (уж простите) говнокода, показывающего, как делать не надо.


        1. Rou1997
          18.09.2015 12:55
          -8

          Преимущества Yii2 перед другими фреймворками и вариантом «чистые HTML+CSS+JS+PHP».

          Я не обязан жестко трактовать официальную документацию, какой там тогда смысл вообще в этой статье?
          Исходников и статей надо много, хороших и разных, а не только хороших. Грубо говоря, в говнокоде легче разобраться говнокодерам, а они тоже занимают свою нишу на рынке, например, умеют работать в крайне сжатые сроки, когда перед заказчиком выбор: либо говнокод, либо вообще ничего в такие сроки и за такие деньги.


          1. grayfolk
            18.09.2015 13:04
            +5

            в говнокоде легче разобраться говнокодерам

            Как-то всегда считал, что в говнокоде разобраться трудно кому бы-то ни было. А уж говнокодерам — и подавно, потому что чем код менее внятен — тем больше опыта нужно, чтобы его понять.

            А насчет рынка и денег — непонятно, вы хотели написать пост про Yii или все же более верным будет название по типу «Как быстро наговнокодить, чтобы срубить бабла по-легкому»?


  1. Core2Duo
    18.09.2015 10:46
    +1

    Блин, статья на самом интересном месте заканчивается!!!11 Автор, пиши еще, я очень заинтригован как сделать Очень Простые Комментарии с Пагинацией на Yii2! Особенно мне понравилась часть статьи про загрузку Yii. Такого я даже в самых подробных мануалах не видел.


    1. Rou1997
      18.09.2015 12:50
      -5

      Боюсь, не получится еще писать сюда — не дадутЪ.
      А жаль, трафик-то огромный, скольким бы нормальным людям мог помочь.
      Вернусь на CodeProject, значит.


      1. NorthDakota
        18.09.2015 13:20
        +7

        Мне кажется, это был сарказм…


        1. Core2Duo
          18.09.2015 15:45
          -1

          Когда я писал этот комментарий, статья заканчивалась на фразе:

          Но как actionAbout() генерирует полный HTML-код страницы? Давайте посмотрим:
          Видимо, автор что-то менял. Но насчет «заинтригован» я не соврал, я действительно ждал продолжения. И что самое грустное, по соотношению количество символов/количество фейспалмов эта недописанная статья была в разы лучше, чем готовая.


  1. oledje
    18.09.2015 11:55
    +4

    Каждый начинал с этого, поэтому немного критики по делу:

    • Используйте Composer. Это легче чем скачать и распаковать архив, правда.
    • Забудьте про phpMyAdmin и узнайте что такое миграции.
    • Попробуйте установить IDE (PhpStorm, NetBeans).
    • Active Record — простой и мощный инструмент для работы с данными в базе данных.

    Еще много всего, но в целом, если бы вы прочли мануал перед написанием статьи, она вышла бы куда лучше.


    1. seokirill
      18.09.2015 12:01
      -5

      Вместо манкала для первого знакомства с yii с натяжкой покатит


      1. oledje
        18.09.2015 12:09
        +4

        Для знакомства? Ни в коем случе! Это же сборник вредных советов. Я повторюсь, для знакомства нет ничего лучше мануала, написанного самими разработчиками.


    1. Rou1997
      18.09.2015 12:45
      -8

      Ну хоть что-то хоть немного вменяемое написали.
      1) Насчет композера не соглашусь, там вроде учетку Github надо иметь, логин-пароль от нее помнить… Уже это осложняет процесс скачивания.
      2) Спс, гляну.
      3) Железо мощное надо, а то PhpStorm, как и прочая продукция от JetBrains, будет тормозить невыносимо. NetBeans тоже тяжеловат.
      4) Спс, гляну.


      1. oledje
        18.09.2015 12:54
        +1

        там вроде учетку Github надо иметь, логин-пароль от нее помнить…

        Создать аккаунты на GitHub и Stackoverflow — одно из первых действий которые должен сделать начинающий разработчик.


        1. grayfolk
          18.09.2015 13:05
          +3

          Ну то начинающий. А здесь, судя по пафосу — гуру ))) Чукча не читатель, чукча писатель таки да.


      1. SerafimArts
        18.09.2015 13:50

        У меня на нетбуке (HP Mini, Интел Атом) шторм летал. Аккумулятора хватило на поездку из Мск в Краснодар на поезде с одной подзарядкой (это больше дня езды). Так что «мощное железо» — понятие очень относительное.


      1. Metus
        18.09.2015 14:06

        Ну, категорично так говорить про ide я бы тоже не стал, но только если вы в состоянии настроить nodepad++ так, чтобы он проверял хотя бы codestyle на лету.


  1. Sirian
    18.09.2015 11:57
    +6

    я плачу(

    $db->createCommand('INSERT INTO tbl_comments (`nick`, `email`, `body`)' .
                    ' VALUES (\'' . $nickSafe . '\', \'' . $emailSafe . '\', REPLACE("' . $bodySafe . '", "\n", "<br />"));')->execute();
    


    1. Rou1997
      18.09.2015 12:34
      -7

      Лучше не плачьте, а поясните, чем плохо, предложите лучшее. Если в посте все совсем плохо — напишите свой, а сюда ссылку.
      Кого-то мой вариант устроит лучше, кого-то — ваш. Всему свое применение и своя ЦА, даже грузовику с навозом. Серьезно.


      1. grayfolk
        18.09.2015 12:41
        +1

        поясните, чем плохо, предложите лучшее

        Вам поясняют и поясняют — да только смысл? Вы на эти пояснения рассказываете про свою ЦА ))


      1. Graid
        18.09.2015 12:59
        +2

        По одной строчке кода

        1. Не понимаете принципов работы с моделями в yii2.
        2. Не знаете как правильно составлять безопасные запросы.
        3. Изменяете данные средствами БД.


  1. seokirill
    18.09.2015 12:00

    Расстраивают ошибки грамматические. Писал в торопях?

    Пример:
    «давайте перейдем к практики»


    1. Core2Duo
      18.09.2015 12:10

      А сами-то :)


      1. seokirill
        18.09.2015 13:29
        +1

        Клянусь, написал «второпях», а автоисправление на телефоне исправило на раздельное написание. Я и подумал, что я дурак.


    1. MelkoV
      18.09.2015 12:23
      +3

      В этом посте Вас расстраивает только это?)))


    1. Rou1997
      18.09.2015 12:40
      -7

      Да, второпях. И как теперь видим, правильно сделал. Получил хреновый результат, но хоть время и силы сэкономил.
      Нормальных людей, кто хочет глянуть, что такое Yii2 и быстренько создать на нем кривые простенькие комменты, или кто уже все знает и ему все равно до статей такого уровня, — таких тут очень мало…
      Премодерация — медленная…
      Комменты — только раз в 5 минут можно писать…
      Зато понтовитая злоба с презрением — аж потоком хлещет…
      По воробьям из пушек, короче.


      1. Mart_Slaaf
        18.09.2015 12:43
        +5

        Я начинаю подозревать, что вы тролль. Хотя и несколько своеобразный.


      1. VirmarY
        18.09.2015 12:43
        +4

        Злоба здесь не хлещет. Хабр — технический ресурс. И он призван учить хорошему, а не плохому. К сожалению ваша статья не попадает в категорию «учить хорошему».


      1. grayfolk
        18.09.2015 12:45
        +2

        А где вы злобу видите? ))

        Получил хреновый результат

        То есть, вы считаете, что хреновый результат достоин публикации на профессиональном ресурсе? Скажите, вы придете в магазин и купите там, например… ну, скажем, торт. Да, торт. А потом, дома выяснится, что торт местами не очень-то пропечен, крем протух и прочие прелести. А в магазине, куда вы, безусловно, вернетесь после лечения, вам скажут, что пекарь торопился. Времени было мало, потому и коржи не допеклись и крем новый делать было некогда — нашли что-то позапрошлогоднее. Зато быстро сделали, что уж там. Да тем более, какая зарплата — такая и работа.


        1. hlogeon
          18.09.2015 13:16
          +1

          И цлелевую аудиторию этот торт, заметьте, нашёл!


          1. Mylistryx
            18.09.2015 13:18
            +2

            Этим «тортом» разве что троллей кормить!


  1. Rou1997
    18.09.2015 13:07
    -12

    Значит так, ситуация:
    1) толку от поста не получилось, ЦА он практически не нашел, одни старперы, на которых он как бы и не рассчитывался
    2) в комментариях конструктивной беседы не получается, только дерьмо льется, по стандартной схеме — «нибизапасна-гавнакод-убейсяабстену-минус-минус-минус-даэтапростатроллинг»
    3) при всем этом, должно ждал премодерации (примерно столько же, как и на гораздо более адекватном CodeProject), да еще и дебильное ограничение «1 коммент в 5 минут»; плюсануть более-менее нормальные комменты я тоже не могу

    Вывод: не годен хабрахабр для таких постов, эксперимент провалился, возвращаюсь на CodeProject.
    Старперы и модЫры могут радоваться, могут все вместе дружно уничтожить мой пост и мой профиль подобно стае саранчи (если так охота гадость сделать, так лучше уж мой пост удалить, я на него нарочно затратил мало сил и времени — именно для такого случая), могут что хотят делать.
    Я все, ушел.


    1. hlogeon
      18.09.2015 13:39
      +7

      Слушай, ну это уже не смешно! Тебе даже разжевали что к чему. Я понимаю, что бесполезно, но астрологи объявили неделю кормежки троллей, потому начну.

      Yii2 — фреймворк для PHP, позволяющий рекордно быстро создать такие веб-сайты и компоненты веб-сайтов

      То есть я не могу быстро создать консольное приложение на Yii2, так? Рекордно быстро? Откуда такие данные? На Laravel бложик я создам быстрее.
      где ключевую роль играют формы ввода (тэг input), списки и таблицы с пагинацией и, конечно же, база данных MySQL.

      У меня есть приложение, в котором нет ни одного списка, таблицы, никакой пагинации и, тем более, формы ввода и используется MongoDb в качестве БД. Да, оно на Yii2.

      Вы создаете все это сами, имея при этом полную свободу действий, как и с «голыми» HTML&CSS&JS&PHP&MySQL.

      Нет, не полную, нет не как с голыми HTML&CSS&JS&PHP&MySQL. Вы знаете что такое фреймворк? А в чем отличае фреймворка от библиотеки? Почитайте хотя бы тут.

      Также, Yii2 поддерживает AJAX

      Если бы вы хоть немного понимали что такое AJAX вообще, вы бы не добавили такую строку. Какое отношение Yii2 имеет к поддержке AJAX?

      Давайте попробуем Yii2 Framework в деле, придумав какую-нибудь более-менее реалистичную задачу, для которой бы он подходил.

      Дает нереалистичную задачу, для которой намного больше подошло бы готовое решение.

      Также, я рекомендую юзать Yii2 именно с БД MySQL, хотя он может выполняться вообще без запущенного сервера MySQL, а в качестве БД использовать, например, SQLite.

      И почему такая рекомендация, в чем причина? Почему использовать Yii2 с Redis или PostgreSQL Вы мне не рекомендуете?

      Yii2 представляет собой готовый шаблон веб-сайта («application template»)

      Каким образом слово application вы конвертировали в сайт? Что означает словосочетание «готовый шаблон»? Что такое «неготовый шаблон»?

      Качаем Yii2

      Про композер вам написали выше. Использовать стоит именно его.

      Если у вас XAMPP…
      Если у вас Ampps…
      Если у вас удаленный сервер…

      То есть настраивать сервер вы не научились и решили, вместо этого манипулировать местоположением приложения? Интересно…

      Очень, очень некрасиво, когда index.php лежит не в корне сайте. Давайте исправим это.

      Ну это просто выше моих сил и сил еще нескольких комментаторов, которые пытались Вас образумить. Так делать НЕЛЬЗЯ(точнее можно, но не так и только в том случае, если ты понимаешь что и для чего ты делаешь). Ничего некрасивого в том, что index.php лежит не в корне нет. Я бы сказал — наоборот. Потратьте 10 минут и изучите основные параметры конфигурации вашего веб-сервера… Как бонус получите отличный способ ничего не удалять\перемещать в проекте, а за секунду «учить» веб-сервер смотреть куда надо.

      3. Файл и "/index-test.php" папку "/basic/web/" просто удалим. Они нам просто не нужны.

      Выше всё уже сказали

      Блин, чувак, нет. Я думал, я осилю, но, ведь до основной части статьи я еще не дошел, а уже написал столько, что на 10 новых статей хватило бы.


      1. VirmarY
        18.09.2015 13:46
        +4

        И это все безобразие он еще и на английский не поленился перевести.


        1. Core2Duo
          18.09.2015 15:35
          +3

          Автор упорный :) Не самая плохая черта, лишь бы в нужное русло пошла. Комментарии оттуда:

          What is this about? I highly recommend newbies to SKIP this article! It's not only useless but it's dangerous! Author, you'd better add «BAD PRACTICE» to the title!

          Как оказалось, не только хабр «злой и плохой».


    1. Bringoff
      18.09.2015 13:43
      +4

      Мдя. После статьи сдержался, не трогал карму, а почитал твои комменты — ну нет, прямо просишь же.
      1. Как хорошо, что здесь нету целевой аудитории данного… опуса.
      2. На конструктивные комментарии ты отвечаешь не совсем адекватно.
      3. Это не премодерация, а песочница. Хоть бы правила почитал для приличия.
      В комментарии ограничиваются народу с отрицательной кармой, троллям, если хочешь. Можешь и до одного коммента в неделю дожить, почему бы и нет. Опять же, надо было правила немножко изучить.


  1. SerafimArts
    18.09.2015 13:25

    > Yii2 требует PHP 5.4.0 или выше. Старые версии PHP (такие, как 5.2 или 5.3 в Денвере) не поддерживают некоторые синтаксические фичи, примененные в Yii2.

    На всякий случай: PHP 5.4 устарел и больше не поддерживается: http://php.net/eol.php PHP 5.5 на уровне поддержки в виде критических багов: http://php.net/supported-versions.php но в течении ~года тоже будет деперекейтнут.


  1. Strate
    18.09.2015 14:00

    Вот за что я люблю Symfony 2, так это за то что он просто не позволит вам так говнокодить.


    1. Big_Shark
      18.09.2015 14:02
      +3

      Ошибаешься, как же ты ошибаешься.


    1. VirmarY
      18.09.2015 14:05
      +1

      Еще как позволит.


  1. MetaDone
    18.09.2015 14:26
    +1

    Старые версии PHP (такие, как 5.2 или 5.3 в Денвере)

    фраза-детектор, учитесь настраивать рабочее окружение
    Не поддерживающую регистрацию и авторизации (для простоты)
    Не поддерживающую AJAX для получения и постинга комментов (для простоты)

    Абсолютно бесполезную, да?

    Заметил, что из песочницы последнее время столько бесполезной информации, связанной с php, что становится стыдно


  1. michael_vostrikov
    18.09.2015 17:29
    +1

    Поскольку автор выразил нежелание скрывать статью в черновики, у меня появилось желание вкратце написать для новичков, которые сюда зайдут, как все-таки надо делать то, о чем написано в статье. Начал писать коммент, но понял, что просто повторяю документацию. Поэтому напишу, как делать не надо. А новичкам рекомендую прочитать всю ветку Getting started, начиная отсюда.

    Не нужно менять структуру папок фреймворка. Добавляем в системный файл hosts строку «127.0.0.1 mysite.local». В настройках хостов апача пишем примерно так:

    Скрытый текст
    <VirtualHost mysite.local:80>
        RewriteEngine on
        ServerName mysite.local
        DocumentRoot "<path_to_your_sites>/mysite.local/web"
        <Directory "<path_to_your_sites>/mysite.local/web">
            AllowOverride all
            Order Allow,Deny
            Allow from All
            Require all granted
        </Directory>
    </VirtualHost>