Вниз ↓

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($sourcePATHINFO_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. В конфігураційному файлі зазначаєте який використовувати.