<rmcreative>

RSS
  1. Yii совсем без MVC

    23 января 2011

    Интересный пост «Yii без MVC» нашёлся в блоге Евгения Карагодина. В нём он описывает использование Yii без view и стандартных директорий. Можно пойти дальше и использовать Yii вообще без MVC. Ну или использовать, например, только M. Для этого во входном файле делаем так:

    $yii='path/to/framework/yii.php';
    $config=dirname(__FILE__).'/config.php';
     
    require($yii);
    // при желании можно объявить конфиг параметром в виде массива и не использовать файл
    Yii::createWebApplication($config);
     
    // далее любой код с использованием Yii:
     
    $criteria = new CDbCriteria();
    $criteria->limit = 10;
    $criteria->order = 'id DESC';
    $posts = Post::model()->findAll($criteria);
    echo "<ol>";
    foreach($posts as $post)
    {
      echo "<li>";
      echo $post->title;
      echo "</li>";
    }
    echo "</ol>"
    15 комментариев
  2. Yii 1.1.6

    17 января 2011

    PHP-фреймворк Yii обновился до версии 1.1.6. Обновление не только правит ошибки, но и добавляет много нового. Какие же изменения были сделаны?

    Читаем

    11 комментариев
  3. Yii::t и перевод множественных форм слова по CLDR 2

    16 января 2011

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

    Подстановка параметров, число передаётся как {n}

    Yii::t('test', '{username} has a cucumber|{username} has {n} cucumbers',
    array(5, '{username}' => 'samdark'));

    Получим:

    samdark has 5 cucumbers
    

    Замена параметра {n}

    function convertNumber($number)
    {
        // число прописью
        return $number;
    }
     
    Yii::t('test', '{n} cucumber|{n} cucumbers',
    array(5, '{n}' => convertNumber(5)));

    Получим:

    five cucumbers
    

    Дробные числа

    Yii::t('app', 'cucumber|cucumbers', 1.5);

    В файле перевода за дроби в Русском отвечает четвёртый параметр:

    'cucumber|cucumbers' => 'огурец|огурца|огурцов|огурца',

    На выходе:

    огурца
    

    Полное описание можно найти на странице «Интернационализация» полного руководства.

    10 комментариев
  4. RSS для комментариев

    16 января 2011

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

    Заодно убрано автозаполнение с поля капчи.

    Комментировать
  5. Исключаем отдельный файл из индексации PhpStorm

    15 января 2011

    В PhpStorm на данный момент нет возможности исключить из индекса отдельный файл, что сильно портит жизнь тем, кто использует фреймворк Yii. Дело в том, что IDE при наличии одинаковых классов в нескольких файлах не знает, который из них использовать для автодополнения и предпочитает не выводить дополнения вовсе.

    Рано или поздно это будет исправлено, а пока можно воспользоваться небольшим трюком:

    • File → Settings → IDE Settings → File Types.
    • Ищем в списке Text Files, жмём нижнюю Add... и добавляем yiilite.php.

    Теперь yiilite.php будет исключён из индексирования для всех проектов.

    UPD: Алексей подсказал, что способ есть:

    • File → Settings → IDE Settings → File Types → Ignore files and folders. Через ; вписываем yiilite.php;

    UPD2: В текущих версиях PhpStorm появилась возможность исключить отдельный файл из индексации прямо из контекстного меню, выбрав Mark as Plain Text.

    14 комментариев
  6. Yii::t и перевод множественных форм слова по CLDR

    13 января 2011

    В транк Yii попала ещё одна интересная возможность, которая облегчит жизнь всем, кто имеет дело с мультиязычными проектами, а именно поддержка перевода множественных форм слова по правилам CLDR в Yii::t.

    Теперь для человеческого перевода строк вроде «10 яблок», «51 яблоко» не нужно писать страшные правила, а процесс будет выглядеть как показано ниже.

    В коде делаем всё как обычно:

    echo '10 '.Yii::t('app', 'apple', array(10));
    echo '51 '.Yii::t('app', 'apple', array(51));

    В файле перевода для Русского записываем:

    return array(
        'apple' => 'яблоко|яблока|яблок',
    );

    Для Английского, соответственно будет:

    return array(
        'apple' => 'apple|apples',
    );

    Полный список правил доступен на сайте CLDR.

    17 комментариев
  7. Opera: расширение для управления Xdebug

    11 января 2011

    Моё первое расширение для Opera. Упрощает отладку PHP-приложений через Xdebug и IDE, а именно включает и выключает сессию отладчика из браузера при щелчке на кнопке.

    Ключик для IDE можно выставить в настройках расширения.

    Страничка расширения

    Кстати, API расширений Opera понравился, хотя пришлось сначала к нему привыкнуть.

    11 комментариев
  8. Оптимизация ORDER BY RAND()

    10 января 2011

    Задача «выбрать 10 случайных постов» часто решается так:

    SELECT *
    FROM post
    ORDER BY RAND()
    LIMIT 10;

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

    EXPLAIN показывает нам Using temporary; Using filesort, что означает создание временной таблицы (а для большого количества записей она ещё и на диск пишется) и не использование индекса. Виновник, как вы уже догадались — ORDER BY RAND().

    Чтобы использовать индекс можно выбрать не все данные, а только id:

    SELECT id
    FROM post
    ORDER BY RAND()
    LIMIT 10

    Теперь имея 10 id получим посты:

    SELECT post.*
    FROM (
        SELECT id
        FROM post
        ORDER BY RAND()
        LIMIT 10
    )  
    AS ids JOIN post ON post.id = ids.id

    Получаем результат примерно за 10мс, что несомненно лучше. Но и этого может не хватить.

    В этом случае можно поступить следующим образом:

    • По крону получить 10—20 вариантов случайных записей.
    • Записать в отдельную таблицу, предварительно очистив её.

    Далее делаем rand(1, 20) на сервере и выполняем очень простой и быстрый запрос:

    SELECT *
    FROM random_post
    WHERE random_id = :random_id

    Если нужно ещё быстрее — делаем аналог на Redis или memcached.

    14 комментариев
  9. Simple ToDo Manager для Opera

    8 января 2011

    Давно искал простой и удобный способ записи личных дел. Перепробовал при этом довольно много всего:

    • текстовые файлы (их я до сих пор использую для совсем несрочных дел).
    • десктопное ПО. Остановился на ToDoList. Он действительно лучший в своём роде и, к тому же, бесплатен. Но его надо запускать… да и для мелких личных дел он, пожалуй, слишком мощный.
    • популярные вебсервисы вроде remember the milk почему-то не прижились. Впрочем, как и разработки коллег CircleTasks и MicroToDo.

    Как ни странно, попробовав не так давно список дел в виде расширения для Opera, я понял, что это именно та штука, которая мне была нужна.

    Главные плюсы:

    • Прост.
    • Не надо выходить из текущего таба и как-либо отвлекаться.
    • Становится лучше с выходом новых версий.
    • Всегда под рукой. Хранит данные локально.
    • В свёрнутом виде показывает количество невыполненных дел.
    • Приятен на вид.

    Пробуем

    Хорошим дополнением к нему идёт To-Read Sites, позволяющий добавлять в отдельный список ссылки на сайты, которые надо «прочитать потом». Очень хорошо разгружает список дел.

    14 комментариев
  10. SQLite, временные таблицы и таблицы в памяти

    8 января 2011

    SQLite можно заставить работать без файлов прямо в памяти. В случае PHP и PDO для этого в качестве соединения указывается sqlite::memory::

    $db = new PDO('sqlite::memory:');

    В этом случае база существует в памяти ровно до закрытия соединения.

    Если же указать в качестве соединения sqlite:, будет создан временный файл, который после закрытия соединения также будет удалён.

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

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