| /** | |
| * Class representing a page of a multipage form | |
| * | |
| * PHP version 5 | |
| * | |
| * LICENSE: | |
| * | |
| * Copyright (c) 2006-2010, Alexey Borzov <avb@php.net>, | |
| * Bertrand Mansion <golgote@mamasam.com> | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions | |
| * are met: | |
| * | |
| * * Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * * Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * * The names of the authors may not be used to endorse or promote products | |
| * derived from this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * @category HTML | |
| * @package HTML_QuickForm2 | |
| * @author Alexey Borzov <avb@php.net> | |
| * @author Bertrand Mansion <golgote@mamasam.com> | |
| * @license http://opensource.org/licenses/bsd-license.php New BSD License | |
| * @version SVN: $Id: Page.php 295963 2010-03-08 14:33:43Z avb $ | |
| * @link http://pear.php.net/package/HTML_QuickForm2 | |
| */ | |
| /** | |
| * Class representing a page of a multipage form | |
| * | |
| * Unlike old HTML_QuickForm_Controller, this does not extend HTML_QuickForm2 | |
| * but accepts an instance of that in the constructor. You need to create a | |
| * subclass of this class and implement its populateForm() method. | |
| * | |
| * @category HTML | |
| * @package HTML_QuickForm2 | |
| * @author Alexey Borzov <avb@php.net> | |
| * @author Bertrand Mansion <golgote@mamasam.com> | |
| * @version Release: @package_version@ | |
| */ | |
| abstract class HTML_QuickForm2_Controller_Page | |
| { | |
| /** | |
| * Button name template (needs form ID and action name substituted by sprintf()) | |
| */ | |
| const KEY_NAME = '_qf_%s_%s'; | |
| /** | |
| * Whether populateForm() was already called | |
| * @var boolean | |
| */ | |
| private $_formPopulated = false; | |
| /** | |
| * The form wrapped by this page | |
| * @var HTML_QuickForm2 | |
| */ | |
| protected $form = null; | |
| /** | |
| * Controller this page belongs to | |
| * @var HTML_QuickForm2_Controller | |
| */ | |
| protected $controller = null; | |
| /** | |
| * Contains the mapping of action names to handlers (objects implementing HTML_QuickForm2_Controller_Action) | |
| * @var array | |
| */ | |
| protected $handlers = array(); | |
| /** | |
| * Class constructor, accepts the form to wrap around | |
| * | |
| * @param HTML_QuickForm2 | |
| */ | |
| public function __construct(HTML_QuickForm2 $form) | |
| { | |
| $this->form = $form; | |
| } | |
| /** | |
| * Returns the form this page wraps around | |
| * | |
| * @return HTML_QuickForm2 | |
| */ | |
| public function getForm() | |
| { | |
| return $this->form; | |
| } | |
| /** | |
| * Sets the controller owning the page | |
| * | |
| * @param HTML_QuickForm2_Controller controller the page belongs to | |
| */ | |
| public function setController(HTML_QuickForm2_Controller $controller) | |
| { | |
| $this->controller = $controller; | |
| } | |
| /** | |
| * Returns the controller owning this page | |
| * | |
| * @return HTML_QuickForm2_Controller | |
| */ | |
| public function getController() | |
| { | |
| return $this->controller; | |
| } | |
| /** | |
| * Adds a handler for a specific action | |
| * | |
| * @param string action name | |
| * @param HTML_QuickForm2_Controller_Action the handler for the action | |
| */ | |
| public function addHandler($actionName, HTML_QuickForm2_Controller_Action $action) | |
| { | |
| $this->handlers[$actionName] = $action; | |
| } | |
| /** | |
| * Handles an action | |
| * | |
| * If the page does not contain a handler for this action, controller's | |
| * handle() method will be called. | |
| * | |
| * @param string Name of the action | |
| * @throws HTML_QuickForm2_NotFoundException if handler for an action is missing | |
| */ | |
| public function handle($actionName) | |
| { | |
| if (isset($this->handlers[$actionName])) { | |
| return $this->handlers[$actionName]->perform($this, $actionName); | |
| } else { | |
| return $this->getController()->handle($this, $actionName); | |
| } | |
| } | |
| /** | |
| * Returns a name for a submit button that will invoke a specific action | |
| * | |
| * @param string Name of the action | |
| * @return string "name" attribute for a submit button | |
| */ | |
| public function getButtonName($actionName) | |
| { | |
| return sprintf(self::KEY_NAME, $this->getForm()->getId(), $actionName); | |
| } | |
| /** | |
| * Sets the default action invoked on page-form submit | |
| * | |
| * This is necessary as the user may just press Enter instead of | |
| * clicking one of the named submit buttons and then no action name will | |
| * be passed to the script. | |
| * | |
| * @param string Default action name | |
| * @param string Path to a 1x1 transparent GIF image | |
| * @return object Returns the image input used for default action | |
| */ | |
| public function setDefaultAction($actionName, $imageSrc = '') | |
| { | |
| // require_once 'HTML/QuickForm2/Controller/DefaultAction.php'; | |
| if (0 == count($this->form)) { | |
| $image = $this->form->appendChild( | |
| new HTML_QuickForm2_Controller_DefaultAction( | |
| $this->getButtonName($actionName), array('src' => $imageSrc) | |
| ) | |
| ); | |
| // replace the existing DefaultAction | |
| } elseif ($image = $this->form->getElementById('_qf_default')) { | |
| $image->setName($this->getButtonName($actionName)) | |
| ->setAttribute('src', $imageSrc); | |
| // Inject the element to the first position to improve chances that | |
| // it ends up on top in the output | |
| } else { | |
| $it = $this->form->getIterator(); | |
| $it->rewind(); | |
| $image = $this->form->insertBefore( | |
| new HTML_QuickForm2_Controller_DefaultAction( | |
| $this->getButtonName($actionName), array('src' => $imageSrc) | |
| ), | |
| $it->current() | |
| ); | |
| } | |
| return $image; | |
| } | |
| /** | |
| * Wrapper around populateForm() ensuring that it is only called once | |
| */ | |
| final public function populateFormOnce() | |
| { | |
| if (!$this->_formPopulated) { | |
| if (!empty($this->controller) && $this->controller->propagateId()) { | |
| $this->form->addElement( | |
| 'hidden', HTML_QuickForm2_Controller::KEY_ID, | |
| array('id' => HTML_QuickForm2_Controller::KEY_ID) | |
| )->setValue($this->controller->getId()); | |
| } | |
| $this->populateForm(); | |
| $this->_formPopulated = true; | |
| } | |
| } | |
| /** | |
| * Populates the form with the elements | |
| * | |
| * The implementation of this method in your subclass of | |
| * HTML_QuickForm2_Controller_Page should contain all the necessary | |
| * addElement(), addRule() etc. calls. The method will only be called if | |
| * needed to prevent wasting resources on the forms that aren't going to | |
| * be seen by the user. | |
| */ | |
| abstract protected function populateForm(); | |
| /** | |
| * Stores the form values (and validation status) is session container | |
| * | |
| * @param bool Whether to store validation status | |
| */ | |
| public function storeValues($validate = true) | |
| { | |
| $this->populateFormOnce(); | |
| $container = $this->getController()->getSessionContainer(); | |
| $id = $this->form->getId(); | |
| $container->storeValues($id, (array)$this->form->getValue()); | |
| if ($validate) { | |
| $container->storeValidationStatus($id, $this->form->validate()); | |
| } | |
| return $container->getValidationStatus($id); | |
| } | |
| } | |