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

Documentation generated on Wed, 24 Sep 2014 21:56:57 +0200 by phpDocumentor 1.4.3