準備が整ったものが必要なとき

画像

こんにちは、ハラジテル!

1年少し前に、豊富な機能を備えたWebアプリケーションを(非常に短時間で)実装する必要がある状況に遭遇しました。

  1. さまざまな役割を持つユーザーアカウントを管理する
  2. ユーザーにタスクを割り当て、これらのタスクの将来のアクティビティを追跡する
  3. ユーザー作業計画(日、月ごと)
  4. 従業員の仕事の結果を処理する(時間と仕事の種類を記録する)
  5. 各種レポートの作成、情報の統計セクションなど。

そして、これは「昨日」に行う必要のあることのほんの10分の1です。 すぐに予約します。私はWeb開発者ではないので、PHP、JS、Java、Rubyなどの世界に深く入らずに、できるだけ早くWebアプリケーションを構築するためのソリューションが必要でした。

私は意図的に分析と実装ツールの選択をスキップし、すぐに最も興味深いものに移ります。プラットフォームはKoalaフレームワーク -Zend FrameworkとExtJSの爆発的な混合物を選択しました。 このフレームワークは、MVCモデル(model-view-controller)に基づいています。 しかし、実際の強みは自動生成されたフォームとテーブル( AutoFormとAutoGrid )です。

自動フォームと自動テーブルの意味は、開発者がモデル(DBテーブル)を記述し、モデルフィールド/モデルプロパティをテーブル列とフォームフィールドに関連付ける必要があるということです。 例:

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 Webアプリケーションがロシアの大企業で正常に開発および実装されたことを自分で付け加えたいと思います。 ユーザーのレビューは非常に肯定的です。

PS1:技術がカルマの損失によってすでに罰せられることを理解し、示すことを試みることか。 コメントで議論しましょう:)

PS 2:チームは、Koala Frameworkをより詳しく知りたいと思っているPHP、ExtJS、MySQLの開発者を探しています。 コメントまたはPMですべての質問に答えることができます。

Source: https://habr.com/ru/post/J228901/


All Articles