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.         $act jApp::coord()->action;
  158.         return $act->module.'~'.$act->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 true;
  171.     }
  172.  
  173.     /**
  174.      * list all records
  175.      */
  176.     function index(){
  177.         $offset $this->intParam($this->offsetParameterName,0,true);
  178.  
  179.         $rep $this->_getResponse();
  180.  
  181.         $dao jDao::get($this->dao$this->dbProfile);
  182.  
  183.         $cond jDao::createConditions();
  184.         $this->_indexSetConditions($cond);
  185.  
  186.         $results $dao->findBy($cond,$offset,$this->listPageSize);
  187.         $pk $dao->getPrimaryKeyNames();
  188.  
  189.         // we're using a form to have the portunity to have
  190.         // labels for each columns.
  191.         $form $this->_createForm($this->pseudoFormId);
  192.         $tpl new jTpl();
  193.         $tpl->assign('list',$results);
  194.         $tpl->assign('primarykey'$pk[0]);
  195.  
  196.         if(count($this->propertiesForList)) {
  197.             $prop $this->propertiesForList;
  198.         }else{
  199.             $prop array_keys($dao->getProperties());
  200.         }
  201.  
  202.         $tpl->assign('properties'$prop);
  203.         $tpl->assign('controls',$form->getControls());
  204.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  205.         $tpl->assign('createAction' $this->_getAction('precreate'));
  206.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  207.         $tpl->assign('viewAction' $this->_getAction('view'));
  208.         $tpl->assign('listAction' $this->_getAction('index'));
  209.         $tpl->assign('listPageSize'$this->listPageSize);
  210.         $tpl->assign('page',$offset>0?$offset:null);
  211.         $tpl->assign('recordCount',$dao->countBy($cond));
  212.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  213.         $tpl->assign('dao',$this->dao);
  214.         $tpl->assign('dbProfile',$this->dbProfile)
  215.  
  216.         $this->_index($rep$tpl);
  217.         $rep->body->assign($this->templateAssign$tpl->fetch($this->listTemplate));
  218.         jForms::destroy($this->form$this->pseudoFormId);
  219.         return $rep;
  220.     }
  221.  
  222.     /**
  223.      * redefine this method if you wan to do additionnal things on the response and on the list template
  224.      * during the index action.
  225.      * @param jResponseHtml $resp the response
  226.      * @param jtpl $tpl the template to display the record list
  227.      */
  228.     protected function _index($resp$tpl{
  229.  
  230.     }
  231.  
  232.     /**
  233.      * redefine this method if you wan to do additionnal conditions to the index's select
  234.      * during the index action.
  235.      * @param jDaoConditions $cond the conditions
  236.      */
  237.     protected function _indexSetConditions($cond{
  238.         foreach ($this->propertiesForRecordsOrder as $p=>$order{
  239.             $cond->addItemOrder($p$order);
  240.         }
  241.     }
  242.  
  243.     /**
  244.      * prepare a form to create a record.
  245.      */
  246.     function precreate({
  247.         // we cannot create the form directly in the create action
  248.         // because if the forms already exists, we wouldn't show
  249.         // errors or already filled field. see ticket #292
  250.         $form $this->_createForm();
  251.         $this->_preCreate($form);
  252.         $rep $this->getResponse('redirect');
  253.         $rep->action $this->_getAction('create');
  254.         return $rep;
  255.     }
  256.  
  257.     /**
  258.      * redefine this method if you want to do additionnal during the precreate action
  259.      * @param jFormsBase $form the form
  260.      * @since 1.1
  261.      */
  262.     protected function _preCreate($form{
  263.  
  264.     }
  265.  
  266.     /**
  267.      * display a form to create a record
  268.      */
  269.     function create(){
  270.         $form $this->_getForm();
  271.         if($form == null){
  272.             $form $this->_createForm();
  273.         }
  274.         $rep $this->_getResponse();
  275.  
  276.         $tpl new jTpl();
  277.         $tpl->assign('id'null);
  278.         $tpl->assign('page' null);
  279.         $tpl->assign('offsetParameterName' null);
  280.         $tpl->assign('form',$form);
  281.         $tpl->assign('submitAction'$this->_getAction('savecreate'));
  282.         $tpl->assign('listAction' $this->_getAction('index'));
  283.         $this->_create($form$rep$tpl);
  284.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  285.         return $rep;
  286.     }
  287.  
  288.     /**
  289.      * redefine this method if you want to do additionnal things on the response and on the edit template
  290.      * during the create action.
  291.      * @param jFormsBase $form the form
  292.      * @param jResponseHtml $resp the response
  293.      * @param jtpl $tpl the template to display the edit form
  294.      */
  295.     protected function _create($form$resp$tpl{
  296.  
  297.     }
  298.  
  299.     /**
  300.      * redefine this method if you wan to do additionnal things on the dao generated by the
  301.      * jFormsBase::prepareDaoFromControls method
  302.      * @param jFormsBase $form the form
  303.      * @param jDaoRecordBase $form_daorec 
  304.      * @since 1.1
  305.      */
  306.     protected function _beforeSaveCreate($form$form_daorec{
  307.  
  308.     }
  309.  
  310.     /**
  311.      * save data of a form in a new record
  312.      */
  313.     function savecreate(){
  314.         $form $this->_getForm();
  315.         $rep $this->getResponse('redirect');
  316.         if($form == null){
  317.             $rep->action $this->_getAction('index');
  318.             return $rep;
  319.         }
  320.         $form->initFromRequest();
  321.  
  322.         if($form->check(&& $this->_checkData($formfalse)){
  323.             $results $form->prepareDaoFromControls($this->dao,null,$this->dbProfile);
  324.             extract($resultsEXTR_PREFIX_ALL"form");//use a temp variable to avoid notices
  325.             $this->_beforeSaveCreate($form$form_daorec);
  326.             $form_dao->insert($form_daorec);
  327.             $id $form_daorec->getPk();
  328.             $rep->action $this->_getAction('view');
  329.             $rep->params['id'$id;
  330.             $this->_afterCreate($form$id$rep);
  331.             if ($this->uploadsDirectory !== false)
  332.                 $form->saveAllFiles($this->uploadsDirectory);
  333.             jForms::destroy($this->form);
  334.             return $rep;
  335.         else {
  336.             $rep->action $this->_getAction('create');
  337.             return $rep;
  338.         }
  339.     }
  340.  
  341.     /**
  342.      * redefine this method if you wan to do additionnal things after the creation of
  343.      * a record. For example, you can handle here the uploaded files. If you do
  344.      * such handling, set the uploadsDirectory property to false, to prevent
  345.      * the default behavior on uploaded files in the controller.
  346.      * @param jFormsBase $form the form object
  347.      * @param mixed $id the new id of the inserted record
  348.      * @param jResponseHtml $resp the response
  349.      */
  350.     protected function _afterCreate($form$id$resp{
  351.  
  352.     }
  353.  
  354.     /**
  355.      * prepare a form in order to edit an existing record, and redirect to the editupdate action
  356.      */
  357.     function preupdate(){
  358.         $id $this->param('id');
  359.         $page $this->param($this->offsetParameterName);
  360.         $rep $this->getResponse('redirect');
  361.  
  362.         if$id === null ){
  363.             $rep->action $this->_getAction('index');
  364.             return $rep;
  365.         }
  366.  
  367.         $form $this->_createForm($id);
  368.  
  369.         try {
  370.             $rec $form->initFromDao($this->daonull$this->dbProfile);
  371.             foreach($rec->getPrimaryKeyNames(as $pkn{
  372.                 $c $form->getControl($pkn);
  373.                 if($c !==null{
  374.                     $c->setReadOnly(true);
  375.                 }
  376.             }
  377.         }catch(Exception $e){
  378.             $rep->action $this->_getAction('index');
  379.             return $rep;
  380.         }
  381.         $this->_preUpdate($form);
  382.  
  383.         $rep->action $this->_getAction('editupdate');
  384.         $rep->params['id'$id;
  385.         $rep->params[$this->offsetParameterName$page;
  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.         $page $this->param($this->offsetParameterName);
  406.         $form $this->_getForm($id);
  407.         if$form === null || $id === null){
  408.             $rep $this->getResponse('redirect');
  409.             $rep->action $this->_getAction('index');
  410.             return $rep;
  411.         }
  412.         $rep $this->_getResponse();
  413.  
  414.         $tpl new jTpl();
  415.         $tpl->assign('id'$id);
  416.         $tpl->assign('form',$form);
  417.         $tpl->assign('page',$page);
  418.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  419.         $tpl->assign('submitAction'$this->_getAction('saveupdate'));
  420.         $tpl->assign('listAction' $this->_getAction('index'));
  421.         $tpl->assign('viewAction' $this->_getAction('view'));
  422.         $this->_editUpdate($form$rep$tpl);
  423.         $rep->body->assign($this->templateAssign$tpl->fetch($this->editTemplate));
  424.         return $rep;
  425.     }
  426.  
  427.     /**
  428.      * redefine this method if you wan to do additionnal things on the response and on the edit template
  429.      * during the editupdate action.
  430.      * @param jFormsBase $form the form
  431.      * @param jResponseHtml $resp the response
  432.      * @param jtpl $tpl the template to display the edit form
  433.      */
  434.     protected function _editUpdate($form$resp$tpl{
  435.  
  436.     }
  437.  
  438.     /**
  439.      * redefine this method if you wan to do additionnal things on the dao generated by the
  440.      * jFormsBase::prepareDaoFromControls method
  441.      * @param jFormsBase $form the form
  442.      * @param jDaoRecordBase $form_daorec 
  443.      * @param mixed $id the new id of the updated record
  444.      * @since 1.1
  445.      */
  446.     protected function _beforeSaveUpdate($form$form_daorec$id{
  447.  
  448.     }
  449.  
  450.     /**
  451.      * save data of a form in a new record
  452.      */
  453.     function saveupdate(){
  454.         $rep $this->getResponse('redirect');
  455.         $id $this->param('id');
  456.         $page $this->param($this->offsetParameterName);
  457.         $form $this->_getForm($id);
  458.         if$form === null || $id === null){
  459.             $rep->action $this->_getAction('index');
  460.             return $rep;
  461.         }
  462.         $form->initFromRequest();
  463.  
  464.         $rep->params[$this->offsetParameterName$page;
  465.         if($form->check(&& $this->_checkData($formtrue)){
  466.             $results $form->prepareDaoFromControls($this->dao,$id,$this->dbProfile);
  467.             extract($resultsEXTR_PREFIX_ALL"form");//use a temp variable to avoid notices
  468.             $this->_beforeSaveUpdate($form$form_daorec$id);
  469.             $form_dao->update($form_daorec);
  470.             $rep->action $this->_getAction('view');
  471.             $rep->params['id'$id;
  472.             $this->_afterUpdate($form$id$rep);
  473.             if ($this->uploadsDirectory !== false)
  474.                 $form->saveAllFiles($this->uploadsDirectory);
  475.             jForms::destroy($this->form$id);
  476.         else {
  477.             $rep->action $this->_getAction('editupdate');
  478.             $rep->params['id'$id;
  479.         }
  480.         return $rep;
  481.     }
  482.  
  483.     /**
  484.      * redefine this method if you wan to do additionnal things after the update of
  485.      * a record. For example, you can handle here the uploaded files. If you do
  486.      * such handling, set the uploadsDirectory property to false, to prevent
  487.      * the default behavior on uploaded files in the controller.
  488.      * @param jFormsBase $form the form object
  489.      * @param mixed $id the new id of the updated record
  490.      * @param jResponseHtml $resp the response
  491.      */
  492.     protected function _afterUpdate($form$id$resp{
  493.  
  494.     }
  495.  
  496.     /**
  497.      * displays a record
  498.      */
  499.     function view(){
  500.         $id $this->param('id');
  501.         $page $this->param($this->offsetParameterName);
  502.         if$id === null ){
  503.             $rep $this->getResponse('redirect');
  504.             $rep->action $this->_getAction('index');
  505.             return $rep;
  506.         }
  507.         $rep $this->_getResponse();
  508.  
  509.         // we're using a form to display a record, to have the portunity to have
  510.         // labels with each values. We need also him to load easily values of some
  511.         // of controls with initControlFromDao (to use in _view method).
  512.         $form $this->_createForm($id);
  513.         $form->initFromDao($this->dao$id$this->dbProfile);
  514.  
  515.         $tpl new jTpl();
  516.         $tpl->assign('id'$id);
  517.         $tpl->assign('form',$form);
  518.         $tpl->assign('page',$page);
  519.         $tpl->assign('offsetParameterName',$this->offsetParameterName);
  520.         $tpl->assign('editAction' $this->_getAction('preupdate'));
  521.         $tpl->assign('deleteAction' $this->_getAction('delete'));
  522.         $tpl->assign('listAction' $this->_getAction('index'));
  523.         $this->_view($form$rep$tpl);
  524.         $rep->body->assign($this->templateAssign$tpl->fetch($this->viewTemplate));
  525.         return $rep;
  526.     }
  527.  
  528.     /**
  529.      * redefine this method if you want to do additionnal things on the response and on the view template
  530.      * during the view action.
  531.      * @param jFormsBase $form the form
  532.      * @param jResponseHtml $resp the response
  533.      * @param jtpl $tpl the template to display the form content
  534.      */
  535.     protected function _view($form$resp$tpl{
  536.  
  537.     }
  538.  
  539.     /**
  540.      * delete a record
  541.      */
  542.     function delete(){
  543.         $id $this->param('id');
  544.         $page $this->param($this->offsetParameterName);
  545.         $rep $this->getResponse('redirect');
  546.         $rep->params array($this->offsetParameterName=>$page);
  547.         $rep->action $this->_getAction('index');
  548.         if$id !== null && $this->_delete($id$rep) ){
  549.             $dao jDao::get($this->dao$this->dbProfile);
  550.             $dao->delete($id);
  551.         }
  552.         return $rep;
  553.     }
  554.  
  555.     /**
  556.      * redefine this method if you want to do additionnal things before the deletion of a record
  557.      * @param mixed $id the id of the record to delete
  558.      * @return boolean true if the record can be deleted
  559.      * @param jResponseHtml $resp the response
  560.      */
  561.     protected function _delete($id$resp{
  562.         return true;
  563.     }
  564.  
  565. }

Documentation generated on Wed, 04 Jan 2017 22:52:44 +0100 by phpDocumentor 1.4.3