Source for file View.php

Documentation is available at View.php

  1. <?php
  2.     /**
  3.      * Presentation layer miView and miDefaultView
  4.      *
  5.      * @copyright Copyright (c) 2003-2007 Mirchev Ideas Ltd. All rights reserved.
  6.      * @package MIPHPF
  7.      */
  8.     
  9.     /**
  10.      * Base class for the presentation tier
  11.      * 
  12.      * @copyright Copyright (c) 2007 Mirchev Ideas Ltd. All rights reserved.
  13.      * @package MIPHPF
  14.      */
  15.     class miView {
  16.         /**
  17.          * The controller command objects
  18.          */
  19.         protected $_controllerCommands = array();
  20.         
  21.         /**
  22.          * Reference to the controller object
  23.          */
  24.         protected $_controller;
  25.         
  26.         public function setController($controller)
  27.         {
  28.             $this->_controller = $controller;
  29.         }
  30.         
  31.         public function getController()
  32.         {
  33.             return $this->_controller;
  34.         }
  35.         
  36.         /**
  37.          * Retrieves the controller commands
  38.          * 
  39.          * @access public
  40.          * @return array the controller command objects
  41.          */
  42.         public function getControllerCommands()
  43.         {
  44.             return $this->_controllerCommands;
  45.         }
  46.         
  47.         /**
  48.          * Add new controller command
  49.          * 
  50.          * @access public
  51.          * @param miControllerCommand $controllerCommand 
  52.          */
  53.         public function addControllerCommand(miControllerCommand $controllerCommand)
  54.         {
  55.             $this->_controllerCommands[$controllerCommand;
  56.         }
  57.         
  58.         public function preProcess($actionObj)
  59.         {
  60.         }
  61.         
  62.         public function postProcess($actionObj$actionResult)
  63.         {
  64.         }
  65.     }
  66.     
  67.     /**
  68.      * Handles the presentation tier
  69.      *
  70.      * @copyright Copyright (c) 2003-2007 Mirchev Ideas Ltd. All rights reserved.
  71.      * @package MIPHPF
  72.      */
  73.     class miDefaultView extends miView {
  74.         const TEMPLATE_ID_CREATE = 'create';
  75.         const TEMPLATE_ID_EDIT = 'edit';
  76.         const TEMPLATE_ID_VIEW = 'view';
  77.         const TEMPLATE_ID_LIST = 'list';
  78.         
  79.         
  80.         /**
  81.          * An array of template names needed to visualize all viewes
  82.          *
  83.          * @access protected
  84.          * @var array 
  85.          */
  86.         protected $_templates = array();
  87.         
  88.         /**
  89.          * Object of class miSQLRecord or its subclasses
  90.          *
  91.          * @access protected
  92.          * @var SQLRecord 
  93.          */
  94.         protected $_record;
  95.         
  96.         /**
  97.          * Reference to the view mapper controller object
  98.          */
  99.         protected $_viewMapperController = null;
  100.         
  101.         /**
  102.          * Reference to the domain object
  103.          */
  104.         protected $_domainObject = null;
  105.         
  106.         /**
  107.          * Object of class miTable or its subclasses
  108.          *
  109.          * @access protected
  110.          * @var miTable 
  111.          */
  112.         protected $_table;
  113.  
  114.         /**
  115.          * Array that describes the output and input of each database field
  116.          *
  117.          * @access protected
  118.          * @var array 
  119.          */
  120.         protected $_dataFields = array();
  121.  
  122.         /**
  123.          * Array that describes the output and input of each field of type FILE
  124.          *
  125.          * @access protected
  126.          * @var array 
  127.          */
  128.         protected $_submitFields = array();
  129.         
  130.         /**
  131.          * Stores page specific elements
  132.          * 
  133.          * @access protected
  134.          */
  135.         protected $_mainPageElements = array();
  136.         
  137.         /**
  138.          * The default filter values
  139.          * 
  140.          * @access protected
  141.          */
  142.         protected $_defaultFilterValues = array();
  143.         
  144.         /**
  145.          * @access protected
  146.          */
  147.         protected $_recordset;
  148.         
  149.         /**
  150.          * Plugin objects
  151.          */
  152.         protected $_plugins = array();
  153.         
  154.         protected $_persistVars = array('sortBy''sortDir''page''recordsPerPage');
  155.         
  156.         /**
  157.          * Constructor
  158.          */
  159.         function __construct($recordset)
  160.         {
  161.             $this->_recordset = &$recordset;
  162.             
  163.             $stateObj miAppFactory::singleton()->getStateObj();
  164.             $stateObj->setDefaultCategory(get_class($this));
  165.             
  166.             // Setup the persist vars: persist the filters 
  167.             foreach ($_REQUEST as $name => $value{
  168.                 if (!substr_compare($name'Filter'-6or !substr_compare($name'Condition'-9))
  169.                     $this->_persistVars[$name;
  170.             }
  171.             $stateObj->setPersistVars($this->_persistVars);
  172.             
  173.             $stateObj->restoreState();
  174.         }
  175.         
  176.         
  177.         /**
  178.          * Creates the table pager object. Singleton pattern
  179.          * 
  180.          * @access public
  181.          * @return object 
  182.          */
  183.         public function &getTablePagerObj()
  184.         {
  185.             static $pagerObj null;
  186.             if ($pagerObj == null)
  187.                 $pagerObj new miDefaultTablePager($this->_table);
  188.             return $pagerObj;
  189.         }
  190.         
  191.         /**
  192.          * Creates the table filter object. Singleton pattern
  193.          * 
  194.          * @access public
  195.          * @return object 
  196.          */
  197.         public function &getTableFilterObj()
  198.         {
  199.             static $filterObj null;
  200.             if ($filterObj == null{
  201.                 $filterObj new miTableFilters($this->_table);
  202.                 
  203.                 $defaultFilterValues $this->_defaultFilterValues;
  204.                 // By default all fields that do not have explicit default
  205.                 // filter value will have empty default filter value
  206.                 foreach ($this->_dataFields as $dataField{
  207.                     if (!isset($defaultFilterValues[$dataField['data']]))
  208.                         $defaultFilterValues[$dataField['data']] '';
  209.                 }
  210.                 $filterObj->setDefaultFilterValues($defaultFilterValues);
  211.             }
  212.             return $filterObj;
  213.         }
  214.         
  215.         /**
  216.          * Adds additional table features
  217.          * 
  218.          * @access protected
  219.          * @param miTable $table 
  220.          */
  221.         protected function addTableFeatures($table)
  222.         {
  223.             new miTableSorter($table);
  224.             // Init the table pager and table filter
  225.             $this->getTablePagerObj();
  226.             $this->getTableFilterObj();
  227.         }
  228.         
  229.         /**
  230.          * Return Object of class miSqlRecord or its subclasses
  231.          * which was set by setRecord method
  232.          *
  233.          * @access public
  234.          * @return object Object of class miSqlRecord or its subclasses
  235.          */
  236.         public function &getRecord()
  237.         {
  238.             return $this->_record;
  239.         }
  240.         
  241.         
  242.         /**
  243.          * Sets object of class miSqlRecord or its subclasses.
  244.          * 
  245.          * miSqlRecord object is needed to handle and manage the inserting,
  246.          * updating, deleting and reading of data into the database table specified
  247.          * by the "tableName" in miSqlRecord constructor. The database table primary
  248.          * key is also needed in miSqlRecord constructor.
  249.          * Example:
  250.          * <code>
  251.          * <?php
  252.          * $view = new miView;
  253.          * $view->setRecord(new miSqlRecord('tableName', 'tablePrimaryKey'));
  254.          * ?>
  255.          * </code>
  256.          * @access public
  257.          * @param object $u Object of class miSqlRecord or its subclasses
  258.          */
  259.         public function setRecord($u)
  260.         {
  261.             $this->_record $u;
  262.         }
  263.         
  264.         public function getDomainObject()
  265.         {
  266.             if ($this->_domainObject == null)
  267.                 $this->_domainObject $this->createDomainObject();
  268.             return $this->_domainObject;
  269.         }
  270.         
  271.         protected function createDomainObject()
  272.         {
  273.             return new miDefaultDomainObject($this->_record);
  274.         }
  275.         
  276.         public function getViewMapperController()
  277.         {
  278.             if ($this->_viewMapperController == null{
  279.                 $this->_viewMapperController $this->createViewMapperController();
  280.                 $this->initViewMapperController($this->_viewMapperController);
  281.             }
  282.             return $this->_viewMapperController;
  283.         }
  284.         
  285.         protected function createViewMapperController()
  286.         {
  287.             $pkValue miGetParamDefault($this->_record->getPrimaryKeyColumn()0);
  288.             return new miViewMapperControllerDefault($this$this->getDomainObject()$pkValue);
  289.         }
  290.         
  291.         /**
  292.          * Returns the recordset
  293.          * 
  294.          * @access public
  295.          */
  296.         public function getRecordset()
  297.         {
  298.             return $this->_recordset;
  299.         }
  300.         
  301.         /**
  302.          * Return array that describes the output and input of each database field
  303.          *
  304.          * @access public
  305.          * @return array that describes the output and input of each database field
  306.          */
  307.         public function getDataFields()
  308.         {
  309.             return $this->_dataFields;
  310.         }
  311.         
  312.         
  313.         /**
  314.          * Sets array that describes the output and input of each database field
  315.          *
  316.          * @access public
  317.          * @param array $u Array that describes the output and input of each database field
  318.          */
  319.         public function setDataFields($u)
  320.         {
  321.             $this->_dataFields $u;
  322.         }
  323.        
  324.  
  325.         /**
  326.          * Return object of class miTable or its subclasses
  327.          * which was set by setTable method
  328.          *
  329.          * @access public
  330.          * @return object Object of class miTable or its subclasses
  331.          */
  332.         public function getTable()
  333.         {
  334.             return $this->_table;
  335.         }
  336.         
  337.         
  338.         /**
  339.          * Sets Object of class miTable or its subclasses.
  340.          *
  341.          * miTable object is needed to manage the representation in table format of data,
  342.          * which is readed from miSqlRecordset object set in miTable constructor.
  343.          * The data is readed from table specified by the "tableName" in the miSqlRecordset
  344.          * constructor.
  345.          * Example:
  346.          * <code>
  347.          * <?php
  348.          * $view = new miView;
  349.          * $recordset = new miSqlRecordset('tableName');
  350.          * $view->setTable(new miTable($recordset));
  351.          * ?>
  352.          * </code>
  353.          *
  354.          * @access public
  355.          * @param object $u Object of class miTable or its subclasses
  356.          */
  357.         public function setTable($u)
  358.         {
  359.             $this->_table $u;
  360.         }
  361.         
  362.         
  363.         /**
  364.          * Sets main page elements
  365.          *
  366.          * @access public
  367.          * @param array $mainPageElements array with the main page elements
  368.          */
  369.         public function setMainPageElements($mainPageElements)
  370.         {
  371.             $this->_mainPageElements $mainPageElements;
  372.         }
  373.         
  374.         
  375.         /**
  376.          * Adds main page elements
  377.          *
  378.          * @access public
  379.          * @param array $mainPageElements array with the main page elements
  380.          */
  381.         public function addMainPageElements($mainPageElements)
  382.         {
  383.             $this->_mainPageElements array_merge($this->_mainPageElements$mainPageElements);
  384.         }
  385.         
  386.         /**
  387.          * Returns the main page elements
  388.          * 
  389.          * @access public
  390.          * @return array 
  391.          */
  392.         public function getMainPageElements()
  393.         {
  394.             return $this->_mainPageElements;
  395.         }
  396.         
  397.         /**
  398.          * Registers new plugin
  399.          * 
  400.          * @access public
  401.          * @param miViewPlugin $plugin the plugin to register
  402.          */
  403.         public function registerPlugin(miViewPlugin $plugin)
  404.         {
  405.             $this->_plugins[$plugin;
  406.         }
  407.         
  408.         /**
  409.          * Adds redirect to list controller command
  410.          * Used after dmExecCreate, dmExecEdit and dmExecDelete to prevent refreshing
  411.          * the page to cause repetition of the operation
  412.          * 
  413.          * @access public
  414.          * @param string $msg message to display on the list page
  415.          * @param int $msgType the type of the message (optional)
  416.          */
  417.         public function addRedirectToListControllerCommand($msg$msgType miMessage::MSG_TYPE_ERROR)
  418.         {
  419.             $loc $_SERVER['PHP_SELF''?' $this->getRedirectParams($msg$msgType);
  420.             $cmd new miControllerCommand(miControllerCommand::CONTROLLER_COMMAND_REDIRECT$loc);
  421.             $this->addControllerCommand($cmd);
  422.         }
  423.         
  424.         /**
  425.          * Returns the redirect params
  426.          *
  427.          * @access protected
  428.          * @param string $msg message to display on the list page
  429.          * @param int $msgType the type of the message (optional)
  430.          * @return string the redirect params url string
  431.          */
  432.         public function getRedirectParams($msg$msgType miMessage::MSG_TYPE_ERROR)
  433.         {
  434.             $params miMessage::PARAM_MESSAGE '=' urlencode($msg);
  435.             if ($msgType != miMessage::MSG_TYPE_ERROR)
  436.                 $params .= '&' miMessage::PARAM_MESSAGE_TYPE '=' urlencode($msgType);
  437.             
  438.             $stateParams miAppFactory::singleton()->getStateObj()->getStateUrlParams();
  439.             if ($stateParams != '')
  440.                 $params .= '&' $stateParams;
  441.             
  442.             return $params;
  443.         }
  444.         
  445.         /**
  446.          * Calls each of the plugins passing the $actionObj and the $actionStep
  447.          * 
  448.          * @access public
  449.          * @param miAction $actionObj action object subclassed from miAction
  450.          * @param string $actionStep the particular action step
  451.          */
  452.         public function callPlugin($actionObj$actionStep)
  453.         {
  454.             foreach ($this->_plugins as $plugin)
  455.                 $plugin->processActionStep($actionObj$actionStep);
  456.         }
  457.         
  458.         /**
  459.          * Called before the action is executed
  460.          * Subclasses can add functionlity to be executed before the action
  461.          * 
  462.          * @access protected
  463.          * @param miAction $actionObj action object, extended from miAction
  464.          */
  465.         public function preProcess($actionObj)
  466.         {
  467.             foreach ($this->_plugins as $plugin)
  468.                 $plugin->preProcessAction($actionObj);
  469.         }
  470.         
  471.         /**
  472.          * Called after the action is executed
  473.          * Subclasses can add functionlity to be executed after the action
  474.          * 
  475.          * @access protected
  476.          * @param miAction $actionObj action object, extended from miAction
  477.          * @param boolean $actionResult the result of the action command
  478.          */
  479.         public function postProcess($actionObj$actionResult)
  480.         {
  481.             foreach ($this->_plugins as $plugin)
  482.                 $plugin->postProcessAction($actionObj$actionResult);
  483.         }
  484.         
  485.         /**
  486.          * Subclasses can init the table
  487.          * 
  488.          * @param miTable $table reference to the table object
  489.          */
  490.         public function initTable($table)
  491.         {
  492.             $this->addTableFeatures($this->_table);
  493.         }
  494.         
  495.         /**
  496.          * Inits the web form
  497.          * 
  498.          * @access public
  499.          * @param miWebForm $form 
  500.          */
  501.         public function initWebForm(&$form)
  502.         {
  503.             $form->initWidgets($this->_dataFields);
  504.         }
  505.         
  506.         /**
  507.          * Inits the view mapper controller
  508.          */
  509.         public function initViewMapperController($viewMapperController)
  510.         {
  511.         }
  512.         
  513.         /**
  514.          * Returns the template file for the $templateId
  515.          * 
  516.          * @access public
  517.          * @param string $templateId the id of the template
  518.          * @return string the template file name relative to the document root
  519.          * @throws miConfigurationException
  520.          */
  521.         public function getTemplateFileName($templateId)
  522.         {
  523.             if (isset($this->_templates[$templateId]))
  524.                 return $this->_templates[$templateId];
  525.             
  526.             // Find the prefix
  527.             $prefix $_SERVER['SCRIPT_NAME'];
  528.             if (substr_compare($prefix'_mgmt.php'strlen($prefix)-9))
  529.                 throw new miConfigurationException('The template filename needs to be defined for template: ' $templateIdmiConfigurationException::EXCEPTION_UNDEFINED_TEMPLATE_FILENAME);
  530.             
  531.             $prefix substr($prefix1-9);
  532.             switch ($templateId{
  533.                 case self::TEMPLATE_ID_LIST:
  534.                     return $prefix '_mgmt.tmpl';
  535.                 case self::TEMPLATE_ID_VIEW:
  536.                     return $prefix '_view.tmpl';
  537.                 case self::TEMPLATE_ID_CREATE:
  538.                     return $prefix '_create.tmpl';
  539.                 case self::TEMPLATE_ID_EDIT:
  540.                     return $prefix '_edit.tmpl';
  541.             }
  542.             throw new miConfigurationException('The template filename needs to be defined for template: ' $templateIdmiConfigurationException::EXCEPTION_UNDEFINED_TEMPLATE_FILENAME);
  543.         }
  544.         
  545.         /**
  546.          * Returns message based on code
  547.          * 
  548.          * @param string $msgCode 
  549.          * @return string the message
  550.          */
  551.         public function getMessage($msgCode)
  552.         {
  553.             return miI18N::getSystemMessage($msgCode);
  554.         }
  555.     }
  556. ?>

Documentation generated on Thu, 08 May 2008 16:57:56 +0300 by phpDocumentor 1.4.1