Vagrant box маппинг на существующую виртуальную машину VirtualBox

Иногда есть необходимость указать Vagrant’у, чтобы он запускался на существующей виртуальной машине VirtualBox’a. Стандартный кейс, когда Vagrant при старте создал новую виртуальную машину, а вам нужна старая, к примеру из-за того, что вы увеличили \ уменьшили количество оперативной памяти для VM. Поскольку сам столкнулся с этим в очередной раз, решил написать заметку.

Читать далее

Полезные команды для переноса данных между серверами linux

Есть у меня один проект на phpBB и на днях решил его перенести с сервера на сервер и за одно обновить ему версию. Проект не сложный и требовалось перенести только БД и само приложение. Больше проблем возникло с переходом на более новую версию phpBB, пришлось поковыряться, но об этом я не буду рассказывать. А расскажу о полезных linux командах, которые помогают совершить такой перенос. Читать далее

MySQL, изменение кодировки в SELECT

Появилась необходимость сделать выборку из таблиц и отдать результат людям, которые ни какого отношения не имеют к ИТ. Все было бы хорошо если бы не одна из колонок не была бы в utf8_bin в которой хранятся различные символы, которые отображаются как: d0a4d0bed180d182d183d0bdd0b0 и простому смертному не совсем понятны) Не много погуглив доку оказалось MySQL умеет это делать прямо в запросе.
[sql]SELECT user_id, username COLLATE utf8_general_ci AS username FROM table;[/sql]
В моем примере колонка username имеет кодировку utf8_bin и прямо в запросе я ее конвертирую в utf8_general_ci, чтобы все было для людей) Может кому пригодится и я не забуду 😉

WiFi Points или 200 коммитов к бета версии

Живя в Таиланде уже почти с полгода и греясь на солнышке, возникла необходимость поиска WiFi интернета. Как оказалось достойных сервисов не нашлось. Поэтому необходимость переросла в идею, а идея в реализацию сервиса WiFi Points, который должен помочь найти WiFi в любом уголке нашего земного шара.

За две недели между ходами в Героях 3 и волейболом, было произведено 200 коммитов и это привело нас к бета версии WiFi Points.

Не много расскажу о том как устроен процесс разработки.
Проект реализовывали в команде из 3х человек: дизайнер, фронт-энд и бэк-энд разработчики. Код лежит в SVN’e на Assembla. Roadmap в гугл доках, а различные мелкие задачки на листочках :), по возможности конечно не забываем и их переносить в доки, чтобы не чего не забыть. На бэк-энде конечно же используется Yii. На фронт-энде Google Map, JQuery. Все это дело крутится на nginx + php-fpm + mysql. Про железо говорить бессмысленно, т.к. нагрузки ни какой нет… а 8 ядер и 16гигов оперативы просто простаивают). Для наполнения была идея спарсить какие-то базы WiFi точек, но подумав отказались от этой идеи, т.к. может быть очень много старой и не правдивой информации.

Функционал, который сейчас доступен ;):

  • Просмотр всех точек на карте.
  • Поиск по адресу, по названию точек пока поиска нет и пока не решили будет ли он.
  • Авторизация через: Facebook, Twitter, Vkontakte.
  • Привязка аккаунтов.
  • Добавление точек.
  • Редактирование и удаление собственных точек.
  • Доступно два языка: английский, русский.

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

Ну а так же вы можете следить за обновлениями в:

Представление редактирование отношения MANY_MANY в Yii

Давно лежит данная заметка в черновиках. Решил наконец выложить…

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

<?php echo $form->labelEx($model, 'categories'); ?>
<?php echo $form->dropDownList($model, 'categories', CHtml::listData(
    Category::model()->active()->findAll(), 'id', 'title'
), array('multiple'=>'multiple', 'size'=>'7', 'encode'=>false)); ?>
<?php echo $form->error($model, 'categories'); ?>

Поясню что здесь написано.
categories — Это отношение MANY_MANY в модели $model.

Авторизация для различных сабдоменов

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

Сходу не получилось решить данную задачу. В сети тоже не нашел ответа, а решается очень просто в конфиге для каждого домена необходимо указать две вещи:

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

            'user'=>array(
                ...
                'stateKeyPrefix'=>'yourDifferentPrefixForEveryDomain',
                ...
            ),

2. Чтобы выход не происходил сразу со всех доменов, необходимо:

            'session' => array (
                ...
                'sessionName' => 'differentSessionNameForEveryDomain',
                ...
            ),

Вот и все :).

YiiTalk подкаст о Yii фреймворке, или разговоры ни о чем ;)

Совсем не давно Юрий Беляков(belyakov.su) начал серию подкастов по Yii фреймворку. Изначально была идея вести это дело совместно, но в силу различных обстоятельств, которые как обычно не зависят от нас 😉 не получилось. Это наверное и к лучшему, двум ведущим там делать не чего :).

Был записан пилотный выпуск, затем в скором времени подкаст с Александром Макаровым(rmcreative.ru), кто не знает это наш соотечественник, который участвует в разработке ядра Yii. Ну и третий выпуск был записан со мной, до сих пор не понимаю чем удостоен такой чести ;). В плане запись подкаста с одним из активных участником yii сообщества Ekstazi.

Послушать все это дело можно здесь: yiitalk.podfm.ru yiitalk.rpod.ru

Хочу добавить к тому что было сказано в подкасте, а именно про книги. Как мне было подмечено по пхп стоит почитать: Котерова PHP5(у меня есть такая книга, читал давно и просто забыл уже про нее.) и PHP. Объекты, шаблоны и методики программирования(ее не читал, но все говорят хорошая).

З.Ы. не забывайте писать комменты, фитбэки. Для нас это очень важно, чтобы понять куда двигаться дальше 😉

С Новым 2012 Годом!

Хочу всех поздравить с наступающим 2012 годом! 2011году осталось совсем чуть-чуть и можно подвести его итоги. Не считая, что на улицах Питера снега нет и у большинства нет новогоднего настроения, 2011 в целом удался))
Начало года было не очень удачным, были финансовые проблемы. Полностью перешел на фриланс и повсеместное использование Yii. Начал писать свою CMS для управления сайтов своих клиентов. Втянулся в пару авантюрных проектов, не все оказались удачными. Многие отвалились по мере работы над ними. Некоторые дожили до конца года, посмотри что им принесет будущий 2012 год.
Осень 2011 стала очень неожиданной, было много работы, несколько проектов, которые помогли моей CMS подрасти и обзавестись не только стандартными функциями типа управления статическими страницами, новости, сео, общие настройки системы, но и каталогом с конструктором товаров.
Под конец года обрисовался один стартап и даже вроде инвестор вместе с ним. Так что посмотрим что принесет 2012 год)

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

ВСЕХ С НОВЫМ ГОДОМ!

Использование CDbCriteria в DAO

Не знал какое название дать посту, получилось, что получилось.
Очередной рабочий вечер, работа над интернет-магазином. Для уменьшения нагрузки отказываюсь в некоторых местах от использования AR. Естественно для выборки данных с использованием AR использую класс CDbCriteria. Но отказываясь от AR приходится отказаться и от CDbCriteria. Решил «поплакаться» на этот счет одному из знакомых разработчиков, который подсказал поковырять фреймворк и посмотреть действительно ли необходимо отказаться от CDbCriteria, когда не используешь AR. И как оказалось все не так плохо, иначе бы этот пост и не появился ;).
Ну а теперь к практическому решению:

criteria = new CDbCriteria;
// идет некий сумасшедший сбор критерии.
...
// Дальше необходимо создать экземпляр класса CDbCommandBuilder
$builder = new CDbCommandBuilder(Yii::app()->db->getSchema());
// Дальше если необходимо сделать выборку, то используем createFindCommand
// Если что-то удалить, то createDeleteCommand и т.п.
// Первым параметром передаем название таблицы или объект CDbTableSchema
$command = $builder->createFindCommand('product', $criteria);
// дальше можно использовать queryColumn(), queryAll() и т.п.
$productIds = $command->queryColumn();

Возможно это слишком низкоуровневое решение, но оно работает.

Игры в модуль, подмодуль в Yii

Поскольку Yii дает возможность из коробки использовать «любую» вложенность модулей, я решил опробовать написать админку в виде модуля и подмодулей.
Единый лейаут для модуля и его подмодулей.
Возникла логичная необходимость в том, что леайт модуля должен использоваться и в его подмодулях. Сделал я это следующим образом:

class AdminModule extends BaseWebModule {
	public function init() {
            Yii::app()->setViewPath($this->getViewPath());
	}
}

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

$this->createUrl('/module/submodule/controller/action')

НО! Возникают проблемы при подключение в подмодулях CGridView и т.п. Для этого я создал базовый контроллер для всех контроллеров в AdminModule и его подмодулей, переопределив метод CController.createUrl следующим образом:

    public function createUrl($route,$params=array(),$ampersand='&') {
        if($route==='')
            $route=$this->getId().'/'.$this->getAction()->getId();
        else if(strpos($route,'/')===false)
            $route=$this->getId().'/'.$route;
        if($route[0]!=='/') {
            if(($module=$this->getModule())!==null) {
                $route = $module->getId().'/'.$route;
                $route = $this->_getParentModuleRecursive($module, $route);
            }
        }
    
        return Yii::app()->createUrl(trim($route,'/'),$params,$ampersand);
    }
    
    private function _getParentModuleRecursive(CModule $module, $route) {
        if(($parentModule = $module->getParentModule()) !== null) {
            $route = $parentModule->getId().'/'.$route;
            $this->_getParentModuleRecursive($parentModule, $route);
        }
        return $route;
    }

По мере моего изучения возможности Yii — модуля, подмодуля буду пополнять данную заметку различной информацией.