Source for file jControllerDaoCrudDfk.class.php

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

Documentation generated on Thu, 22 Mar 2012 22:14:27 +0100 by phpDocumentor 1.4.3