Zen coding
Дякуючи Стюарту Ленгріджу я тепер теж в темі. Дуже сподобалось на тестах, попробую завтра на роботі.
Шо це таке?
Читайте на сторінці проекту zen coding на гуглокодах та дивіться на відео нижче.
Doctrine і Kohana3
Doctrine
Doctrine — це бібліотека ORM. По MVC-паттерну код генерований за допомогою Doctrine можна дуже класно використовувати замість kohana ORM або кастомних моделей. Доктрина має ряд няшок, якими б хотілось скористуватись:
- Автоматична генерація моделей. Потім дуже зручно їх міняти, бо створюється спеціально доктриновський клас від якого наслідується вже ваш, який власне і міняємо.
- Можливість задавати базу і моделі за допомогою yaml, що є дуже зручно і зрозуміло. SQL створення бази генерується, моделі генеруються, всьо добре.
- Решту няшок просто пронумерую: раз два три.
Kohana 3
Kohana 3, як показує ссилка ось-ось зарелізиться, але проекти не чекають. Щоб йти в ногу з технологіями потрібно приймати ризиковані новаторські рішення. Більше того, по моїм перечитуванням коду реліз кандидату склалось дуже приємне враження, оптимізували і дуже спростили ядро, не втрачаючи необхідного функціоналу звісно. Скачати останню версію.
Процедура
Власне нам потрібно створити модуль kohana, який буде в собі включати доктріну. Відволікатись на таку просту процедуру ми не будемо, в нас doctrine буде лежати в... ну з конфіга буде краще видно я думаю.
Kohana::modules(array(
// 'database' => MODPATH.'database', Database
// 'kodoc' => MODPATH.'kodoc', // Kohana documentation
// 'orm' => MODPATH.'orm', // Object Relationship Mapping (not complete)
'auth' => MODPATH.'auth', // Database access
'pagination' => MODPATH.'pagination', // Paging of results
'image' => MODPATH.'image', // Image manipulation
'doctrine' => MODPATH.'doctrine', // Doctrine ORM
);
Ми виключаємо рідний kohana orm і ActiveRecord і підключаємо натомість doctrine. Далі в папці з модулем доктріни ложимо файлик init.php (вот за що я люблю kohana, тут всьо продумано) з наступним вмістом.
<?php
/* Doctrine integration */
require Kohana::find_file('classes', 'doctrine/Doctrine');
/* Реєструємо аутолоадер. Після розробки доктріну можна скомпілити в один файл
* розміров 800кб правда. Не думаю шо там можна шось сильно оптимізувати.
* Суть в тому, що треба виключити буде аутолоадер. якщо буде скомпілений файл.
*/
spl_autoload_register(array('Doctrine', 'autoload'));
// Читаємо конфіги для конекту з базою даних
$db = Kohana::config('database')->doctrine;
// Получаємо менеджер доктріни
$manager = Doctrine_Manager::getInstance();
//Створюємо конект
$manager->connection('mysql://'.$db['user'].':'.$db['password'].'@'.$db['host'].'/'.$db['database'], 'default_connection');
// @see http://www.doctrine-project.org/documentation/manual/1_1/en/configuration
$manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE);
$manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL);
$manager->setAttribute(Doctrine::ATTR_DEFAULT_IDENTIFIER_OPTIONS, array('name' => '%s_id', 'type' => 'int', 'length' => 11));
$manager->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL);
$manager->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true);
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);
$manager->setAttribute(Doctrine::ATTR_TBLNAME_FORMAT, $db['prefix'].'_%s');
$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);
// Доктринові моделі будуть лежати не в classes/ а окремо в MODPATH
Doctrine::loadModels(APPPATH.'models');
Вроді все прокоментовано. Єдине запитання може виникати до конфігураційного файла бази даних. Вот доречі і він:
<?php
return array(
'doctrine' => array(
'user' => 'username',
'password' => 'supersecretpasword',
'host' => 'localhost',
'database' => 'fancy_site',
'prefix' => 'wtfpl',
)
);
Отак отримуємо інтегровану Doctrine в kohana. Опісля, якщо у вас з модулями йдуть моделі доктрини, то в тому ж init.php ставимо наступне:
Doctrine::loadModels(MODPATH.'blog/models');
для модуля блогу наприклад ;)
Бонус
Також викладаю вам спеціально драйвер бібліотеки Auth для використання з doctrine. Розібратись де його поставити зовсім не важко (правда я півдня думав чи його пхати до auth чи до doctrine). Да, ще одне, використовуючи бібліотеку авторизації треба уважно слідкувати за цією сторіночкою.
Код драйвера власне тут. Я думаю резонно його включити в модуль auth, хоча б для того, щоб якщо хтось ще задастся таким питанням, то зможе використати. Да, драйвер ще не тестований, тому можуть бути очевидні завтики, але походу реалізований.
Серія записок безумного архітектора #2
Завдання в нас доволі тривіальне: потрібно зробити вивід сторінок типу {host}/page/name з довільною ієрархією (тобто в нас може бути декілька слешів, які зазвичай сприймаються як шлях до сторінки) швидким пошуком, щоб генерація сторінки займала як-омога менше часу і щоб це було просто і очевидно. В інтернеті куча інформації на цю тему, готових рішень не менше. Проте я придумав свого велосипеда, про якого піде мова далі.
Вирішувати його будемо простеньким хуком. Приступимо зразу до коду, пояснення будуть потім.
<?php
// Вішаємось на післяроутингу
// це викличе нашу функцію коли роутинг закінчиться
Event::add('system.post_routing' ,'call_fallback_page');
function call_fallback_page()
{
// визначаємо чи наразі визначений контроллер
if (Router::$controller === NULL) {
// контроллера нема, якраз наш випадок!
Router::$controller = 'page';
// встановлюємо наш контроллер ^ і метод, якмй показуватиме статичну сторінку
Router::$method = 'show';
// знаходимо шлях до контроллера
Router::$controller_path = Kohana::find_file('controllers', 'page');
}
}
// перший профіт!
Тепер діло в контроллері. Ми повинні перевірити, чи така сторінка існує, а якщо ні показати 404-ту сторіночку.
<?php
// Сторінки розмічені маркдауном
require Kohana::find_file('vendor', 'Markdown');
// Власне контроллер. Я використовую Template_Controller свого приготування,
// не забудьте поміняти свого парента
class Page_Controller extends Website_Controller {
public function show()
{
$page = ORM::factory('page', Router::$current_uri;);
// orm модель має перевизначений метод unique_id()
if ($page->id > 0) {
//сторінка знайдена!
//змінні как бе намєкають нам на правильну SEO оптимізацію
$this->template->keywords = $page->keywords;
$this->template->description = $page->description;
$this->template->content = new View('page');
$this->template->content->title = $page->title;
$this->template->content->text = Markdown($page->body);
$this->template->content->modified = $page->modified;
} else {
// ніц не знайшли, показуємо 404-ту помилку.
Kohana::instance()->show_404();
}
}
}
Я думаю модель створити і відповідні в’юшки — не проблема. На крайняк їх можна подивитись в репозиторії цього сайту.
З цього починається люба CMS.
Як копіюють музику на плеєр
Ото йду на прогулку і рішив закинути собі дейва на плеєр. Не всього (не влізе банально), а тільки то, шо сподобалось раніше. Благо Quodlibet сам випасає шо мені подобається, а що ні по очевидному алгоритму, з яким я згідний. Без компромісів. Писати плагіна на пітоні в неділю ввечері — забити на прогулку. Тому ми скористались тим що було. Активовуємо плагін Export to HTML плеєра, ставимо в плейлісті тільки колонку Path to file і також відмічаємо Show Full Path to file. Вже згенерований плейліст через пошук, як я писав в першому(?) пості в цьому блозі експортуємо в html в папочку. Відкриваємо текстовим редактором, html до першого рядка таблиці і з останнього, зберігаємо, йдемо до кроку два бігом!
Саме цікаве. В папочці створюємо файлик player.php, в який ставимо наступний вміст:
<?php
//Шлях до файла.
$files = file('songs.html');
//рахуємо кількість файлів
$count = count($files);
//Понеслись!
for ($i = 0; $i < $count; $i++) {
//Забрали теги нафіг і стрімили перевод строчки
$source = trim(strip_tags($files[$i]));
// Написали якусь каляку шо робиться
echo "copying file: ".$source."\n";
// Копіюєм $файл в шлях. в мене /media/disk/muzik/dmb/. У вас скоріш за все що інший
exec("cp \"".$source."\" \"/media/disk/muzik/dmb/".pathinfo($source, PATHINFO_BASENAME)."\"");
}
// Раз два три — закінчили
echo "FUKKEN SAVED!!!!!!!1111111\n";
Уважно читаємо коментарі, міняємо керуючись здоровим глуздом.
потім в терміналі
php player.php
Чекаєм характерного повідомлення, відключаємо плеєр і йдем гуляти, гарного вечора.
Коменти виключаються
Коментарі в цьому блозі не потрібні. Зі спамом я вже навчився боротись, але це не значить, шо ці падли повинні гадити тут. Коментарі людей залишаться в мому серці назавжди =)
Відтак це не означає, що коментарі відміняються в двигунці блогу. Їх можна буде включити опціонально.
Я знаю хто прийде жалітись, тому пишіть в жаббер.
Authorize.net CIM Kohana library
Надокучаю з постами сьогодні, розписався аж нема куда і нічого по ділу. Шойно запакував і виклад модулем Kohana Authorize.net CIM. Думаю передруковувати мануал як підключати модуль не треба. Як і говорилось попередньо, бібліотека НЕ ПОВНІСТЮ реалізує API, а тільки ті частини, які мені потрібні в робочому проекті. З часом проект буде рости, вот і будуть реалізовуватись решта методів.
Наразі доступні такі методи:
- create_customer(User_Model $user, Profile_Model $profile, Location_Model $location, $credit_card, $expiration_date)
- create_customer_profile(Profile_Model $profile, $credit_card)
- get_customer_profile($authorize_customer_id)
- delete_customer_profile($authorize_customer_id, $customer_profile_id)
- create_customer_transaction($authorize_customer_id, $amount)
API не кинсистентне, проте можна вже користуватись. Набити решту методів нема проблеми, логіка побудови модуля думаю дуже зрозуміла навіть для початківця. Тепер стукатиму zomborу нехай добавляє до проектів, а вже буде репозиторій можна буде допиляти до нормального стану.
Робивши цю білбіотеку заодно навчився пакувати модулі для kohana. Все дуже просто. У вас бібліотека називається XXX. В папці libraries/drivers створюєте файл Xxx.php в якому описуєте інтерфейс драйвера (з аналогічного файлу) і створюєте Xxx/drivername.php власне сам драйвер, який має реалізовувати інтерфейс.
Зараз є два драйвера fsockopen і curl. В конфігураційному файлі зазначаєте який використовувати.