ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç PKw \+a[5##autocomplete.phpnu[ | // | | // | For the JavaScript code thanks to Martin Honnen and | // | Nicholas C. Zakas | // | See: | // | http://www.faqts.com/knowledge_base/view.phtml/aid/13562 | // | and | // | http://www.sitepoint.com/article/1220 | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/text.php"); /** * Class to dynamically create an HTML input text element that * at every keypressed javascript event, check in an array of options * if there's a match and autocomplete the text in case of match. * * Ex: * $autocomplete =& $form->addElement('autocomplete', 'fruit', 'Favourite fruit:'); * $options = array("Apple", "Orange", "Pear", "Strawberry"); * $autocomplete->setOptions($options); * * @author Matteo Di Giovinazzo */ class HTML_QuickForm_autocomplete extends HTML_QuickForm_text { // {{{ properties /** * Options for the autocomplete input text element * * @var array * @access private */ var $_options = array(); /** * "One-time" javascript (containing functions), see bug #4611 * * @var string * @access private */ var $_js = ''; // }}} // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $elementLabel (optional)Input field label in form * @param array $options (optional)Autocomplete options * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array. Date format is passed along the attributes. * @access public * @return void */ public function __construct($elementName = null, $elementLabel = null, $options = null, $attributes = null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_type = 'autocomplete'; if (isset($options)) { $this->setOptions($options); } } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_autocomplete($elementName = null, $elementLabel = null, $options = null, $attributes = null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $options, $attributes); } // }}} // {{{ setOptions() /** * Sets the options for the autocomplete input text element * * @param array $options Array of options for the autocomplete input text element * @access public * @return void */ function setOptions($options) { $this->_options = array_values($options); } // end func setOptions // }}} // {{{ toHtml() /** * Returns Html for the autocomplete input text element * * @access public * @return string */ function toHtml() { // prevent problems with grouped elements $arrayName = str_replace(array('[', ']'), array('__', ''), $this->getName()) . '_values'; $this->updateAttributes(array( 'onkeypress' => 'return autocomplete(this, event, ' . $arrayName . ');' )); if ($this->_flagFrozen) { $js = ''; } else { $js = ""; } return $js . parent::toHtml(); }// end func toHtml // }}} } // end class HTML_QuickForm_autocomplete ?> PKw \[ image.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a image type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_image extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Element name attribute * @param string $src (optional)Image source * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $src='', $attributes=null) { parent::__construct($elementName, null, $attributes); $this->setType('image'); $this->setSource($src); } // end class constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_image($elementName=null, $src='', $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $src, $attributes); } // }}} // {{{ setSource() /** * Sets source for image element * * @param string $src source for image element * @since 1.0 * @access public * @return void */ function setSource($src) { $this->updateAttributes(array('src' => $src)); } // end func setSource // }}} // {{{ setBorder() /** * Sets border size for image element * * @param string $border border for image element * @since 1.0 * @access public * @return void */ function setBorder($border) { $this->updateAttributes(array('border' => $border)); } // end func setBorder // }}} // {{{ setAlign() /** * Sets alignment for image element * * @param string $align alignment for image element * @since 1.0 * @access public * @return void */ function setAlign($align) { $this->updateAttributes(array('align' => $align)); } // end func setAlign // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return void */ function freeze() { return false; } //end func freeze // }}} } // end class HTML_QuickForm_image ?> PKw \ hidden.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a hidden type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_hidden extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $value (optional)Input field value * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $value='', $attributes=null) { parent::__construct($elementName, null, $attributes); $this->setType('hidden'); $this->setValue($value); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_hidden($elementName=null, $value='', $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); return self::__construct($elementName, $value, $attributes); } // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return void */ function freeze() { return false; } //end func freeze // }}} // {{{ accept() /** * Accepts a renderer * * @param object An HTML_QuickForm_Renderer object * @access public * @return void */ function accept(&$renderer, $required=false, $error=null) { $renderer->renderHidden($this); } // end func accept // }}} } //end class HTML_QuickForm_hidden ?> PKw \șb b Rule/Email.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Rule.php'); /** * Email validation rule * @version 1.0 */ class HTML_QuickForm_Rule_Email extends HTML_QuickForm_Rule { var $regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/'; /** * Validates an email address * * @param string $email Email address * @param boolean $checkDomain True if dns check should be performed * @access public * @return boolean true if email is valid */ function validate($email, $checkDomain = false) { if (preg_match($this->regex, $email)) { if ($checkDomain && function_exists('checkdnsrr')) { $tokens = explode('@', $email); if (checkdnsrr($tokens[1], 'MX') || checkdnsrr($tokens[1], 'A')) { return true; } return false; } return true; } return false; } // end func validate function getValidationScript($options = null) { return array(" var regex = " . $this->regex . ";\n", "{jsVar} != '' && !regex.test({jsVar})"); } // end func getValidationScript } // end class HTML_QuickForm_Rule_Email ?>PKw \%&SRule/Callback.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Rule.php'); /** * Validates values using callback functions or methods * @version 1.0 */ class HTML_QuickForm_Rule_Callback extends HTML_QuickForm_Rule { /** * Array of callbacks * * Array is in the format: * $_data['rulename'] = array('functionname', 'classname'); * If the callback is not a method, then the class name is not set. * * @var array * @access private */ var $_data = array(); /** * Whether to use BC mode for specific rules * * Previous versions of QF passed element's name as a first parameter * to validation functions, but not to validation methods. This behaviour * is emulated if you are using 'function' as rule type when registering. * * @var array * @access private */ var $_BCMode = array(); /** * Validates a value using a callback * * @param string $value Value to be checked * @param mixed $options Options for callback * @access public * @return boolean true if value is valid */ function validate($value, $options = null) { if (isset($this->_data[$this->name])) { $callback = $this->_data[$this->name]; if (isset($callback[1])) { return call_user_func(array($callback[1], $callback[0]), $value, $options); } elseif ($this->_BCMode[$this->name]) { return $callback[0]('', $value, $options); } else { return $callback[0]($value, $options); } } elseif (is_callable($options)) { return call_user_func($options, $value); } else { return true; } } // end func validate /** * Adds new callbacks to the callbacks list * * @param string $name Name of rule * @param string $callback Name of function or method * @param string $class Name of class containing the method * @param bool $BCMode Backwards compatibility mode * @access public */ function addData($name, $callback, $class = null, $BCMode = false) { if (!empty($class)) { $this->_data[$name] = array($callback, $class); } else { $this->_data[$name] = array($callback); } $this->_BCMode[$name] = $BCMode; } // end func addData function getValidationScript($options = null) { if (isset($this->_data[$this->name])) { $callback = $this->_data[$this->name][0]; $params = ($this->_BCMode[$this->name]? "'', {jsVar}": '{jsVar}') . (isset($options)? ", '{$options}'": ''); } else { $callback = is_array($options)? $options[1]: $options; $params = '{jsVar}'; } return array('', "{jsVar} != '' && !{$callback}({$params})"); } // end func getValidationScript } // end class HTML_QuickForm_Rule_Callback ?>PKw \| Rule/Regex.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Rule.php'); /** * Validates values using regular expressions * @version 1.0 */ class HTML_QuickForm_Rule_Regex extends HTML_QuickForm_Rule { /** * Array of regular expressions * * Array is in the format: * $_data['rulename'] = 'pattern'; * * @var array * @access private */ var $_data = array( 'lettersonly' => '/^[a-zA-Z]+$/', 'alphanumeric' => '/^[a-zA-Z0-9]+$/', 'numeric' => '/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/', 'nopunctuation' => '/^[^().\/\*\^\?#!@$%+=,\"\'><~\[\]{}]+$/', 'nonzero' => '/^-?[1-9][0-9]*/', 'positiveint' => '/^[1-9]\d*$/' ); /** * Validates a value using a regular expression * * @param string $value Value to be checked * @param string $regex Regular expression * @access public * @return boolean true if value is valid */ function validate($value, $regex = null) { if (isset($this->_data[$this->name])) { if (!preg_match($this->_data[$this->name], $value)) { return false; } } else { if (!preg_match($regex, $value)) { return false; } } return true; } // end func validate /** * Adds new regular expressions to the list * * @param string $name Name of rule * @param string $pattern Regular expression pattern * @access public */ function addData($name, $pattern) { $this->_data[$name] = $pattern; } // end func addData function getValidationScript($options = null) { $regex = isset($this->_data[$this->name]) ? $this->_data[$this->name] : $options; return array(" var regex = " . $regex . ";\n", "{jsVar} != '' && !regex.test({jsVar})"); } // end func getValidationScript } // end class HTML_QuickForm_Rule_Regex ?>PKw \, , Rule/Range.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Rule.php'); /** * Validates values using range comparison * @version 1.0 */ class HTML_QuickForm_Rule_Range extends HTML_QuickForm_Rule { /** * Validates a value using a range comparison * * @param string $value Value to be checked * @param mixed $options Int for length, array for range * @access public * @return boolean true if value is valid */ function validate($value, $options = null) { $length = core_text::strlen($value); switch ($this->name) { case 'minlength': return ($length >= $options); case 'maxlength': return ($length <= $options); default: return ($length >= $options[0] && $length <= $options[1]); } } // end func validate function getValidationScript($options = null) { switch ($this->name) { case 'minlength': $test = '{jsVar}.length < '.$options; break; case 'maxlength': $test = '{jsVar}.length > '.$options; break; default: $test = '({jsVar}.length < '.$options[0].' || {jsVar}.length > '.$options[1].')'; } return array('', "{jsVar} != '' && {$test}"); } // end func getValidationScript } // end class HTML_QuickForm_Rule_Range ?> PKw \]m m Rule/Compare.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once 'HTML/QuickForm/Rule.php'; /** * Rule to compare two form fields * * The most common usage for this is to ensure that the password * confirmation field matches the password field * * @access public * @package HTML_QuickForm * @version $Revision$ */ class HTML_QuickForm_Rule_Compare extends HTML_QuickForm_Rule { /** * Possible operators to use * @var array * @access private */ var $_operators = array( 'eq' => '==', 'neq' => '!=', 'gt' => '>', 'gte' => '>=', 'lt' => '<', 'lte' => '<=' ); /** * Returns the operator to use for comparing the values * * @access private * @param string operator name * @return string operator to use for validation */ function _findOperator($name) { if (empty($name)) { return '=='; } elseif (isset($this->_operators[$name])) { return $this->_operators[$name]; } elseif (in_array($name, $this->_operators)) { return $name; } else { return '=='; } } function validate($values, $operator = null) { $operator = $this->_findOperator($operator); $a = $values[0]; $b = $values[1]; if ($operator == '==') { return $a == $b; } else if ($operator == '!=') { return $a != $b; } else { // One of: <= , >= , < , > . return eval('return ' . floatval($a) . $operator . floatval($b) . ';'); } } function getValidationScript($operator = null) { $operator = $this->_findOperator($operator); if ('==' != $operator && '!=' != $operator) { $check = "!(Number({jsVar}[0]) {$operator} Number({jsVar}[1]))"; } else { $check = "!({jsVar}[0] {$operator} {jsVar}[1])"; } return array('', "'' != {jsVar}[0] && {$check}"); } } ?> PKw \q9Rule/Required.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Rule.php'); /** * Required elements validation * @version 1.0 */ class HTML_QuickForm_Rule_Required extends HTML_QuickForm_Rule { /** * Checks if an element is empty * * @param string $value Value to check * @param mixed $options Not used yet * @access public * @return boolean true if value is not empty */ function validate($value, $options = null) { if ((string)$value == '') { return false; } return true; } // end func validate function getValidationScript($options = null) { return array('', "{jsVar} == ''"); } // end func getValidationScript } // end class HTML_QuickForm_Rule_Required ?> PKw \Z xbutton.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once 'HTML/QuickForm/element.php'; /** * Class for HTML 4.0 tags) * @param mixed Either a typical HTML attribute string or an associative array * @access public */ public function __construct($elementName = null, $elementContent = null, $attributes = null) { parent::__construct($elementName, null, $attributes); $this->setContent($elementContent); $this->setPersistantFreeze(false); $this->_type = 'xbutton'; } /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_xbutton($elementName = null, $elementContent = null, $attributes = null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementContent, $attributes); } function toHtml() { return 'getAttributes(true) . '>' . $this->_content . ''; } function getFrozenHtml() { return $this->toHtml(); } function freeze() { return false; } function setName($name) { $this->updateAttributes(array( 'name' => $name )); } function getName() { return $this->getAttribute('name'); } function setValue($value) { $this->updateAttributes(array( 'value' => $value )); } function getValue() { return $this->getAttribute('value'); } /** * Sets the contents of the button element * * @param string Button content (HTML to add between tags) */ function setContent($content) { $this->_content = $content; } function onQuickFormEvent($event, $arg, &$caller) { if ('updateValue' != $event) { return parent::onQuickFormEvent($event, $arg, $caller); } else { $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_defaultValues); } if (null !== $value) { $this->setValue($value); } } return true; } /** * Returns a 'safe' element's value * * The value is only returned if the button's type is "submit" and if this * particlular button was clicked */ function exportValue(&$submitValues, $assoc = false) { if ('submit' == $this->getAttribute('type')) { return $this->_prepareValue($this->_findValue($submitValues), $assoc); } else { return null; } } } ?> PKw \44 element.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/Common.php'); /** * Static utility methods. */ require_once('HTML/QuickForm/utils.php'); /** * Base class for form elements * * @author Adam Daniel * @author Bertrand Mansion * @version 1.3 * @since PHP4.04pl1 * @access public * @abstract */ class HTML_QuickForm_element extends HTML_Common { // {{{ properties /** * Label of the field * @var string * @since 1.3 * @access private */ var $_label = ''; /** * Form element type * @var string * @since 1.0 * @access private */ var $_type = ''; /** * Flag to tell if element is frozen * @var boolean * @since 1.0 * @access private */ var $_flagFrozen = false; /** * Does the element support persistant data when frozen * @var boolean * @since 1.3 * @access private */ var $_persistantFreeze = false; // }}} // {{{ constructor /** * Class constructor * * @param string Name of the element * @param mixed Label(s) for the element * @param mixed Associative array of tag attributes or HTML attributes name="value" pairs * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($attributes); if (isset($elementName)) { $this->setName($elementName); } if (isset($elementLabel)) { $this->setLabel($elementLabel); } } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_element($elementName=null, $elementLabel=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ apiVersion() /** * Returns the current API version * * @since 1.0 * @access public * @return float */ function apiVersion() { return 2.0; } // end func apiVersion // }}} // {{{ getType() /** * Returns element type * * @since 1.0 * @access public * @return string */ function getType() { return $this->_type; } // end func getType // }}} // {{{ setName() /** * Sets the input field name * * @param string $name Input field name attribute * @since 1.0 * @access public * @return void */ function setName($name) { // interface method } //end func setName // }}} // {{{ getName() /** * Returns the element name * * @since 1.0 * @access public * @return string */ function getName() { // interface method } //end func getName // }}} // {{{ setValue() /** * Sets the value of the form element * * @param string $value Default value of the form element * @since 1.0 * @access public * @return void */ function setValue($value) { // interface } // end func setValue // }}} // {{{ getValue() /** * Returns the value of the form element * * @since 1.0 * @access public * @return mixed */ function getValue() { // interface return null; } // end func getValue // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return void */ function freeze() { $this->_flagFrozen = true; } //end func freeze // }}} // {{{ unfreeze() /** * Unfreezes the element so that it becomes editable * * @access public * @return void * @since 3.2.4 */ function unfreeze() { $this->_flagFrozen = false; } // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags * * @since 1.0 * @access public * @return string */ function getFrozenHtml() { $value = $this->getValue(); return ('' != $value? htmlspecialchars($value): ' ') . $this->_getPersistantData(); } //end func getFrozenHtml // }}} // {{{ _getPersistantData() /** * Used by getFrozenHtml() to pass the element's value if _persistantFreeze is on * * @access private * @return string */ function _getPersistantData() { if (!$this->_persistantFreeze) { return ''; } else { $id = $this->getAttribute('id'); if (isset($id)) { // Id of persistant input is different then the actual input. $id = array('id' => $id . '_persistant'); } else { $id = array(); } return '_getAttrString(array( 'type' => 'hidden', 'name' => $this->getName(), 'value' => $this->getValue() ) + $id) . ' />'; } } // }}} // {{{ isFrozen() /** * Returns whether or not the element is frozen * * @since 1.3 * @access public * @return bool */ function isFrozen() { return $this->_flagFrozen; } // end func isFrozen // }}} // {{{ setPersistantFreeze() /** * Sets wether an element value should be kept in an hidden field * when the element is frozen or not * * @param bool $persistant True if persistant value * @since 2.0 * @access public * @return void */ function setPersistantFreeze($persistant=false) { $this->_persistantFreeze = $persistant; } //end func setPersistantFreeze // }}} // {{{ setLabel() /** * Sets display text for the element * * @param string $label Display text for the element * @since 1.3 * @access public * @return void */ function setLabel($label) { $this->_label = $label; } //end func setLabel // }}} // {{{ getLabel() /** * Returns display text for the element * * @since 1.3 * @access public * @return string */ function getLabel() { return $this->_label; } //end func getLabel // }}} // {{{ _findValue() /** * Tries to find the element value from the values array * * @since 2.7 * @access private * @return mixed */ function _findValue(&$values) { if (empty($values)) { return null; } $elementName = $this->getName() ?? ''; if (isset($values[$elementName])) { return $values[$elementName]; } elseif (strpos($elementName, '[')) { $keys = str_replace( array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"), $elementName ); $arrayKeys = explode("']['", $keys); return HTML_QuickForm_utils::recursiveValue($values, $arrayKeys); } else { return null; } } //end func _findValue // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return void */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'createElement': static::__construct($arg[0], $arg[1], $arg[2], $arg[3], $arg[4], $arg[5]); if ($caller->getAttribute('data-random-ids') && !$this->getAttribute('id')) { $this->_generateId(); $attributes = $this->getAttributes(); $attributes['id'] = $this->getAttribute('id') . '_' . random_string(); $this->updateAttributes($attributes); } break; case 'addElement': $this->onQuickFormEvent('createElement', $arg, $caller); $this->onQuickFormEvent('updateValue', null, $caller); break; case 'updateValue': // constant values override both default and submitted ones // default values are overriden by submitted $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_submitValues); if (null === $value) { $value = $this->_findValue($caller->_defaultValues); } } if (null !== $value) { $this->setValue($value); } break; case 'setGroupValue': $this->setValue($arg); } return true; } // end func onQuickFormEvent // }}} // {{{ accept() /** * Accepts a renderer * * @param object An HTML_QuickForm_Renderer object * @param bool Whether an element is required * @param string An error message associated with an element * @access public * @return void */ function accept(&$renderer, $required=false, $error=null) { $renderer->renderElement($this, $required, $error); } // end func accept // }}} // {{{ _generateId() /** * Automatically generates and assigns an 'id' attribute for the element. * * Currently used to ensure that labels work on radio buttons and * checkboxes. Per idea of Alexander Radivanovich. * * @access private * @return void */ function _generateId() { if ($this->getAttribute('id')) { return; } $id = $this->getName() ?? ''; $id = 'id_' . str_replace(array('qf_', '[', ']'), array('', '_', ''), $id); $id = clean_param($id, PARAM_ALPHANUMEXT); $this->updateAttributes(array('id' => $id)); } // }}} // {{{ exportValue() /** * Returns a 'safe' element's value * * @param array array of submitted values to search * @param bool whether to return the value as associative array * @access public * @return mixed */ function exportValue(&$submitValues, $assoc = false) { $value = $this->_findValue($submitValues); if (null === $value) { $value = $this->getValue(); } return $this->_prepareValue($value, $assoc); } // }}} // {{{ _prepareValue() /** * Used by exportValue() to prepare the value for returning * * @param mixed the value found in exportValue() * @param bool whether to return the value as associative array * @access private * @return mixed */ function _prepareValue($value, $assoc) { if (null === $value) { return null; } elseif (!$assoc) { return $value; } else { $name = $this->getName(); if (!strpos($name, '[')) { return array($name => $value); } else { $keys = str_replace( array('\\', '\'', ']', '['), array('\\\\', '\\\'', '', "']['"), $name ); $keysArray = explode("']['", $keys); return HTML_QuickForm_utils::recursiveBuild($keysArray, $value); } } } // }}} } // end class HTML_QuickForm_element ?> PKw \N reset.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a reset type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.1 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_reset extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $value (optional)Input field value * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $value=null, $attributes=null) { parent::__construct($elementName, null, $attributes); $this->setValue($value); $this->setType('reset'); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_reset($elementName=null, $value=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $value, $attributes); } // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return void */ function freeze() { return false; } //end func freeze // }}} } //end class HTML_QuickForm_reset ?> PKw \i Renderer.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ /** * An abstract base class for QuickForm renderers * * The class implements a Visitor design pattern * * @abstract * @author Alexey Borzov */ class HTML_QuickForm_Renderer { /** * Constructor * * @access public */ public function __construct() { } // end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_Renderer() { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct(); } /** * Called when visiting a form, before processing any form elements * * @param object An HTML_QuickForm object being visited * @access public * @return void * @abstract */ function startForm(&$form) { return; } // end func startForm /** * Called when visiting a form, after processing all form elements * * @param object An HTML_QuickForm object being visited * @access public * @return void * @abstract */ function finishForm(&$form) { return; } // end func finishForm /** * Called when visiting a header element * * @param object An HTML_QuickForm_header element being visited * @access public * @return void * @abstract */ function renderHeader(&$header) { return; } // end func renderHeader /** * Called when visiting an element * * @param object An HTML_QuickForm_element object being visited * @param bool Whether an element is required * @param string An error message associated with an element * @access public * @return void * @abstract */ function renderElement(&$element, $required, $error) { return; } // end func renderElement /** * Called when visiting a hidden element * * @param object An HTML_QuickForm_hidden object being visited * @access public * @return void * @abstract */ function renderHidden(&$element) { return; } // end func renderHidden /** * Called when visiting a raw HTML/text pseudo-element * * Seems that this should not be used when using a template-based renderer * * @param object An HTML_QuickForm_html element being visited * @access public * @return void * @abstract */ function renderHtml(&$data) { return; } // end func renderHtml /** * Called when visiting a group, before processing any group elements * * @param object An HTML_QuickForm_group object being visited * @param bool Whether a group is required * @param string An error message associated with a group * @access public * @return void * @abstract */ function startGroup(&$group, $required, $error) { return; } // end func startGroup /** * Called when visiting a group, after processing all group elements * * @param object An HTML_QuickForm_group object being visited * @access public * @return void * @abstract */ function finishGroup(&$group) { return; } // end func finishGroup } // end class HTML_QuickForm_Renderer ?> PKw \Bhiddenselect.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/select.php'); /** * This class takes the same arguments as a select element, but instead * of creating a select ring it creates hidden elements for all values * already selected with setDefault or setConstant. This is useful if * you have a select ring that you don't want visible, but you need all * selected values to be passed. * * @author Isaac Shepard * * @version 1.0 * @since 2.1 * @access public */ class HTML_QuickForm_hiddenselect extends HTML_QuickForm_select { // {{{ constructor /** * Class constructor * * @param string Select name attribute * @param mixed Label(s) for the select (not used) * @param mixed Data to be used to populate options * @param mixed Either a typical HTML attribute string or an associative array (not used) * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) { // TODO MDL-52313 Replace with the call to parent::__construct(). HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_type = 'hiddenselect'; if (isset($options)) { $this->load($options); } } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_hiddenselect($elementName=null, $elementLabel=null, $options=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $options, $attributes); } // }}} // {{{ toHtml() /** * Returns the SELECT in HTML * * @since 1.0 * @access public * @return string * @throws */ function toHtml() { $tabs = $this->_getTabs(); $name = $this->getPrivateName(); $strHtml = ''; foreach ($this->_values as $key => $val) { for ($i = 0, $optCount = count($this->_options); $i < $optCount; $i++) { if ($val == $this->_options[$i]['attr']['value']) { $strHtml .= $tabs . '_getAttrString(array( 'type' => 'hidden', 'name' => $name, 'value' => $val )) . " />\n" ; } } } return $strHtml; } //end func toHtml // }}} // {{{ accept() /** * This is essentially a hidden element and should be rendered as one */ function accept(&$renderer, $required=false, $error=null) { $renderer->renderHidden($this); } // }}} } //end class HTML_QuickForm_hiddenselect ?> PKw \_,,file.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); // register file-related rules if (class_exists('HTML_QuickForm')) { HTML_QuickForm::registerRule('uploadedfile', 'callback', '_ruleIsUploadedFile', 'HTML_QuickForm_file'); HTML_QuickForm::registerRule('maxfilesize', 'callback', '_ruleCheckMaxFileSize', 'HTML_QuickForm_file'); HTML_QuickForm::registerRule('mimetype', 'callback', '_ruleCheckMimeType', 'HTML_QuickForm_file'); HTML_QuickForm::registerRule('filename', 'callback', '_ruleCheckFileName', 'HTML_QuickForm_file'); } /** * HTML class for a file type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_file extends HTML_QuickForm_input { // {{{ properties /** * Uploaded file data, from $_FILES * @var array */ var $_value = null; // }}} // {{{ constructor /** * Class constructor * * @param string Input field name attribute * @param string Input field label * @param mixed (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->setType('file'); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_file($elementName=null, $elementLabel=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ setSize() /** * Sets size of file element * * @param int Size of file element * @since 1.0 * @access public */ function setSize($size) { $this->updateAttributes(array('size' => $size)); } //end func setSize // }}} // {{{ getSize() /** * Returns size of file element * * @since 1.0 * @access public * @return int */ function getSize() { return $this->getAttribute('size'); } //end func getSize // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return bool */ function freeze() { return false; } //end func freeze // }}} // {{{ setValue() /** * Sets value for file element. * * Actually this does nothing. The function is defined here to override * HTML_Quickform_input's behaviour of setting the 'value' attribute. As * no sane user-agent uses 's value for anything * (because of security implications) we implement file's value as a * read-only property with a special meaning. * * @param mixed Value for file element * @since 3.0 * @access public */ function setValue($value) { return null; } //end func setValue // }}} // {{{ getValue() /** * Returns information about the uploaded file * * @since 3.0 * @access public * @return array */ function getValue() { return $this->_value; } // end func getValue // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string Name of event * @param mixed event arguments * @param object calling object * @since 1.0 * @access public * @return bool */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': if ($caller->getAttribute('method') == 'get') { return self::raiseError('Cannot add a file upload field to a GET method form'); } $this->_value = $this->_findValue(); $caller->updateAttributes(array('enctype' => 'multipart/form-data')); $caller->setMaxFileSize(); break; case 'addElement': $this->onQuickFormEvent('createElement', $arg, $caller); return $this->onQuickFormEvent('updateValue', null, $caller); break; case 'createElement': static::__construct($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]); break; } return true; } // end func onQuickFormEvent // }}} // {{{ moveUploadedFile() /** * Moves an uploaded file into the destination * * @param string Destination directory path * @param string New file name * @access public * @return bool Whether the file was moved successfully */ function moveUploadedFile($dest, $fileName = '') { if ($dest != '' && substr($dest, -1) != '/') { $dest .= '/'; } $fileName = ($fileName != '') ? $fileName : basename($this->_value['name']); if (move_uploaded_file($this->_value['tmp_name'], $dest . $fileName)) { return true; } else { return false; } } // end func moveUploadedFile // }}} // {{{ isUploadedFile() /** * Checks if the element contains an uploaded file * * @access public * @return bool true if file has been uploaded, false otherwise */ function isUploadedFile() { return $this->_ruleIsUploadedFile($this->_value); } // end func isUploadedFile // }}} // {{{ _ruleIsUploadedFile() /** * Checks if the given element contains an uploaded file * * @param array Uploaded file info (from $_FILES) * @access private * @return bool true if file has been uploaded, false otherwise */ function _ruleIsUploadedFile($elementValue) { if ((isset($elementValue['error']) && $elementValue['error'] == 0) || (!empty($elementValue['tmp_name']) && $elementValue['tmp_name'] != 'none')) { return is_uploaded_file($elementValue['tmp_name']); } else { return false; } } // end func _ruleIsUploadedFile // }}} // {{{ _ruleCheckMaxFileSize() /** * Checks that the file does not exceed the max file size * * @param array Uploaded file info (from $_FILES) * @param int Max file size * @access private * @return bool true if filesize is lower than maxsize, false otherwise */ function _ruleCheckMaxFileSize($elementValue, $maxSize) { if (!empty($elementValue['error']) && (UPLOAD_ERR_FORM_SIZE == $elementValue['error'] || UPLOAD_ERR_INI_SIZE == $elementValue['error'])) { return false; } if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) { return true; } return ($maxSize >= @filesize($elementValue['tmp_name'])); } // end func _ruleCheckMaxFileSize // }}} // {{{ _ruleCheckMimeType() /** * Checks if the given element contains an uploaded file of the right mime type * * @param array Uploaded file info (from $_FILES) * @param mixed Mime Type (can be an array of allowed types) * @access private * @return bool true if mimetype is correct, false otherwise */ function _ruleCheckMimeType($elementValue, $mimeType) { if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) { return true; } if (is_array($mimeType)) { return in_array($elementValue['type'], $mimeType); } return $elementValue['type'] == $mimeType; } // end func _ruleCheckMimeType // }}} // {{{ _ruleCheckFileName() /** * Checks if the given element contains an uploaded file of the filename regex * * @param array Uploaded file info (from $_FILES) * @param string Regular expression * @access private * @return bool true if name matches regex, false otherwise */ function _ruleCheckFileName($elementValue, $regex) { if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) { return true; } return preg_match($regex, $elementValue['name']); } // end func _ruleCheckFileName // }}} // {{{ _findValue() /** * Tries to find the element value from the values array * * Needs to be redefined here as $_FILES is populated differently from * other arrays when element name is of the form foo[bar] * * @access private * @return mixed */ function _findValue() { if (empty($_FILES)) { return null; } $elementName = $this->getName(); if (isset($_FILES[$elementName])) { return $_FILES[$elementName]; } elseif (false !== ($pos = strpos($elementName, '['))) { $base = substr($elementName, 0, $pos); $idx = "['" . str_replace(array(']', '['), array('', "']['"), substr($elementName, $pos + 1, -1)) . "']"; $props = array('name', 'type', 'size', 'tmp_name', 'error'); $code = "if (!isset(\$_FILES['{$base}']['name']{$idx})) {\n" . " return null;\n" . "} else {\n" . " \$value = array();\n"; foreach ($props as $prop) { $code .= " \$value['{$prop}'] = \$_FILES['{$base}']['{$prop}']{$idx};\n"; } return eval($code . " return \$value;\n}\n"); } else { return null; } } // }}} } // end class HTML_QuickForm_file ?> PKw \6w html.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once 'HTML/QuickForm/static.php'; /** * A pseudo-element used for adding raw HTML to form * * Intended for use with the default renderer only, template-based * ones may (and probably will) completely ignore this * * @author Alexey Borzov * @access public */ class HTML_QuickForm_html extends HTML_QuickForm_static { // {{{ constructor /** * Class constructor * * @param string $text raw HTML to add * @access public * @return void */ public function __construct($text = null) { parent::__construct(null, null, $text); $this->_type = 'html'; } /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_html($text = null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($text); } // }}} // {{{ accept() /** * Accepts a renderer * * @param object An HTML_QuickForm_Renderer object * @access public * @return void */ function accept(&$renderer, $required=false, $error=null) { $renderer->renderHtml($this); } // end func accept // }}} } //end class HTML_QuickForm_header ?> PKw \'у@P@Phierselect.phpnu[ | // | Bertrand Mansion | // | Alexey Borzov // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/group.php'); require_once('HTML/QuickForm/select.php'); /** * Static utility methods. */ require_once 'HTML/QuickForm/utils.php'; /** * Class to dynamically create two or more HTML Select elements * The first select changes the content of the second select and so on. * This element is considered as a group. Selects will be named * groupName[0], groupName[1], groupName[2]... * * @author Herim Vasquez * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_hierselect extends HTML_QuickForm_group { // {{{ properties /** * Options for all the select elements * * Format is a bit more complex as we need to know which options * are related to the ones in the previous select: * * Ex: * // first select * $select1[0] = 'Pop'; * $select1[1] = 'Classical'; * $select1[2] = 'Funeral doom'; * * // second select * $select2[0][0] = 'Red Hot Chil Peppers'; * $select2[0][1] = 'The Pixies'; * $select2[1][0] = 'Wagner'; * $select2[1][1] = 'Strauss'; * $select2[2][0] = 'Pantheist'; * $select2[2][1] = 'Skepticism'; * * // If only need two selects * // - and using the depracated functions * $sel =& $form->addElement('hierselect', 'cds', 'Choose CD:'); * $sel->setMainOptions($select1); * $sel->setSecOptions($select2); * * // - and using the new setOptions function * $sel =& $form->addElement('hierselect', 'cds', 'Choose CD:'); * $sel->setOptions(array($select1, $select2)); * * // If you have a third select with prices for the cds * $select3[0][0][0] = '15.00$'; * $select3[0][0][1] = '17.00$'; * etc * * // You can now use * $sel =& $form->addElement('hierselect', 'cds', 'Choose CD:'); * $sel->setOptions(array($select1, $select2, $select3)); * * @var array * @access private */ var $_options = array(); /** * Number of select elements on this group * * @var int * @access private */ var $_nbElements = 0; /** * The javascript used to set and change the options * * @var string * @access private */ var $_js = ''; // }}} // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $elementLabel (optional)Input field label in form * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array. Date format is passed along the attributes. * @param mixed $separator (optional)Use a string for one separator, * use an array to alternate the separators. * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $attributes=null, $separator=null) { // TODO MDL-52313 Replace with the call to parent::__construct(). HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; if (isset($separator)) { $this->_separator = $separator; } $this->_type = 'hierselect'; $this->_appendName = true; } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_hierselect($elementName=null, $elementLabel=null, $attributes=null, $separator=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes, $separator); } // }}} // {{{ setOptions() /** * Initialize the array structure containing the options for each select element. * Call the functions that actually do the magic. * * @param array $options Array of options defining each element * * @access public * @return void */ function setOptions($options) { $this->_options = $options; if (empty($this->_elements)) { $this->_nbElements = count($this->_options); $this->_createElements(); } else { // setDefaults has probably been called before this function // check if all elements have been created $totalNbElements = count($this->_options); for ($i = $this->_nbElements; $i < $totalNbElements; $i ++) { $this->_elements[] = new HTML_QuickForm_select($i, null, array(), $this->getAttributes()); $this->_nbElements++; } } $this->_setOptions(); } // end func setMainOptions // }}} // {{{ setMainOptions() /** * Sets the options for the first select element. Deprecated. setOptions() should be used. * * @param array $array Options for the first select element * * @access public * @deprecated Deprecated since release 3.2.2 * @return void */ function setMainOptions($array) { $this->_options[0] = $array; if (empty($this->_elements)) { $this->_nbElements = 2; $this->_createElements(); } } // end func setMainOptions // }}} // {{{ setSecOptions() /** * Sets the options for the second select element. Deprecated. setOptions() should be used. * The main _options array is initialized and the _setOptions function is called. * * @param array $array Options for the second select element * * @access public * @deprecated Deprecated since release 3.2.2 * @return void */ function setSecOptions($array) { $this->_options[1] = $array; if (empty($this->_elements)) { $this->_nbElements = 2; $this->_createElements(); } else { // setDefaults has probably been called before this function // check if all elements have been created $totalNbElements = 2; for ($i = $this->_nbElements; $i < $totalNbElements; $i ++) { $this->_elements[] = new HTML_QuickForm_select($i, null, array(), $this->getAttributes()); $this->_nbElements++; } } $this->_setOptions(); } // end func setSecOptions // }}} // {{{ _setOptions() /** * Sets the options for each select element * * @access private * @return void */ function _setOptions() { $arrayKeys = []; foreach (array_keys($this->_elements) AS $key) { if (isset($this->_options[$key])) { if ((empty($arrayKeys)) || HTML_QuickForm_utils::recursiveIsset($this->_options[$key], $arrayKeys)) { $array = empty($arrayKeys) ? $this->_options[$key] : HTML_QuickForm_utils::recursiveValue($this->_options[$key], $arrayKeys); if (is_array($array)) { $select =& $this->_elements[$key]; $select->_options = array(); $select->loadArray($array); $value = is_array($v = $select->getValue()) ? $v[0] : key($array); $arrayKeys[] = $value; } } } } } // end func _setOptions // }}} // {{{ setValue() /** * Sets values for group's elements * * @param array $value An array of 2 or more values, for the first, * the second, the third etc. select * * @access public * @return void */ function setValue($value) { // fix for bug #6766. Hope this doesn't break anything more // after bug #7961. Forgot that _nbElements was used in // _createElements() called in several places... $this->_nbElements = max($this->_nbElements, count($value)); parent::setValue($value); $this->_setOptions(); } // end func setValue // }}} // {{{ _createElements() /** * Creates all the elements for the group * * @access private * @return void */ function _createElements() { for ($i = 0; $i < $this->_nbElements; $i++) { $this->_elements[] = new HTML_QuickForm_select($i, null, array(), $this->getAttributes()); } } // end func _createElements // }}} // {{{ toHtml() function toHtml() { $this->_js = ''; if (!$this->_flagFrozen) { // set the onchange attribute for each element except last $keys = array_keys($this->_elements); $onChange = array(); for ($i = 0; $i < count($keys) - 1; $i++) { $select =& $this->_elements[$keys[$i]]; $onChange[$i] = $select->getAttribute('onchange'); $select->updateAttributes( array('onchange' => '_hs_swapOptions(this.form, \'' . $this->_escapeString($this->getName()) . '\', ' . $keys[$i] . ');' . $onChange[$i]) ); } // create the js function to call if (!defined('HTML_QUICKFORM_HIERSELECT_EXISTS')) { $this->_js .= <<_nbElements; $i++) { $jsParts[] = $this->_convertArrayToJavascript($this->_options[$i]); } $this->_js .= "\n_hs_options['" . $this->_escapeString($this->getName()) . "'] = [\n" . implode(",\n", $jsParts) . "\n];\n"; // default value; if we don't actually have any values yet just use // the first option (for single selects) or empty array (for multiple) $values = array(); foreach (array_keys($this->_elements) as $key) { if (is_array($v = $this->_elements[$key]->getValue())) { $values[] = count($v) > 1? $v: $v[0]; } else { // XXX: accessing the supposedly private _options array $values[] = $this->_elements[$key]->getMultiple() || empty($this->_elements[$key]->_options[0])? array(): $this->_elements[$key]->_options[0]['attr']['value']; } } $this->_js .= "_hs_defaults['" . $this->_escapeString($this->getName()) . "'] = " . $this->_convertArrayToJavascript($values, false) . ";\n"; } include_once('HTML/QuickForm/Renderer/Default.php'); $renderer = new HTML_QuickForm_Renderer_Default(); $renderer->setElementTemplate('{element}'); parent::accept($renderer); if (!empty($onChange)) { $keys = array_keys($this->_elements); for ($i = 0; $i < count($keys) - 1; $i++) { $this->_elements[$keys[$i]]->updateAttributes(array('onchange' => $onChange[$i])); } } return (empty($this->_js)? '': "") . $renderer->toHtml(); } // end func toHtml // }}} // {{{ accept() function accept(&$renderer, $required = false, $error = null) { $renderer->renderElement($this, $required, $error); } // end func accept // }}} // {{{ onQuickFormEvent() function onQuickFormEvent($event, $arg, &$caller) { if ('updateValue' == $event) { // we need to call setValue() so that the secondary option // matches the main option return HTML_QuickForm_element::onQuickFormEvent($event, $arg, $caller); } else { $ret = parent::onQuickFormEvent($event, $arg, $caller); // add onreset handler to form to properly reset hierselect (see bug #2970) if ('addElement' == $event) { $onReset = $caller->getAttribute('onreset') ?? ''; if (strlen($onReset)) { if (strpos($onReset, '_hs_setupOnReset')) { $caller->updateAttributes(array('onreset' => str_replace('_hs_setupOnReset(this, [', "_hs_setupOnReset(this, ['" . $this->_escapeString($this->getName()) . "', ", $onReset))); } else { $caller->updateAttributes(array('onreset' => "var temp = function() { {$onReset} } ; if (!temp()) { return false; } ; if (typeof _hs_setupOnReset != 'undefined') { return _hs_setupOnReset(this, ['" . $this->_escapeString($this->getName()) . "']); } ")); } } else { $caller->updateAttributes(array('onreset' => "if (typeof _hs_setupOnReset != 'undefined') { return _hs_setupOnReset(this, ['" . $this->_escapeString($this->getName()) . "']); } ")); } } return $ret; } } // end func onQuickFormEvent // }}} // {{{ _convertArrayToJavascript() /** * Converts PHP array to its Javascript analog * * @access private * @param array PHP array to convert * @param bool Generate Javascript object literal (default, works like PHP's associative array) or array literal * @return string Javascript representation of the value */ function _convertArrayToJavascript($array, $assoc = true) { if (!is_array($array)) { return $this->_convertScalarToJavascript($array); } else { $items = array(); foreach ($array as $key => $val) { $item = $assoc? "'" . $this->_escapeString($key) . "': ": ''; if (is_array($val)) { $item .= $this->_convertArrayToJavascript($val, $assoc); } else { $item .= $this->_convertScalarToJavascript($val); } $items[] = $item; } } $js = implode(', ', $items); return $assoc? '{ ' . $js . ' }': '[' . $js . ']'; } // }}} // {{{ _convertScalarToJavascript() /** * Converts PHP's scalar value to its Javascript analog * * @access private * @param mixed PHP value to convert * @return string Javascript representation of the value */ function _convertScalarToJavascript($val) { if (is_bool($val)) { return $val ? 'true' : 'false'; } elseif (is_int($val) || is_double($val)) { return $val; } elseif (is_string($val)) { return "'" . $this->_escapeString($val) . "'"; } elseif (is_null($val)) { return 'null'; } else { // don't bother return '{}'; } } // }}} // {{{ _escapeString() /** * Quotes the string so that it can be used in Javascript string constants * * @access private * @param string * @return string */ function _escapeString($str) { return strtr($str,array( "\r" => '\r', "\n" => '\n', "\t" => '\t', "'" => "\\'", '"' => '\"', '\\' => '\\\\' )); } // }}} } // end class HTML_QuickForm_hierselect ?> PKw \9Ilink.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // require_once 'HTML/QuickForm/static.php'; /** * HTML class for a link type field * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_link extends HTML_QuickForm_static { // {{{ properties /** * Link display text * @var string * @since 1.0 * @access private */ var $_text = ""; // }}} // {{{ constructor /** * Class constructor * * @param string $elementLabel (optional)Link label * @param string $href (optional)Link href * @param string $text (optional)Link display text * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void * @throws */ public function __construct($elementName=null, $elementLabel=null, $href=null, $text=null, $attributes=null) { // TODO MDL-52313 Replace with the call to parent::__construct(). HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = false; $this->_type = 'link'; $this->setHref($href); $this->_text = $text; } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_link($elementName=null, $elementLabel=null, $href=null, $text=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $href, $text, $attributes); } // }}} // {{{ setName() /** * Sets the input field name * * @param string $name Input field name attribute * @since 1.0 * @access public * @return void * @throws */ function setName($name) { $this->updateAttributes(array('name'=>$name)); } //end func setName // }}} // {{{ getName() /** * Returns the element name * * @since 1.0 * @access public * @return string * @throws */ function getName() { return $this->getAttribute('name'); } //end func getName // }}} // {{{ setValue() /** * Sets value for textarea element * * @param string $value Value for password element * @since 1.0 * @access public * @return void * @throws */ function setValue($value) { return; } //end func setValue // }}} // {{{ getValue() /** * Returns the value of the form element * * @since 1.0 * @access public * @return void * @throws */ function getValue() { return; } // end func getValue // }}} // {{{ setHref() /** * Sets the links href * * @param string $href * @since 1.0 * @access public * @return void * @throws */ function setHref($href) { $this->updateAttributes(array('href'=>$href)); } // end func setHref // }}} // {{{ toHtml() /** * Returns the textarea element in HTML * * @since 1.0 * @access public * @return string * @throws */ function toHtml() { $tabs = $this->_getTabs(); $html = "$tabs_getAttrString($this->_attributes).">"; $html .= $this->_text; $html .= ""; return $html; } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags (in this case, value is changed to a mask) * * @since 1.0 * @access public * @return string * @throws */ function getFrozenHtml() { return; } //end func getFrozenHtml // }}} } //end class HTML_QuickForm_textarea ?> PKw \..Renderer/Tableless.phpnu[ * @author Adam Daniel * @author Bertrand Mansion * @author Mark Wiesemann * @copyright 2005-2006 The PHP Group * @license http://www.php.net/license/3_01.txt PHP License 3.01 * @version CVS: $Id$ * @link http://pear.php.net/package/HTML_QuickForm_Renderer_Tableless */ require_once 'HTML/QuickForm/Renderer/Default.php'; /** * A renderer for HTML_QuickForm that only uses XHTML and CSS but no * table tags * * You need to specify a stylesheet like the one that you find in * data/stylesheet.css to make this work. * * @category HTML * @package HTML_QuickForm_Renderer_Tableless * @author Alexey Borzov * @author Adam Daniel * @author Bertrand Mansion * @author Mark Wiesemann * @license http://www.php.net/license/3_01.txt PHP License 3.01 * @version Release: 0.3.4 * @link http://pear.php.net/package/HTML_QuickForm_Renderer_Tableless */ class HTML_QuickForm_Renderer_Tableless extends HTML_QuickForm_Renderer_Default { /** * Header Template string * @var string * @access private */ var $_headerTemplate = "\n\t\t{header}"; /** * Element template string * @var string * @access private */ var $_elementTemplate = "\n\t\t
error\">{error}
{element}

"; /** * Form template string * @var string * @access private */ var $_formTemplate = "\n\n\t
{hidden}
\n{content}\n"; /** * Template used when opening a fieldset * @var string * @access private */ var $_openFieldsetTemplate = "\n\t"; /** * Template used when opening a hidden fieldset * (i.e. a fieldset that is opened when there is no header element) * @var string * @access private */ var $_openHiddenFieldsetTemplate = "\n\t
"; /** * Template used when closing a fieldset * @var string * @access private */ var $_closeFieldsetTemplate = "\n\t
"; /** * Required Note template string * @var string * @access private */ var $_requiredNoteTemplate = "\n\t\t
{requiredNote}
"; /** * How many fieldsets are open * @var integer * @access private */ var $_fieldsetsOpen = 0; /** * Array of element names that indicate the end of a fieldset * (a new one will be opened when a the next header element occurs) * @var array * @access private */ var $_stopFieldsetElements = array(); /** * Constructor * * @access public */ public function __construct() { parent::__construct(); } // end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_Renderer_Tableless() { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct(); } /** * Called when visiting a header element * * @param object An HTML_QuickForm_header element being visited * @access public * @return void */ function renderHeader(&$header) { $name = $header->getName(); $id = empty($name) ? '' : ' id="' . $name . '"'; if (is_null($header->_text)) { $header_html = ''; } elseif (!empty($name) && isset($this->_templates[$name])) { $header_html = str_replace('{header}', $header->toHtml(), $this->_templates[$name]); } else { $header_html = str_replace('{header}', $header->toHtml(), $this->_headerTemplate); } if ($this->_fieldsetsOpen > 0) { $this->_html .= $this->_closeFieldsetTemplate; $this->_fieldsetsOpen--; } $openFieldsetTemplate = str_replace('{id}', $id, $this->_openFieldsetTemplate); $this->_html .= $openFieldsetTemplate . $header_html; $this->_fieldsetsOpen++; } // end func renderHeader /** * Renders an element Html * Called when visiting an element * * @param object An HTML_QuickForm_element object being visited * @param bool Whether an element is required * @param string An error message associated with an element * @access public * @return void */ function renderElement(&$element, $required, $error) { // if the element name indicates the end of a fieldset, close the fieldset if ( in_array($element->getName(), $this->_stopFieldsetElements) && $this->_fieldsetsOpen > 0 ) { $this->_html .= $this->_closeFieldsetTemplate; $this->_fieldsetsOpen--; } // if no fieldset was opened, we need to open a hidden one here to get // XHTML validity if ($this->_fieldsetsOpen === 0) { $this->_html .= $this->_openHiddenFieldsetTemplate; $this->_fieldsetsOpen++; } if (!$this->_inGroup) { $html = $this->_prepareTemplate($element->getName(), $element->getLabel(), $required, $error); // the following lines (until the "elseif") were changed / added // compared to the default renderer $element_html = $element->toHtml(); if (!is_null($element->getAttribute('id'))) { $id = $element->getAttribute('id'); } else { $id = $element->getName(); } if (!empty($id) and !is_a($element, 'MoodleQuickForm_group') and !is_a($element, 'HTML_QuickForm_static')) { // moodle hack $html = str_replace('(\s|\S)*([ \t\n\r]*)?/i", '', $html); } $this->_groupElements[] = str_replace('{element}', $element->toHtml(), $html); } else { $this->_groupElements[] = $element->toHtml(); } } // end func renderElement /** * Called when visiting a form, before processing any form elements * * @param object An HTML_QuickForm object being visited * @access public * @return void */ function startForm(&$form) { $this->_fieldsetsOpen = 0; parent::startForm($form); } // end func startForm /** * Called when visiting a form, after processing all form elements * Adds required note, form attributes, validation javascript and form content. * * @param object An HTML_QuickForm object being visited * @access public * @return void */ function finishForm(&$form) { // add a required note, if one is needed if (!empty($form->_required) && !$form->_freezeAll) { $requiredNote = $form->getRequiredNote(); // replace default required note by DOM/XHTML optimized note if ($requiredNote == '* denotes required field') { $requiredNote = '* denotes required field'; } $this->_html .= str_replace('{requiredNote}', $requiredNote, $this->_requiredNoteTemplate); } // close the open fieldset if ($this->_fieldsetsOpen > 0) { $this->_html .= $this->_closeFieldsetTemplate; $this->_fieldsetsOpen--; } // add form attributes and content $html = str_replace('{attributes}', $form->getAttributes(true), $this->_formTemplate); if (strpos($this->_formTemplate, '{hidden}')) { $html = str_replace('{hidden}', $this->_hiddenHtml, $html); } else { $this->_html .= $this->_hiddenHtml; } $this->_hiddenHtml = ''; $this->_html = str_replace('{content}', $this->_html, $html); $this->_html = str_replace('>', '> ', $this->_html); // add a validation script if ('' != ($script = $form->getValidationScript())) { $this->_html = $this->_html . "\n" . $script; } } // end func finishForm /** * Sets the template used when opening a fieldset * * @param string The HTML used when opening a fieldset * @access public * @return void */ function setOpenFieldsetTemplate($html) { $this->_openFieldsetTemplate = $html; } // end func setOpenFieldsetTemplate /** * Sets the template used when opening a hidden fieldset * (i.e. a fieldset that is opened when there is no header element) * * @param string The HTML used when opening a hidden fieldset * @access public * @return void */ function setOpenHiddenFieldsetTemplate($html) { $this->_openHiddenFieldsetTemplate = $html; } // end func setOpenHiddenFieldsetTemplate /** * Sets the template used when closing a fieldset * * @param string The HTML used when closing a fieldset * @access public * @return void */ function setCloseFieldsetTemplate($html) { $this->_closeFieldsetTemplate = $html; } // end func setCloseFieldsetTemplate /** * Adds one or more element names that indicate the end of a fieldset * (a new one will be opened when a the next header element occurs) * * @param mixed Element name(s) (as array or string) * @access public * @return void */ function addStopFieldsetElements($element) { if (is_array($element)) { $this->_stopFieldsetElements = array_merge($this->_stopFieldsetElements, $element); } else { $this->_stopFieldsetElements[] = $element; } } // end func addStopFieldsetElements } // end class HTML_QuickForm_Renderer_Default ?> PKw \2m=}?}?Renderer/Default.phpnu[ | // | Adam Daniel | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Renderer.php'); /** * A concrete renderer for HTML_QuickForm, * based on QuickForm 2.x built-in one * * @access public */ class HTML_QuickForm_Renderer_Default extends HTML_QuickForm_Renderer { /** * The HTML of the form * @var string * @access private */ var $_html; /** * Header Template string * @var string * @access private */ var $_headerTemplate = "\n\t\n\t\t{header}\n\t"; /** * Element template string * @var string * @access private */ var $_elementTemplate = "\n\t\n\t\t*{label}\n\t\t{error}
\t{element}\n\t"; /** * Form template string * @var string * @access private */ var $_formTemplate = "\n\n
\n{hidden}\n{content}\n
\n
\n"; /** * Required Note template string * @var string * @access private */ var $_requiredNoteTemplate = "\n\t\n\t\t\n\t{requiredNote}\n\t"; /** * Array containing the templates for customised elements * @var array * @access private */ var $_templates = array(); /** * Array containing the templates for group wraps. * * These templates are wrapped around group elements and groups' own * templates wrap around them. This is set by setGroupTemplate(). * * @var array * @access private */ var $_groupWraps = array(); /** * Array containing the templates for elements within groups * @var array * @access private */ var $_groupTemplates = array(); /** * True if we are inside a group * @var bool * @access private */ var $_inGroup = false; /** * Array with HTML generated for group elements * @var array * @access private */ var $_groupElements = array(); /** * Template for an element inside a group * @var string * @access private */ var $_groupElementTemplate = ''; /** * HTML that wraps around the group elements * @var string * @access private */ var $_groupWrap = ''; /** * HTML for the current group * @var string * @access private */ var $_groupTemplate = ''; /** * Collected HTML of the hidden fields * @var string * @access private */ var $_hiddenHtml = ''; /** * Constructor * * @access public */ public function __construct() { parent::__construct(); } // end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_Renderer_Default() { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct(); } // end constructor /** * returns the HTML generated for the form * * @access public * @return string */ function toHtml() { // _hiddenHtml is cleared in finishForm(), so this only matters when // finishForm() was not called (e.g. group::toHtml(), bug #3511) return $this->_hiddenHtml . $this->_html; } // end func toHtml /** * Called when visiting a form, before processing any form elements * * @param object An HTML_QuickForm object being visited * @access public * @return void */ function startForm(&$form) { $this->_html = ''; $this->_hiddenHtml = ''; } // end func startForm /** * Called when visiting a form, after processing all form elements * Adds required note, form attributes, validation javascript and form content. * * @param object An HTML_QuickForm object being visited * @access public * @return void */ function finishForm(&$form) { // add a required note, if one is needed if (!empty($form->_required) && !$form->_freezeAll) { $this->_html .= str_replace('{requiredNote}', $form->getRequiredNote(), $this->_requiredNoteTemplate); } // add form attributes and content $html = str_replace('{attributes}', $form->getAttributes(true), $this->_formTemplate); if (strpos($this->_formTemplate, '{hidden}')) { $html = str_replace('{hidden}', $this->_hiddenHtml, $html); } else { $this->_html .= $this->_hiddenHtml; } $this->_hiddenHtml = ''; $this->_html = str_replace('{content}', $this->_html, $html); // add a validation script if ('' != ($script = $form->getValidationScript())) { $this->_html = $script . "\n" . $this->_html; } } // end func finishForm /** * Called when visiting a header element * * @param object An HTML_QuickForm_header element being visited * @access public * @return void */ function renderHeader(&$header) { $name = $header->getName(); if (!empty($name) && isset($this->_templates[$name])) { $this->_html .= str_replace('{header}', $header->toHtml(), $this->_templates[$name]); } else { $this->_html .= str_replace('{header}', $header->toHtml(), $this->_headerTemplate); } } // end func renderHeader /** * Helper method for renderElement * * @param string Element name * @param mixed Element label (if using an array of labels, you should set the appropriate template) * @param bool Whether an element is required * @param string Error message associated with the element * @access private * @see renderElement() * @return string Html for element */ function _prepareTemplate($name, $label, $required, $error) { if (is_array($label)) { $nameLabel = array_shift($label); } else { $nameLabel = $label; } if (isset($this->_templates[$name])) { $html = str_replace('{label}', $nameLabel, $this->_templates[$name]); } else { $html = str_replace('{label}', $nameLabel, $this->_elementTemplate); } if ($required) { $html = str_replace('', '', $html); $html = str_replace('', '', $html); } else { $html = preg_replace("/([ \t\n\r]*)?(\s|\S)*([ \t\n\r]*)?/iU", '', $html); } if (isset($error)) { $html = str_replace('{error}', $error, $html); $html = str_replace('', '', $html); $html = str_replace('', '', $html); } else { $html = preg_replace("/([ \t\n\r]*)?(\s|\S)*([ \t\n\r]*)?/iU", '', $html); } if (is_array($label)) { foreach($label as $key => $text) { $key = is_int($key)? $key + 2: $key; $html = str_replace("{label_{$key}}", $text, $html); $html = str_replace("", '', $html); $html = str_replace("", '', $html); } } if (strpos($html, '{label_')) { $html = preg_replace('/\s*.*\s*/i', '', $html); } return $html; } // end func _prepareTemplate /** * Renders an element Html * Called when visiting an element * * @param object An HTML_QuickForm_element object being visited * @param bool Whether an element is required * @param string An error message associated with an element * @access public * @return void */ function renderElement(&$element, $required, $error) { if (!$this->_inGroup) { $html = $this->_prepareTemplate($element->getName(), $element->getLabel(), $required, $error); $this->_html .= str_replace('{element}', $element->toHtml(), $html); } elseif (!empty($this->_groupElementTemplate)) { $html = str_replace('{label}', $element->getLabel(), $this->_groupElementTemplate); if ($required) { $html = str_replace('', '', $html); $html = str_replace('', '', $html); } else { $html = preg_replace("/([ \t\n\r]*)?(\s|\S)*([ \t\n\r]*)?/iU", '', $html); } $this->_groupElements[] = str_replace('{element}', $element->toHtml(), $html); } else { $this->_groupElements[] = $element->toHtml(); } } // end func renderElement /** * Renders an hidden element * Called when visiting a hidden element * * @param object An HTML_QuickForm_hidden object being visited * @access public * @return void */ function renderHidden(&$element) { $this->_hiddenHtml .= $element->toHtml() . "\n"; } // end func renderHidden /** * Called when visiting a raw HTML/text pseudo-element * * @param object An HTML_QuickForm_html element being visited * @access public * @return void */ function renderHtml(&$data) { $this->_html .= $data->toHtml(); } // end func renderHtml /** * Called when visiting a group, before processing any group elements * * @param object An HTML_QuickForm_group object being visited * @param bool Whether a group is required * @param string An error message associated with a group * @access public * @return void */ function startGroup(&$group, $required, $error) { $name = $group->getName(); $this->_groupTemplate = $this->_prepareTemplate($name, $group->getLabel(), $required, $error); $this->_groupElementTemplate = empty($this->_groupTemplates[$name])? '': $this->_groupTemplates[$name]; $this->_groupWrap = empty($this->_groupWraps[$name])? '': $this->_groupWraps[$name]; $this->_groupElements = array(); $this->_inGroup = true; } // end func startGroup /** * Called when visiting a group, after processing all group elements * * @param object An HTML_QuickForm_group object being visited * @access public * @return void */ function finishGroup(&$group) { $separator = $group->_separator; if (is_array($separator)) { $count = count($separator); $html = ''; for ($i = 0; $i < count($this->_groupElements); $i++) { $html .= (0 == $i? '': $separator[($i - 1) % $count]) . $this->_groupElements[$i]; } } else { if (is_null($separator)) { $separator = ' '; } $html = implode((string)$separator, $this->_groupElements); } if (!empty($this->_groupWrap)) { $html = str_replace('{content}', $html, $this->_groupWrap); } $this->_html .= str_replace('{element}', $html, $this->_groupTemplate); $this->_inGroup = false; } // end func finishGroup /** * Sets element template * * @param string The HTML surrounding an element * @param string (optional) Name of the element to apply template for * @access public * @return void */ function setElementTemplate($html, $element = null) { if (is_null($element)) { $this->_elementTemplate = $html; } else { $this->_templates[$element] = $html; } } // end func setElementTemplate /** * Sets template for a group wrapper * * This template is contained within a group-as-element template * set via setTemplate() and contains group's element templates, set * via setGroupElementTemplate() * * @param string The HTML surrounding group elements * @param string Name of the group to apply template for * @access public * @return void */ function setGroupTemplate($html, $group) { $this->_groupWraps[$group] = $html; } // end func setGroupTemplate /** * Sets element template for elements within a group * * @param string The HTML surrounding an element * @param string Name of the group to apply template for * @access public * @return void */ function setGroupElementTemplate($html, $group) { $this->_groupTemplates[$group] = $html; } // end func setGroupElementTemplate /** * Sets header template * * @param string The HTML surrounding the header * @access public * @return void */ function setHeaderTemplate($html) { $this->_headerTemplate = $html; } // end func setHeaderTemplate /** * Sets form template * * @param string The HTML surrounding the form tags * @access public * @return void */ function setFormTemplate($html) { $this->_formTemplate = $html; } // end func setFormTemplate /** * Sets the note indicating required fields template * * @param string The HTML surrounding the required note * @access public * @return void */ function setRequiredNoteTemplate($html) { $this->_requiredNoteTemplate = $html; } // end func setRequiredNoteTemplate /** * Clears all the HTML out of the templates that surround notes, elements, etc. * Useful when you want to use addData() to create a completely custom form look * * @access public * @return void */ function clearAllTemplates() { $this->setElementTemplate('{element}'); $this->setFormTemplate("\n\t{content}\n\t\n"); $this->setRequiredNoteTemplate(''); $this->_templates = array(); } // end func clearAllTemplates } // end class HTML_QuickForm_Renderer_Default ?> PKw \9''Renderer/Array.phpnu[ | // | Adam Daniel | // | Bertrand Mansion | // | Thomas Schulz | // +----------------------------------------------------------------------+ // // $Id$ require_once 'HTML/QuickForm/Renderer.php'; /** * A concrete renderer for HTML_QuickForm, makes an array of form contents * * Based on old toArray() code. * * The form array structure is the following: * array( * 'frozen' => 'whether the form is frozen', * 'javascript' => 'javascript for client-side validation', * 'attributes' => 'attributes for
tag', * 'requirednote => 'note about the required elements', * // if we set the option to collect hidden elements * 'hidden' => 'collected html of all hidden elements', * // if there were some validation errors: * 'errors' => array( * '1st element name' => 'Error for the 1st element', * ... * 'nth element name' => 'Error for the nth element' * ), * // if there are no headers in the form: * 'elements' => array( * element_1, * ... * element_N * ) * // if there are headers in the form: * 'sections' => array( * array( * 'header' => 'Header text for the first header', * 'name' => 'Header name for the first header', * 'elements' => array( * element_1, * ... * element_K1 * ) * ), * ... * array( * 'header' => 'Header text for the Mth header', * 'name' => 'Header name for the Mth header', * 'elements' => array( * element_1, * ... * element_KM * ) * ) * ) * ); * * where element_i is an array of the form: * array( * 'name' => 'element name', * 'value' => 'element value', * 'type' => 'type of the element', * 'frozen' => 'whether element is frozen', * 'label' => 'label for the element', * 'required' => 'whether element is required', * 'error' => 'error associated with the element', * 'style' => 'some information about element style (e.g. for Smarty)', * // if element is not a group * 'html' => 'HTML for the element' * // if element is a group * 'separator' => 'separator for group elements', * 'elements' => array( * element_1, * ... * element_N * ) * ); * * @access public */ class HTML_QuickForm_Renderer_Array extends HTML_QuickForm_Renderer { /** * An array being generated * @var array */ var $_ary; /** * Number of sections in the form (i.e. number of headers in it) * @var integer */ var $_sectionCount; /** * Current section number * @var integer */ var $_currentSection; /** * Array representing current group * @var array */ var $_currentGroup = null; /** * Additional style information for different elements * @var array */ var $_elementStyles = array(); /** * true: collect all hidden elements into string; false: process them as usual form elements * @var bool */ var $_collectHidden = false; /** * true: render an array of labels to many labels, $key 0 named 'label', the rest "label_$key" * false: leave labels as defined * @var bool */ var $_staticLabels = false; /** * Constructor * * @param bool true: collect all hidden elements into string; false: process them as usual form elements * @param bool true: render an array of labels to many labels, $key 0 to 'label' and the oterh to "label_$key" * @access public */ public function __construct($collectHidden = false, $staticLabels = false) { parent::__construct(); $this->_collectHidden = $collectHidden; $this->_staticLabels = $staticLabels; } // end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_Renderer_Array($collectHidden = false, $staticLabels = false) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($collectHidden, $staticLabels); } /** * Returns the resultant array * * @access public * @return array */ function toArray() { return $this->_ary; } function startForm(&$form) { $this->_ary = array( 'frozen' => $form->isFrozen(), 'javascript' => $form->getValidationScript(), 'attributes' => $form->getAttributes(true), 'requirednote' => $form->getRequiredNote(), 'errors' => array() ); if ($this->_collectHidden) { $this->_ary['hidden'] = ''; } $this->_currentSection = null; $this->_sectionCount = 0; } // end func startForm function renderHeader(&$header) { $this->_ary['sections'][$this->_sectionCount] = array( 'header' => $header->toHtml(), 'name' => $header->getName() ); $this->_currentSection = $this->_sectionCount++; } // end func renderHeader function renderElement(&$element, $required, $error) { $elAry = $this->_elementToArray($element, $required, $error); if (!empty($error)) { $this->_ary['errors'][$elAry['name']] = $error; } $this->_storeArray($elAry); } // end func renderElement function renderHidden(&$element) { if ($this->_collectHidden) { $this->_ary['hidden'] .= $element->toHtml() . "\n"; } else { $this->renderElement($element, false, null); } } // end func renderHidden function startGroup(&$group, $required, $error) { $this->_currentGroup = $this->_elementToArray($group, $required, $error); if (!empty($error)) { $this->_ary['errors'][$this->_currentGroup['name']] = $error; } } // end func startGroup function finishGroup(&$group) { $this->_storeArray($this->_currentGroup); $this->_currentGroup = null; } // end func finishGroup /** * Creates an array representing an element * * @access private * @param object An HTML_QuickForm_element object * @param bool Whether an element is required * @param string Error associated with the element * @return array */ function _elementToArray(&$element, $required, $error) { $ret = array( 'name' => $element->getName(), 'value' => $element->getValue(), 'type' => $element->getType(), 'frozen' => $element->isFrozen(), 'required' => $required, 'error' => $error ); // render label(s) $labels = $element->getLabel(); if (is_array($labels) && $this->_staticLabels) { foreach($labels as $key => $label) { $key = is_int($key)? $key + 1: $key; if (1 === $key) { $ret['label'] = $label; } else { $ret['label_' . $key] = $label; } } } else { $ret['label'] = $labels; } // set the style for the element if (isset($this->_elementStyles[$ret['name']])) { $ret['style'] = $this->_elementStyles[$ret['name']]; } if ('group' == $ret['type']) { $ret['separator'] = $element->_separator; $ret['elements'] = array(); } else { $ret['html'] = $element->toHtml(); } return $ret; } /** * Stores an array representation of an element in the form array * * @access private * @param array Array representation of an element * @return void */ function _storeArray($elAry) { // where should we put this element... if (is_array($this->_currentGroup) && ('group' != $elAry['type'])) { $this->_currentGroup['elements'][] = $elAry; } elseif (isset($this->_currentSection)) { $this->_ary['sections'][$this->_currentSection]['elements'][] = $elAry; } else { $this->_ary['elements'][] = $elAry; } } /** * Sets a style to use for element rendering * * @param mixed element name or array ('element name' => 'style name') * @param string style name if $elementName is not an array * @access public * @return void */ function setElementStyle($elementName, $styleName = null) { if (is_array($elementName)) { $this->_elementStyles = array_merge($this->_elementStyles, $elementName); } else { $this->_elementStyles[$elementName] = $styleName; } } } ?>PKw \:,:,Renderer/Object.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Renderer.php'); /** * A concrete renderer for HTML_QuickForm, makes an object from form contents * * Based on HTML_Quickform_Renderer_Array code * * @access public */ class HTML_QuickForm_Renderer_Object extends HTML_QuickForm_Renderer { /** * The object being generated * @var object $_obj */ var $_obj= null; /** * Number of sections in the form (i.e. number of headers in it) * @var integer $_sectionCount */ var $_sectionCount; /** * Current section number * @var integer $_currentSection */ var $_currentSection; /** * Object representing current group * @var object $_currentGroup */ var $_currentGroup = null; /** * Class of Element Objects * @var object $_elementType */ var $_elementType = 'QuickFormElement'; /** * Additional style information for different elements * @var array $_elementStyles */ var $_elementStyles = array(); /** * true: collect all hidden elements into string; false: process them as usual form elements * @var bool $_collectHidden */ var $_collectHidden = false; /** * Constructor * * @param collecthidden bool true: collect all hidden elements * @access public */ public function __construct($collecthidden = false) { parent::__construct(); $this->_collectHidden = $collecthidden; $this->_obj = new QuickformForm; } /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_Renderer_Object($collecthidden = false) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($collecthidden); } /** * Return the rendered Object * @access public */ function toObject() { return $this->_obj; } /** * Set the class of the form elements. Defaults to QuickformElement. * @param type string Name of element class * @access public */ function setElementType($type) { $this->_elementType = $type; } function startForm(&$form) { $this->_obj->frozen = $form->isFrozen(); $this->_obj->javascript = $form->getValidationScript(); $this->_obj->attributes = $form->getAttributes(true); $this->_obj->requirednote = $form->getRequiredNote(); $this->_obj->errors = new StdClass; if($this->_collectHidden) { $this->_obj->hidden = ''; } $this->_currentSection = null; $this->_sectionCount = 0; } // end func startForm function renderHeader(&$header) { $hobj = new StdClass; $hobj->header = $header->toHtml(); $this->_obj->sections[$this->_sectionCount] = $hobj; $this->_currentSection = $this->_sectionCount++; } function renderElement(&$element, $required, $error) { $elObj = $this->_elementToObject($element, $required, $error); if(!empty($error)) { $name = $elObj->name; $this->_obj->errors->$name = $error; } $this->_storeObject($elObj); } // end func renderElement function renderHidden(&$element) { if($this->_collectHidden) { $this->_obj->hidden .= $element->toHtml() . "\n"; } else { $this->renderElement($element, false, null); } } //end func renderHidden function startGroup(&$group, $required, $error) { $this->_currentGroup = $this->_elementToObject($group, $required, $error); if(!empty($error)) { $name = $this->_currentGroup->name; $this->_obj->errors->$name = $error; } } // end func startGroup function finishGroup(&$group) { $this->_storeObject($this->_currentGroup); $this->_currentGroup = null; } // end func finishGroup /** * Creates an object representing an element * * @access private * @param element object An HTML_QuickForm_element object * @param required bool Whether an element is required * @param error string Error associated with the element * @return object */ function _elementToObject(&$element, $required, $error) { if($this->_elementType) { $ret = new $this->_elementType; } $ret->name = $element->getName(); $ret->value = $element->getValue(); $ret->type = $element->getType(); $ret->frozen = $element->isFrozen(); $labels = $element->getLabel(); if (is_array($labels)) { $ret->label = array_shift($labels); foreach ($labels as $key => $label) { $key = is_int($key)? $key + 2: $key; $ret->{'label_' . $key} = $label; } } else { $ret->label = $labels; } $ret->required = $required; $ret->error = $error; if(isset($this->_elementStyles[$ret->name])) { $ret->style = $this->_elementStyles[$ret->name]; $ret->styleTemplate = "styles/". $ret->style .".html"; } if($ret->type == 'group') { $ret->separator = $element->_separator; $ret->elements = array(); } else { $ret->html = $element->toHtml(); } return $ret; } /** * Stores an object representation of an element in the form array * * @access private * @param elObj object Object representation of an element * @return void */ function _storeObject($elObj) { $name = $elObj->name; if(is_object($this->_currentGroup) && $elObj->type != 'group') { $this->_currentGroup->elements[] = $elObj; } elseif (isset($this->_currentSection)) { $this->_obj->sections[$this->_currentSection]->elements[] = $elObj; } else { $this->_obj->elements[] = $elObj; } } function setElementStyle($elementName, $styleName = null) { if(is_array($elementName)) { $this->_elementStyles = array_merge($this->_elementStyles, $elementName); } else { $this->_elementStyles[$elementName] = $styleName; } } } // end class HTML_QuickForm_Renderer_Object /** * Convenience class for the form object passed to outputObject() * * Eg. * {form.outputJavaScript():h} * {form.outputHeader():h} * * * * *
{form.name.label:h}{form.name.html:h}
*
*/ class QuickformForm { /** * Whether the form has been frozen * @var boolean $frozen */ var $frozen; /** * Javascript for client-side validation * @var string $javascript */ var $javascript; /** * Attributes for form tag * @var string $attributes */ var $attributes; /** * Note about required elements * @var string $requirednote */ var $requirednote; /** * Collected html of all hidden variables * @var string $hidden */ var $hidden; /** * Set if there were validation errors. * StdClass object with element names for keys and their * error messages as values * @var object $errors */ var $errors; /** * Array of QuickformElementObject elements. If there are headers in the form * this will be empty and the elements will be in the * separate sections * @var array $elements */ var $elements; /** * Array of sections contained in the document * @var array $sections */ var $sections; /** * Output <form> header * {form.outputHeader():h} * @return string <form attributes> */ function outputHeader() { return "
attributes . ">\n"; } /** * Output form javascript * {form.outputJavaScript():h} * @return string Javascript */ function outputJavaScript() { return $this->javascript; } } // end class QuickformForm /** * Convenience class describing a form element. * The properties defined here will be available from * your flexy templates by referencing * {form.zip.label:h}, {form.zip.html:h}, etc. */ class QuickformElement { /** * Element name * @var string $name */ var $name; /** * Element value * @var mixed $value */ var $value; /** * Type of element * @var string $type */ var $type; /** * Whether the element is frozen * @var boolean $frozen */ var $frozen; /** * Label for the element * @var string $label */ var $label; /** * Whether element is required * @var boolean $required */ var $required; /** * Error associated with the element * @var string $error */ var $error; /** * Some information about element style * @var string $style */ var $style; /** * HTML for the element * @var string $html */ var $html; /** * If element is a group, the group separator * @var mixed $separator */ var $separator; /** * If element is a group, an array of subelements * @var array $elements */ var $elements; function isType($type) { return ($this->type == $type); } function notFrozen() { return !$this->frozen; } function isButton() { return ($this->type == "submit" || $this->type == "reset"); } /** * XXX: why does it use Flexy when all other stuff here does not depend on it? */ function outputStyle() { ob_start(); HTML_Template_Flexy::staticQuickTemplate('styles/' . $this->style . '.html', $this); $ret = ob_get_contents(); ob_end_clean(); return $ret; } } // end class QuickformElement ?> PKw \Aى static.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/element.php"); /** * HTML class for static data * * @author Wojciech Gdela * @access public */ class HTML_QuickForm_static extends HTML_QuickForm_element { // {{{ properties /** * Display text * @var string * @access private */ var $_text = null; // }}} // {{{ constructor /** * Class constructor * * @param string $elementLabel (optional)Label * @param string $text (optional)Display text * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $text=null) { parent::__construct($elementName, $elementLabel); $this->_persistantFreeze = false; $this->_type = 'static'; $this->_text = $text; } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_static($elementName=null, $elementLabel=null, $text=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $text); } // }}} // {{{ setName() /** * Sets the element name * * @param string $name Element name * @access public * @return void */ function setName($name) { $this->updateAttributes(array('name'=>$name)); } //end func setName // }}} // {{{ getName() /** * Returns the element name * * @access public * @return string */ function getName() { return $this->getAttribute('name'); } //end func getName // }}} // {{{ setText() /** * Sets the text * * @param string $text * @access public * @return void */ function setText($text) { $this->_text = $text; } // end func setText // }}} // {{{ setValue() /** * Sets the text (uses the standard setValue call to emulate a form element. * * @param string $text * @access public * @return void */ function setValue($text) { $this->setText($text); } // end func setValue // }}} // {{{ toHtml() /** * Returns the static text element in HTML * * @access public * @return string */ function toHtml() { return $this->_getTabs() . $this->_text; } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags * * @access public * @return string */ function getFrozenHtml() { return $this->toHtml(); } //end func getFrozenHtml // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return void * @throws */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': // do NOT use submitted values for static elements $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_defaultValues); } if (null !== $value) { $this->setValue($value); } break; default: parent::onQuickFormEvent($event, $arg, $caller); } return true; } // end func onQuickFormEvent // }}} // {{{ exportValue() /** * We override this here because we don't want any values from static elements */ function exportValue(&$submitValues, $assoc = false) { return null; } // }}} } //end class HTML_QuickForm_static ?> PKw \'ll password.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a password type field * * @author Adam Daniel * @author Bertrand Mansion * @version 1.1 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_password extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $elementLabel (optional)Input field label * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void * @throws */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->setType('password'); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_password($elementName=null, $elementLabel=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ setSize() /** * Sets size of password element * * @param string $size Size of password field * @since 1.0 * @access public * @return void */ function setSize($size) { $this->updateAttributes(array('size'=>$size)); } //end func setSize // }}} // {{{ setMaxlength() /** * Sets maxlength of password element * * @param string $maxlength Maximum length of password field * @since 1.0 * @access public * @return void */ function setMaxlength($maxlength) { $this->updateAttributes(array('maxlength'=>$maxlength)); } //end func setMaxlength // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags (in this case, value is changed to a mask) * * @since 1.0 * @access public * @return string * @throws */ function getFrozenHtml() { $value = $this->getValue(); return ('' != $value? '**********': ' ') . $this->_getPersistantData(); } //end func getFrozenHtml // }}} } //end class HTML_QuickForm_password ?> PKw \ text.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a text field * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_text extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $elementLabel (optional)Input field label * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->setType('text'); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_text($elementName=null, $elementLabel=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ setSize() /** * Sets size of text field * * @param string $size Size of text field * @since 1.3 * @access public * @return void */ function setSize($size) { $this->updateAttributes(array('size'=>$size)); } //end func setSize // }}} // {{{ setMaxlength() /** * Sets maxlength of text field * * @param string $maxlength Maximum length of text field * @since 1.3 * @access public * @return void */ function setMaxlength($maxlength) { $this->updateAttributes(array('maxlength'=>$maxlength)); } //end func setMaxlength // }}} } //end class HTML_QuickForm_text ?> PKw \{D#D#advcheckbox.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/checkbox.php'); /** * HTML class for an advanced checkbox type field * * Basically this fixes a problem that HTML has had * where checkboxes can only pass a single value (the * value of the checkbox when checked). A value for when * the checkbox is not checked cannot be passed, and * furthermore the checkbox variable doesn't even exist if * the checkbox was submitted unchecked. * * It works by prepending a hidden field with the same name and * another "unchecked" value to the checbox. If the checkbox is * checked, PHP overwrites the value of the hidden field with * its value. * * @author Jason Rust * @since 2.0 * @access public */ class HTML_QuickForm_advcheckbox extends HTML_QuickForm_checkbox { // {{{ properties /** * The values passed by the hidden elment * * @var array * @access private */ var $_values = null; /** * The default value * * @var boolean * @access private */ var $_currentValue = null; // }}} // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $elementLabel (optional)Input field label * @param string $text (optional)Text to put after the checkbox * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @param mixed $values (optional)Values to pass if checked or not checked * * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null) { parent::__construct($elementName, $elementLabel, $text, $attributes); $this->setValues($values); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_advcheckbox($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $text, $attributes, $values); } // }}} // {{{ getPrivateName() /** * Gets the private name for the element * * @param string $elementName The element name to make private * * @access public * @return string * * @deprecated Deprecated since 3.2.6, both generated elements have the same name */ function getPrivateName($elementName) { return '__'.$elementName; } // }}} // {{{ getOnclickJs() /** * Create the javascript for the onclick event which will * set the value of the hidden field * * @param string $elementName The element name * * @access public * @return string * * @deprecated Deprecated since 3.2.6, this element no longer uses any javascript */ function getOnclickJs($elementName) { $onclickJs = 'if (this.checked) { this.form[\''.$elementName.'\'].value=\''.addcslashes($this->_values[1], '\'').'\'; }'; $onclickJs .= 'else { this.form[\''.$elementName.'\'].value=\''.addcslashes($this->_values[0], '\'').'\'; }'; return $onclickJs; } // }}} // {{{ setValues() /** * Sets the values used by the hidden element * * @param mixed $values The values, either a string or an array * * @access public * @return void */ function setValues($values) { if (empty($values)) { // give it default checkbox behavior $this->_values = array('', 1); } elseif (is_scalar($values)) { // if it's string, then assume the value to // be passed is for when the element is checked $this->_values = array('', $values); } else { $this->_values = $values; } $this->updateAttributes(array('value' => $this->_values[1])); $this->setChecked($this->_currentValue == $this->_values[1]); } // }}} // {{{ setValue() /** * Sets the element's value * * @param mixed Element's value * @access public */ function setValue($value) { $this->setChecked(isset($this->_values[1]) && $value == $this->_values[1]); $this->_currentValue = $value; } // }}} // {{{ getValue() /** * Returns the element's value * * @access public * @return mixed */ function getValue() { if (is_array($this->_values)) { return $this->_values[$this->getChecked()? 1: 0]; } else { return null; } } // }}} // {{{ toHtml() /** * Returns the checkbox element in HTML * and the additional hidden element in HTML * * @access public * @return string */ function toHtml() { if ($this->_flagFrozen) { return parent::toHtml(); } else { return '_getAttrString(array( 'type' => 'hidden', 'name' => $this->getName(), 'value' => $this->_values[0] )) . ' />' . parent::toHtml(); } } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Unlike checkbox, this has to append a hidden input in both * checked and non-checked states */ function getFrozenHtml() { return ($this->getChecked()? '[x]': '[ ]') . $this->_getPersistantData(); } // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return void */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': // constant values override both default and submitted ones // default values are overriden by submitted $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_submitValues); if (null === $value) { $value = $this->_findValue($caller->_defaultValues); } } if (null !== $value) { $this->setValue($value); } break; default: parent::onQuickFormEvent($event, $arg, $caller); } return true; } // end func onQuickFormLoad // }}} // {{{ exportValue() /** * This element has a value even if it is not checked, thus we override * checkbox's behaviour here */ function exportValue(&$submitValues, $assoc = false) { $value = $this->_findValue($submitValues); if (null === $value) { $value = $this->getValue(); } elseif (is_array($this->_values) && ($value != $this->_values[0]) && ($value != $this->_values[1])) { $value = null; } return $this->_prepareValue($value, $assoc); } // }}} } //end class HTML_QuickForm_advcheckbox ?> PKw \<<RuleRegistry.phpnu[ | // | Alexey Borzov | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ /** * Registers rule objects and uses them for validation * */ class HTML_QuickForm_RuleRegistry { /** * Array containing references to used rules * @var array * @access private */ var $_rules = array(); /** * Returns a singleton of HTML_QuickForm_RuleRegistry * * Usually, only one RuleRegistry object is needed, this is the reason * why it is recommended to use this method to get the validation object. * * @access public * @static * @return object Reference to the HTML_QuickForm_RuleRegistry singleton */ static function &singleton() { static $obj; if (!isset($obj)) { $obj = new HTML_QuickForm_RuleRegistry(); } return $obj; } // end func singleton /** * Registers a new validation rule * * In order to use a custom rule in your form, you need to register it * first. For regular expressions, one can directly use the 'regex' type * rule in addRule(), this is faster than registering the rule. * * Functions and methods can be registered. Use the 'function' type. * When registering a method, specify the class name as second parameter. * * You can also register an HTML_QuickForm_Rule subclass with its own * validate() method. * * @param string $ruleName Name of validation rule * @param string $type Either: 'regex', 'function' or null * @param string $data1 Name of function, regular expression or * HTML_QuickForm_Rule object class name * @param string $data2 Object parent of above function or HTML_QuickForm_Rule file path * @access public * @return void */ function registerRule($ruleName, $type, $data1, $data2 = null) { $type = strtolower($type ?? ''); if ($type == 'regex') { // Regular expression $rule =& $this->getRule('regex'); $rule->addData($ruleName, $data1); $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = $GLOBALS['_HTML_QuickForm_registered_rules']['regex']; } elseif ($type == 'function' || $type == 'callback') { // Callback function $rule =& $this->getRule('callback'); $rule->addData($ruleName, $data1, $data2, 'function' == $type); $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = $GLOBALS['_HTML_QuickForm_registered_rules']['callback']; } elseif (is_object($data1)) { // An instance of HTML_QuickForm_Rule $this->_rules[strtolower(get_class($data1))] = $data1; $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = array(strtolower(get_class($data1)), null); } else { // Rule class name $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName] = array(strtolower($data1), $data2); } } // end func registerRule /** * Returns a reference to the requested rule object * * @param string $ruleName Name of the requested rule * @access public * @return object */ function &getRule($ruleName) { list($class, $path) = $GLOBALS['_HTML_QuickForm_registered_rules'][$ruleName]; if (!isset($this->_rules[$class])) { if (!empty($path)) { include_once($path); } $this->_rules[$class] = new $class(); } $this->_rules[$class]->setName($ruleName); return $this->_rules[$class]; } // end func getRule /** * Performs validation on the given values * * @param string $ruleName Name of the rule to be used * @param mixed $values Can be a scalar or an array of values * to be validated * @param mixed $options Options used by the rule * @param mixed $multiple Whether to validate an array of values altogether * @access public * @return mixed true if no error found, int of valid values (when an array of values is given) or false if error */ function validate($ruleName, $values, $options = null, $multiple = false) { $rule =& $this->getRule($ruleName); if (is_array($values) && !$multiple) { $result = 0; foreach ($values as $value) { if ($rule->validate($value, $options) === true) { $result++; } } return ($result == 0) ? false : $result; } else { return $rule->validate($values, $options); } } // end func validate /** * Returns the validation test in javascript code * * @param mixed Element(s) the rule applies to * @param string Element name, in case $element is not array * @param array Rule data * @access public * @return string JavaScript for the rule */ function getValidationScript(&$element, $elementName, $ruleData) { $reset = (isset($ruleData['reset'])) ? $ruleData['reset'] : false; $rule =& $this->getRule($ruleData['type']); if (!is_array($element)) { list($jsValue, $jsReset) = $this->_getJsValue($element, $elementName, $reset, null); } else { $jsValue = " value = new Array();\n"; $jsReset = ''; for ($i = 0; $i < count($element); $i++) { list($tmp_value, $tmp_reset) = $this->_getJsValue($element[$i], $element[$i]->getName(), $reset, $i); $jsValue .= "\n" . $tmp_value; $jsReset .= $tmp_reset; } } $jsField = isset($ruleData['group'])? $ruleData['group']: $elementName; list ($jsPrefix, $jsCheck) = $rule->getValidationScript($ruleData['format']); if (!isset($ruleData['howmany'])) { $js = $jsValue . "\n" . $jsPrefix . " if (" . str_replace('{jsVar}', 'value', $jsCheck) . " && !errFlag['{$jsField}']) {\n" . " errFlag['{$jsField}'] = true;\n" . " _qfMsg = _qfMsg + '{$ruleData['message']}';\n" . $jsReset . " }\n"; } else { $js = $jsValue . "\n" . $jsPrefix . " var res = 0;\n" . " for (var i = 0; i < value.length; i++) {\n" . " if (!(" . str_replace('{jsVar}', 'value[i]', $jsCheck) . ")) {\n" . " res++;\n" . " }\n" . " }\n" . " if (res < {$ruleData['howmany']} && !errFlag['{$jsField}']) {\n" . " errFlag['{$jsField}'] = true;\n" . " _qfMsg = _qfMsg + '{$ruleData['message']}';\n" . $jsReset . " }\n"; } return $js; } // end func getValidationScript /** * Returns JavaScript to get and to reset the element's value * * @access private * @param object HTML_QuickForm_element element being processed * @param string element's name * @param bool whether to generate JavaScript to reset the value * @param integer value's index in the array (only used for multielement rules) * @return array first item is value javascript, second is reset */ function _getJsValue(&$element, $elementName, $reset = false, $index = null) { $jsIndex = isset($index)? '[' . $index . ']': ''; $tmp_reset = $reset? " var field = frm.elements['$elementName'];\n": ''; if (is_a($element, 'html_quickform_group')) { $value = " _qfGroups['{$elementName}'] = {"; $elements =& $element->getElements(); for ($i = 0, $count = count($elements); $i < $count; $i++) { $append = (($elements[$i]->getType() == 'select' || $element->getType() == 'autocomplete') && $elements[$i]->getMultiple())? '[]': ''; $value .= "'" . $element->getElementName($i) . $append . "': true" . ($i < $count - 1? ', ': ''); } $value .= "};\n" . " value{$jsIndex} = new Array();\n" . " var valueIdx = 0;\n" . " for (var i = 0; i < frm.elements.length; i++) {\n" . " var _element = frm.elements[i];\n" . " if (_element.name in _qfGroups['{$elementName}']) {\n" . " switch (_element.type) {\n" . " case 'checkbox':\n" . " case 'radio':\n" . " if (_element.checked) {\n" . " value{$jsIndex}[valueIdx++] = _element.value;\n" . " }\n" . " break;\n" . " case 'select-one':\n" . " if (-1 != _element.selectedIndex) {\n" . " value{$jsIndex}[valueIdx++] = _element.options[_element.selectedIndex].value;\n" . " }\n" . " break;\n" . " case 'select-multiple':\n" . " var tmpVal = new Array();\n" . " var tmpIdx = 0;\n" . " for (var j = 0; j < _element.options.length; j++) {\n" . " if (_element.options[j].selected) {\n" . " tmpVal[tmpIdx++] = _element.options[j].value;\n" . " }\n" . " }\n" . " if (tmpIdx > 0) {\n" . " value{$jsIndex}[valueIdx++] = tmpVal;\n" . " }\n" . " break;\n" . " default:\n" . " value{$jsIndex}[valueIdx++] = _element.value;\n" . " }\n" . " }\n" . " }\n"; if ($reset) { $tmp_reset = " for (var i = 0; i < frm.elements.length; i++) {\n" . " var _element = frm.elements[i];\n" . " if (_element.name in _qfGroups['{$elementName}']) {\n" . " switch (_element.type) {\n" . " case 'checkbox':\n" . " case 'radio':\n" . " _element.checked = _element.defaultChecked;\n" . " break;\n" . " case 'select-one':\n" . " case 'select-multiple':\n" . " for (var j = 0; j < _element.options.length; j++) {\n" . " _element.options[j].selected = _element.options[j].defaultSelected;\n" . " }\n" . " break;\n" . " default:\n" . " _element.value = _element.defaultValue;\n" . " }\n" . " }\n" . " }\n"; } } elseif ($element->getType() == 'select' || $element->getType() == 'autocomplete') { if ($element->getMultiple()) { $elementName .= '[]'; $value = " value{$jsIndex} = new Array();\n" . " var valueIdx = 0;\n" . " for (var i = 0; i < frm.elements['{$elementName}'].options.length; i++) {\n" . " if (frm.elements['{$elementName}'].options[i].selected) {\n" . " value{$jsIndex}[valueIdx++] = frm.elements['{$elementName}'].options[i].value;\n" . " }\n" . " }\n"; } else { $value = " value{$jsIndex} = frm.elements['{$elementName}'].selectedIndex == -1? '': frm.elements['{$elementName}'].options[frm.elements['{$elementName}'].selectedIndex].value;\n"; } if ($reset) { $tmp_reset .= " for (var i = 0; i < field.options.length; i++) {\n" . " field.options[i].selected = field.options[i].defaultSelected;\n" . " }\n"; } } elseif ($element->getType() == 'advcheckbox') { $value = " value{$jsIndex} = frm.elements['$elementName'][1].checked ?" . " frm.elements['$elementName'][1].value : frm.elements['$elementName'][0].value;\n"; $tmp_reset .= $reset ? " field[1].checked = field[1].defaultChecked;\n" : ''; } elseif ($element->getType() == 'checkbox') { $value = " value{$jsIndex} = frm.elements['$elementName'].checked? '1': '';\n"; $tmp_reset .= $reset ? " field.checked = field.defaultChecked;\n" : ''; } elseif ($element->getType() == 'radio') { $value = " value{$jsIndex} = '';\n" . // Fix for bug #5644 " var els = 'length' in frm.elements['$elementName']? frm.elements['$elementName']: [ frm.elements['$elementName'] ];\n" . " for (var i = 0; i < els.length; i++) {\n" . " if (els[i].checked) {\n" . " value{$jsIndex} = els[i].value;\n" . " }\n" . " }"; if ($reset) { $tmp_reset .= " for (var i = 0; i < field.length; i++) {\n" . " field[i].checked = field[i].defaultChecked;\n" . " }"; } } else { $value = " value{$jsIndex} = frm.elements['$elementName'].value;"; $tmp_reset .= ($reset) ? " field.value = field.defaultValue;\n" : ''; } return array($value, $tmp_reset); } } // end class HTML_QuickForm_RuleRegistry ?> PKw \h~FŁŁdate.phpnu[ | // | Adam Daniel | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once 'HTML/QuickForm/group.php'; require_once 'HTML/QuickForm/select.php'; /** * Class for a group of elements used to input dates (and times). * * Inspired by original 'date' element but reimplemented as a subclass * of HTML_QuickForm_group * * @author Alexey Borzov * @access public */ class HTML_QuickForm_date extends HTML_QuickForm_group { // {{{ properties /** * Various options to control the element's display. * * Currently known options are * 'language': date language * 'format': Format of the date, based on PHP's date() function. * The following characters are recognised in format string: * D => Short names of days * l => Long names of days * d => Day numbers * M => Short names of months * F => Long names of months * m => Month numbers * Y => Four digit year * y => Two digit year * h => 12 hour format * H => 23 hour format * i => Minutes * s => Seconds * a => am/pm * A => AM/PM * 'minYear': Minimum year in year select * 'maxYear': Maximum year in year select * 'addEmptyOption': Should an empty option be added to the top of * each select box? * 'emptyOptionValue': The value passed by the empty option. * 'emptyOptionText': The text displayed for the empty option. * 'optionIncrement': Step to increase the option values by (works for 'i' and 's') * * @access private * @var array */ var $_options = array( 'language' => 'en', 'format' => 'dMY', 'minYear' => 2001, 'maxYear' => 2010, 'addEmptyOption' => false, 'emptyOptionValue' => '', 'emptyOptionText' => ' ', 'optionIncrement' => array('i' => 1, 's' => 1) ); /** * These complement separators, they are appended to the resultant HTML * @access private * @var array */ var $_wrap = array('', ''); /** * Options in different languages * * Note to potential translators: to avoid encoding problems please send * your translations with "weird" letters encoded as HTML Unicode entities * * @access private * @var array */ var $_locale = array( 'en' => array ( 'weekdays_short'=> array ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'), 'weekdays_long' => array ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), 'months_long' => array ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') ), 'de' => array ( 'weekdays_short'=> array ('So', 'Mon', 'Di', 'Mi', 'Do', 'Fr', 'Sa'), 'weekdays_long' => array ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'), 'months_short' => array ('Jan', 'Feb', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dez'), 'months_long' => array ('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember') ), 'fr' => array ( 'weekdays_short'=> array ('Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'), 'weekdays_long' => array ('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'), 'months_short' => array ('Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Déc'), 'months_long' => array ('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre') ), 'hu' => array ( 'weekdays_short'=> array ('V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'), 'weekdays_long' => array ('vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'), 'months_short' => array ('jan', 'feb', 'márc', 'ápr', 'máj', 'jún', 'júl', 'aug', 'szept', 'okt', 'nov', 'dec'), 'months_long' => array ('január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december') ), 'pl' => array ( 'weekdays_short'=> array ('Nie', 'Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'Sob'), 'weekdays_long' => array ('Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'), 'months_short' => array ('Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze', 'Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'), 'months_long' => array ('Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień') ), 'sl' => array ( 'weekdays_short'=> array ('Ned', 'Pon', 'Tor', 'Sre', 'Cet', 'Pet', 'Sob'), 'weekdays_long' => array ('Nedelja', 'Ponedeljek', 'Torek', 'Sreda', 'Cetrtek', 'Petek', 'Sobota'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'), 'months_long' => array ('Januar', 'Februar', 'Marec', 'April', 'Maj', 'Junij', 'Julij', 'Avgust', 'September', 'Oktober', 'November', 'December') ), 'ru' => array ( 'weekdays_short'=> array ('Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'), 'weekdays_long' => array ('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'), 'months_short' => array ('Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'), 'months_long' => array ('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь') ), 'es' => array ( 'weekdays_short'=> array ('Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'), 'weekdays_long' => array ('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'), 'months_short' => array ('Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'), 'months_long' => array ('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre') ), 'da' => array ( 'weekdays_short'=> array ('Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'), 'weekdays_long' => array ('Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'), 'months_long' => array ('Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December') ), 'is' => array ( 'weekdays_short'=> array ('Sun', 'Mán', 'Þri', 'Mið', 'Fim', 'Fös', 'Lau'), 'weekdays_long' => array ('Sunnudagur', 'Mánudagur', 'Þriðjudagur', 'Miðvikudagur', 'Fimmtudagur', 'Föstudagur', 'Laugardagur'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maí', 'Jún', 'Júl', 'Ágú', 'Sep', 'Okt', 'Nóv', 'Des'), 'months_long' => array ('Janúar', 'Febrúar', 'Mars', 'Apríl', 'Maí', 'Júní', 'Júlí', 'Ágúst', 'September', 'Október', 'Nóvember', 'Desember') ), 'it' => array ( 'weekdays_short'=> array ('Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'), 'weekdays_long' => array ('Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'), 'months_short' => array ('Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'), 'months_long' => array ('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre') ), 'sk' => array ( 'weekdays_short'=> array ('Ned', 'Pon', 'Uto', 'Str', 'Štv', 'Pia', 'Sob'), 'weekdays_long' => array ('Nedeža', 'Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Máj', 'Jún', 'Júl', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'), 'months_long' => array ('Január', 'Február', 'Marec', 'Apríl', 'Máj', 'Jún', 'Júl', 'August', 'September', 'Október', 'November', 'December') ), 'cs' => array ( 'weekdays_short'=> array ('Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'), 'weekdays_long' => array ('Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'), 'months_short' => array ('Led', 'Úno', 'Bře', 'Dub', 'Kvě', 'Čen', 'Čec', 'Srp', 'Zář', 'Říj', 'Lis', 'Pro'), 'months_long' => array ('Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec') ), 'hy' => array ( 'weekdays_short'=> array ('Կրկ', 'Երկ', 'Երք', 'Չրք', 'Հնգ', 'Ուր', 'Շբթ'), 'weekdays_long' => array ('Կիրակի', 'Երկուշաբթի', 'Երեքշաբթի', 'Չորեքշաբթի', 'Հինգշաբթի', 'Ուրբաթ', 'Շաբաթ'), 'months_short' => array ('Հնվ', 'Փտր', 'Մրտ', 'Ապր', 'Մյս', 'Հնս', 'Հլս', 'Օգս', 'Սպտ', 'Հկտ', 'Նյմ', 'Դկտ'), 'months_long' => array ('Հունվար', 'Փետրվար', 'Մարտ', 'Ապրիլ', 'Մայիս', 'Հունիս', 'Հուլիս', 'Օգոստոս', 'Սեպտեմբեր', 'Հոկտեմբեր', 'Նոյեմբեր', 'Դեկտեմբեր') ), 'nl' => array ( 'weekdays_short'=> array ('Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'), 'weekdays_long' => array ('Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'), 'months_long' => array ('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December') ), 'et' => array ( 'weekdays_short'=> array ('P', 'E', 'T', 'K', 'N', 'R', 'L'), 'weekdays_long' => array ('Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'), 'months_short' => array ('Jaan', 'Veebr', 'Märts', 'Aprill', 'Mai', 'Juuni', 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'), 'months_long' => array ('Jaanuar', 'Veebruar', 'Märts', 'Aprill', 'Mai', 'Juuni', 'Juuli', 'August', 'September', 'Oktoober', 'November', 'Detsember') ), 'tr' => array ( 'weekdays_short'=> array ('Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cts'), 'weekdays_long' => array ('Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'), 'months_short' => array ('Ock', 'Şbt', 'Mrt', 'Nsn', 'Mys', 'Hzrn', 'Tmmz', 'Ağst', 'Eyl', 'Ekm', 'Ksm', 'Arlk'), 'months_long' => array ('Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık') ), 'no' => array ( 'weekdays_short'=> array ('Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'), 'weekdays_long' => array ('Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'), 'months_long' => array ('Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember') ), 'eo' => array ( 'weekdays_short'=> array ('Dim', 'Lun', 'Mar', 'Mer', 'Ĵaŭ', 'Ven', 'Sab'), 'weekdays_long' => array ('Dimanĉo', 'Lundo', 'Mardo', 'Merkredo', 'Ĵaŭdo', 'Vendredo', 'Sabato'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aŭg', 'Sep', 'Okt', 'Nov', 'Dec'), 'months_long' => array ('Januaro', 'Februaro', 'Marto', 'Aprilo', 'Majo', 'Junio', 'Julio', 'Aŭgusto', 'Septembro', 'Oktobro', 'Novembro', 'Decembro') ), 'ua' => array ( 'weekdays_short'=> array('Ндл', 'Пнд', 'Втр', 'Срд', 'Чтв', 'Птн', 'Сбт'), 'weekdays_long' => array('Неділя', 'Понеділок', 'Вівторок', 'Середа', 'Четвер', 'П\'ятниця', 'Субота'), 'months_short' => array('Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер', 'Лип', 'Сер', 'Вер', 'Жов', 'Лис', 'Гру'), 'months_long' => array('Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень') ), 'ro' => array ( 'weekdays_short'=> array ('Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sam'), 'weekdays_long' => array ('Duminica', 'Luni', 'Marti', 'Miercuri', 'Joi', 'Vineri', 'Sambata'), 'months_short' => array ('Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), 'months_long' => array ('Ianuarie', 'Februarie', 'Martie', 'Aprilie', 'Mai', 'Iunie', 'Iulie', 'August', 'Septembrie', 'Octombrie', 'Noiembrie', 'Decembrie') ), 'he' => array ( 'weekdays_short'=> array ('ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'), 'weekdays_long' => array ('יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'שבת'), 'months_short' => array ('ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'), 'months_long' => array ('ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר') ), 'sv' => array ( 'weekdays_short'=> array ('Sön', 'Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör'), 'weekdays_long' => array ('Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag'), 'months_short' => array ('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'), 'months_long' => array ('Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December') ), 'pt' => array ( 'weekdays_short'=> array ('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'), 'weekdays_long' => array ('Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'), 'months_short' => array ('Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'), 'months_long' => array ('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro') ), 'tw' => array ( 'weekdays_short'=> array ('週日','週一', '週二','週三', '週四','週五', '週六'), 'weekdays_long' => array ('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'), 'months_short' => array ('一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'), 'months_long' => array ('一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月') ), 'pt-br' => array ( 'weekdays_short'=> array ('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'), 'weekdays_long' => array ('Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'), 'months_short' => array ('Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'), 'months_long' => array ('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro') ) ); // }}} // {{{ constructor /** * Class constructor * * @access public * @param string Element's name * @param mixed Label(s) for an element * @param array Options to control the element's display * @param mixed Either a typical HTML attribute string or an associative array */ public function __construct($elementName = null, $elementLabel = null, $options = array(), $attributes = null) { // TODO MDL-52313 Replace with the call to parent::__construct(). HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_appendName = true; $this->_type = 'date'; // set the options, do not bother setting bogus ones if (is_array($options)) { foreach ($options as $name => $value) { if ('language' == $name) { $this->_options['language'] = isset($this->_locale[$value])? $value: 'en'; } elseif (isset($this->_options[$name])) { if (is_array($value) && is_array($this->_options[$name])) { $this->_options[$name] = @array_merge($this->_options[$name], $value); } else { $this->_options[$name] = $value; } } } } } /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_date($elementName = null, $elementLabel = null, $options = array(), $attributes = null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $options, $attributes); } // }}} // {{{ _createElements() function _createElements() { $this->_separator = $this->_elements = array(); $separator = ''; $locale =& $this->_locale[$this->_options['language']]; $backslash = false; for ($i = 0, $length = strlen($this->_options['format']); $i < $length; $i++) { $sign = $this->_options['format'][$i]; if ($backslash) { $backslash = false; $separator .= $sign; } else { $loadSelect = true; switch ($sign) { case 'D': // Sunday is 0 like with 'w' in date() $options = $locale['weekdays_short']; break; case 'l': $options = $locale['weekdays_long']; break; case 'd': $options = $this->_createOptionList(1, 31); break; case 'M': $options = $locale['months_short']; array_unshift($options , ''); unset($options[0]); break; case 'm': $options = $this->_createOptionList(1, 12); break; case 'F': $options = $locale['months_long']; array_unshift($options , ''); unset($options[0]); break; case 'Y': $options = $this->_createOptionList( $this->_options['minYear'], $this->_options['maxYear'], $this->_options['minYear'] > $this->_options['maxYear']? -1: 1 ); break; case 'y': $options = $this->_createOptionList( $this->_options['minYear'], $this->_options['maxYear'], $this->_options['minYear'] > $this->_options['maxYear']? -1: 1 ); array_walk($options, function(&$v, $k) { $v = substr($v, -2); }); break; case 'h': $options = $this->_createOptionList(1, 12); break; case 'g': $options = $this->_createOptionList(1, 12); array_walk($options, function(&$v, $k) { $v = intval($v); }); break; case 'H': $options = $this->_createOptionList(0, 23); break; case 'i': $options = $this->_createOptionList(0, 59, $this->_options['optionIncrement']['i']); break; case 's': $options = $this->_createOptionList(0, 59, $this->_options['optionIncrement']['s']); break; case 'a': $options = array('am' => 'am', 'pm' => 'pm'); break; case 'A': $options = array('AM' => 'AM', 'PM' => 'PM'); break; case 'W': $options = $this->_createOptionList(1, 53); break; case '\\': $backslash = true; $loadSelect = false; break; default: $separator .= (' ' == $sign? ' ': $sign); $loadSelect = false; } if ($loadSelect) { if (0 < count($this->_elements)) { $this->_separator[] = $separator; } else { $this->_wrap[0] = $separator; } $separator = ''; // Should we add an empty option to the top of the select? if (!is_array($this->_options['addEmptyOption']) && $this->_options['addEmptyOption'] || is_array($this->_options['addEmptyOption']) && !empty($this->_options['addEmptyOption'][$sign])) { // Using '+' array operator to preserve the keys if (is_array($this->_options['emptyOptionText']) && !empty($this->_options['emptyOptionText'][$sign])) { $options = array($this->_options['emptyOptionValue'] => $this->_options['emptyOptionText'][$sign]) + $options; } else { $options = array($this->_options['emptyOptionValue'] => $this->_options['emptyOptionText']) + $options; } } $this->_elements[] = new HTML_QuickForm_select($sign, null, $options, $this->getAttributes()); } } } $this->_wrap[1] = $separator . ($backslash? '\\': ''); } // }}} // {{{ _createOptionList() /** * Creates an option list containing the numbers from the start number to the end, inclusive * * @param int The start number * @param int The end number * @param int Increment by this value * @access private * @return array An array of numeric options. */ function _createOptionList($start, $end, $step = 1) { for ($i = $start, $options = array(); $start > $end? $i >= $end: $i <= $end; $i += $step) { $options[$i] = sprintf('%02d', $i); } return $options; } // }}} // {{{ setValue() function setValue($value) { if (empty($value)) { $value = array(); } elseif (is_scalar($value)) { if (!is_numeric($value)) { $value = strtotime($value); } // might be a unix epoch, then we fill all possible values $arr = explode('-', date('w-d-n-Y-h-H-i-s-a-A-W', (int)$value)); $value = array( 'D' => $arr[0], 'l' => $arr[0], 'd' => $arr[1], 'M' => $arr[2], 'm' => $arr[2], 'F' => $arr[2], 'Y' => $arr[3], 'y' => $arr[3], 'h' => $arr[4], 'g' => $arr[4], 'H' => $arr[5], 'i' => $arr[6], 's' => $arr[7], 'a' => $arr[8], 'A' => $arr[9], 'W' => $arr[10] ); } parent::setValue($value); } // }}} // {{{ toHtml() function toHtml() { include_once('HTML/QuickForm/Renderer/Default.php'); $renderer = new HTML_QuickForm_Renderer_Default(); $renderer->setElementTemplate('{element}'); parent::accept($renderer); return $this->_wrap[0] . $renderer->toHtml() . $this->_wrap[1]; } // }}} // {{{ accept() function accept(&$renderer, $required = false, $error = null) { $renderer->renderElement($this, $required, $error); } // }}} // {{{ onQuickFormEvent() function onQuickFormEvent($event, $arg, &$caller) { if ('updateValue' == $event) { // we need to call setValue(), 'cause the default/constant value // may be in fact a timestamp, not an array return HTML_QuickForm_element::onQuickFormEvent($event, $arg, $caller); } else { return parent::onQuickFormEvent($event, $arg, $caller); } } // }}} } ?> PKw \DHTMLRulesTableless.phpnu[ * @author Adam Daniel * @author Bertrand Mansion * @author Justin Patrin * @author Mark Wiesemann * @copyright 2005-2006 The PHP Group * @license http://www.php.net/license/3_01.txt PHP License 3.01 * @version CVS: $Id$ * @link http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless */ require_once 'HTML/QuickForm.php'; /** * This is a DHTML replacement for the standard JavaScript alert window for * client-side validation of forms built with HTML_QuickForm * * @category HTML * @package HTML_QuickForm_DHTMLRulesTableless * @author Alexey Borzov * @author Adam Daniel * @author Bertrand Mansion * @author Justin Patrin * @author Mark Wiesemann * @license http://www.php.net/license/3_01.txt PHP License 3.01 * @version Release: 0.1.3 * @link http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless */ class HTML_QuickForm_DHTMLRulesTableless extends HTML_QuickForm { // {{{ getValidationScript() /** * Returns the client side validation script * * The code here was copied from HTML_QuickForm and slightly modified to run rules per-element * * @access public * @return string Javascript to perform validation, empty string if no 'client' rules were added */ function getValidationScript() { if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) { return ''; } include_once('HTML/QuickForm/RuleRegistry.php'); $registry =& HTML_QuickForm_RuleRegistry::singleton(); $test = array(); $js_escape = array( "\r" => '\r', "\n" => '\n', "\t" => '\t', "'" => "\\'", '"' => '\"', '\\' => '\\\\' ); foreach ($this->_rules as $elementName => $rules) { foreach ($rules as $rule) { if ('client' == $rule['validation']) { unset($element); $dependent = isset($rule['dependent']) && is_array($rule['dependent']); $rule['message'] = strtr($rule['message'], $js_escape); if (isset($rule['group'])) { $group =& $this->getElement($rule['group']); // No JavaScript validation for frozen elements if ($group->isFrozen()) { continue 2; } $elements =& $group->getElements(); foreach (array_keys($elements) as $key) { if ($elementName == $group->getElementName($key)) { $element =& $elements[$key]; break; } } } elseif ($dependent) { $element = array(); $element[] =& $this->getElement($elementName); foreach ($rule['dependent'] as $idx => $elName) { $element[] =& $this->getElement($elName); } } else { $element =& $this->getElement($elementName); } // No JavaScript validation for frozen elements if (is_object($element) && $element->isFrozen()) { continue 2; } elseif (is_array($element)) { foreach (array_keys($element) as $key) { if ($element[$key]->isFrozen()) { continue 3; } } } $test[$elementName][] = $registry->getValidationScript($element, $elementName, $rule); } } } $js = ' '; return $js; } // end func getValidationScript // }}} } ?> PKw \ KK select.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/element.php'); /** * Class to dynamically create an HTML SELECT * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_select extends HTML_QuickForm_element { // {{{ properties /** * Contains the select options * * @var array * @since 1.0 * @access private */ var $_options = array(); /** * Default values of the SELECT * * @var array * @since 1.0 * @access private */ var $_values = null; // }}} // {{{ constructor /** * Class constructor * * @param string Select name attribute * @param mixed Label(s) for the select * @param mixed Data to be used to populate options * @param mixed Either a typical HTML attribute string or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_type = 'select'; if (isset($options)) { $this->load($options); } } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ apiVersion() /** * Returns the current API version * * @since 1.0 * @access public * @return double */ function apiVersion() { return 2.3; } //end func apiVersion // }}} // {{{ setSelected() /** * Sets the default values of the select box * * @param mixed $values Array or comma delimited string of selected values * @since 1.0 * @access public * @return void */ function setSelected($values) { if (is_string($values) && $this->getMultiple()) { $values = preg_split("/[ ]?,[ ]?/", $values); } if (is_array($values)) { $this->_values = array_values($values); } else { $this->_values = array($values); } } //end func setSelected // }}} // {{{ getSelected() /** * Returns an array of the selected values * * @since 1.0 * @access public * @return array of selected values */ function getSelected() { return $this->_values; } // end func getSelected // }}} // {{{ setName() /** * Sets the input field name * * @param string $name Input field name attribute * @since 1.0 * @access public * @return void */ function setName($name) { $this->updateAttributes(array('name' => $name)); } //end func setName // }}} // {{{ getName() /** * Returns the element name * * @since 1.0 * @access public * @return string */ function getName() { return $this->getAttribute('name'); } //end func getName // }}} // {{{ getPrivateName() /** * Returns the element name (possibly with brackets appended) * * @since 1.0 * @access public * @return string */ function getPrivateName() { if ($this->getAttribute('multiple')) { return $this->getName() . '[]'; } else { return $this->getName(); } } //end func getPrivateName // }}} // {{{ setValue() /** * Sets the value of the form element * * @param mixed $values Array or comma delimited string of selected values * @since 1.0 * @access public * @return void */ function setValue($value) { $this->setSelected($value); } // end func setValue // }}} // {{{ getValue() /** * Returns an array of the selected values * * @since 1.0 * @access public * @return array of selected values */ function getValue() { return $this->_values; } // end func getValue // }}} // {{{ setSize() /** * Sets the select field size, only applies to 'multiple' selects * * @param int $size Size of select field * @since 1.0 * @access public * @return void */ function setSize($size) { $this->updateAttributes(array('size' => $size)); } //end func setSize // }}} // {{{ getSize() /** * Returns the select field size * * @since 1.0 * @access public * @return int */ function getSize() { return $this->getAttribute('size'); } //end func getSize // }}} // {{{ setMultiple() /** * Sets the select mutiple attribute * * @param bool $multiple Whether the select supports multi-selections * @since 1.2 * @access public * @return void */ function setMultiple($multiple) { if ($multiple) { $this->updateAttributes(array('multiple' => 'multiple')); } else { $this->removeAttribute('multiple'); } } //end func setMultiple // }}} // {{{ getMultiple() /** * Returns the select mutiple attribute * * @since 1.2 * @access public * @return bool true if multiple select, false otherwise */ function getMultiple() { return (bool)$this->getAttribute('multiple'); } //end func getMultiple // }}} // {{{ addOption() /** * Adds a new OPTION to the SELECT * * @param string $text Display text for the OPTION * @param string $value Value for the OPTION * @param mixed $attributes Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ function addOption($text, $value, $attributes=null) { if (null === $attributes) { $attributes = array('value' => $value); } else { $attributes = $this->_parseAttributes($attributes); if (isset($attributes['selected'])) { // the 'selected' attribute will be set in toHtml() $this->_removeAttr('selected', $attributes); if (is_null($this->_values)) { $this->_values = array($value); } elseif (!in_array($value, $this->_values)) { $this->_values[] = $value; } } $this->_updateAttrArray($attributes, array('value' => $value)); } $this->_options[] = array('text' => $text, 'attr' => $attributes); } // end func addOption // }}} // {{{ loadArray() /** * Loads the options from an associative array * * @param array $arr Associative array of options * @param mixed $values (optional) Array or comma delimited string of selected values * @since 1.0 * @access public * @return PEAR_Error on error or true * @throws PEAR_Error */ function loadArray($arr, $values=null) { if (!is_array($arr)) { return self::raiseError('Argument 1 of HTML_Select::loadArray is not a valid array'); } if (isset($values)) { $this->setSelected($values); } foreach ($arr as $key => $val) { // Warning: new API since release 2.3 $this->addOption($val, $key); } return true; } // end func loadArray // }}} // {{{ loadDbResult() /** * Loads the options from DB_result object * * If no column names are specified the first two columns of the result are * used as the text and value columns respectively * @param object $result DB_result object * @param string $textCol (optional) Name of column to display as the OPTION text * @param string $valueCol (optional) Name of column to use as the OPTION value * @param mixed $values (optional) Array or comma delimited string of selected values * @since 1.0 * @access public * @return PEAR_Error on error or true * @throws PEAR_Error */ function loadDbResult(&$result, $textCol=null, $valueCol=null, $values=null) { if (!is_object($result) || !is_a($result, 'db_result')) { return self::raiseError('Argument 1 of HTML_Select::loadDbResult is not a valid DB_result'); } if (isset($values)) { $this->setValue($values); } $fetchMode = ($textCol && $valueCol) ? DB_FETCHMODE_ASSOC : DB_FETCHMODE_ORDERED; while (is_array($row = $result->fetchRow($fetchMode)) ) { if ($fetchMode == DB_FETCHMODE_ASSOC) { $this->addOption($row[$textCol], $row[$valueCol]); } else { $this->addOption($row[0], $row[1]); } } return true; } // end func loadDbResult // }}} // {{{ loadQuery() /** * Queries a database and loads the options from the results * * @param mixed $conn Either an existing DB connection or a valid dsn * @param string $sql SQL query string * @param string $textCol (optional) Name of column to display as the OPTION text * @param string $valueCol (optional) Name of column to use as the OPTION value * @param mixed $values (optional) Array or comma delimited string of selected values * @since 1.1 * @access public * @return void * @throws PEAR_Error */ function loadQuery(&$conn, $sql, $textCol=null, $valueCol=null, $values=null) { if (is_string($conn)) { require_once('DB.php'); $dbConn = &DB::connect($conn, true); if (DB::isError($dbConn)) { return $dbConn; } } elseif (is_subclass_of($conn, "db_common")) { $dbConn = &$conn; } else { return self::raiseError('Argument 1 of HTML_Select::loadQuery is not a valid type'); } $result = $dbConn->query($sql); if (DB::isError($result)) { return $result; } $this->loadDbResult($result, $textCol, $valueCol, $values); $result->free(); if (is_string($conn)) { $dbConn->disconnect(); } return true; } // end func loadQuery // }}} // {{{ load() /** * Loads options from different types of data sources * * This method is a simulated overloaded method. The arguments, other than the * first are optional and only mean something depending on the type of the first argument. * If the first argument is an array then all arguments are passed in order to loadArray. * If the first argument is a db_result then all arguments are passed in order to loadDbResult. * If the first argument is a string or a DB connection then all arguments are * passed in order to loadQuery. * @param mixed $options Options source currently supports assoc array or DB_result * @param mixed $param1 (optional) See function detail * @param mixed $param2 (optional) See function detail * @param mixed $param3 (optional) See function detail * @param mixed $param4 (optional) See function detail * @since 1.1 * @access public * @return PEAR_Error on error or true * @throws PEAR_Error */ function load(&$options, $param1=null, $param2=null, $param3=null, $param4=null) { switch (true) { case is_array($options): return $this->loadArray($options, $param1); break; case (is_a($options, 'db_result')): return $this->loadDbResult($options, $param1, $param2, $param3); break; case (is_string($options) && !empty($options) || is_subclass_of($options, "db_common")): return $this->loadQuery($options, $param1, $param2, $param3, $param4); break; } } // end func load // }}} // {{{ toHtml() /** * Returns the SELECT in HTML * * @since 1.0 * @access public * @return string */ function toHtml() { if ($this->_flagFrozen) { return $this->getFrozenHtml(); } else { $tabs = $this->_getTabs(); $strHtml = ''; if ($this->getComment() != '') { $strHtml .= $tabs . '\n"; } if (!$this->getMultiple()) { $attrString = $this->_getAttrString($this->_attributes); } else { $myName = $this->getName(); $this->setName($myName . '[]'); $attrString = $this->_getAttrString($this->_attributes); $this->setName($myName); } $strHtml .= $tabs . '\n"; foreach ($this->_options as $option) { if (is_array($this->_values) && in_array((string)$option['attr']['value'], $this->_values)) { $this->_updateAttrArray($option['attr'], array('selected' => 'selected')); } $strHtml .= $tabs . "\t_getAttrString($option['attr']) . '>' . $option['text'] . "\n"; } return $strHtml . $tabs . ''; } } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags * * @since 1.0 * @access public * @return string */ function getFrozenHtml() { $value = array(); if (is_array($this->_values)) { foreach ($this->_values as $key => $val) { for ($i = 0, $optCount = count($this->_options); $i < $optCount; $i++) { if ((string)$val == (string)$this->_options[$i]['attr']['value']) { $value[$key] = $this->_options[$i]['text']; break; } } } } $html = empty($value)? ' ': join('
', $value); if ($this->_persistantFreeze) { $name = $this->getPrivateName(); // Only use id attribute if doing single hidden input if (1 == count($value)) { $id = $this->getAttribute('id'); $idAttr = isset($id)? array('id' => $id): array(); } else { $idAttr = array(); } foreach ($value as $key => $item) { $html .= '_getAttrString(array( 'type' => 'hidden', 'name' => $name, 'value' => $this->_values[$key] ) + $idAttr) . ' />'; } } return $html; } //end func getFrozenHtml // }}} // {{{ exportValue() /** * We check the options and return only the values that _could_ have been * selected. We also return a scalar value if select is not "multiple" */ function exportValue(&$submitValues, $assoc = false) { $value = $this->_findValue($submitValues); if (is_null($value)) { $value = $this->getValue(); } elseif(!is_array($value)) { $value = array($value); } if (is_array($value) && !empty($this->_options)) { $cleanValue = null; foreach ($value as $v) { for ($i = 0, $optCount = count($this->_options); $i < $optCount; $i++) { if ($v == $this->_options[$i]['attr']['value']) { $cleanValue[] = $v; break; } } } } else { $cleanValue = $value; } if (is_array($cleanValue) && !$this->getMultiple()) { return $this->_prepareValue($cleanValue[0], $assoc); } else { return $this->_prepareValue($cleanValue, $assoc); } } // }}} // {{{ onQuickFormEvent() function onQuickFormEvent($event, $arg, &$caller) { if ('updateValue' == $event) { $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_submitValues); // Fix for bug #4465 & #5269 // XXX: should we push this to element::onQuickFormEvent()? if (null === $value && (!$caller->isSubmitted() || !$this->getMultiple())) { $value = $this->_findValue($caller->_defaultValues); } } if (null !== $value) { $this->setValue($value); } return true; } else { return parent::onQuickFormEvent($event, $arg, $caller); } } // }}} } //end class HTML_QuickForm_select ?> PKw \Rule.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ class HTML_QuickForm_Rule { /** * Name of the rule to use in validate method * * This property is used in more global rules like Callback and Regex * to determine which callback and which regex is to be used for validation * * @var string * @access public */ var $name; /** * Validates a value * * @access public * @abstract */ function validate($value, $options = null) { return true; } /** * Sets the rule name * * @access public */ function setName($ruleName) { $this->name = $ruleName; } /** * Returns the javascript test (the test should return true if the value is INVALID) * * @param mixed Options for the rule * @access public * @return array first element is code to setup validation, second is the check itself */ function getValidationScript($options = null) { return array('', ''); } } ?>PKw \Cfogg radio.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/input.php'); /** * HTML class for a radio type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.1 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_radio extends HTML_QuickForm_input { // {{{ properties /** * Radio display text * @var string * @since 1.1 * @access private */ var $_text = ''; // }}} // {{{ constructor /** * Class constructor * * @param string Input field name attribute * @param mixed Label(s) for a field * @param string Text to display near the radio * @param string Input field value * @param mixed Either a typical HTML attribute string or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) { // TODO MDL-52313 Replace with the call to parent::__construct(). HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes); if (isset($value)) { $this->setValue($value); } $this->_persistantFreeze = true; $this->setType('radio'); $this->_text = $text; } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_radio($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $text, $value, $attributes); } // }}} function _generateId() { // Override the standard implementation, since you can have multiple // check-boxes with the same name on a form. Therefore, add the // (cleaned up) value to the id. if ($this->getAttribute('id')) { return; } parent::_generateId(); $id = $this->getAttribute('id') . '_' . clean_param($this->getValue(), PARAM_ALPHANUMEXT); $this->updateAttributes(array('id' => $id)); } // {{{ setChecked() /** * Sets whether radio button is checked * * @param bool $checked Whether the field is checked or not * @since 1.0 * @access public * @return void */ function setChecked($checked) { if (!$checked) { $this->removeAttribute('checked'); } else { $this->updateAttributes(array('checked'=>'checked')); } } //end func setChecked // }}} // {{{ getChecked() /** * Returns whether radio button is checked * * @since 1.0 * @access public * @return string */ function getChecked() { return $this->getAttribute('checked'); } //end func getChecked // }}} // {{{ toHtml() /** * Returns the radio element in HTML * * @since 1.0 * @access public * @return string */ function toHtml() { if (0 == strlen($this->_text)) { $label = ''; } elseif ($this->_flagFrozen) { $label = $this->_text; } else { $label = ''; } return HTML_QuickForm_input::toHtml() . $label; } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags * * @since 1.0 * @access public * @return string */ function getFrozenHtml() { if ($this->getChecked()) { return '(x)' . $this->_getPersistantData(); } else { return '( )'; } } //end func getFrozenHtml // }}} // {{{ setText() /** * Sets the radio text * * @param string $text Text to display near the radio button * @since 1.1 * @access public * @return void */ function setText($text) { $this->_text = $text; } //end func setText // }}} // {{{ getText() /** * Returns the radio text * * @since 1.1 * @access public * @return string */ function getText() { return $this->_text; } //end func getText // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return void */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': // constant values override both default and submitted ones // default values are overriden by submitted $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_submitValues); if (null === $value) { $value = $this->_findValue($caller->_defaultValues); } } if ($value == $this->getValue()) { $this->setChecked(true); } else { $this->setChecked(false); } break; case 'setGroupValue': if ($arg == $this->getValue()) { $this->setChecked(true); } else { $this->setChecked(false); } break; default: parent::onQuickFormEvent($event, $arg, $caller); } return true; } // end func onQuickFormLoad // }}} // {{{ exportValue() /** * Returns the value attribute if the radio is checked, null if it is not */ function exportValue(&$submitValues, $assoc = false) { $value = $this->_findValue($submitValues); if (null === $value) { $value = $this->getChecked()? $this->getValue(): null; } elseif ($value != $this->getValue()) { $value = null; } return $this->_prepareValue($value, $assoc); } // }}} } //end class HTML_QuickForm_radio ?> PKw \"FGG group.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/element.php"); /** * HTML class for a form element group * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_group extends HTML_QuickForm_element { // {{{ properties /** * Name of the element * @var string * @since 1.0 * @access private */ var $_name = ''; /** * Array of grouped elements * @var array * @since 1.0 * @access private */ var $_elements = array(); /** * String to separate elements * @var mixed * @since 2.5 * @access private */ var $_separator = null; /** * Required elements in this group * @var array * @since 2.5 * @access private */ var $_required = array(); /** * Whether to change elements' names to $groupName[$elementName] or leave them as is * @var bool * @since 3.0 * @access private */ var $_appendName = true; // }}} // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Group name * @param array $elementLabel (optional)Group label * @param array $elements (optional)Group elements * @param mixed $separator (optional)Use a string for one separator, * use an array to alternate the separators. * @param bool $appendName (optional)whether to change elements' names to * the form $groupName[$elementName] or leave * them as is. * @param mixed $attributes Either a typical HTML attribute string or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName = null, $elementLabel = null, $elements = null, $separator = null, $appendName = true, $attributes = null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_type = 'group'; if (isset($elements) && is_array($elements)) { $this->setElements($elements); } if (isset($separator)) { $this->_separator = $separator; } if (isset($appendName)) { $this->_appendName = $appendName; } if (isset($attributes)) { $this->_attributes = $attributes; } } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_group($elementName = null, $elementLabel = null, $elements = null, $separator = null, $appendName = true, $attributes = null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $elements, $separator, $appendName); } // }}} // {{{ setName() /** * Sets the group name * * @param string $name Group name * @since 1.0 * @access public * @return void */ function setName($name) { $this->_name = $name; } //end func setName // }}} // {{{ getName() /** * Returns the group name * * @since 1.0 * @access public * @return string */ function getName() { return $this->_name; } //end func getName // }}} // {{{ setValue() /** * Sets values for group's elements * * @param mixed Values for group's elements * @since 1.0 * @access public * @return void */ function setValue($value) { $this->_createElementsIfNotExist(); foreach (array_keys($this->_elements) as $key) { if (!$this->_appendName) { $v = $this->_elements[$key]->_findValue($value); if (null !== $v) { $this->_elements[$key]->onQuickFormEvent('setGroupValue', $v, $this); } } else { $elementName = $this->_elements[$key]->getName(); $index = strlen($elementName) ? $elementName : $key; if (is_array($value)) { if (isset($value[$index])) { $this->_elements[$key]->onQuickFormEvent('setGroupValue', $value[$index], $this); } } elseif (isset($value)) { $this->_elements[$key]->onQuickFormEvent('setGroupValue', $value, $this); } } } } //end func setValue // }}} // {{{ getValue() /** * Returns the value of the group * * @since 1.0 * @access public * @return mixed */ function getValue() { $value = null; foreach (array_keys($this->_elements) as $key) { $element =& $this->_elements[$key]; switch ($element->getType()) { case 'radio': $v = $element->getChecked()? $element->getValue(): null; break; case 'checkbox': $v = $element->getChecked()? true: null; break; default: $v = $element->getValue(); } if (null !== $v) { $elementName = $element->getName(); if (is_null($elementName)) { $value = $v; } else { if (!is_array($value)) { $value = is_null($value)? array(): array($value); } if ('' === $elementName) { $value[] = $v; } else { $value[$elementName] = $v; } } } } return $value; } // end func getValue // }}} // {{{ setElements() /** * Sets the grouped elements * * @param array $elements Array of elements * @since 1.1 * @access public * @return void */ function setElements($elements) { $this->_elements = array_values($elements); if ($this->_flagFrozen) { $this->freeze(); } } // end func setElements // }}} // {{{ getElements() /** * Gets the grouped elements * * @since 2.4 * @access public * @return array */ function &getElements() { $this->_createElementsIfNotExist(); return $this->_elements; } // end func getElements // }}} // {{{ getGroupType() /** * Gets the group type based on its elements * Will return 'mixed' if elements contained in the group * are of different types. * * @access public * @return string group elements type */ function getGroupType() { $this->_createElementsIfNotExist(); $prevType = ''; foreach (array_keys($this->_elements) as $key) { $type = $this->_elements[$key]->getType(); if ($type != $prevType && $prevType != '') { return 'mixed'; } $prevType = $type; } return $type; } // end func getGroupType // }}} // {{{ toHtml() /** * Returns Html for the group * * @since 1.0 * @access public * @return string */ function toHtml() { include_once('HTML/QuickForm/Renderer/Default.php'); $renderer = new HTML_QuickForm_Renderer_Default(); $renderer->setElementTemplate('{element}'); $this->accept($renderer); return $renderer->toHtml(); } //end func toHtml // }}} // {{{ getElementName() /** * Returns the element name inside the group such as found in the html form * * @param mixed $index Element name or element index in the group * @since 3.0 * @access public * @return mixed string with element name, false if not found */ function getElementName($index) { $this->_createElementsIfNotExist(); $elementName = false; if (is_int($index) && isset($this->_elements[$index])) { $elementName = $this->_elements[$index]->getName(); if (isset($elementName) && $elementName == '') { $elementName = $index; } if ($this->_appendName) { if (is_null($elementName)) { $elementName = $this->getName(); } else { $elementName = $this->getName().'['.$elementName.']'; } } } elseif (is_string($index)) { foreach (array_keys($this->_elements) as $key) { $elementName = $this->_elements[$key]->getName(); if ($index == $elementName) { if ($this->_appendName) { $elementName = $this->getName().'['.$elementName.']'; } break; } elseif ($this->_appendName && $this->getName().'['.$elementName.']' == $index) { break; } } } return $elementName; } //end func getElementName // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags * * @since 1.3 * @access public * @return string */ function getFrozenHtml() { $flags = array(); $this->_createElementsIfNotExist(); foreach (array_keys($this->_elements) as $key) { if (false === ($flags[$key] = $this->_elements[$key]->isFrozen())) { $this->_elements[$key]->freeze(); } } $html = $this->toHtml(); foreach (array_keys($this->_elements) as $key) { if (!$flags[$key]) { $this->_elements[$key]->unfreeze(); } } return $html; } //end func getFrozenHtml // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return ?bool */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': $this->_createElementsIfNotExist(); foreach (array_keys($this->_elements) as $key) { if ($this->_appendName) { $elementName = $this->_elements[$key]->getName(); if (is_null($elementName)) { $this->_elements[$key]->setName($this->getName()); } elseif ('' === $elementName) { $this->_elements[$key]->setName($this->getName() . '[' . $key . ']'); } else { $this->_elements[$key]->setName($this->getName() . '[' . $elementName . ']'); } } $this->_elements[$key]->onQuickFormEvent('updateValue', $arg, $caller); if ($this->_appendName) { $this->_elements[$key]->setName($elementName); } } break; default: parent::onQuickFormEvent($event, $arg, $caller); } return true; } // end func onQuickFormEvent // }}} // {{{ accept() /** * Accepts a renderer * * @param object An HTML_QuickForm_Renderer object * @param bool Whether a group is required * @param string An error message associated with a group * @access public * @return void */ function accept(&$renderer, $required = false, $error = null) { $this->_createElementsIfNotExist(); $renderer->startGroup($this, $required, $error); $name = $this->getName(); foreach (array_keys($this->_elements) as $key) { $element =& $this->_elements[$key]; if ($this->_appendName) { $elementName = $element->getName(); if (isset($elementName)) { $element->setName($name . '['. (strlen($elementName)? $elementName: $key) .']'); } else { $element->setName($name); } } $required = !$element->isFrozen() && in_array($element->getName(), $this->_required); $element->accept($renderer, $required); // restore the element's name if ($this->_appendName) { $element->setName($elementName); } } $renderer->finishGroup($this); } // end func accept // }}} // {{{ exportValue() /** * As usual, to get the group's value we access its elements and call * their exportValue() methods */ function exportValue(&$submitValues, $assoc = false) { $value = null; foreach (array_keys($this->_elements) as $key) { $elementName = $this->_elements[$key]->getName(); if ($this->_appendName) { if (is_null($elementName)) { $this->_elements[$key]->setName($this->getName()); } elseif ('' === $elementName) { $this->_elements[$key]->setName($this->getName() . '[' . $key . ']'); } else { $this->_elements[$key]->setName($this->getName() . '[' . $elementName . ']'); } } $v = $this->_elements[$key]->exportValue($submitValues, $assoc); if ($this->_appendName) { $this->_elements[$key]->setName($elementName); } if (null !== $v) { // Make $value an array, we will use it like one if (null === $value) { $value = array(); } if ($assoc) { // just like HTML_QuickForm::exportValues() $value = HTML_QuickForm::arrayMerge($value, $v); } else { // just like getValue(), but should work OK every time here if (is_null($elementName)) { $value = $v; } elseif ('' === $elementName) { $value[] = $v; } else { $value[$elementName] = $v; } } } } // do not pass the value through _prepareValue, we took care of this already return $value; } // }}} // {{{ _createElements() /** * Creates the group's elements. * * This should be overriden by child classes that need to create their * elements. The method will be called automatically when needed, calling * it from the constructor is discouraged as the constructor is usually * called _twice_ on element creation, first time with _no_ parameters. * * @access private * @abstract */ function _createElements() { // abstract } // }}} // {{{ _createElementsIfNotExist() /** * A wrapper around _createElements() * * This method calls _createElements() if the group's _elements array * is empty. It also performs some updates, e.g. freezes the created * elements if the group is already frozen. * * @access private */ function _createElementsIfNotExist() { if (empty($this->_elements)) { $this->_createElements(); if ($this->_flagFrozen) { $this->freeze(); } } } // }}} // {{{ freeze() function freeze() { parent::freeze(); foreach (array_keys($this->_elements) as $key) { $this->_elements[$key]->freeze(); } } // }}} // {{{ unfreeze() function unfreeze() { parent::unfreeze(); foreach (array_keys($this->_elements) as $key) { $this->_elements[$key]->unfreeze(); } } // }}} // {{{ setPersistantFreeze() function setPersistantFreeze($persistant = false) { parent::setPersistantFreeze($persistant); foreach (array_keys($this->_elements) as $key) { $this->_elements[$key]->setPersistantFreeze($persistant); } } // }}} } //end class HTML_QuickForm_group ?>PKw \ Lf f submit.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a submit type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_submit extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string Input field name attribute * @param string Input field value * @param mixed Either a typical HTML attribute string or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $value=null, $attributes=null) { parent::__construct($elementName, null, $attributes); $this->setValue($value); $this->setType('submit'); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_submit($elementName=null, $value=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $value, $attributes); } // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return void */ function freeze() { return false; } //end func freeze // }}} // {{{ exportValue() /** * Only return the value if it is found within $submitValues (i.e. if * this particular submit button was clicked) */ function exportValue(&$submitValues, $assoc = false) { return $this->_prepareValue($this->_findValue($submitValues), $assoc); } // }}} } //end class HTML_QuickForm_submit ?> PKw \6K button.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a button type element * * @author Adam Daniel * @author Bertrand Mansion * @version 1.1 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_button extends HTML_QuickForm_input { // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $value (optional)Input field value * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $value=null, $attributes=null) { parent::__construct($elementName, null, $attributes); $this->_persistantFreeze = false; $this->setValue($value); $this->setType('button'); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_button($elementName=null, $value=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $value, $attributes); } // }}} // {{{ freeze() /** * Freeze the element so that only its value is returned * * @access public * @return void */ function freeze() { return false; } //end func freeze // }}} } //end class HTML_QuickForm_button ?> PKw \ utils.phpnu[ * @copyright 2001-2018 The PHP Group * @license http://www.php.net/license/3_01.txt PHP License 3.01 * @version CVS: $Id$ * @link http://pear.php.net/package/HTML_QuickForm */ /** * Provides a collection of static methods for array manipulation. * * (courtesy of CiviCRM project (https://civicrm.org/) * * @category HTML * @package HTML_QuickForm * @author Chuck Burgess * @version Release: @package_version@ * @since 3.2 */ class HTML_QuickForm_utils { /** * Get a single value from an array-tree. * * @param array $values Ex: ['foo' => ['bar' => 123]]. * @param array $path Ex: ['foo', 'bar']. * @param mixed $default * @return mixed Ex 123. * * @access public * @static */ static function pathGet($values, $path, $default = NULL) { foreach ($path as $key) { if (!is_array($values) || !isset($values[$key])) { return $default; } $values = $values[$key]; } return $values; } /** * Check if a key isset which may be several layers deep. * * This is a helper for when the calling function does not know how many layers deep * the path array is so cannot easily check. * * @param array $values * @param array $path * @return bool * * @access public * @static */ static function pathIsset($values, $path) { foreach ($path as $key) { if (!is_array($values) || !isset($values[$key])) { return FALSE; } $values = $values[$key]; } return TRUE; } /** * Set a single value in an array tree. * * @param array $values Ex: ['foo' => ['bar' => 123]]. * @param array $pathParts Ex: ['foo', 'bar']. * @param mixed $value Ex: 456. * @return void * * @access public * @static */ static function pathSet(&$values, $pathParts, $value) { $r = &$values; $last = array_pop($pathParts); foreach ($pathParts as $part) { if (!isset($r[$part])) { $r[$part] = array(); } $r = &$r[$part]; } $r[$last] = $value; } /** * Check if a key isset which may be several layers deep. * * This is a helper for when the calling function does not know how many layers deep the * path array is so cannot easily check. * * @param array $array * @param array $path * @return bool * * @access public * @static */ static function recursiveIsset($array, $path) { return self::pathIsset($array, $path); } /** * Check if a key isset which may be several layers deep. * * This is a helper for when the calling function does not know how many layers deep the * path array is so cannot easily check. * * @param array $array * @param array $path An array of keys, * e.g [0, 'bob', 8] where we want to check if $array[0]['bob'][8] * @param mixed $default Value to return if not found. * @return bool * * @access public * @static */ static function recursiveValue($array, $path, $default = NULL) { return self::pathGet($array, $path, $default); } /** * Append the value to the array using the key provided. * * e.g if value is 'llama' & path is [0, 'email', 'location'] result will be * [0 => ['email' => ['location' => 'llama']] * * @param $path * @param $value * @param array $source * @return array * * @access public * @static */ static function recursiveBuild($path, $value, $source = array()) { self::pathSet($source, $path, $value); return $source; } } ?> PKw \8 input.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/element.php"); /** * Base class for input form elements * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public * @abstract */ class HTML_QuickForm_input extends HTML_QuickForm_element { // {{{ constructor /** * Class constructor * * @param string Input field name attribute * @param mixed Label(s) for the input field * @param mixed Either a typical HTML attribute string or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_input($elementName=null, $elementLabel=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ setType() /** * Sets the element type * * @param string $type Element type * @since 1.0 * @access public * @return void */ function setType($type) { $this->_type = $type; $this->updateAttributes(array('type'=>$type)); } // end func setType // }}} // {{{ setName() /** * Sets the input field name * * @param string $name Input field name attribute * @since 1.0 * @access public * @return void */ function setName($name) { $this->updateAttributes(array('name'=>$name)); } //end func setName // }}} // {{{ getName() /** * Returns the element name * * @since 1.0 * @access public * @return string */ function getName() { return $this->getAttribute('name'); } //end func getName // }}} // {{{ setValue() /** * Sets the value of the form element * * @param string $value Default value of the form element * @since 1.0 * @access public * @return void */ function setValue($value) { $this->updateAttributes(array('value'=>$value)); } // end func setValue // }}} // {{{ getValue() /** * Returns the value of the form element * * @since 1.0 * @access public * @return string */ function getValue() { return $this->getAttribute('value'); } // end func getValue // }}} // {{{ toHtml() /** * Returns the input field in HTML * * @since 1.0 * @access public * @return string */ function toHtml() { if ($this->_flagFrozen) { return $this->getFrozenHtml(); } else { return $this->_getTabs() . '_getAttrString($this->_attributes) . ' />'; } } //end func toHtml // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return void * @throws */ function onQuickFormEvent($event, $arg, &$caller) { // do not use submit values for button-type elements $type = $this->getType(); if (('updateValue' != $event) || ('submit' != $type && 'reset' != $type && 'image' != $type && 'button' != $type)) { parent::onQuickFormEvent($event, $arg, $caller); } else { $value = $this->_findValue($caller->_constantValues); if (null === $value) { $value = $this->_findValue($caller->_defaultValues); } if (null !== $value) { $this->setValue($value); } } return true; } // end func onQuickFormEvent // }}} // {{{ exportValue() /** * We don't need values from button-type elements (except submit) and files */ function exportValue(&$submitValues, $assoc = false) { $type = $this->getType(); if ('reset' == $type || 'image' == $type || 'button' == $type || 'file' == $type) { return null; } else { return parent::exportValue($submitValues, $assoc); } } // }}} } // end class HTML_QuickForm_element ?> PKw \_8 textarea.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/element.php"); /** * HTML class for a textarea type field * * @author Adam Daniel * @author Bertrand Mansion * @version 1.0 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_textarea extends HTML_QuickForm_element { // {{{ properties /** * Field value * @var string * @since 1.0 * @access private */ var $_value = null; // }}} // {{{ constructor /** * Class constructor * * @param string Input field name attribute * @param mixed Label(s) for a field * @param mixed Either a typical HTML attribute string or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_type = 'textarea'; } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $attributes); } // }}} // {{{ setName() /** * Sets the input field name * * @param string $name Input field name attribute * @since 1.0 * @access public * @return void */ function setName($name) { $this->updateAttributes(array('name'=>$name)); } //end func setName // }}} // {{{ getName() /** * Returns the element name * * @since 1.0 * @access public * @return string */ function getName() { return $this->getAttribute('name'); } //end func getName // }}} // {{{ setValue() /** * Sets value for textarea element * * @param string $value Value for textarea element * @since 1.0 * @access public * @return void */ function setValue($value) { $this->_value = $value; } //end func setValue // }}} // {{{ getValue() /** * Returns the value of the form element * * @since 1.0 * @access public * @return string */ function getValue() { return $this->_value; } // end func getValue // }}} // {{{ setWrap() /** * Sets wrap type for textarea element * * @param string $wrap Wrap type * @since 1.0 * @access public * @return void */ function setWrap($wrap) { $this->updateAttributes(array('wrap' => $wrap)); } //end func setWrap // }}} // {{{ setRows() /** * Sets height in rows for textarea element * * @param string $rows Height expressed in rows * @since 1.0 * @access public * @return void */ function setRows($rows) { $this->updateAttributes(array('rows' => $rows)); } //end func setRows // }}} // {{{ setCols() /** * Sets width in cols for textarea element * * @param string $cols Width expressed in cols * @since 1.0 * @access public * @return void */ function setCols($cols) { $this->updateAttributes(array('cols' => $cols)); } //end func setCols // }}} // {{{ toHtml() /** * Returns the textarea element in HTML * * @since 1.0 * @access public * @return string */ function toHtml() { if ($this->_flagFrozen) { return $this->getFrozenHtml(); } else { return $this->_getTabs() . '_getAttrString($this->_attributes) . '>' . // because we wrap the form later we don't want the text indented preg_replace("/(\r\n|\n|\r)/", ' ', htmlspecialchars($this->_value ?? '')) . ''; } } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags (in this case, value is changed to a mask) * * @since 1.0 * @access public * @return string */ function getFrozenHtml() { $value = htmlspecialchars($this->getValue()); if ($this->getAttribute('wrap') == 'off') { $html = $this->_getTabs() . '
' . $value."
\n"; } else { $html = nl2br($value)."\n"; } return $html . $this->_getPersistantData(); } //end func getFrozenHtml // }}} } //end class HTML_QuickForm_textarea ?> PKw \j checkbox.phpnu[ | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once("HTML/QuickForm/input.php"); /** * HTML class for a checkbox type field * * @author Adam Daniel * @author Bertrand Mansion * @version 1.1 * @since PHP4.04pl1 * @access public */ class HTML_QuickForm_checkbox extends HTML_QuickForm_input { // {{{ properties /** * Checkbox display text * @var string * @since 1.1 * @access private */ var $_text = ''; // }}} // {{{ constructor /** * Class constructor * * @param string $elementName (optional)Input field name attribute * @param string $elementLabel (optional)Input field value * @param string $text (optional)Checkbox display text * @param mixed $attributes (optional)Either a typical HTML attribute string * or an associative array * @since 1.0 * @access public * @return void */ public function __construct($elementName=null, $elementLabel=null, $text='', $attributes=null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_persistantFreeze = true; $this->_text = $text; $this->setType('checkbox'); $this->updateAttributes(array('value'=>1)); } //end constructor /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_checkbox($elementName=null, $elementLabel=null, $text='', $attributes=null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $elementLabel, $text, $attributes); } // }}} // {{{ setChecked() /** * Sets whether a checkbox is checked * * @param bool $checked Whether the field is checked or not * @since 1.0 * @access public * @return void */ function setChecked($checked) { if (!$checked) { $this->removeAttribute('checked'); } else { $this->updateAttributes(array('checked'=>'checked')); } } //end func setChecked // }}} // {{{ getChecked() /** * Returns whether a checkbox is checked * * @since 1.0 * @access public * @return bool */ function getChecked() { return (bool)$this->getAttribute('checked'); } //end func getChecked // }}} // {{{ toHtml() /** * Returns the checkbox element in HTML * * @since 1.0 * @access public * @return string */ function toHtml() { $this->_generateId(); // Seems to be necessary when this is used in a group. if (0 == strlen($this->_text)) { $label = ''; } elseif ($this->_flagFrozen) { $label = $this->_text; } else { $label = ''; } return HTML_QuickForm_input::toHtml() . $label; } //end func toHtml // }}} // {{{ getFrozenHtml() /** * Returns the value of field without HTML tags * * @since 1.0 * @access public * @return string */ function getFrozenHtml() { if ($this->getChecked()) { return '[x]' . $this->_getPersistantData(); } else { return '[ ]'; } } //end func getFrozenHtml // }}} // {{{ setText() /** * Sets the checkbox text * * @param string $text * @since 1.1 * @access public * @return void */ function setText($text) { $this->_text = $text; } //end func setText // }}} // {{{ getText() /** * Returns the checkbox text * * @since 1.1 * @access public * @return string */ function getText() { return $this->_text; } //end func getText // }}} // {{{ setValue() /** * Sets the value of the form element * * @param string $value Default value of the form element * @since 1.0 * @access public * @return void */ function setValue($value) { return $this->setChecked($value); } // end func setValue // }}} // {{{ getValue() /** * Returns the value of the form element * * @since 1.0 * @access public * @return bool */ function getValue() { return $this->getChecked(); } // end func getValue // }}} // {{{ onQuickFormEvent() /** * Called by HTML_QuickForm whenever form event is made on this element * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @since 1.0 * @access public * @return void */ function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': // constant values override both default and submitted ones // default values are overriden by submitted $value = $this->_findValue($caller->_constantValues); if (null === $value) { // if no boxes were checked, then there is no value in the array // yet we don't want to display default value in this case if ($caller->isSubmitted()) { $value = $this->_findValue($caller->_submitValues); } else { $value = $this->_findValue($caller->_defaultValues); } } if (null !== $value) { $this->setChecked($value); } break; case 'setGroupValue': $this->setChecked($arg); break; default: parent::onQuickFormEvent($event, $arg, $caller); } return true; } // end func onQuickFormEvent // }}} // {{{ exportValue() /** * Return true if the checkbox is checked, null if it is not checked (getValue() returns false) */ function exportValue(&$submitValues, $assoc = false) { $value = $this->_findValue($submitValues); if (null === $value) { $value = $this->getChecked()? true: null; } return $this->_prepareValue($value, $assoc); } // }}} } //end class HTML_QuickForm_checkbox ?> PKw \t header.phpnu[ | // +----------------------------------------------------------------------+ // // $Id$ require_once 'HTML/QuickForm/static.php'; /** * A pseudo-element used for adding headers to form * * @author Alexey Borzov * @access public */ class HTML_QuickForm_header extends HTML_QuickForm_static { // {{{ constructor /** * Class constructor * * @param string $elementName Header name * @param string $text Header text * @access public * @return void */ public function __construct($elementName = null, $text = null) { parent::__construct($elementName, null, $text); $this->_type = 'header'; } /** * Old syntax of class constructor. Deprecated in PHP7. * * @deprecated since Moodle 3.1 */ public function HTML_QuickForm_header($elementName = null, $text = null) { debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); self::__construct($elementName, $text); } // }}} // {{{ accept() /** * Accepts a renderer * * @param object An HTML_QuickForm_Renderer object * @access public * @return void */ function accept(&$renderer, $required=false, $error=null) { $renderer->renderHeader($this); } // end func accept // }}} } //end class HTML_QuickForm_header ?> PKw \+a[5##autocomplete.phpnu[PKw \[ Q#image.phpnu[PKw \ <3hidden.phpnu[PKw \șb b J@Rule/Email.phpnu[PKw \%&SKRule/Callback.phpnu[PKw \| \Rule/Regex.phpnu[PKw \, , iRule/Range.phpnu[PKw \]m m ]tRule/Compare.phpnu[PKw \q9 Rule/Required.phpnu[PKw \Z xbutton.phpnu[PKw \44 Gelement.phpnu[PKw \N nreset.phpnu[PKw \i FRenderer.phpnu[PKw \Bhiddenselect.phpnu[PKw \_,,zfile.phpnu[PKw \6w +html.phpnu[PKw \'у@P@P5hierselect.phpnu[PKw \9Ilink.phpnu[PKw \..Renderer/Tableless.phpnu[PKw \2m=}?}?Renderer/Default.phpnu[PKw \9'' Renderer/Array.phpnu[PKw \:,:,2Renderer/Object.phpnu[PKw \Aى O_static.phpnu[PKw \'ll upassword.phpnu[PKw \ text.phpnu[PKw \{D#D#advcheckbox.phpnu[PKw \<<RuleRegistry.phpnu[PKw \h~FŁŁdate.phpnu[PKw \uDHTMLRulesTableless.phpnu[PKw \ KK vselect.phpnu[PKw \hRule.phpnu[PKw \Cfogg >radio.phpnu[PKw \"FGG group.phpnu[PKw \ Lf f Nsubmit.phpnu[PKw \6K e[button.phpnu[PKw \ ngutils.phpnu[PKw \8 yinput.phpnu[PKw \_8 textarea.phpnu[PKw \j checkbox.phpnu[PKw \t header.phpnu[PK((