Source for file WebForm.php

Documentation is available at WebForm.php

  1. <?php
  2.     /**
  3.      * Contains the miWebForm class
  4.      *
  5.      * @copyright Copyright (c) 2006,2007 Mirchev Ideas Ltd. All rights reserved.
  6.      * @package MIPHPF
  7.      */
  8.  
  9.     /**
  10.      * Manages a web form
  11.      * 
  12.      * @copyright Copyright (c) 2006,2007 Mirchev Ideas Ltd. All rights reserved.
  13.      * @package MIPHPF
  14.      */
  15.     class miWebForm {
  16.         
  17.         
  18.         /**
  19.          * Array that describes the output and input of each web field
  20.          *
  21.          * @access protected
  22.          * @var array 
  23.          */
  24.         protected $_formProperties = array();
  25.         
  26.         /**
  27.          * Array with field objects
  28.          * 
  29.          * @access protected
  30.          * @var array 
  31.          */
  32.         protected $_formFields = array();
  33.         
  34.         /**
  35.          * The validators
  36.          * 
  37.          * @access protected
  38.          * @var array 
  39.          */
  40.         protected $_validators = array();
  41.         
  42.         /**
  43.          * @access protected
  44.          * @var array 
  45.          */
  46.         protected $_mainPageElements = array();
  47.         
  48.         /**
  49.          * 
  50.          */
  51.         protected $_submittedData = array();
  52.         
  53.         /**
  54.          * Array with data to displayed by the widgets
  55.          *
  56.          * @access protected
  57.          * @var array 
  58.          */
  59.         protected $_formDataRow;
  60.         
  61.         /**
  62.          * A reference to the error hanlder object
  63.          */
  64.         protected $_errorsHandler = null;
  65.         
  66.         /**
  67.          * Template section infos to be added when parsing the template
  68.          */
  69.         protected $_templateSectionInfos = array();
  70.         
  71.         /**
  72.          * Reference to the message object, or null
  73.          */
  74.         protected $_messageObj = null;
  75.         
  76.         /**
  77.          * Constructs the miWebForm
  78.          * 
  79.          * @access public
  80.          * @param array $formData 
  81.          */
  82.         function __construct($formDataRow)
  83.         {
  84.             $this->_formDataRow = $formDataRow;
  85.         }
  86.         
  87.         /**
  88.          * Sets the form data row
  89.          * 
  90.          * @access public
  91.          * @param array $formDataRow 
  92.          */
  93.         public function setFormDataRow($formDataRow)
  94.         {
  95.             $this->_formDataRow = $formDataRow;
  96.         }
  97.                 
  98.         /**
  99.          * Returns the form data row
  100.          * 
  101.          * @access public
  102.          * @return array 
  103.          */
  104.         public function &getFormDataRow()
  105.         {
  106.             return $this->_formDataRow;
  107.         }
  108.         
  109.         /**
  110.          * Sets form data
  111.          * 
  112.          * @access public
  113.          * @param string $key 
  114.          * @param string $formData 
  115.          */
  116.         public function setFormData($key$formData)
  117.         {
  118.             $this->_formDataRow[$key$formData;
  119.         }
  120.                 
  121.         /**
  122.          * Returns a form data value
  123.          * 
  124.          * @access public
  125.          * @param string $key 
  126.          * @return mixed 
  127.          */
  128.         public function &getFormData($key)
  129.         {
  130.             return $this->_formDataRow[$key];
  131.         }
  132.         
  133.         /**
  134.          * Adds new template section info
  135.          */
  136.         public function addTemplateSectionInfo($templateSectionInfo)
  137.         {
  138.             $this->_templateSectionInfos[$templateSectionInfo;
  139.         }
  140.         
  141.         /**
  142.          * Set the form fields
  143.          * 
  144.          * @param array $formProperties the form properties array
  145.          */
  146.         public function initWidgets($formProperties)
  147.         {
  148.             $this->_formProperties = $formProperties;
  149.             
  150.             // Build all field objects
  151.             foreach ($formProperties as $key => $formField{
  152.                 $properties = isset($formField['properties']$formField['properties'array();
  153.                 $field new $formField['field']($this$properties);
  154.                 $field->setFieldName($formField['data']);
  155.                 $this->_formFields[$key$field;
  156.                 
  157.                 if (isset($formField['validator'])) {
  158.                     // Multiple validators per field
  159.                     if (is_array($formField['validator'])) {
  160.                         $this->_validators[$keyarray();
  161.                         foreach ($formField['validator'as $validator{
  162.                             $this->_validators[$key][new $validator($this$formField['data']);
  163.                         }
  164.                         continue;
  165.                     }
  166.                     
  167.                     // Single validator
  168.                     $this->_validators[$keynew $formField['validator']($this$formField['data']);
  169.                 }
  170.             }
  171.         }
  172.         
  173.         /**
  174.          * Adds a validator for a field
  175.          * 
  176.          * @access public
  177.          * @param string $fieldName 
  178.          * @param miValidator $validator 
  179.          */
  180.         public function addValidator($fieldNamemiValidator $validator)
  181.         {
  182.             foreach ($this->_formProperties as $key => $formField{
  183.                 if ($formField['data'!= $fieldName)
  184.                     continue;
  185.                 
  186.                 // Check for 3 possible cases:
  187.                 // 1. there is no validator - set it as reference
  188.                 // 2. there is one validator - convert to array of validators
  189.                 // 3. there are already more than one validators - add the validator to the array of validators
  190.                 if (isset($this->_validators[$key])) {
  191.                     if (is_array($this->_validators[$key]))
  192.                         $this->_validators[$key][$validator;
  193.                     else
  194.                         $this->_validators[$keyarray($this->_validators[$key]$validator);
  195.                 else
  196.                     $this->_validators[$key$validator;
  197.             }
  198.         }
  199.         
  200.         /**
  201.          * Removes all validators for a field
  202.          * 
  203.          * @access public
  204.          * @param string $fieldName 
  205.          */
  206.         public function removeValidators($fieldName)
  207.         {
  208.             foreach ($this->_formProperties as $key => $formField{
  209.                 if ($formField['data'!= $fieldName)
  210.                     continue;
  211.                 
  212.                 unset($this->_validators[$key]);
  213.             }
  214.         }
  215.         
  216.         /**
  217.          * Returns the widget
  218.          * 
  219.          * @param string $fieldName the name of the field whose widget to return
  220.          * @return miWidget|nullan object that is extends miWidget, or null if not found
  221.          */
  222.         public function getWidget($fieldName)
  223.         {
  224.             foreach ($this->_formProperties as $key => $formProperty{
  225.                 if ($formProperty['data'== $fieldName)
  226.                     return $this->_formFields[$key];
  227.             }
  228.             return null;
  229.         }
  230.         
  231.         
  232.         /**
  233.          * Adds new form field object
  234.          * 
  235.          * @param string $fieldName 
  236.          * @param miBaseWidget $widget 
  237.          */
  238.         public function addWidget($fieldNamemiBaseWidget $widget)
  239.         {
  240.             $this->_formProperties[array('data' => $fieldName);
  241.             end($this->_formProperties);
  242.             $this->_formFields[key($this->_formProperties)$widget;
  243.         }
  244.         
  245.         /**
  246.          * 
  247.          */
  248.         public function addMainPageElements($mainPageElements)
  249.         {
  250.             $this->_mainPageElements = array_merge($this->_mainPageElements$mainPageElements);
  251.         }
  252.         
  253.         /**
  254.          * Parses the form template
  255.          * 
  256.          * @param string $templateName 
  257.          * @param boolean $isEditable if the form will contain the editable fields/widgets
  258.          * @return string the html for the form
  259.          */
  260.         public function parse($templateName$isEditable)
  261.         {
  262.             $t new miTemplateParser();
  263.             $t->readTemplate($templateName);
  264.             
  265.             foreach ($this->_formFields as $key => $formField{
  266.                 if ($isEditable)
  267.                     $disp $formField->getEditableControl();
  268.                 else
  269.                     $disp $formField->getControl();
  270.                 
  271.                 $fieldValues array();
  272.                 foreach ($disp as $key => $value{
  273.                     $fieldValues['%%' strtoupper($key'%%'$value;
  274.                 }
  275.                 $t->assignArray($fieldValues);
  276.             }
  277.  
  278.             $errors $this->getWebFormErrorsHandler();
  279.             $errors->assignErrors($t);
  280.             
  281.             $t->assignArray($this->getMessageObj()->getMessageTemplateVars());
  282.             $t->assignArray($this->_mainPageElements);
  283.             $t->setSectionInfos($this->_templateSectionInfos);
  284.             $this->onParse($t);
  285.             return $t->templateParse();
  286.         }
  287.         
  288.         /**
  289.          * Returns the message object
  290.          * if $this->_messageObj is null creates new miMessage object
  291.          * 
  292.          * @return miMessage the message object
  293.          */
  294.         protected function getMessageObj()
  295.         {
  296.             if ($this->_messageObj == null)
  297.                 $this->_messageObj = new miMessage;
  298.             return $this->_messageObj;
  299.         }
  300.         
  301.         /**
  302.          * Shows the form
  303.          * 
  304.          * @param string $templateName 
  305.          * @param boolean $isEditable if the form will contain the editable fields/widgets
  306.          */
  307.         public function show($templateName$isEditable)
  308.         {
  309.             echo $this->parse($templateName$isEditable);
  310.         }
  311.         
  312.         /**
  313.          * Called just before the template is parsed
  314.          * Subclasses can add custom functionality using this method
  315.          * 
  316.          * @param miTemplateParser $templateParser the template parser
  317.          */
  318.         protected function onParse(miTemplateParser &$templateParser)
  319.         {
  320.         }
  321.         
  322.         /**
  323.          * Returns the web form errors handling object
  324.          * 
  325.          * @access protected
  326.          * @return miWebFormErrorsHandler 
  327.          */
  328.         public function getWebFormErrorsHandler()
  329.         {
  330.             if ($this->_errorsHandler == null)
  331.                 $this->_errorsHandler = new miWebFormErrorsHandler;
  332.             return $this->_errorsHandler;
  333.         }
  334.         
  335.         public function setErrorsHandler($errorsHandler)
  336.         {
  337.             $this->_errorsHandler = $errorsHandler;
  338.         }
  339.         
  340.         /**
  341.          * Process the form submission
  342.          * 
  343.          * @return boolean true on success, false if errors were found
  344.          */
  345.         function processSubmit()
  346.         {
  347.             $this->_submittedData = array();
  348.             
  349.             foreach ($this->_formFields as $key => $formField{
  350.                 $submittedData $formField->getData();
  351.                 $this->_submittedData = array_merge($this->_submittedData$submittedData);
  352.             }
  353.             
  354.             // Validate the form
  355.             $errors $this->getWebFormErrorsHandler();
  356.             foreach ($this->_formFields as $key => $formField{
  357.                 $formField->validateData($errors);
  358.             }
  359.             foreach ($this->_formFields as $key => $formField{
  360.                 if (!isset($this->_validators[$key]))
  361.                     continue;
  362.                 
  363.                 // Multiple validators per field
  364.                 if (is_array($this->_validators[$key])) {
  365.                     foreach ($this->_validators[$keyas $validator{
  366.                         $validator->validate($errors);
  367.                     }
  368.                     continue;
  369.                 }
  370.                 
  371.                 // Single validator
  372.                 $this->_validators[$key]->validate($errors);
  373.             }
  374.             
  375.             return !$errors->hasErrors();
  376.         }
  377.         
  378.         /**
  379.          * Returns the submitted data row
  380.          * 
  381.          * @access public
  382.          * @return array 
  383.          */
  384.         public function getSubmittedDataRow()
  385.         {
  386.             return $this->_submittedData;
  387.         }
  388.         
  389.         /**
  390.          * Return the submitted field value
  391.          * 
  392.          * @access public
  393.          * @return string 
  394.          */
  395.         public function getSubmittedData($fieldName)
  396.         {
  397.             return $this->_submittedData[$fieldName];
  398.         }
  399.     }
  400. ?>

Documentation generated on Thu, 08 May 2008 16:58:01 +0300 by phpDocumentor 1.4.1