vorst.ru - Как определить событие в Yii приложении
Статьи из рубрики about-sites

Рефакторинг кода авторизации

Использование аккаунта социальной сети для авторизации

Авторизация с помощью социальной сети не должна зависеть от типа аккаунта. В предыдущем посте используется код, где в конструкторе классa common/components/SocialContact.php выполняется оператор switch. При добавлении обработчика для новой социальной сети, придется дописывать код, при этом меняя класс.

Перепишем конструктор так, чтобы класс не нужно было менять и он не зависел от типов социальных сетей.


Как подключить авторизацию через аккаунт

OAuth2 авторизация с использованием аккаунта

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


Модерация и вывод комментариев

Ответ на комментарии и рекурсивный вывод

На сайте оставили комментарий, вы ответили. Оппонент что-то еще уточнил, вы опять ответили. Цепочка из нескольких вопросов/ответов, которую нужно представить в виде лестницы.

Отступы можно выводить в обычном цикле, но если отступы формируются с помощью блочных элементов и css, то проще использовать рекурсию.


Модуль для управления блогом

Блог включает управление комментариями, пользователями, rbac

Новости, сообщения, описания - это все статьи, а статьи - это блог. Блог является важной составляющей любого сайта.

Блог настолько важен, что самая популярная CMS на планете WordPress - это блог.

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


Как отправить email с сайта и не попасть в спам

Как указать реального отправителя отправляя сообщение с сайта

При создании сайта почти всегда предусматривают форму обратной связи.

Допустим у вас на сайте есть форма обратной связи и посетитель заполнил в ней поле Name и поле Email. Логично отправить сообщение с сайта от имени посетителя на адрес администратора сайта или, например, адрес отдела маркетинга.

Но так отправить сообщение не получится. При отправке сообщения с сайта, нужно чтобы отправитель имел тот-же домен, что и сайт.


Как определить правило для RBAC

Выполнять действие или нет

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

Если вы Админ, то у вас есть общее разрешение create. Оно дает право добавлять данные к любым моделям. Если вы Автор, то такое разрешение давать не стоит. Автор не может, например, добавить новую рубрику.


Определение разрешений на доступ и ролей для пользователей

Задание доступа только к определенным действиям

Разработка бекенда сайта часто подразумевает ограничение прав при редактировании контента.

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


Как подключить RBAC

Подключение ролевого доступа

В большом количестве задач необходимо в backend-части приложения разрешать одним группам пользователей выполнять только определенные действия. Другим может быть разрешено чуть больше. И так далее, до админа.

Именно распределение прав для групп пользователей и будет рассмотрено в паре-тройке статей. В качестве примера будет использоваться всего две роли.


Как определить и вызвать событие

Пример события

События бывают разные. Например, привезли хлеб и все, у кого он закончился, потянулись в магазин. То есть выполнили одно и тоже ответное действие. Выдали зарплату и все, естественно, тратят ее по разному.

В первом случае обработчик события один, во-втором их несколько. Но принцип один - наступило событие, надо действовать.


Пример работы с сессией

Если читатель хочет вспомнить, что просмотрено и прочитано

В магазинах это давно норма. Все, что вы просмотрели, у вас перед глазами. Почему бы не сделать тоже самое для блога - вывести заголовки просмотренных постов и время, которое потрачено на листание и чтение каждого поста.


Как разместить контент на двух языках

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

Для перевода интерфейса в Yii применяется таблица из двух колонок. В первой колонке записываются слова или фразы на английском, во второй - перевод на русском. Строки отсортированы по первой колонке. В тексте программы вместо нужного слова или фразы вызывается функция t('Word or Phrase'). Если текущий язык сайта английский, функция возвращает параметр, иначе соответствующий перевод.

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



Поиск



Как определить и вызвать событие

Пример события

События бывают разные. Например, привезли хлеб и все, у кого он закончился, потянулись в магазин. То есть выполнили одно и тоже ответное действие. Выдали зарплату и все, естественно, тратят ее по разному.

В первом случае обработчик события один, во-втором их несколько. Но принцип один - наступило событие, надо действовать.


    Поделиться

Нужно сохранять список статей, просмотренных посетителем сайта. Статья считается просмотренной, если загружен ее контент. Это происходит в двух случаях: при переходе к статье и при динамической загрузке. Два одинаковых события, на которые должна последовать одинаковая реакция.

Начнем с определения события. И сразу вопрос - где определять? Вариант может быть любой: модель, контроллер, любой другой класс, унаследованный от Component. Попробуем начать с модели.

Model

Сначала определим и подключим событие в common\models\Post.php.

class Post extends ActiveRecord
{
    const EVENT_POST_WAS_READ = 'post_was_read';
    const MAX_POST_TRACE = 10;
    public function init()
    {
        parent::init();
        $this->on(self::EVENT_POST_WAS_READ, [$this, 'keepTrace']);
    }

При регистрации передаем имя события и обработчик - имя метода объекта $this. Определим метод здесь же, в модели.

    /**
     * Save current time and post ID to keep user trace. 
     */
    public function keepTrace($event)
    {
        $session = \Yii::$app->session;
        // if not in a session, make empty array
        $trace = $session->has('trace') ? json_decode($session->get('trace')) : [];
        // if more then max elements then delete first
        if(count($trace) == self::MAX_POST_TRACE)
            array_shift($trace);
        // keep trace
        $trace[] = ['time' => time(), 'id' => $this->id];
        $session->set('trace', json_encode($trace));
    }

Controller

Теперь можно вызывать событие в контроллере frontend\controllers\PostController.php.

    public function actionView($id)
    {
        $model = $this->loadModel($id);
        $model->trigger(POST::EVENT_POST_WAS_READ);
        return $this->render('view', [
            'model' => $model,
        ]);
    }
    public function actionGetContent($id)
    {
        $model = $this->loadModel($id);
        $model->trigger(POST::EVENT_POST_WAS_READ);
        echo '<hr>' . $model->content;
    }

Заключение

Вообще-то ничто не мешает нам вызвать метод keepTrace напрямую. Но просмотр поста, это событие. Тут не о чем спорить :)

Оставить комментарий

Только авторизованные пользователи могут оставлять комментарии. Пожалуйста авторизуйтесь или пройдите регистрацию.