<rmcreative>

RSS
  1. Yii 1.1 Application Development Cookbook, финальная версия

    26 августа 2011

    Yii 1.1 Application Development Cookbook Cover

    Вот и вышла финальная версия моей книги про Yii. Про завершение работ я рано радовался. Оказалось, что процесс далеко не закончен и впереди ждала стилистическая правка, ревью и куча других вопросов. Пришлось очень неслабо напрячься, но результат радует: книга вышла не в Сентябре, как планировалось, а в Августе.

    По этому поводу обновил сайт книги:

    Кстати, с оценкой объёма вышла промашка. В финале 392 страницы. Изначально ожидалось около 300.

    Да, скорее всего, выложу там же одну главу в открытый доступ.

    Про процесс написания этой книги можно почитать на хабре.

    34 комментария
  2. CodeIgniter 2.0.3, GitHub и Reactor

    20 августа 2011

    Зарелизился CodeIgniter 2.0.3. Сам по себе релиз вполне обычный, но при этом произошли две интересные вещи:

    1. Репозиторий переехал с BitBucket (Mercurial) на GitHub (Git). Похоже, скоро вообще все популярные фреймворки будут развиваться именно там.
    2. Наконец, CodeIgniter в полной мере стал фреймворком сообщества: Reactor (ветка CI, развиваемая группой разработчиков из сообщества) стала основной.

    Официальный пост про миграцию на GitHub

    3 комментария
  3. PhpStorm Database Navigator

    19 августа 2011

    При работе с базой данных удобно рассматривать её структуру визуально. В идеале прямо из IDE. Хорошо-бы ещё и выполнять SQL и рассматривать результаты выполнения запроса табличкой в той же IDE. Данные задачи замечательно решаются в PhpStorm установкой плагина Database Navigator. Для тех, кто никогда не работал с Java и JDBC настройка не совсем тривиальна. Покажу как настроить для MySQL:

    1. Идём в IDE Settings → Plugins → Available.
    2. Ищем Database Navigator, делаем Download and Install.
    3. Сливаем с этой страницы архив коннектора JDBC. Находим там .jar и извлекаем в удобное место.
    4. Перегружаем IDE.
    5. Project Settings → Database Navigator → Connections.
    6. Добавляем соединение, в Driver Library прописываем путь к .jar.
    7. В URL прописываем jdbc:mysql://127.0.0.1:3306. Сохраняемся.

    Всё, теперь можно пользоваться:

    • Из главного меню DB Navigator → Open SQL Console… доступен редактор SQL с возможностью запуска этого самого SQL.
    • Если открыть вкладку DB Browser слева, получим неплохой способ визуально рассматривать схему.
    34 комментария
  4. Выбрать посты, содержащие все теги из списка

    12 августа 2011

    В этом блоге примерно с середины 2007-го, когда я переписал его с файлового велосипедохранилища на нормальный SQL, появилась возможность выбрать посты, содержащие все заданные теги. В 2008-м возможность окончательно оформилась в теговую навигацию.

    Изначальный способ выборки, который используется и сейчас:

    SELECT *
    FROM post p
     
    JOIN post_tag pt1 ON pt1.post_id = p.id
    JOIN tag t1 ON t1.id = pt1.tag_id AND t1.name = 'php'
     
    JOIN post_tag pt2 ON pt2.post_id = p.id
    JOIN tag t2 ON t2.id = pt2.tag_id AND t2.name = 'yii'
     
    -- для каждого дополнительного тега добавляем ещё JOIN-ы

    Недавно Максим подсказал способ поизвращённее:

    -- Сначала выбираем посты с тегом yii и посты с тегом php
    -- через IN. Если у поста и тот и тот тег, он будет выбран
    -- несколько раз.
    SELECT *
    FROM post p
    JOIN post_tag pt ON pt.post_id = p.id
    JOIN tag t ON pt.tag_id = t.id
    WHERE t.name IN ('php', 'yii')
    -- Считаем количество раз, которые выбрался пост. Если оно
    -- совпадает с количеством тегов в нашем списке, то это
    -- означает, что у поста есть и тот и тот тег.
    GROUP BY p.id
    HAVING COUNT(pt.tag_id) = 2

    Есть ли ещё интересные способы решения этой задачи?

    17 комментариев
  5. Перехват фатальных ошибок в Yii

    12 августа 2011

    Владимир Колесников описал у себя в блоге способ отлова фатальных ошибок PHP в Yii. Подумываю прикрутить к Yii2… или лучше сразу к Yii 1.1?

    Рассматриваем

    12 комментариев
  6. SQL, пересекается ли событие с теми, что уже имеются в таблице

    9 августа 2011

    Довольно частая задача при работе с различными событиями и датами.

    Имеется таблица вида:

    CREATE TABLE `event` (
      `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `start_time` datetime DEFAULT NULL,
      `end_time` datetime DEFAULT NULL,
    );

    Тут start_time и end_time не обязательно datetime. Например, они могут быть просто int-ами, хранящими обычный unix timestamp.

    Перед вставкой очередной записи нужно убедиться, что событие не пересечётся с каким-либо уже имеющимся в базе. Решается это так:

    SELECT 1
    FROM event
    WHERE 
      :new_start_time BETWEEN start_time AND end_time 
      OR :new_end_time BETWEEN start_time AND end_time 
      OR start_time BETWEEN :new_start_time AND :new_end_time 
      OR end_time BETWEEN :new_start_time AND :new_end_time
    LIMIT 1

    В запросе :new_start_time и :new_end_time соответственно начало и конец события, которое мы собираемся вставлять. Если запрос выше отдал 1, наше новое событие с чем-то пересекается…

    UPD: менее избыточные варианты (спасибо dec5e):

    NOT(:new_start_time > end_time OR :new_end_time < start_time)

    или через AND

    :new_start_time <= end_time AND :new_end_time >= start_time
    8 комментариев
  7. Yii, автокомплит для Yii::app

    4 августа 2011

    Yii неплохо дополняется в различных IDE, но для этого его нужно немного настроить. После первоначальной настройки можно сделать ещё одну штуку, полезную, когда вы работаете исключительно с веб-приложием.

    • В index.php подключаем YiiBase.php вместо yii.php, дописываем свой класс с аннотацией для IDE:
    require(dirname(__FILE__) . '/../framework/YiiBase.php');
     
    class Yii extends YiiBase {
        /**
         * @static
         * @return CWebApplication
         */
        public static function app()
        {
            return parent::app();
        }
    }
     
    $config=dirname(__FILE__).'/../protected/config/main.php';
     
    defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
    $app = Yii::createWebApplication($config)->run();

    После всех манипуляций получим дополнение, например, для Yii::app()->user->.

    50 комментариев
  8. Yii, HMVC

    4 августа 2011

    Пример простого HMVC в Yii.

    5 комментариев
  9. Yii, параметры action-а

    4 августа 2011

    В Yii есть приятная возможность: все $_GET-параметры автоматом передаются как аргументы метода.

    public function actionView($id)
    {
        echo $id == $_GET['id'];
    }

    Можно расширить возможность, например, на POST как показал helmut в топике:

    class MyPostAwareController extends CController
    {
        public function getActionParams()
        {
          return array_merge($_GET, $_POST);
        }
    }
    17 комментариев
  10. Эмулятор iPhone / iPad

    2 августа 2011

    Оказывается, эмулятор, который я как-то упоминал, подрос и научился эмулировать не только браузер iPhone, но и браузер iPad. Делает он это довольно-таки полноценно. Работает он не только под Windows, но и под Linux… и даже Mac. Из основных возможностей стоит отметить:

    UPD: вот тут можно найти обновлённый эмулятор.

    15 комментариев