, * Bertrand Mansion * 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 * @author Bertrand Mansion * @license http://opensource.org/licenses/bsd-license.php New BSD License * @version SVN: $Id: Callback.php 294057 2010-01-26 21:10:28Z avb $ * @link http://pear.php.net/package/HTML_QuickForm2 */ /** * Base class for HTML_QuickForm2 rules */ // require_once 'HTML/QuickForm2/Rule.php'; /** * Rule checking the value via a callback function (method) * * The Rule needs a valid callback as a configuration parameter for its work, it * may also be given additional arguments to pass to the callback alongside the * element's value. See {@link mergeConfig()} for description of possible ways * to pass configuration parameters. * * The callback will be called with element's value as the first argument, if * additional arguments were provided they'll be passed as well. It is expected * to return false if the value is invalid and true if it is valid. * * Checking that the value is not empty: * * $str->addRule('callback', 'The field should not be empty', 'strlen'); * * Checking that the value is in the given array: * * $meta->addRule('callback', 'Unknown variable name', * array('callback' => 'in_array', * 'arguments' => array(array('foo', 'bar', 'baz')))); * * The same, but with rule registering first: * * HTML_QuickForm2_Factory::registerRule( * 'in_array', 'HTML_QuickForm2_Rule_Callback', * 'HTML/QuickForm2/Rule/Callback.php', 'in_array' * ); * $meta->addRule('in_array', 'Unknown variable name', array(array('foo', 'bar', 'baz'))); * * * @category HTML * @package HTML_QuickForm2 * @author Alexey Borzov * @author Bertrand Mansion * @version Release: @package_version@ */ class HTML_QuickForm2_Rule_Callback extends HTML_QuickForm2_Rule { /** * Validates the owner element * * @return bool the value returned by a callback function */ protected function validateOwner() { $value = $this->owner->getValue(); $config = $this->getConfig(); return (bool)call_user_func_array( $config['callback'], array_merge(array($value), $config['arguments']) ); } /** * Merges local configuration with that provided for registerRule() * * "Global" configuration may be passed to * {@link HTML_QuickForm2_Factory::registerRule()} in either of the * following formats * - callback * - array(['callback' => callback, ]['arguments' => array(...)]) * * "Local" configuration may be passed to the constructor in either of * the following formats * - callback or arguments (interpretation depends on whether the global * configuration already contains the callback) * - array(['callback' => callback, ]['arguments' => array(...)]) * * As usual, global config overrides local one. It is a good idea to use the * associative array format to prevent ambiguity. * * @param mixed Local configuration * @param mixed Global configuration * @return mixed Merged configuration */ public static function mergeConfig($localConfig, $globalConfig) { if (!isset($globalConfig)) { $config = $localConfig; } else { if (!is_array($globalConfig) || !isset($globalConfig['callback']) && !isset($globalConfig['arguments']) ) { $config = array('callback' => $globalConfig); } else { $config = $globalConfig; } if (is_array($localConfig) && (isset($localConfig['callback']) || isset($localConfig['arguments'])) ) { $config += $localConfig; } elseif(isset($localConfig)) { $config += array('callback' => $localConfig, 'arguments' => $localConfig); } } return $config; } /** * Sets the callback to use for validation and its additional arguments * * @param callback|array Callback or array ('callback' => validation callback, * 'arguments' => additional arguments) * @return HTML_QuickForm2_Rule * @throws HTML_QuickForm2_InvalidArgumentException if callback is missing or invalid */ public function setConfig($config) { if (!is_array($config) || !isset($config['callback'])) { $config = array('callback' => $config); } if (!is_callable($config['callback'], false, $callbackName)) { throw new HTML_QuickForm2_InvalidArgumentException( 'Callback Rule requires a valid callback, \'' . $callbackName . '\' was given' ); } return parent::setConfig($config + array('arguments' => array())); } } ?>