Source for file jControllerDaoCrud.class.php

Documentation is available at jControllerDaoCrud.class.php

  1. <?php
  2. /**
  3. @package      jelix
  4. @subpackage   controllers
  5. @author       Laurent Jouanneau
  6. @contributor  Bastien Jaillot
  7. @contributor  Thibault PIRONT < nuKs >
  8. @copyright    2007 Laurent Jouanneau
  9. @copyright    2007 Thibault PIRONT
  10. @copyright    2007,2008 Bastien Jaillot
  11. @link         http://www.jelix.org
  12. @licence      http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  13. *
  14. */
  15.  
  16. /**
  17.  * a base class for crud controllers
  18.  * @package    jelix
  19.  * @subpackage controllers
  20.  * @since 1.0b3
  21.  */
  22. class jControllerDaoCrud extends jController {
  23.  
  24.     /**
  25.      * selector of the dao to use for the crud.
  26.      * It should be filled by child controller.
  27.      * @var string 
  28.      */
  29.     protected $dao = '';
  30.  
  31.     /**
  32.      * selector of the form to use to edit and display a record
  33.      * It should be filled by child controller.
  34.      * @var string 
  35.      */
  36.     protected $form ='';
  37.  
  38.     /**
  39.      * list of properties to show in the list page
  40.      * if empty list (default), it shows all properties.
  41.      * this property is only usefull when you use the default "list" template
  42.      * @var array 
  43.      */
  44.     protected $propertiesForList = array();
  45.  
  46.     /**
  47.      * list of properties which serve to order the record list
  48.      * if empty list (default), the list is in a natural order
  49.      * keys are properties name, and values are "asc" or "desc"
  50.      * @var array 
  51.      */
  52.     protected $propertiesForRecordsOrder = array();
  53.  
  54.     /**
  55.      * template to display the list of records
  56.      * @var string 
  57.      */
  58.     protected $listTemplate = 'jelix~crud_list';
  59.  
  60.     /**
  61.      * template to display the form
  62.      * @var string 
  63.      */
  64.     protected $editTemplate = 'jelix~crud_edit';
  65.  
  66.     /**
  67.      * template to display a record
  68.      * @var string 
  69.      */
  70.     protected $viewTemplate = 'jelix~crud_view';
  71.  
  72.     /**
  73.      * number of record to display in the list page
  74.      * @var integer 
  75.      */
  76.     protected $listPageSize = 20;
  77.  
  78.     /**
  79.      * the template variable name to display a CRUD content in the main template
  80.      * of the html response
  81.      * @var string 
  82.      */
  83.     protected $templateAssign = 'MAIN';
  84.  
  85.     /**
  86.      * name of the parameter which contains the page offset, for the index action
  87.      * @var string 
  88.      */
  89.     protected $offsetParameterName = 'offset';
  90.  
  91.     /**
  92.      * id for the "pseudo" form used to show a record. You can change it if the default one corresponds to
  93.      * a possible id in your dao.
  94.      * @var string 
  95.      */
  96.     protected $pseudoFormId = 'jelix_crud_roxor';
  97.  
  98.  
  99.     protected $uploadsDirectory ='';
  100.  
  101.     /**
  102.      * the jDb profil to use with the dao
  103.      */
  104.     protected $dbProfil = '';
  105.  
  106.     /**
  107.      * Returned a simple html response to display CRUD contents. You can override this
  108.      * method to return a personnalized response
  109.      * @return jResponseHtml the response
  110.      */
  111.     protected function _getResponse(){
  112.         return $this->getResponse('html');
  113.     }
  114.  
  115.     /**
  116.      * returned the selector of the action corresponding of the given method of the current controller.
  117.      * @param string $method  name of one of method of this controller
  118.      * @return string an action selector
  119.      */
  120.     protected function _getAction($method){
  121.         global $gJCoord;
  122.         return $gJCoord->action->module.'~'.$gJCoord->action->controller.':'.$method;
  123.     }
  124.  
  125.     /**
  126.      * you can do your own data check of a form by overloading this method.
  127.      * You can also do some other things. It is called only if the $form->check() is ok.
  128.      * and before the save of the data.
  129.      * @param jFormsBase $form the current form
  130.      * @param boolean $calltype   true for an update, false for a create
  131.      * @return boolean true if it is ok.
  132.      */
  133.     protected function _checkDatas($form$calltype){
  134.         return true;
  135.     }
  136.  
  137.     /**
  138.      * list all records
  139.      */
  140.     function index(){
  141.         $offset $this->intParam($this->offsetParameterName,0,true);
  142.  
  143.         $rep $this->_getResponse();
  144.  
  145.         $dao jDao::get($this->dao$this->dbProfil);
  146.  
  147.         $cond jDao::createConditions();
  148.         $this->_indexSetConditions($cond);
  149.  
  150.         $results $dao->findBy($cond,$offset,$this->listPageSize);
  151.         $pk $dao->getPrimaryKeyNames();
  152.  
  153.         // we're using a form to have the portunity to have
  154.         // labels for each columns.
  155.         $form jForms::create($this->form$this->pseudoFormId);
  156.         $tpl new jTpl();
  157.         $tpl->assign('list',$results);
  158.         $tpl->assign('primarykey'$pk[0]);
  159.  
  160.         if(count($this->propertiesForList)) {
  161.             $prop $this->propertiesForList;
  162.         }else{
  163.             $prop array_keys($dao->getProperties());
  164.         }
  165.  
  166.         $tpl->assign('properties'$prop);
  167.         $tpl->assign('controls',$form->getControls());
  168.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  169.         $tpl->assign('createAction' $this->_getAction('precreate'));
  170.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  171.         $tpl->assign('viewAction' $this->_getAction('view'));
  172.         $tpl->assign('listAction' $this->_getAction('index'));
  173.         $tpl->assign('listPageSize'$this->listPageSize);
  174.         $tpl->assign('page',$offset);
  175.         $tpl->assign('recordCount',$dao->countBy($cond));
  176.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  177.  
  178.         $this->_index($rep$tpl);
  179.         $rep->body->assign($this->templateAssign$tpl->fetch($this->listTemplate));
  180.         jForms::destroy($this->form$this->pseudoFormId);
  181.         return $rep;
  182.     }
  183.  
  184.     /**
  185.      * overload this method if you wan to do additionnal things on the response and on the list template
  186.      * during the index action.
  187.      * @param jResponseHtml $resp the response
  188.      * @param jtpl $tpl the template to display the record list
  189.      */
  190.     protected function _index($resp$tpl{
  191.  
  192.     }
  193.  
  194.     /**
  195.      * overload this method if you wan to do additionnal conditions to the index's select
  196.      * during the index action.
  197.      * @param jDaoConditions $cond the conditions
  198.      */
  199.     protected function _indexSetConditions($cond{
  200.         foreach ($this->propertiesForRecordsOrder as $p=>$order{
  201.             $cond->addItemOrder($p$order);
  202.         }
  203.     }
  204.  
  205.     /**
  206.      * prepare a form to create a record.
  207.      */
  208.     function precreate({
  209.         // we cannot create the form directly in the create action
  210.         // because if the forms already exists, we wouldn't show
  211.         // errors or already filled field. see ticket #292
  212.         $form jForms::create($this->form);
  213.         $rep $this->getResponse('redirect');
  214.         $rep->action $this->_getAction('create');
  215.         return $rep;
  216.     }
  217.  
  218.     /**
  219.      * display a form to create a record
  220.      */
  221.     function create(){
  222.         $form jForms::get($this->form);
  223.         if($form == null){
  224.             $form jForms::create($this->form);
  225.         }
  226.         $rep $this->_getResponse();
  227.  
  228.         $tpl new jTpl();
  229.         $tpl->assign('id'null);
  230.         $tpl->assign('form',$form);
  231.         $tpl->assign('submitAction'$this->_getAction('savecreate'));
  232.         $tpl->assign('listAction' $this->_getAction('index'));
  233.         $this->_create($form$rep$tpl);
  234.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  235.         return $rep;
  236.     }
  237.  
  238.     /**
  239.      * overload this method if you wan to do additionnal things on the response and on the edit template
  240.      * during the create action.
  241.      * @param jFormsBase $form the form
  242.      * @param jResponseHtml $resp the response
  243.      * @param jtpl $tpl the template to display the edit form
  244.      */
  245.     protected function _create($form$resp$tpl{
  246.  
  247.     }
  248.  
  249.     /**
  250.      * save data of a form in a new record
  251.      */
  252.     function savecreate(){
  253.         $form jForms::fill($this->form);
  254.         $rep $this->getResponse('redirect');
  255.         if($form == null){
  256.             $rep->action $this->_getAction('index');
  257.             return $rep;
  258.         }
  259.  
  260.         if($form->check(&& $this->_checkDatas($formfalse)){
  261.             $id $form->saveToDao($this->daonull$this->dbProfil);
  262.             $form->saveAllFiles($this->uploadsDirectory);
  263.             $rep->action $this->_getAction('view');
  264.             $this->_afterCreate($form$id$rep);
  265.             jForms::destroy($this->form);
  266.             $rep->params['id'$id;
  267.             return $rep;
  268.         else {
  269.             $rep->action $this->_getAction('create');
  270.             return $rep;
  271.         }
  272.     }
  273.  
  274.     /**
  275.      * overload this method if you wan to do additionnal things after the creation of
  276.      * a record
  277.      * @param jFormsBase $form the form object
  278.      * @param mixed $id the new id of the inserted record
  279.      * @param jResponseHtml $resp the response
  280.      */
  281.     protected function _afterCreate($form$id$resp{
  282.  
  283.     }
  284.  
  285.  
  286.     /**
  287.      * prepare a form in order to edit an existing record, and redirect to the editupdate action
  288.      */
  289.     function preupdate(){
  290.         $id $this->param('id');
  291.         $rep $this->getResponse('redirect');
  292.  
  293.         if$id === null ){
  294.             $rep->action $this->_getAction('index');
  295.             return $rep;
  296.         }
  297.  
  298.         $form jForms::create($this->form$id);
  299.  
  300.         try {
  301.             $form->initFromDao($this->daonull$this->dbProfil);
  302.         }catch(Exception $e){
  303.             $rep->action $this->_getAction('index');
  304.             return $rep;
  305.         }
  306.  
  307.         $rep->action $this->_getAction('editupdate');
  308.         $rep->params['id'$id;
  309.         return $rep;
  310.     }
  311.  
  312.     /**
  313.      * displays a forms to edit an existing record. The form should be
  314.      * prepared with the preupdate before, so a refresh of the page
  315.      * won't cause a reset of the form
  316.      */
  317.     function editupdate(){
  318.         $id $this->param('id');
  319.         $form jForms::get($this->form$id);
  320.         if$form === null || $id === null){
  321.             $rep $this->getResponse('redirect');
  322.             $rep->action $this->_getAction('index');
  323.             return $rep;
  324.         }
  325.         $rep $this->_getResponse();
  326.  
  327.         $tpl new jTpl();
  328.         $tpl->assign('id'$id);
  329.         $tpl->assign('form',$form);
  330.         $tpl->assign('submitAction'$this->_getAction('saveupdate'));
  331.         $tpl->assign('listAction' $this->_getAction('index'));
  332.         $tpl->assign('viewAction' $this->_getAction('view'));
  333.         $this->_editUpdate($form$rep$tpl);
  334.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  335.         return $rep;
  336.     }
  337.  
  338.     /**
  339.      * overload this method if you wan to do additionnal things on the response and on the edit template
  340.      * during the editupdate action.
  341.      * @param jFormsBase $form the form
  342.      * @param jResponseHtml $resp the response
  343.      * @param jtpl $tpl the template to display the edit form
  344.      */
  345.     protected function _editUpdate($form$resp$tpl{
  346.  
  347.     }
  348.  
  349.     /**
  350.      * save data of a form in a new record
  351.      */
  352.     function saveupdate(){
  353.         $rep $this->getResponse('redirect');
  354.         $id $this->param('id');
  355.         $form jForms::fill($this->form$id);
  356.         if$form === null || $id === null){
  357.             $rep->action $this->_getAction('index');
  358.             return $rep;
  359.         }
  360.  
  361.         if($form->check(&& $this->_checkDatas($formtrue)){
  362.             $id $form->saveToDao($this->daonull$this->dbProfil);
  363.             $form->saveAllFiles($this->uploadsDirectory);
  364.             $rep->action $this->_getAction('view');
  365.             $this->_afterUpdate($form$id$rep);
  366.             jForms::destroy($this->form$id);
  367.         else {
  368.             $rep->action $this->_getAction('editupdate');
  369.         }
  370.         $rep->params['id'$id;
  371.         return $rep;
  372.     }
  373.  
  374.     /**
  375.      * overload this method if you wan to do additionnal things after the update of
  376.      * a record
  377.      * @param jFormsBase $form the form object
  378.      * @param mixed $id the new id of the updated record
  379.      * @param jResponseHtml $resp the response
  380.      */
  381.     protected function _afterUpdate($form$id$resp{
  382.  
  383.     }
  384.  
  385.     /**
  386.      * displays a record
  387.      */
  388.     function view(){
  389.         $id $this->param('id');
  390.         if$id === null ){
  391.             $rep $this->getResponse('redirect');
  392.             $rep->action $this->_getAction('index');
  393.             return $rep;
  394.         }
  395.         $rep $this->_getResponse();
  396.  
  397.         // we're using a form to display a record, to have the portunity to have
  398.         // labels with each values. We need also him to load easily values of some
  399.         // of controls with initControlFromDao (to use in _view method).
  400.         $form jForms::create($this->form$id);
  401.         $form->initFromDao($this->dao$id$this->dbProfil);
  402.  
  403.         $tpl new jTpl();
  404.         $tpl->assign('id'$id);
  405.         $tpl->assign('form',$form);
  406.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  407.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  408.         $tpl->assign('listAction' $this->_getAction('index'));
  409.         $this->_view($form$rep$tpl);
  410.         $rep->body->assign($this->templateAssign$tpl->fetch($this->viewTemplate));
  411.         return $rep;
  412.     }
  413.  
  414.     /**
  415.      * overload this method if you want to do additionnal things on the response and on the view template
  416.      * during the view action.
  417.      * @param jFormsBase $form the form
  418.      * @param jResponseHtml $resp the response
  419.      * @param jtpl $tpl the template to display the form content
  420.      */
  421.     protected function _view($form$resp$tpl{
  422.  
  423.     }
  424.  
  425.     /**
  426.      * delete a record
  427.      */
  428.     function delete(){
  429.         $id $this->param('id');
  430.         $rep $this->getResponse('redirect');
  431.         $rep->action $this->_getAction('index');
  432.         if$id !== null && $this->_delete($id$rep) ){
  433.             $dao jDao::get($this->dao$this->dbProfil);
  434.             $dao->delete($id);
  435.         }
  436.         return $rep;
  437.     }
  438.  
  439.     /**
  440.      * overload this method if you want to do additionnal things before the deletion of a record
  441.      * @param mixed $id the new id of the record
  442.      * @return boolean true if the record can be deleted
  443.      * @param jResponseHtml $resp the response
  444.      */
  445.     protected function _delete($id$resp{
  446.         return true;
  447.     }
  448.  
  449. }
  450.  
  451. ?>

Documentation generated on Wed, 07 Sep 2011 13:46:48 +0200 by phpDocumentor 1.4.3