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. @contributor  Mickael Fradin, Brunto
  9. @copyright    2007-2009 Laurent Jouanneau
  10. @copyright    2007 Thibault Piront
  11. @copyright    2007,2008 Bastien Jaillot
  12. @copyright    2009 Mickael Fradin, 2011 Brunto
  13. @link         http://www.jelix.org
  14. @licence      http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  15. *
  16. */
  17.  
  18. /**
  19.  * a base class for crud controllers
  20.  * @package    jelix
  21.  * @subpackage controllers
  22.  * @since 1.0b3
  23.  */
  24. class jControllerDaoCrud extends jController {
  25.  
  26.     /**
  27.      * selector of the dao to use for the crud.
  28.      * It should be filled by child controller.
  29.      * @var string 
  30.      */
  31.     protected $dao = '';
  32.  
  33.     /**
  34.      * selector of the form to use to edit and display a record
  35.      * It should be filled by child controller.
  36.      * @var string 
  37.      */
  38.     protected $form ='';
  39.  
  40.     /**
  41.      * list of properties to show in the list page
  42.      * if empty list (default), it shows all properties.
  43.      * this property is only usefull when you use the default "list" template
  44.      * @var array 
  45.      */
  46.     protected $propertiesForList = array();
  47.  
  48.     /**
  49.      * list of properties which serve to order the record list.
  50.      * if empty list (default), the list is in a natural order.
  51.      * keys are properties name, and values are "asc" or "desc".
  52.      * @var array 
  53.      */
  54.     protected $propertiesForRecordsOrder = array();
  55.  
  56.     /**
  57.      * template to display the list of records
  58.      * @var string 
  59.      */
  60.     protected $listTemplate = 'jelix~crud_list';
  61.  
  62.     /**
  63.      * template to display the form
  64.      * @var string 
  65.      */
  66.     protected $editTemplate = 'jelix~crud_edit';
  67.  
  68.     /**
  69.      * template to display a record
  70.      * @var string 
  71.      */
  72.     protected $viewTemplate = 'jelix~crud_view';
  73.  
  74.     /**
  75.      * number of record to display in the list page
  76.      * @var integer 
  77.      */
  78.     protected $listPageSize = 20;
  79.  
  80.     /**
  81.      * the template variable name to display a CRUD content in the main template
  82.      * of the html response
  83.      * @var string 
  84.      */
  85.     protected $templateAssign = 'MAIN';
  86.  
  87.     /**
  88.      * name of the parameter which contains the page offset, for the index action
  89.      * @var string 
  90.      */
  91.     protected $offsetParameterName = 'offset';
  92.  
  93.     /**
  94.      * id for the "pseudo" form used to show a record. You can change it if the default one corresponds to
  95.      * a possible id in your dao.
  96.      * @var string 
  97.      */
  98.     protected $pseudoFormId = 'jelix_crud_roxor';
  99.  
  100.     /**
  101.      * full path to the directory where uploaded files will be stored
  102.      * automatically by jForms.
  103.      * Set it to false if you want to handle yourself the uploaded files.
  104.      * Set it with an empty string if you want to stored files in the default
  105.      * var/uploads directory.
  106.      * @var string|false
  107.      */
  108.     protected $uploadsDirectory ='';
  109.  
  110.     /**
  111.      * the jDb profile to use with the dao
  112.      */
  113.     protected $dbProfile = '';
  114.  
  115.     /**
  116.      * Returned a simple html response to display CRUD contents. You can redefine this
  117.      * method to return a personnalized response
  118.      * @return jResponseHtml the response
  119.      */
  120.     protected function _getResponse(){
  121.         return $this->getResponse('html');
  122.     }
  123.  
  124.     /**
  125.      * create the form. You can redefine this method to modify dynamically the form
  126.      * Typically, you call jForms::create and then you can call addControl or whatever.
  127.      * Don't do a jForms::get or jForms::fill in this method !
  128.      * called in methods: index, precreate, create, preupdate, view
  129.      * @return jFormsBase the form
  130.      * @since 1.1
  131.      */
  132.     protected function _createForm($formId null{
  133.         return jForms::create($this->form$formId);
  134.     }
  135.  
  136.     /**
  137.      * get an existing form. You can redefine this method to modify dynamically the form
  138.      * Typically, you call jForms::get and then you can call addControl or whatever.
  139.      * Don't do a jForms::create or jForms::fill in this method !
  140.      * called in methods: create, savecreate, editupdate, saveupdate
  141.      * @return jFormsBase the form
  142.      * @since 1.1
  143.      */
  144.     protected function _getForm($formId null{
  145.         return jForms::get($this->form$formId);
  146.     }
  147.  
  148.  
  149.     /**
  150.      * returned the selector of the action corresponding of the given method of the current controller.
  151.      * @param string $method  name of one of method of this controller
  152.      * @return string an action selector
  153.      */
  154.     protected function _getAction($method){
  155.         global $gJCoord;
  156.         return $gJCoord->action->module.'~'.$gJCoord->action->controller.':'.$method;
  157.     }
  158.  
  159.     /**
  160.      * you can do your own data check of a form by redefining this method.
  161.      * You can also do some other things. It is called only if the $form->check() is ok.
  162.      * and before the save of the data.
  163.      * @param jFormsBase $form the current form
  164.      * @param boolean $calltype   true for an update, false for a create
  165.      * @return boolean true if it is ok.
  166.      */
  167.     protected function _checkData($form$calltype){
  168.         return $this->_checkDatas($form$calltype)// for compatibility
  169.     }
  170.  
  171.     /**
  172.      * DEPRECATED, use _checkData instead
  173.      * @deprecated since 1.1
  174.      */
  175.     protected function _checkDatas($form$calltype){
  176.         return true;
  177.     }
  178.  
  179.     /**
  180.      * list all records
  181.      */
  182.     function index(){
  183.         $offset $this->intParam($this->offsetParameterName,0,true);
  184.  
  185.         $rep $this->_getResponse();
  186.  
  187.         $dao jDao::get($this->dao$this->dbProfile);
  188.  
  189.         $cond jDao::createConditions();
  190.         $this->_indexSetConditions($cond);
  191.  
  192.         $results $dao->findBy($cond,$offset,$this->listPageSize);
  193.         $pk $dao->getPrimaryKeyNames();
  194.  
  195.         // we're using a form to have the portunity to have
  196.         // labels for each columns.
  197.         $form $this->_createForm($this->pseudoFormId);
  198.         $tpl new jTpl();
  199.         $tpl->assign('list',$results);
  200.         $tpl->assign('primarykey'$pk[0]);
  201.  
  202.         if(count($this->propertiesForList)) {
  203.             $prop $this->propertiesForList;
  204.         }else{
  205.             $prop array_keys($dao->getProperties());
  206.         }
  207.  
  208.         $tpl->assign('properties'$prop);
  209.         $tpl->assign('controls',$form->getControls());
  210.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  211.         $tpl->assign('createAction' $this->_getAction('precreate'));
  212.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  213.         $tpl->assign('viewAction' $this->_getAction('view'));
  214.         $tpl->assign('listAction' $this->_getAction('index'));
  215.         $tpl->assign('listPageSize'$this->listPageSize);
  216.         $tpl->assign('page',$offset>0?$offset:null);
  217.         $tpl->assign('recordCount',$dao->countBy($cond));
  218.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  219.  
  220.         $this->_index($rep$tpl);
  221.         $rep->body->assign($this->templateAssign$tpl->fetch($this->listTemplate));
  222.         jForms::destroy($this->form$this->pseudoFormId);
  223.         return $rep;
  224.     }
  225.  
  226.     /**
  227.      * redefine this method if you wan to do additionnal things on the response and on the list template
  228.      * during the index action.
  229.      * @param jResponseHtml $resp the response
  230.      * @param jtpl $tpl the template to display the record list
  231.      */
  232.     protected function _index($resp$tpl{
  233.  
  234.     }
  235.  
  236.     /**
  237.      * redefine this method if you wan to do additionnal conditions to the index's select
  238.      * during the index action.
  239.      * @param jDaoConditions $cond the conditions
  240.      */
  241.     protected function _indexSetConditions($cond{
  242.         foreach ($this->propertiesForRecordsOrder as $p=>$order{
  243.             $cond->addItemOrder($p$order);
  244.         }
  245.     }
  246.  
  247.     /**
  248.      * prepare a form to create a record.
  249.      */
  250.     function precreate({
  251.         // we cannot create the form directly in the create action
  252.         // because if the forms already exists, we wouldn't show
  253.         // errors or already filled field. see ticket #292
  254.         $form $this->_createForm();
  255.         $this->_preCreate($form);
  256.         $rep $this->getResponse('redirect');
  257.         $rep->action $this->_getAction('create');
  258.         return $rep;
  259.     }
  260.  
  261.     /**
  262.      * redefine this method if you want to do additionnal during the precreate action
  263.      * @param jFormsBase $form the form
  264.      * @since 1.1
  265.      */
  266.     protected function _preCreate($form{
  267.  
  268.     }
  269.  
  270.     /**
  271.      * display a form to create a record
  272.      */
  273.     function create(){
  274.         $form $this->_getForm();
  275.         if($form == null){
  276.             $form $this->_createForm();
  277.         }
  278.         $rep $this->_getResponse();
  279.  
  280.         $tpl new jTpl();
  281.         $tpl->assign('id'null);
  282.         $tpl->assign('page' null);
  283.         $tpl->assign('offsetParameterName' null);
  284.         $tpl->assign('form',$form);
  285.         $tpl->assign('submitAction'$this->_getAction('savecreate'));
  286.         $tpl->assign('listAction' $this->_getAction('index'));
  287.         $this->_create($form$rep$tpl);
  288.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  289.         return $rep;
  290.     }
  291.  
  292.     /**
  293.      * redefine this method if you want to do additionnal things on the response and on the edit template
  294.      * during the create action.
  295.      * @param jFormsBase $form the form
  296.      * @param jResponseHtml $resp the response
  297.      * @param jtpl $tpl the template to display the edit form
  298.      */
  299.     protected function _create($form$resp$tpl{
  300.  
  301.     }
  302.  
  303.     /**
  304.      * redefine this method if you wan to do additionnal things on the dao generated by the
  305.      * jFormsBase::prepareDaoFromControls method
  306.      * @param jFormsBase $form the form
  307.      * @param jDaoRecordBase $form_daorec 
  308.      * @since 1.1
  309.      */
  310.     protected function _beforeSaveCreate($form$form_daorec{
  311.  
  312.     }
  313.  
  314.     /**
  315.      * save data of a form in a new record
  316.      */
  317.     function savecreate(){
  318.         $form $this->_getForm();
  319.         $rep $this->getResponse('redirect');
  320.         if($form == null){
  321.             $rep->action $this->_getAction('index');
  322.             return $rep;
  323.         }
  324.         $form->initFromRequest();
  325.  
  326.         if($form->check(&& $this->_checkData($formfalse)){
  327.             $results $form->prepareDaoFromControls($this->dao,null,$this->dbProfile);
  328.             extract($resultsEXTR_PREFIX_ALL"form");//use a temp variable to avoid notices
  329.             $this->_beforeSaveCreate($form$form_daorec);
  330.             $form_dao->insert($form_daorec);
  331.             $id $form_daorec->getPk();
  332.             $rep->action $this->_getAction('view');
  333.             $rep->params['id'$id;
  334.             $this->_afterCreate($form$id$rep);
  335.             if ($this->uploadsDirectory !== false)
  336.                 $form->saveAllFiles($this->uploadsDirectory);
  337.             jForms::destroy($this->form);
  338.             return $rep;
  339.         else {
  340.             $rep->action $this->_getAction('create');
  341.             return $rep;
  342.         }
  343.     }
  344.  
  345.     /**
  346.      * redefine this method if you wan to do additionnal things after the creation of
  347.      * a record. For example, you can handle here the uploaded files. If you do
  348.      * such handling, set the uploadsDirectory property to false, to prevent
  349.      * the default behavior on uploaded files in the controller.
  350.      * @param jFormsBase $form the form object
  351.      * @param mixed $id the new id of the inserted record
  352.      * @param jResponseHtml $resp the response
  353.      */
  354.     protected function _afterCreate($form$id$resp{
  355.  
  356.     }
  357.  
  358.     /**
  359.      * prepare a form in order to edit an existing record, and redirect to the editupdate action
  360.      */
  361.     function preupdate(){
  362.         $id $this->param('id');
  363.         $page $this->param($this->offsetParameterName);
  364.         $rep $this->getResponse('redirect');
  365.  
  366.         if$id === null ){
  367.             $rep->action $this->_getAction('index');
  368.             return $rep;
  369.         }
  370.  
  371.         $form $this->_createForm($id);
  372.  
  373.         try {
  374.             $rec $form->initFromDao($this->daonull$this->dbProfile);
  375.             foreach($rec->getPrimaryKeyNames(as $pkn{
  376.                 $c $form->getControl($pkn);
  377.                 if($c !==null{
  378.                     $c->setReadOnly(true);
  379.                 }
  380.             }
  381.         }catch(Exception $e){
  382.             $rep->action $this->_getAction('index');
  383.             return $rep;
  384.         }
  385.         $this->_preUpdate($form);
  386.  
  387.         $rep->action $this->_getAction('editupdate');
  388.         $rep->params['id'$id;
  389.         $rep->params[$this->offsetParameterName$page;
  390.         return $rep;
  391.     }
  392.  
  393.     /**
  394.      * redefine this method if you want to do additionnal things during preupdate action
  395.      * @param jFormsBase $form the form object
  396.      * @since 1.1
  397.      */
  398.     protected function _preUpdate($form{
  399.  
  400.     }
  401.  
  402.     /**
  403.      * displays a forms to edit an existing record. The form should be
  404.      * prepared with the preupdate before, so a refresh of the page
  405.      * won't cause a reset of the form
  406.      */
  407.     function editupdate(){
  408.         $id $this->param('id');
  409.         $page $this->param($this->offsetParameterName);
  410.         $form $this->_getForm($id);
  411.         if$form === null || $id === null){
  412.             $rep $this->getResponse('redirect');
  413.             $rep->action $this->_getAction('index');
  414.             return $rep;
  415.         }
  416.         $rep $this->_getResponse();
  417.  
  418.         $tpl new jTpl();
  419.         $tpl->assign('id'$id);
  420.         $tpl->assign('form',$form);
  421.         $tpl->assign('page',$page);
  422.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  423.         $tpl->assign('submitAction'$this->_getAction('saveupdate'));
  424.         $tpl->assign('listAction' $this->_getAction('index'));
  425.         $tpl->assign('viewAction' $this->_getAction('view'));
  426.         $this->_editUpdate($form$rep$tpl);
  427.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  428.         return $rep;
  429.     }
  430.  
  431.     /**
  432.      * redefine this method if you wan to do additionnal things on the response and on the edit template
  433.      * during the editupdate action.
  434.      * @param jFormsBase $form the form
  435.      * @param jResponseHtml $resp the response
  436.      * @param jtpl $tpl the template to display the edit form
  437.      */
  438.     protected function _editUpdate($form$resp$tpl{
  439.  
  440.     }
  441.  
  442.     /**
  443.      * redefine this method if you wan to do additionnal things on the dao generated by the
  444.      * jFormsBase::prepareDaoFromControls method
  445.      * @param jFormsBase $form the form
  446.      * @param jDaoRecordBase $form_daorec 
  447.      * @param mixed $id the new id of the updated record
  448.      * @since 1.1
  449.      */
  450.     protected function _beforeSaveUpdate($form$form_daorec$id{
  451.  
  452.     }
  453.  
  454.     /**
  455.      * save data of a form in a new record
  456.      */
  457.     function saveupdate(){
  458.         $rep $this->getResponse('redirect');
  459.         $id $this->param('id');
  460.         $page $this->param($this->offsetParameterName);
  461.         $form $this->_getForm($id);
  462.         if$form === null || $id === null){
  463.             $rep->action $this->_getAction('index');
  464.             return $rep;
  465.         }
  466.         $form->initFromRequest();
  467.  
  468.         $rep->params[$this->offsetParameterName$page;
  469.         if($form->check(&& $this->_checkData($formtrue)){
  470.             $results $form->prepareDaoFromControls($this->dao,$id,$this->dbProfile);
  471.             extract($resultsEXTR_PREFIX_ALL"form");//use a temp variable to avoid notices
  472.             $this->_beforeSaveUpdate($form$form_daorec$id);
  473.             $form_dao->update($form_daorec);
  474.             $rep->action $this->_getAction('view');
  475.             $rep->params['id'$id;
  476.             $this->_afterUpdate($form$id$rep);
  477.             if ($this->uploadsDirectory !== false)
  478.                 $form->saveAllFiles($this->uploadsDirectory);
  479.             jForms::destroy($this->form$id);
  480.         else {
  481.             $rep->action $this->_getAction('editupdate');
  482.             $rep->params['id'$id;
  483.         }
  484.         return $rep;
  485.     }
  486.  
  487.     /**
  488.      * redefine this method if you wan to do additionnal things after the update of
  489.      * a record. For example, you can handle here the uploaded files. If you do
  490.      * such handling, set the uploadsDirectory property to false, to prevent
  491.      * the default behavior on uploaded files in the controller.
  492.      * @param jFormsBase $form the form object
  493.      * @param mixed $id the new id of the updated record
  494.      * @param jResponseHtml $resp the response
  495.      */
  496.     protected function _afterUpdate($form$id$resp{
  497.  
  498.     }
  499.  
  500.     /**
  501.      * displays a record
  502.      */
  503.     function view(){
  504.         $id $this->param('id');
  505.         $page $this->param($this->offsetParameterName);
  506.         if$id === null ){
  507.             $rep $this->getResponse('redirect');
  508.             $rep->action $this->_getAction('index');
  509.             return $rep;
  510.         }
  511.         $rep $this->_getResponse();
  512.  
  513.         // we're using a form to display a record, to have the portunity to have
  514.         // labels with each values. We need also him to load easily values of some
  515.         // of controls with initControlFromDao (to use in _view method).
  516.         $form $this->_createForm($id);
  517.         $form->initFromDao($this->dao$id$this->dbProfile);
  518.  
  519.         $tpl new jTpl();
  520.         $tpl->assign('id'$id);
  521.         $tpl->assign('form',$form);
  522.         $tpl->assign('page',$page);
  523.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  524.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  525.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  526.         $tpl->assign('listAction' $this->_getAction('index'));
  527.         $this->_view($form$rep$tpl);
  528.         $rep->body->assign($this->templateAssign$tpl->fetch($this->viewTemplate));
  529.         return $rep;
  530.     }
  531.  
  532.     /**
  533.      * redefine this method if you want to do additionnal things on the response and on the view template
  534.      * during the view action.
  535.      * @param jFormsBase $form the form
  536.      * @param jResponseHtml $resp the response
  537.      * @param jtpl $tpl the template to display the form content
  538.      */
  539.     protected function _view($form$resp$tpl{
  540.  
  541.     }
  542.  
  543.     /**
  544.      * delete a record
  545.      */
  546.     function delete(){
  547.         $id $this->param('id');
  548.         $page $this->param($this->offsetParameterName);
  549.         $rep $this->getResponse('redirect');
  550.         $rep->params array($this->offsetParameterName=>$page);
  551.         $rep->action $this->_getAction('index');
  552.         if$id !== null && $this->_delete($id$rep) ){
  553.             $dao jDao::get($this->dao$this->dbProfile);
  554.             $dao->delete($id);
  555.         }
  556.         return $rep;
  557.     }
  558.  
  559.     /**
  560.      * redefine this method if you want to do additionnal things before the deletion of a record
  561.      * @param mixed $id the id of the record to delete
  562.      * @return boolean true if the record can be deleted
  563.      * @param jResponseHtml $resp the response
  564.      */
  565.     protected function _delete($id$resp{
  566.         return true;
  567.     }
  568.  
  569. }

Documentation generated on Mon, 19 Sep 2011 14:12:05 +0200 by phpDocumentor 1.4.3