📄 form.php
字号:
<?php
// $Id: form.php 1279 2008-01-28 06:40:39Z phppp $
// ------------------------------------------------------------------------ //
// XOOPS - PHP Content Management System //
// Copyright (c) 2000 XOOPS.org //
// <http://www.xoops.org/> //
// ------------------------------------------------------------------------ //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// You may not change or alter any portion of this comment or credits //
// of supporting developers from this source code or any supporting //
// source code which is considered copyrighted (c) material of the //
// original comment or credit authors. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
// ------------------------------------------------------------------------ //
// Author: Kazumi Ono (AKA onokazu) //
// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
// Project: The XOOPS Project //
// ------------------------------------------------------------------------- //
// public abstract
/**
*
*
* @package kernel
* @subpackage form
*
* @author Kazumi Ono <onokazu@xoops.org>
* @author Taiwen Jiang <phppp@users.sourceforge.net>
* @copyright copyright (c) 2000-2007 XOOPS.org
*/
/**
* Abstract base class for forms
*
* @author Kazumi Ono <onokazu@xoops.org>
* @author Taiwen Jiang <phppp@users.sourceforge.net>
* @copyright copyright (c) 2000-2007 XOOPS.org
*
* @package kernel
* @subpackage form
*/
class XoopsForm {
/**#@+
* @access private
*/
/**
* "action" attribute for the html form
* @var string
*/
var $_action;
/**
* "method" attribute for the form.
* @var string
*/
var $_method;
/**
* "name" attribute of the form
* @var string
*/
var $_name;
/**
* title for the form
* @var string
*/
var $_title;
/**
* array of {@link XoopsFormElement} objects
* @var array
*/
var $_elements = array();
/**
* extra information for the <form> tag
* @var array
*/
var $_extra = array();
/**
* required elements
* @var array
*/
var $_required = array();
/**#@-*/
/**
* constructor
*
* @param string $title title of the form
* @param string $name "name" attribute for the <form> tag
* @param string $action "action" attribute for the <form> tag
* @param string $method "method" attribute for the <form> tag
* @param bool $addtoken whether to add a security token to the form
*/
function XoopsForm($title, $name, $action, $method = "post", $addtoken = false) {
$this->_title = $title;
$this->_name = $name;
$this->_action = $action;
$this->_method = $method;
if ($addtoken != false) {
$this->addElement(new XoopsFormHiddenToken());
}
}
/**
* return the title of the form
*
* @param bool $encode To sanitizer the text?
* @return string
*/
function getTitle($encode = false) {
return $encode ? htmlspecialchars($this->_title, ENT_QUOTES) : $this->_title;
}
/**
* get the "name" attribute for the <form> tag
*
* Deprecated, to be refactored
*
* @param bool $encode To sanitizer the text?
* @return string
*/
function getName($encode = true) {
return $encode ? htmlspecialchars($this->_name, ENT_QUOTES) : $this->_name;
}
/**
* get the "action" attribute for the <form> tag
*
* @param bool $encode To sanitizer the text?
* @return string
*/
function getAction($encode = true) {
return $encode ? htmlspecialchars($this->_action, ENT_QUOTES) : $this->_action;
}
/**
* get the "method" attribute for the <form> tag
*
* @return string
*/
function getMethod(){
return ( strtolower($this->_method) == "get" ) ? "GET" : "POST";
}
/**
* Add an element to the form
*
* @param object &$formElement reference to a {@link XoopsFormElement}
* @param bool $required is this a "required" element?
*/
function addElement(&$formElement, $required = false) {
if ( is_string( $formElement ) ) {
$this->_elements[] = $formElement;
} elseif ( is_subclass_of($formElement, 'xoopsformelement') ) {
$this->_elements[] =& $formElement;
if (!$formElement->isContainer()) {
if ($required) {
$formElement->_required = true;
$this->_required[] =& $formElement;
}
} else {
$required_elements =& $formElement->getRequired();
$count = count($required_elements);
for ($i = 0 ; $i < $count; $i++) {
$this->_required[] =& $required_elements[$i];
}
}
}
}
/**
* get an array of forms elements
*
* @param bool get elements recursively?
* @return array array of {@link XoopsFormElement}s
*/
function &getElements($recurse = false) {
if (!$recurse) {
return $this->_elements;
} else {
$ret = array();
$count = count($this->_elements);
for ($i = 0; $i < $count; $i++) {
if ( is_object( $this->_elements[$i] ) ) {
if (!$this->_elements[$i]->isContainer()) {
$ret[] =& $this->_elements[$i];
} else {
$elements =& $this->_elements[$i]->getElements(true);
$count2 = count($elements);
for ($j = 0; $j < $count2; $j++) {
$ret[] =& $elements[$j];
}
unset($elements);
}
}
}
return $ret;
}
}
/**
* get an array of "name" attributes of form elements
*
* @return array array of form element names
*/
function getElementNames() {
$ret = array();
$elements =& $this->getElements(true);
$count = count($elements);
for ($i = 0; $i < $count; $i++) {
$ret[] = $elements[$i]->getName();
}
return $ret;
}
/**
* get a reference to a {@link XoopsFormElement} object by its "name"
*
* @param string $name "name" attribute assigned to a {@link XoopsFormElement}
* @return object reference to a {@link XoopsFormElement}, false if not found
*/
function &getElementByName($name) {
$elements = $this->getElements(true);
$count = count($elements);
for ($i = 0; $i < $count; $i++) {
if ($name == $elements[$i]->getName(false)) {
return $elements[$i];
}
}
$elt = null;
return $elt;
}
/**
* Sets the "value" attribute of a form element
*
* @param string $name the "name" attribute of a form element
* @param string $value the "value" attribute of a form element
*/
function setElementValue($name, $value){
$ele =& $this->getElementByName($name);
if (is_object($ele) && method_exists($ele, 'setValue')) {
$ele->setValue($value);
}
}
/**
* Sets the "value" attribute of form elements in a batch
*
* @param array $values array of name/value pairs to be assigned to form elements
*/
function setElementValues($values){
if (is_array($values) && !empty($values)) {
// will not use getElementByName() for performance..
$elements =& $this->getElements(true);
$count = count($elements);
for ($i = 0; $i < $count; $i++) {
$name = $elements[$i]->getName(false);
if ($name && isset($values[$name]) && method_exists($elements[$i], 'setValue')) {
$elements[$i]->setValue($values[$name]);
}
}
}
}
/**
* Gets the "value" attribute of a form element
*
* @param string $name the "name" attribute of a form element
* @param bool $encode To sanitizer the text?
* @return string the "value" attribute assigned to a form element, null if not set
*/
function getElementValue($name, $encode = false) {
$ele =& $this->getElementByName($name);
if (is_object($ele) && method_exists($ele, 'getValue')) {
return $ele->getValue($encode);
}
return;
}
/**
* gets the "value" attribute of all form elements
*
* @param bool $encode To sanitizer the text?
* @return array array of name/value pairs assigned to form elements
*/
function getElementValues($encode = false) {
// will not use getElementByName() for performance..
$elements =& $this->getElements(true);
$count = count($elements);
$values = array();
for ($i = 0; $i < $count; $i++) {
$name = $elements[$i]->getName(false);
if ($name && method_exists($elements[$i], 'getValue')) {
$values[$name] =& $elements[$i]->getValue($encode);
}
}
return $values;
}
/**
* set the extra attributes for the <form> tag
*
* @param string $extra extra attributes for the <form> tag
*/
function setExtra($extra) {
if (!empty($extra)) {
$this->_extra[] = $extra;
}
}
/**
* get the extra attributes for the <form> tag
*
* @return string
*/
function &getExtra() {
$extra = empty($this->_extra) ? "" : " ". implode(" ", $this->_extra);
return $extra;
}
/**
* make an element "required"
*
* @param object &$formElement reference to a {@link XoopsFormElement}
*/
function setRequired(&$formElement) {
$this->_required[] =& $formElement;
}
/**
* get an array of "required" form elements
*
* @return array array of {@link XoopsFormElement}s
*/
function &getRequired() {
return $this->_required;
}
/**
* insert a break in the form
*
* This method is abstract. It must be overwritten in the child classes.
*
* @param string $extra extra information for the break
* @abstract
*/
function insertBreak($extra = null) {
}
/**
* returns renderered form
*
* This method is abstract. It must be overwritten in the child classes.
*
* @abstract
*/
function render() {
}
/**
* displays rendered form
*/
function display() {
echo $this->render();
}
/**
* Renders the Javascript function needed for client-side for validation
*
* Form elements that have been declared "required" and not set will prevent the form from being
* submitted. Additionally, each element class may provide its own "renderValidationJS" method
* that is supposed to return custom validation code for the element.
*
* The element validation code can assume that the JS "myform" variable points to the form, and must
* execute <i>return false</i> if validation fails.
*
* A basic element validation method may contain something like this:
* <code>
* function renderValidationJS() {
* $name = $this->getName();
* return "if ( myform.{$name}.value != 'valid' ) { " .
* "myform.{$name}.focus(); window.alert( '$name is invalid' ); return false;" .
* " }";
* }
* </code>
*
* @param boolean $withtags Include the < javascript > tags in the returned string
*/
function renderValidationJS( $withtags = true ) {
$js = "";
if ( $withtags ) {
$js .= "\n<!-- Start Form Validation JavaScript //-->\n<script type='text/javascript'>\n<!--//\n";
}
$formname = $this->getName();
$js .= "function xoopsFormValidate_{$formname}() { var myform = window.document.{$formname}; ";
$elements = $this->getElements( true );
foreach ( $elements as $elt ) {
if ( method_exists( $elt, 'renderValidationJS' ) ) {
$js .= $elt->renderValidationJS();
}
}
$js .= "return true;\n}\n";
if ( $withtags ) {
$js .= "//--></script>\n<!-- End Form Vaidation JavaScript //-->\n";
}
return $js;
}
/**
* assign to smarty form template instead of displaying directly
*
* @param object &$tpl reference to a {@link Smarty} object
* @see Smarty
*/
function assign(&$tpl) {
$i = -1;
$elements = array();
foreach ( $this->getElements() as $ele ) {
++$i;
if (is_string( $ele )) {
$elements[$i]['body'] = $ele;
continue;
}
$ele_name = $ele->getName();
$ele_description = $ele->getDescription();
$n = $ele_name ? $ele_name : $i;
$elements[$n]['name'] = $ele_name;
$elements[$n]['caption'] = $ele->getCaption();
$elements[$n]['body'] = $ele->render();
$elements[$n]['hidden'] = $ele->isHidden();
$elements[$n]['required'] = $ele->isRequired();
if ($ele_description != '') {
$elements[$n]['description'] = $ele_description;
}
}
$js = $this->renderValidationJS();
$tpl->assign($this->getName(), array('title' => $this->getTitle(), 'name' => $this->getName(), 'action' => $this->getAction(), 'method' => $this->getMethod(), 'extra' => 'onsubmit="return xoopsFormValidate_'.$this->getName().'();"'.$this->getExtra(), 'javascript' => $js, 'elements' => $elements));
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -