Коли потрібно щось майже готове

Cвіт Зелений

Коли потрібно щось майже готове

Моя оцінка корисності цієї статті
2 - Точно колись знадобиться.
https://www.ar25.org/node/33598

коли потрібно було реалізувати веб-додаток (як звичайно в дуже стислі терміни) з багатим функціоналом: 

    image
 
Доброго часу доби, хабражітель! 
 
Трохи більше року тому зіткнувся з ситуацією коли потрібно було реалізувати веб-додаток (як звичайно в дуже стислі терміни) з багатим функціоналом: 
 
 
  1.  
  2. Служба захисту користувачів з різними ролями
  3.  
  4. Призначення завдань на користувачів і відстеження подальшої життєдіяльності цих завдань
  5.  
  6. Планування роботи користувачів (на день, місяць)
  7.  
  8. Робота з результатами роботи співробітників (реєстрація часу і типів робіт)
  9.  
  10. Формування різних звітів, статистичних зрізів інформації і тп
  11.  
І це тільки десята частина того що потрібно було зробити ще "вчора". Відразу обмовлюся: Я — не веб-розробник, тому потрібно було рішення, на якому можна було б побудувати веб-додаток якнайшвидше без глибокого занурення у світ PHP, JS, Java, Ruby, і тп. 
  
Я навмисне пропущу аналіз і вибір засобів реалізації та відразу перейду до найцікавішого: в якості платформи був обраний Koala Framework — гримуча суміш з Zend Framework і ExtJS. В основу цього фреймворку лягла модель MVC (model-view-controller). Але справжньою його силою є автогенеріруемие форми і таблиці (AutoForm і AutoGrid ). 
 
Сенс авто-форм і авто-таблиць в тому, що розробнику потрібно описати модель (таблицю БД) і зв'язати поля / свойст моделі з колонками таблиці і полями форми. Наприклад: 
 
припустимо у нас є таблиця в MySQL: 
 
 
CREATE TABLE IF NOT EXISTS `tasks` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `userId` int NOT NULL,
    `title` varchar(300) COLLATE utf8_unicode_ci,
    `description` varchar(1000) COLLATE utf8_unicode_ci,
    `startDate` date,
    `endDate` date,
    `status` int NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`),
    KEY `userId` (`userId`)
)  ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 
Модель буде мати вигляд: 
 
 
<?php
class Tasks extends Kwf_Model_Db
{
    protected $_table = 'tasks';
}

 
Щоб відобразити список завдань необхідно створити контролер (точніше AutoGrid Controller): 
 
 
<?php
class TasksController extends Kwf_Controller_Action_Auto_Grid
{
    protected $_modelName = 'Tasks';
    protected $_defaultOrder = array('field' => 'id', 'direction' => 'DESC');
    protected $_paging = 30;
    protected $_buttons = array('add');

    public function indexAction()
    {
        $this->view->ext('Tasks');
    }
    
    protected function _initColumns()
    {
        $this->_columns->add(new Kwf_Grid_Column('title', trl('Title'), 200));

        $this->_columns->add(new Kwf_Grid_Column_Date('endDate', trl('End Date'), 100))->setRenderer('checkDate');
    }    
}

 
Тут властивості класу описують поведінку: кількість елементів на сторінці (так, посторінковий висновок підтримується з коробки!), Модель даних, сортування вибірки (опіціонально) і можливі дії. З дій тут зазначено тільки додавання завдань, але доступні ще й видалення, збереження та експорт в Excel / PDF. 
 
Тепер потрібно завантажити завдання тільки для конкретного залогіненним користувача. Для цього під фреймворці є глобальні змінні. Тепер легко задаємо умови для вибірки завдань у контролері: 
 
 
protected function _getWhere()
    {
        $users = Kwf_Registry::get('userModel');
        
        $ret = parent::_getWhere();
        
        $ret['status = ?'] = 0;
        $ret['userId = ?'] = $users->getAuthedUserId();
        return $ret;
    }

 
Відмінно, тепер користувач бачить тільки свої активні завдання! 
 
Так, залишилося додати створення і зміна завдань. Для цього потрібен вже інший контролер (AutoForm Controller): 
 
 
<?php
class TaskController extends Kwf_Controller_Action_Auto_Form
{
    protected $_modelName = 'Tasks';
    protected $_permissions = array('save', 'add');
    protected $_buttons = array('save');

    protected function _initFields()
    {        
        $this->_form->add(new Kwf_Form_Field_TextField('title', trl('Title')))
        ->setWidth(400)
        ->setAllowBlank(false);
        
        $this->_form->add(new Kwf_Form_Field_DateField('startDate', trl('Start Date')));
        $this->_form->add(new Kwf_Form_Field_DateField('endDate', trl('End Date')));
        
        $this->_form->add(new Kwf_Form_Field_TextArea('description', trl('Description')))
        ->setHeight(70)
        ->setWidth(400);
                
        $this->_form->add(new Kwf_Form_Field_Checkbox('status', trl('Done')));
    }    
}

 
Властивості класу описують поведінку форми, причому зв'язку даних з полями задаються у функції initFields (). Але є маленька проблема: поле userId ніяк не пов'язано з поточним користувачем і не прив'язане до полів форми. Поки що… Щоб звільнити користувача від роботи з вибору самого себе в якості власника завдання потрібно додати тригер — функцію, що спрацьовує під час створення нового запису: 
 
 
protected function _beforeInsert(Kwf_Model_Row_Interface $row)
    {
        $users = Kwf_Registry::get('userModel');
        
        if ($row->startDate == NULL)
        {
            $row->startDate = new DateTime ();
        }
        $row->userId = $users->getAuthedUserId();
        $row->status = 0;
    }

 
У KWF також доступні й інші тригери: на зміну і видалення даних. 
 
Тепер якось треба зв'язати обидва цих контролера між собою. Код обох контролерів генерує ExtJS форми. Отже і пов'язувати ми їх будемо в JS коді: 
 
 
var Tasks = Ext.extend(Ext.Panel,
{
       initComponent : function(test)
       {
       var form = new Kwf.Auto.FormPanel({
                                         controllerUrl   : '/task',
                                         region          : 'center'
                                         });
              
       var grid = new Kwf.Auto.GridPanel({
                                         controllerUrl   : '/tasks',
                                         region          : 'west',
                                         width           : 400,
                                         resizable       : true,
                                         split           : true,
                                         collapsible     : true,
                                         title           : trl('Tasks'),
                                         bindings: [{
                                                    queryParam: 'id',
                                                    item: form
                                                    }]
                                         });
       this.layout = 'border';
       this.items = [grid, {
                     layout: 'border',
                     region: 'center',
                     items: [form]
                     }];
       Tasks.superclass.initComponent.call(this);
    }
});

 
Всім, хто вже працював з ExtJS, цей код напевно здасться дуже знайомим =) 
 
Залишилося тільки визначити точку доступу (входу) до цих контролерам. Для цього в KWF є окремий зумовлений клас Kwf_Acl: 
 
 
<?php
class Acl extends Kwf_Acl
{
    public function __construct()
    {
        parent::__construct();
        $this->remove('default_index');
 
        $this->addResource(new Kwf_Acl_Resource_MenuUrl('default_tasks', array('text'=>trl('Tasks'), 'icon'=>'time.png'), '/tasks'));

        $this->addResource(new Zend_Acl_Resource('default_task'), ‘default_tasks');

        $this->addRole(new Zend_Acl_Role(‘user'));

        $this->allow('user', 'default_tasks');
        $this->allow('admin', 'default_tasks');
        $this->allow('admin', 'default_index');
    }
}

 
Ось і все! Черговий TO-DO список готовий! У добавок він розрахований на багато і при необхідності завдання типу експорт списку в Excel / PDF, фільтрації і сортування списків додаються максимум хвилин за 5! 
 
 
 
Повний код програми доступний тут: github.com / kronik / kwf-app-demo 
 
Давайте створювати побільше корисних і зручних інструментів! =) 
 
Від себе ще хочу додати що зараз веб-додаток на KFW успішно розроблено та впроваджено в крупній Російської компанії. Відгуки користувачів виключно позитивні. 
 
PS: У команду шукаються розробники PHP, ExtJS, MySQL, бажаючі ближче познайомитися з Koala Framework і готові допомогти (не безкоштовно звичайно) у розвитку вітчизняної спеціалізованої КІС. На всі питання можу відповісти в коментарях або в личке.
    
Джерело: Хабрахабр

0 коментарів

Наші інтереси

коли потрібно було реалізувати веб-додаток (як звичайно в дуже стислі терміни) з багатим функціоналом: 

Теги
web
Останні записи
Audio file
/sites/default/files/radio/klavdia_petrivna_-_ya_tobi_brehala.mp3
Audio file
/sites/default/files/radio/iran_zbagachuye_uran_-_sasha_boole.mp3
Audio file
/sites/default/files/radio/zwyntar_-_ne_doviryay_smertnym.mp3
Audio file
/sites/default/files/radio/klavdia_petrivna_-_sonce_zhara.mp3
Audio file
/sites/default/files/radio/klavdia_petrivna_-_znaydy_mene.mp3
Audio file
/sites/default/files/tayina_ukrayiny.mp3
Audio file
/sites/default/files/radio/zwyntar_-_choven.mp3
Audio file
/sites/default/files/radio/ruslana-ostannya_poema.mp3
Audio file
/sites/default/files/radio/bozhichi-ja_ptychka-nevelychka-kant.mp3
Audio file
/sites/default/files/radio/2.slipa_dytyna.mp3
Audio file
/sites/default/files/radio/zlata_ognevich_-_yangol.mp3
Audio file
/sites/default/files/sergius_iii_-_maty_govoryla_ukrayinskoyu_my_mother_told_me_ukrainian_version_ac_valhalla_song.mp3
Audio file
/sites/default/files/radio/oy_yak_zhe_bulo_izprezhdy.mp3
Audio file
/sites/default/files/radio/02_kolir_nochi_-_dva_shlyahy.mp3
Audio file
/sites/default/files/radio/05_kolir_nochi_-_slava_ukrayini.mp3
Audio file
/sites/default/files/radio/zwyntar_-_na_boloti.mp3
Audio file
/sites/default/files/radio/oc_feat._bangi_hep_-_ziyde_sonce.mp3
Audio file
/sites/default/files/radio/torban_-_oy_yak_zhe_bulo.mp3
Audio file
/sites/default/files/radio/zwyntar_-_dzhonni.mp3
Audio file
/sites/default/files/radio/harcyzy_-_lebedi_2020.mp3
Audio file
/sites/default/files/radio/oleksa_mikolajchuk_ta_viktor_pashnik_-_sonce-zori.mp3
Audio file
/sites/default/files/zwyntar_-_gospel.mp3
Audio file
/sites/default/files/radio/angy_kreyda_-_vrazhe.mp3
Audio file
/sites/default/files/tnmk_-_ivo_bobul_1.mp3
Audio file
/sites/default/files/radio/hrystyna-solovij-buty-lyudmy.mp3
Audio file
/sites/default/files/karta_svitu_-_kryla.mp3
Audio file
/sites/default/files/radio/kalush_feat.skofka-dodomu_kaver_victoria_niro.mp3
Audio file
/sites/default/files/radio/kolir_nochi_-_korabli_demo_2013.mp3
Audio file
/sites/default/files/vopli_vidoplyasova_-_yura.mp3
Audio file
/sites/default/files/radio/de_tvoya_liniya.mp3
Audio file
/sites/default/files/trans-former-kalina.mp3
Audio file
/sites/default/files/radio/kozak_system_-_poday_zbroyu.mp3
Audio file
/sites/default/files/02_-_party_na_prikarpatti.mp3
Audio file
/sites/default/files/folkteatr_ostapa_stahiva._pisni_upa._marshyruyut_vzhe_povstanci.mp3
Audio file
/sites/default/files/tavro_-_fashist_2.mp3
Audio file
/sites/default/files/karchata_folknery.mp3
Audio file
/sites/default/files/karna-gucul-metal_2017.mp3
Audio file
/sites/default/files/kazka_-_plakala.mp3
Audio file
/sites/default/files/maxima_-_u_rayu.mp3
Audio file
/sites/default/files/radio/maxima_-_zolota_y_nebesna_zhinka.mp3
Audio file
/sites/default/files/maxima_-_zyma_vesna_lito_osin.mp3
Audio file
/sites/default/files/the_doox_-_gopaka.mp3
Audio file
/sites/default/files/radio/the_doox_-_pid_borom.mp3
Audio file
/sites/default/files/diana_bigun-moya_zemlya.mp3
Audio file
/sites/default/files/radio/4_koly_vona.mp3
Audio file
/sites/default/files/meri_-_ya_z_ukrayiny.mp3
Audio file
/sites/default/files/radio/vidverto_-_borotba.mp3
Audio file
/sites/default/files/14_sosonochka.mp3
Audio file
/sites/default/files/radio/drevo_tak_kosyv_batko.mp3
Audio file
/sites/default/files/the_doox_-_rusalochky.mp3
Audio file
/sites/default/files/the_doox_-_ne_vidpuskay.mp3
Audio file
/sites/default/files/radio/the_doox_-_viter_z_polya.mp3
Audio file
/sites/default/files/radio/13_folknery_-_vyplyvalo_utenia.mp3
Audio file
/sites/default/files/taruta_zberemosya_rode.mp3
Audio file
/sites/default/files/radio/090-znak-vodi-mamo.mp3
Audio file
/sites/default/files/radio/119-vv-harmonija.mp3
Audio file
/sites/default/files/radio/115-vv-vesna.mp3
Audio file
/sites/default/files/117-vv-haleluja.mp3
Audio file
/sites/default/files/radio/118-vv-halu_pryhod.mp3
Audio file
/sites/default/files/radio/120_-_gorila_sosna.mp3
Audio file
/sites/default/files/radio/054-oj_po_sinomu_mori.mp3
Audio file
/sites/default/files/055-oj_tam_u_lvovi.mp3
Audio file
/sites/default/files/radio/002-kvitka-osinnie_kokhannia.mp3
Audio file
/sites/default/files/022-haydamaky_gnyva.mp3
Audio file
/sites/default/files/radio/021-haydamaky_bohuslav.mp3
Audio file
/sites/default/files/017-ohorontsi_lisu.mp3
Audio file
/sites/default/files/radio/ta_scho_tancjuye_z_vitrom.mp3
Audio file
/sites/default/files/radio/vita-brevis-doroga-v-nebesa.mp3
Audio file
/sites/default/files/nedilja-prosto-neba.mp3
Audio file
/sites/default/files/radio/vitalij-kozlovskij-znayesh.mp3
Audio file
/sites/default/files/radio/01._enej_-_radio_hello.mp3
Audio file
/sites/default/files/05_vitre_hnatyi.mp3
Audio file
/sites/default/files/radio/igor-balan-oj-tam-za-morjami.mp3
Audio file
/sites/default/files/korali_project_-_korali_-_01._potsuhy.mp3
Audio file
/sites/default/files/radio/batkivcke_gyto.mp3
Audio file
/sites/default/files/radio/burmaka_hodyt_son.mp3
Audio file
/sites/default/files/radio/burmaka_melanka.mp3
Audio file
/sites/default/files/radio/liotchyk.mp3
Audio file
/sites/default/files/lama_meni_tak_treba.mp3
Audio file
/sites/default/files/radio/04._mertvi_troyandy.mp3
Audio file
/sites/default/files/radio/08._z_togo_berega.mp3
Audio file
/sites/default/files/09._ya_bez_tebe_ne_ye.mp3
Audio file
/sites/default/files/maxima_-_kolyskova.mp3
Audio file
/sites/default/files/chuhajster-ukr.mp3
Audio file
/sites/default/files/radio/kozaky.mp3
Audio file
/sites/default/files/tnmk_banzay.mp3
Audio file
/sites/default/files/tnmk_vidryvaysya.mp3
Audio file
/sites/default/files/tnmk_syla.mp3
Audio file
/sites/default/files/tnmk_ta_ty_shcho.mp3
Audio file
/sites/default/files/radio/mandarinovij-raj-zorepadi.mp3
Audio file
/sites/default/files/radio/nedilja-prosto-neba.mp3
Audio file
/sites/default/files/radio/ty_v_mene_ye.mp3
Audio file
/sites/default/files/radio/nebo_ukrayiny-drach_eduard.mp3
Audio file
/sites/default/files/euterpa_marysunia.mp3
Audio file
/sites/default/files/radio/sonce-hmary_na_chuzhyni.mp3
Audio file
/sites/default/files/radio/01.persha_versiya.mp3
Audio file
/sites/default/files/radio/03.vesna_.mp3
Audio file
/sites/default/files/07.chaka_1.mp3
Audio file
/sites/default/files/radio/020-haydamaky_30-lit.mp3
Audio file
/sites/default/files/026-dyki_gusy.mp3
Audio file
/sites/default/files/027-pisnya_pro_pisnyu.mp3
Audio file
/sites/default/files/031-ukraina.mp3
Audio file
/sites/default/files/radio/033-ishla_divcha_luchkamy.mp3
Audio file
/sites/default/files/035-vv_kompanichenko_taras.mp3
Audio file
/sites/default/files/036-kvitka-dva_koliory.mp3
Audio file
/sites/default/files/036-kvitka_cisyk_-_cheremshyna.mp3
Audio file
/sites/default/files/039._dva_kolory.mp3
Audio file
/sites/default/files/radio/040._chornobryvtsi.mp3
Audio file
/sites/default/files/042._nich_jaka_misiachna.mp3
Audio file
/sites/default/files/043._de_ty_teper.mp3
Audio file
/sites/default/files/045-oj_na_gori_ta_zenci_znut.mp3
Audio file
/sites/default/files/046-ridna_maty_moja.mp3
Audio file
/sites/default/files/radio/048-lira.mp3
Audio file
/sites/default/files/radio/049-pryvyd.mp3
Audio file
/sites/default/files/051-neba_zori.mp3
Audio file
/sites/default/files/radio/052-ptakha.mp3
Audio file
/sites/default/files/056-tam_na_stavi.mp3
Audio file
/sites/default/files/radio/059-i_zijde.mp3
Audio file
/sites/default/files/radio/061-hen_dolynoju.mp3
Audio file
/sites/default/files/062-mykyta_shvachka.mp3
Audio file
/sites/default/files/radio/064-bili_demony.mp3
Audio file
/sites/default/files/radio/065-maga_vira.mp3
Audio file
/sites/default/files/067-zapovit.mp3
Audio file
/sites/default/files/069-vechir.mp3
Audio file
/sites/default/files/072-olster.mp3
Audio file
/sites/default/files/radio/073-shiva.mp3
Audio file
/sites/default/files/076-transformer-zmusila.mp3
Audio file
/sites/default/files/098-drymbadadzyga-shidi-ridi.mp3
Audio file
/sites/default/files/101-u-muza-7.mp3
Audio file
/sites/default/files/radio/103-u-muza-16.mp3
Audio file
/sites/default/files/ukranski_koljadki_-_dobrij_vechir_tobi_pane_gospodarju.mp3
Audio file
/sites/default/files/radio/105-vasya-club-04-chorna_gora.mp3
Audio file
/sites/default/files/108-bozhichi-sho-z-kuiva-ta-j-do-rusalima.mp3
Audio file
/sites/default/files/111-bozhichi-u_poli_vijsko_stojalo-koljadka.mp3
Audio file
/sites/default/files/114-muzyka_dyka.mp3
Audio file
/sites/default/files/tik_-_cyklony.mp3
Audio file
/sites/default/files/ukrayinski_dity_i_ruslana_-_ye_u_kozhnogo_z_nas_v_serci_mriya.mp3
Audio file
/sites/default/files/116_-_velyka_syla.mp3
Audio file
/sites/default/files/tik_vesela_pisnya_2010_-_bude_shchastya_gulyay_veselys_sodnya_vitka_pry_vlasti_bude_shchastya_gulyay_veselys_sodnya_vitka_pry_vlasti.mp3
Audio file
/sites/default/files/6_sheva_ital.mp3
Audio file
/sites/default/files/chornyj_luge.mp3
Audio file
/sites/default/files/16_siv_sus_hrestos_da_vecheryaty_-_shchedrivka.mp3