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
  9. @copyright    2007-2009 Laurent Jouanneau
  10. @copyright    2007 Thibault Piront
  11. @copyright    2007,2008 Bastien Jaillot
  12. @copyright    2009 Mickael Fradin
  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);
  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('form',$form);
  283.         $tpl->assign('submitAction'$this->_getAction('savecreate'));
  284.         $tpl->assign('listAction' $this->_getAction('index'));
  285.         $this->_create($form$rep$tpl);
  286.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  287.         return $rep;
  288.     }
  289.  
  290.     /**
  291.      * redefine this method if you want to do additionnal things on the response and on the edit template
  292.      * during the create action.
  293.      * @param jFormsBase $form the form
  294.      * @param jResponseHtml $resp the response
  295.      * @param jtpl $tpl the template to display the edit form
  296.      */
  297.     protected function _create($form$resp$tpl{
  298.  
  299.     }
  300.  
  301.     /**
  302.      * redefine this method if you wan to do additionnal things on the dao generated by the
  303.      * jFormsBase::prepareDaoFromControls method
  304.      * @param jFormsBase $form the form
  305.      * @param jDaoRecordBase $form_daorec 
  306.      * @since 1.1
  307.      */
  308.     protected function _beforeSaveCreate($form$form_daorec{
  309.  
  310.     }
  311.  
  312.     /**
  313.      * save data of a form in a new record
  314.      */
  315.     function savecreate(){
  316.         $form $this->_getForm();
  317.         $rep $this->getResponse('redirect');
  318.         if($form == null){
  319.             $rep->action $this->_getAction('index');
  320.             return $rep;
  321.         }
  322.         $form->initFromRequest();
  323.  
  324.         if($form->check(&& $this->_checkData($formfalse)){
  325.             $results $form->prepareDaoFromControls($this->dao,null,$this->dbProfile);
  326.             extract($resultsEXTR_PREFIX_ALL"form");//use a temp variable to avoid notices
  327.             $this->_beforeSaveCreate($form$form_daorec);
  328.             $form_dao->insert($form_daorec);
  329.             $id $form_daorec->getPk();
  330.             $rep->action $this->_getAction('view');
  331.             $rep->params['id'$id;
  332.             $this->_afterCreate($form$id$rep);
  333.             if ($this->uploadsDirectory !== false)
  334.                 $form->saveAllFiles($this->uploadsDirectory);
  335.             jForms::destroy($this->form);
  336.             return $rep;
  337.         else {
  338.             $rep->action $this->_getAction('create');
  339.             return $rep;
  340.         }
  341.     }
  342.  
  343.     /**
  344.      * redefine this method if you wan to do additionnal things after the creation of
  345.      * a record. For example, you can handle here the uploaded files. If you do
  346.      * such handling, set the uploadsDirectory property to false, to prevent
  347.      * the default behavior on uploaded files in the controller.
  348.      * @param jFormsBase $form the form object
  349.      * @param mixed $id the new id of the inserted record
  350.      * @param jResponseHtml $resp the response
  351.      */
  352.     protected function _afterCreate($form$id$resp{
  353.  
  354.     }
  355.  
  356.     /**
  357.      * prepare a form in order to edit an existing record, and redirect to the editupdate action
  358.      */
  359.     function preupdate(){
  360.         $id $this->param('id');
  361.         $rep $this->getResponse('redirect');
  362.  
  363.         if$id === null ){
  364.             $rep->action $this->_getAction('index');
  365.             return $rep;
  366.         }
  367.  
  368.         $form $this->_createForm($id);
  369.  
  370.         try {
  371.             $rec $form->initFromDao($this->daonull$this->dbProfile);
  372.             foreach($rec->getPrimaryKeyNames(as $pkn{
  373.                 $c $form->getControl($pkn);
  374.                 if($c !==null{
  375.                     $c->setReadOnly(true);
  376.                 }
  377.             }
  378.         }catch(Exception $e){
  379.             $rep->action $this->_getAction('index');
  380.             return $rep;
  381.         }
  382.         $this->_preUpdate($form);
  383.  
  384.         $rep->action $this->_getAction('editupdate');
  385.         $rep->params['id'$id;
  386.         return $rep;
  387.     }
  388.  
  389.     /**
  390.      * redefine this method if you want to do additionnal things during preupdate action
  391.      * @param jFormsBase $form the form object
  392.      * @since 1.1
  393.      */
  394.     protected function _preUpdate($form{
  395.  
  396.     }
  397.  
  398.     /**
  399.      * displays a forms to edit an existing record. The form should be
  400.      * prepared with the preupdate before, so a refresh of the page
  401.      * won't cause a reset of the form
  402.      */
  403.     function editupdate(){
  404.         $id $this->param('id');
  405.         $form $this->_getForm($id);
  406.         if$form === null || $id === null){
  407.             $rep $this->getResponse('redirect');
  408.             $rep->action $this->_getAction('index');
  409.             return $rep;
  410.         }
  411.         $rep $this->_getResponse();
  412.  
  413.         $tpl new jTpl();
  414.         $tpl->assign('id'$id);
  415.         $tpl->assign('form',$form);
  416.         $tpl->assign('submitAction'$this->_getAction('saveupdate'));
  417.         $tpl->assign('listAction' $this->_getAction('index'));
  418.         $tpl->assign('viewAction' $this->_getAction('view'));
  419.         $this->_editUpdate($form$rep$tpl);
  420.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  421.         return $rep;
  422.     }
  423.  
  424.     /**
  425.      * redefine this method if you wan to do additionnal things on the response and on the edit template
  426.      * during the editupdate action.
  427.      * @param jFormsBase $form the form
  428.      * @param jResponseHtml $resp the response
  429.      * @param jtpl $tpl the template to display the edit form
  430.      */
  431.     protected function _editUpdate($form$resp$tpl{
  432.  
  433.     }
  434.  
  435.     /**
  436.      * redefine this method if you wan to do additionnal things on the dao generated by the
  437.      * jFormsBase::prepareDaoFromControls method
  438.      * @param jFormsBase $form the form
  439.      * @param jDaoRecordBase $form_daorec 
  440.      * @param mixed $id the new id of the updated record
  441.      * @since 1.1
  442.      */
  443.     protected function _beforeSaveUpdate($form$form_daorec$id{
  444.  
  445.     }
  446.  
  447.     /**
  448.      * save data of a form in a new record
  449.      */
  450.     function saveupdate(){
  451.         $rep $this->getResponse('redirect');
  452.         $id $this->param('id');
  453.         $form $this->_getForm($id);
  454.         if$form === null || $id === null){
  455.             $rep->action $this->_getAction('index');
  456.             return $rep;
  457.         }
  458.         $form->initFromRequest();
  459.  
  460.         if($form->check(&& $this->_checkData($formtrue)){
  461.             $results $form->prepareDaoFromControls($this->dao,$id,$this->dbProfile);
  462.             extract($resultsEXTR_PREFIX_ALL"form");//use a temp variable to avoid notices
  463.             $this->_beforeSaveUpdate($form$form_daorec$id);
  464.             $form_dao->update($form_daorec);
  465.             $rep->action $this->_getAction('view');
  466.             $rep->params['id'$id;
  467.             $this->_afterUpdate($form$id$rep);
  468.             if ($this->uploadsDirectory !== false)
  469.                 $form->saveAllFiles($this->uploadsDirectory);
  470.             jForms::destroy($this->form$id);
  471.         else {
  472.             $rep->action $this->_getAction('editupdate');
  473.             $rep->params['id'$id;
  474.         }
  475.         return $rep;
  476.     }
  477.  
  478.     /**
  479.      * redefine this method if you wan to do additionnal things after the update of
  480.      * a record. For example, you can handle here the uploaded files. If you do
  481.      * such handling, set the uploadsDirectory property to false, to prevent
  482.      * the default behavior on uploaded files in the controller.
  483.      * @param jFormsBase $form the form object
  484.      * @param mixed $id the new id of the updated record
  485.      * @param jResponseHtml $resp the response
  486.      */
  487.     protected function _afterUpdate($form$id$resp{
  488.  
  489.     }
  490.  
  491.     /**
  492.      * displays a record
  493.      */
  494.     function view(){
  495.         $id $this->param('id');
  496.         if$id === null ){
  497.             $rep $this->getResponse('redirect');
  498.             $rep->action $this->_getAction('index');
  499.             return $rep;
  500.         }
  501.         $rep $this->_getResponse();
  502.  
  503.         // we're using a form to display a record, to have the portunity to have
  504.         // labels with each values. We need also him to load easily values of some
  505.         // of controls with initControlFromDao (to use in _view method).
  506.         $form $this->_createForm($id);
  507.         $form->initFromDao($this->dao$id$this->dbProfile);
  508.  
  509.         $tpl new jTpl();
  510.         $tpl->assign('id'$id);
  511.         $tpl->assign('form',$form);
  512.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  513.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  514.         $tpl->assign('listAction' $this->_getAction('index'));
  515.         $this->_view($form$rep$tpl);
  516.         $rep->body->assign($this->templateAssign$tpl->fetch($this->viewTemplate));
  517.         return $rep;
  518.     }
  519.  
  520.     /**
  521.      * redefine this method if you want to do additionnal things on the response and on the view template
  522.      * during the view action.
  523.      * @param jFormsBase $form the form
  524.      * @param jResponseHtml $resp the response
  525.      * @param jtpl $tpl the template to display the form content
  526.      */
  527.     protected function _view($form$resp$tpl{
  528.  
  529.     }
  530.  
  531.     /**
  532.      * delete a record
  533.      */
  534.     function delete(){
  535.         $id $this->param('id');
  536.         $rep $this->getResponse('redirect');
  537.         $rep->action $this->_getAction('index');
  538.         if$id !== null && $this->_delete($id$rep) ){
  539.             $dao jDao::get($this->dao$this->dbProfile);
  540.             $dao->delete($id);
  541.         }
  542.         return $rep;
  543.     }
  544.  
  545.     /**
  546.      * redefine this method if you want to do additionnal things before the deletion of a record
  547.      * @param mixed $id the id of the record to delete
  548.      * @return boolean true if the record can be deleted
  549.      * @param jResponseHtml $resp the response
  550.      */
  551.     protected function _delete($id$resp{
  552.         return true;
  553.     }
  554.  
  555. }

Documentation generated on Thu, 19 Sep 2013 00:02:50 +0200 by phpDocumentor 1.4.3