Демо блог на Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Демо блог на Yii2

Сообщение vova07 »

Привет всем!
Собственно, хочу поделится ссылкой на статью: http://habrahabr.ru/post/185236/
Надеюсь будет полезно и интересно!
Сильно не критикуйте, времени на знакомство было мало. Полно работы сейчас.

От себя хочу пожелать команде разработчиков успехов, и терпение, в развитие такого хорошего продукта.

UPD:
Ссылка на Github
Ссылка на демо
Последний раз редактировалось vova07 2014.01.25, 12:14, всего редактировалось 3 раза.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Демо блог на Yii2

Сообщение futbolim »

конечно прочитаем на досуге.
надеюсь дадут Вам инвайт, который Вы так хотели )
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

Спасибо!
Последний раз редактировалось vova07 2013.07.01, 18:23, всего редактировалось 1 раз.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Демо блог на Yii2

Сообщение futbolim »

расскажите как они его дают. статья - по любому инвайт ? или еще что то...
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Демо блог на Yii2

Сообщение samdark »

Спасибо за статью.

futbolim
Хорошая статья — с большой вероятностью инвайт. Если, конечно, он есть у тех, кто её прочитает. У меня вот все кончились пару лет назад, а новые дают только за суперстатьи, которые я пиши редко.
ErgoZ
Сообщения: 1
Зарегистрирован: 2013.07.02, 09:14

Re: Демо блог на Yii2

Сообщение ErgoZ »

futbolim
В правилах хабра всё более менее подробно написано. Можно получить несколькими путями.
1) Если статья действительно хорошая (в песочнице) то модератор (он же НЛО) может сам перевести вас из Рид Онли.
2) Если кому-то из читателей у кого есть инвайт и кого вы удивите статьёй, то он может вам подарить его (применяется в настройках учётки)
3) Раньше давался инвайт если статья набирала вроде бы 50 кармы, сейчас не знаю работает ли это правило.

Моя статья про домашнюю мини-климат-контроль систему понравилась модераторам, поэтому меня НЛО заапрувил, к примеру.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Демо блог на Yii2

Сообщение futbolim »

благодарю
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Демо блог на Yii2

Сообщение kukuruku »

суховато для статьи
события плохо раскрыты
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

Про статью не спорю.
А почему события плохо раскрыты? Я не спорю, я это делал в свободное время, хотя в новой версии с событиями работать то очень просто, и раскрывать там особо нечего.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Демо блог на Yii2

Сообщение kukuruku »

Код: Выделить всё

файл app\modules\users\models\User
...
public function afterSave($insert)
    {
               // Создаём событие
        $event = new ModelEvent;
        $this->trigger(self::EVENT_NEW_USER, $event);

        parent::afterSave($insert);
    }
...

файл app\modules\users\controllers\DefaultController
...
public function actionSignup()
    {
        $model = new User();
        $model->scenario = 'signup';
        if ($model->load($_POST)) {
            if (!$this->module->activeAfterRegistration)
                                // Задаём наш обработчик событий, для события [[EVENT_NEW_USER]]
                $model->on($model::EVENT_NEW_USER, array($this->module, 'onNewUser'));
            if ($model->save()) {
                Yii::$app->session->setFlash('success');
                return Yii::$app->response->refresh();
            }
        } else {
            echo $this->render('signup', array('model' => $model));
        }
    }
...
из примера не понятно что и зачем, что за переменная EVENT_NEW_USER, для чего нужен ModelEvent, что за параметр onNewUser
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

Из конкретно данного примера согласен что для новичков что-то возможно непонятно, но если честно за основу, статья берет готовый блог, где все это можно подсмотреть, по этому кода так мало. Это больше обзор, чем руководство.
Но раз уж возникают вопросы, напишу более подробно, маленькую инструкцию.

Итак, чтобы добавить своё событие в Yii 2, нам нужно сделать следующие вещи:
1) Определить событие - подразумевается определение момента когда событие должно сработать.
2) В нужном месте повесить на наше событие, обработчик.
3) Написать логику самого обработчика. (Хотя это уже не относится к событиям как таковы)
Все!

Теперь на простом примере все разберём. (Пример берём из демо приложения)
Задача: При регистрации нового пользователя, нужно отправлять код для подтверждения электронного адреса. Письмо должно отправятся моментально.

1) Определяем событие:

Код: Выделить всё

Файл модель пользователя: \app\modules\users\models\User
...
const EVENT_NEW_USER = 'newUser'; // Просто определяем имя нашего события в виде константы. По принципу Yii 2. (Это можно не делать на простых проектах)
...
// Сообщение мы будем отправлять после того как пользователь был добавлен в базу. таким образом событие добавляется в функцию: afterSave()
public function afterSave($insert)
{
    $event = new ModelEvent; // Тут мы определяем параметр нашего события. То что мы передаём. В данном случае передаётся значение $this, то есть текущая сущность модели (новый юзер) со всеми сохранными полями
    $this->trigger(self::EVENT_NEW_USER, $event); // Тут мы вызываем непосредственно наше событие а именно EVENT_NEW_USER что = "newUser", и передаём наш $event параметр, который можно будет потом использовать в обработчике событий.

    parent::afterSave($insert); // Вызываем родительскую функцию afterSave()
}
На этом все с определением события. переходим к следующему пункту.

2) Подключение обработчика для нашего события:

Код: Выделить всё

 // Файл контроллера: \app\modules\users\controllers\DefaultController
public function actionSignup()
{
    $model = new User();
    $model->scenario = 'signup';
    if ($model->load($_POST)) {
        if (!$this->module->activeAfterRegistration)
            $model->on($model::EVENT_NEW_USER, array($this->module, 'onNewUser')); // Тут мы задаём непосредственно обработчик для нашего события. $model::EVENT_NEW_USER это у нас та же константа что мы объявили в нашей модели пользователей, что снова = "newUser". array($this->module, 'onNewUser') это у нас конкретно обработчик. Есть несколько возможностей его назначать. Смотрите ниже или на хабре. В данном случае, массив параметр означает, что нужно брать метод: "onNewUser", из модуля к которому относится наш текущий класс. В нашем примере это: \app\modules\users\Users
        if ($model->save()) {
           Yii::$app->session->setFlash('success');
           return Yii::$app->response->refresh();
        }
    } else {
        echo $this->render('signup', array('model' => $model));
    }
}
Есть несколько способов привязки обработчика:

Код: Выделить всё

function ($event) { ... }         // Анонимная функция
array($object, 'handleClick')    // $object->handleClick()
array('Page', 'handleClick')     // Page::handleClick()
'handleClick'                    // глобальная  функция handleClick()    
3) Описание самого обработчика:

Код: Выделить всё

//Файл нашего модуля: \app\modules\users\Users
// В нем мы создаём наш метод, который мы определили как обработчик
public function onNewUser($event) // у обработчика должен быть задан аргумент, который хранит в себе переданный объект события
{
    $model = $event->sender; // Как и в первой версии, мы должны обработать наше событие, чтобы объект можно было использовать. После этого просто выполняем нужные нам действия.

    $url = Yii::$app->urlManager->createAbsoluteUrl('users/default/activation', array('username' => $model['username'], 'key' => $model['activkey']));
    $message = 'Thank you for registering. Your activation <a href="' . $url . '">url</a>.';
    
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

    return mail($model['email'], 'Email confirmation', $message, $headers);
}
На этом все. Теперь при создании нового пользователя, на его почту, будет отправлен код активации. (В нашем примере, это случится если параметр $activeAfterRegistration = true)

Надеюсь так более понятно и удобно для всех.

Спасибо!
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Демо блог на Yii2

Сообщение lancecoder »

я проще опишу, события как в Yii, только теперь объявляем как в Jquery через on, а вызываем trigger
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

lancecoder писал(а):я проще опишу, события как в Yii, только теперь объявляем как в Jquery через on, а вызываем trigger
Я так и написал на хабре, кроме Jquery, но наверное не совсем понятно новичкам, нужно пощупать, чтобы все понять. )
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Демо блог на Yii2

Сообщение kukuruku »

vova07 писал(а):
lancecoder писал(а):я проще опишу, события как в Yii, только теперь объявляем как в Jquery через on, а вызываем trigger
Я так и написал на хабре, кроме Jquery, но наверное не совсем понятно новичкам, нужно пощупать, чтобы все понять. )
согласен что лучше бы в начале блока упомянуть про аналогию с jquery

а вот еще не совсем понятная строка, с оборотом "в нужном месте"
Для того чтобы определить событие достаточно в нужном месте вызвать «trigger()» функцию, а уже потом в нужном месте задать для события обработчик.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

kukuruku писал(а):а вот еще не совсем понятная строка, с оборотом "в нужном месте"
Если заговорили про Jquery, то то что непонятно в данной строке можно объяснить так: все похоже на Jquery.
Определить место события - подразумевает, определить для себя когда это событие должно сработать. Перед сохранением, после сохранения, возможно нам нужно перед валидацией. То есть мы просто определяем "когда" это событие будет срабатывать, а в кодовом формате это "где".
Тоже самое с обработчиком - мы определяем когда он будет вызван, при регистрации, после авторизации, после добавления поста, это снова "когда" будет срабатывать, но в коде это "где".
Спасибо!
RuZzz
Сообщения: 85
Зарегистрирован: 2011.10.16, 23:43

Re: Демо блог на Yii2

Сообщение RuZzz »

а как вам удалось сделать структуру приложения с модулями?
как то сходу в доке не нашёл.
или вы структуру модулей вручную создавали?

а вроде дошло, там же gii генерирует модули
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

Все создавал вручную, по комментам фрейма. На момент когда я делал обзор, небыло ни gii ничего, хотя и сейчас он только на WIP стадии, так что еще рано его юзать.
Сейчас сильных различий между модульной структурой первой версии и второй почти нет, так что вполне можно руководится интрукцией первой весии.
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Re: Демо блог на Yii2

Сообщение belkod »

Что-то не срабатывает этот триггер, вываливается в ошибку.
/common/modules/users/models/User.php

Код: Выделить всё

    const EVENT_NEW_USER = 'newUser';

    /**
     * It's just an exemple of an own event. In realy app you can use [[self::EVENT_AFTER_INSERT]]
     */
    public function afterSave($insert)
    {
        $event = new ModelEvent;
        $this->trigger(self::EVENT_NEW_USER, $event);

        parent::afterSave($insert);
    }
 
/common/modules/users/Users.php

Код: Выделить всё

namespace common\modules\users;

use Yii;
use yii\base\Module;

class Users extends Module
{
    /**
     * If is false, after user registration wi'll be send a confirmation email.
     */
    public $activeAfterRegistration = false;

    /**
     * @var integer number of records per page
     */
    public $recordsPerPage = 10;

    /**
     * This method is called after new user inserting. This is an exemple of [[Event]] $hendler
     * @param ActiveRecord app\modules\users\models\User $event
     * @return boolean or mail() error
     */
    public function onNewUser($event)
    {
        $model = $event->sender;

        $url = Yii::$app->urlManager->createAbsoluteUrl('users/activation', array('username' => $model['username'], 'key' => $model['auth_key']));
        $message = 'Thank you for registering. Your activation <a href="' . $url . '">url</a>.';

        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

        return mail($model['email'], 'Email confirmation', $message, $headers);
    }
} 
Ошибка:
PHP Warning – yii\base\ErrorException
call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object

в:
/vendor/yiisoft/yii2/yii/base/Component.php
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Демо блог на Yii2

Сообщение vova07 »

Если честно не могу точно ответить чем вызвана данная проблема, но могу сказать одно: код очень устарел и сейчас он уже не правильный с учетом новых коммитов.
По просьбам многих пользователей я начал собирать новое демо приложение, оно будет готово примерно через 2-3 дня. На данный момент могу сказать что новое приложение будет содержать готовый модуль пользователей, блог с категорийми, и комментарии с ajax поддержкой + для всего этого админка. Если есть время подождите пожалуйста пару дней, пока соберу приложение, после смогу ответить на все вопросы.
Спасибо!
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Re: Демо блог на Yii2

Сообщение belkod »

Да я уже понял, что код старый в блоге, т.к. при запуске там пошли ошибки сразу же.
Я начал собирать на Advanced сборке. И вот при использовании модуля users из блоговой сборки происходят такие штуки.
Хотя в Advanced уже есть авторизация и регистрация.
Ответить