341 lines
7.2 KiB
PHP
341 lines
7.2 KiB
PHP
<?php
|
|
/**
|
|
* patForms rule base class
|
|
*
|
|
* $Id: Rule.php 1347 2009-12-03 21:06:36Z francois $
|
|
*
|
|
* @access protected
|
|
* @package patForms
|
|
* @subpackage Rules
|
|
*/
|
|
|
|
/**
|
|
* patForms rule base class
|
|
*
|
|
* @access protected
|
|
* @package patForms
|
|
* @subpackage Rules
|
|
* @author Stephan Schmidt <schst@php-tools.net>
|
|
* @license LGPL, see license.txt for details
|
|
* @link http://www.php-tools.net
|
|
* @todo implement javascript helper methods (set a javascript property plus an
|
|
* array of keys that will be replaced by the properties of the rule)
|
|
*/
|
|
class patForms_Rule
|
|
{
|
|
/**
|
|
* time when the rule should be applied
|
|
*
|
|
* Possible values are:
|
|
* -PATFORMS_RULE_BEFORE_VALIDATION
|
|
* -PATFORMS_RULE_AFTER_VALIDATION
|
|
* -PATFORMS_RULE_BOTH
|
|
*
|
|
* @access private
|
|
* @var integer
|
|
*/
|
|
var $_time = PATFORMS_RULE_AFTER_VALIDATION;
|
|
|
|
/**
|
|
* script that will be displayed only once
|
|
*
|
|
* @access private
|
|
* @var array
|
|
*/
|
|
var $globalScript = array();
|
|
|
|
/**
|
|
* script that will be displayed once per instance
|
|
*
|
|
* @access private
|
|
* @var array
|
|
*/
|
|
var $instanceScript = array();
|
|
|
|
/**
|
|
* properties that have to be replaced in the instance script.
|
|
*
|
|
* @access private
|
|
* @var array
|
|
*/
|
|
var $scriptPlaceholders = array();
|
|
|
|
/**
|
|
* store the container of the rule
|
|
*
|
|
* @access private
|
|
* @var object
|
|
*/
|
|
var $container;
|
|
|
|
/**
|
|
* define error codes an messages for each form element
|
|
*
|
|
* @abstract
|
|
* @access private
|
|
* @var array
|
|
*/
|
|
var $validatorErrorCodes = array();
|
|
|
|
/**
|
|
* error code offset for the rule
|
|
*
|
|
* @abstract
|
|
* @access private
|
|
*/
|
|
var $errorOffset;
|
|
|
|
/**
|
|
* format of the rule
|
|
*
|
|
* @abstract
|
|
* @access private
|
|
*/
|
|
var $format = 'html';
|
|
|
|
/**
|
|
* name of the rule
|
|
*
|
|
* @abstract
|
|
* @access private
|
|
*/
|
|
var $ruleName = '';
|
|
|
|
/**
|
|
* Get the time when the rule should be applied.
|
|
*
|
|
* This has to be defined in the _time property of the rule.
|
|
*
|
|
* @access public
|
|
* @return integer
|
|
*/
|
|
function getTime()
|
|
{
|
|
return $this->_time;
|
|
}
|
|
|
|
/**
|
|
* create a new rule object
|
|
*
|
|
* @access public
|
|
* @param string id
|
|
*/
|
|
function patForms_Rule( $id = null )
|
|
{
|
|
if ( $id === null )
|
|
{
|
|
$id = uniqid( '' );
|
|
}
|
|
|
|
$this->_id = $id;
|
|
}
|
|
|
|
/**
|
|
* set the id for the rule
|
|
*
|
|
* @access public
|
|
* @param string id
|
|
*/
|
|
function setId( $id )
|
|
{
|
|
$this->_id = $id;
|
|
}
|
|
|
|
/**
|
|
* set the locale, this is needed to update the rule
|
|
* translations, that have been passed to the container
|
|
* element
|
|
*
|
|
* @access public
|
|
* @param string new locale
|
|
* @return boolean
|
|
*/
|
|
function setLocale( $locale )
|
|
{
|
|
// rules do not store locale information
|
|
if (!patForms::isCustomLocale($locale)) {
|
|
return true;
|
|
}
|
|
|
|
$errorMessages = patForms::getCustomLocale($locale, 'Rule::' . $this->getRuleName());
|
|
|
|
if (is_array($errorMessages)) {
|
|
$this->validatorErrorCodes[$locale] = $errorMessages;
|
|
}
|
|
|
|
$this->container->addValidatorErrorCodes( $this->validatorErrorCodes, $this->errorOffset );
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* prepare the rule
|
|
*
|
|
* This method is used to initialize the rule.
|
|
* By default it adds it validatorErrorCodes
|
|
* to the container and stores a reference to the
|
|
* container.
|
|
*
|
|
* You may extend it in your custom rules, but should always be calling
|
|
* this method using:
|
|
*
|
|
* <code>
|
|
* patForms_Rule::prepareRule( $container );
|
|
* </code>
|
|
*
|
|
* @access public
|
|
* @param object Either a patForms or patForms_Element object
|
|
*/
|
|
function prepareRule( &$container )
|
|
{
|
|
$this->format = $container->getFormat();
|
|
|
|
$this->container = &$container;
|
|
$this->errorOffset = $container->getErrorOffset();
|
|
|
|
$container->addValidatorErrorCodes( $this->validatorErrorCodes, $this->errorOffset );
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* method called by patForms or any patForms_Element to validate the
|
|
* element or the form.
|
|
*
|
|
* @abstract
|
|
* @access public
|
|
* @param object Either a patForms or patForms_Element object
|
|
* @return boolean true, if rule has been applied succesfully, false otherwise
|
|
*/
|
|
function applyRule( &$container, $type = PATFORMS_RULE_BEFORE_VALIDATION )
|
|
{
|
|
// your code
|
|
}
|
|
|
|
/**
|
|
* addValidationError
|
|
*
|
|
* @access private
|
|
* @param integer $code
|
|
* @param array $vars fill named placeholder with values
|
|
* @return boolean $result true on success
|
|
*/
|
|
function addValidationError( $code, $vars = array() )
|
|
{
|
|
$code= $this->errorOffset + $code;
|
|
return $this->container->addValidationError( $code, $vars );
|
|
}
|
|
|
|
/**
|
|
* get the name of the rule
|
|
*
|
|
* By default just return the classname, this is sufficient.
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
function getRuleName()
|
|
{
|
|
if (!empty($this->ruleName)) {
|
|
return $this->ruleName;
|
|
}
|
|
return get_class( $this );
|
|
}
|
|
|
|
/**
|
|
* get the global javascript of the rule
|
|
*
|
|
* @access public
|
|
* @return string
|
|
* @todo Rules need to know the output format
|
|
*/
|
|
/*
|
|
function getGlobalJavascript()
|
|
{
|
|
if ( isset( $this->globalScript['html'] ) )
|
|
{
|
|
return $this->globalScript['html'];
|
|
}
|
|
return '';
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* get the instance javascript of the rule
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
/*
|
|
function getInstanceJavascript()
|
|
{
|
|
if ( !isset( $this->instanceScript[$this->format] ) )
|
|
{
|
|
return false;
|
|
}
|
|
// get the script for the current format
|
|
$script = $this->instanceScript[$this->format];
|
|
|
|
// always replace the id
|
|
$script = str_replace( '[RULE::ID]', $this->_id, $script );
|
|
if ( method_exists( $this->container, 'getId' ) )
|
|
{
|
|
$script = str_replace( '[CONTAINER::ID]', $this->container->getId(), $script );
|
|
}
|
|
if ( method_exists( $this->container, 'getName' ) )
|
|
{
|
|
$script = str_replace( '[CONTAINER::NAME]', $this->container->getName(), $script );
|
|
}
|
|
|
|
foreach ( $this->scriptPlaceholders as $placeholder => $property )
|
|
{
|
|
if ( isset( $this->$property ) )
|
|
$script = str_replace( '['.$placeholder.']', $this->$property, $script );
|
|
else
|
|
$script = str_replace( '['.$placeholder.']', '', $script );
|
|
}
|
|
return $script;
|
|
}
|
|
*/
|
|
|
|
function registerJavascripts(&$form) {
|
|
|
|
if ($script = $this->getGlobalJavascript()) {
|
|
$form->registerGlobalJavascript($this->getRuleName(), $script);
|
|
}
|
|
|
|
if ($script = $this->getInstanceJavascript()) {
|
|
$form->registerInstanceJavascript($script);
|
|
}
|
|
}
|
|
|
|
function getGlobalJavascript() {
|
|
|
|
if (isset($this->globalScript[$this->format])) {
|
|
return $this->globalScript[$this->format];
|
|
}
|
|
}
|
|
|
|
function getInstanceJavascript(){
|
|
|
|
if (isset($this->instanceScript[$this->format])) {
|
|
$script = $this->instanceScript[$this->format];
|
|
$script = str_replace('[RULE::ID]', $this->_id, $script);
|
|
if (method_exists($this->container, 'getId')) {
|
|
$script = str_replace('[CONTAINER::ID]', $this->container->getId(), $script);
|
|
}
|
|
if (method_exists($this->container, 'getName')) {
|
|
$script = str_replace('[CONTAINER::NAME]', $this->container->getName(), $script);
|
|
}
|
|
foreach ($this->scriptPlaceholders as $placeholder => $property) {
|
|
if (isset($this->$property)) {
|
|
$script = str_replace('['.$placeholder.']', $this->$property, $script);
|
|
} else {
|
|
$script = str_replace('['.$placeholder.']', '', $script);
|
|
}
|
|
}
|
|
return $script;
|
|
}
|
|
}
|
|
}
|