protected function getJavascriptCallback() { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_JavascriptBuilder'); $config = $this->getConfig(); $arguments = array($this->owner->getJavascriptValue()); foreach ($config['arguments'] as $arg) { $arguments[] = HTML_QuickForm2_JavascriptBuilder::encode($arg); } return "function() { return !" . $this->findJavascriptName() . "(" . implode(', ', $arguments) . "); }"; }
public function testEncode() { $this->assertEquals('null', HTML_QuickForm2_JavascriptBuilder::encode(null)); $this->assertEquals('false', HTML_QuickForm2_JavascriptBuilder::encode(false)); $this->assertEquals('"foo"', HTML_QuickForm2_JavascriptBuilder::encode('foo')); $this->assertEquals('"\\r\\n\\t\\\'\\"bar\\\\"', HTML_QuickForm2_JavascriptBuilder::encode("\r\n\t'\"bar\\")); $this->assertEquals(1, HTML_QuickForm2_JavascriptBuilder::encode(1)); $this->assertEquals('[]', HTML_QuickForm2_JavascriptBuilder::encode(array())); $this->assertEquals('{}', HTML_QuickForm2_JavascriptBuilder::encode(new stdClass())); $this->assertEquals('["a","b"]', HTML_QuickForm2_JavascriptBuilder::encode(array('a', 'b'))); $this->assertEquals('{"0":"a","b":"c"}', HTML_QuickForm2_JavascriptBuilder::encode(array('a', 'b' => 'c'))); $obj = new stdClass(); $obj->a = 'b'; $obj->c = 'd'; $obj->e = array('f', 'g'); $this->assertEquals('{"a":"b","c":"d","e":["f","g"]}', HTML_QuickForm2_JavascriptBuilder::encode($obj)); try { $fp = fopen(__FILE__, 'rb'); HTML_QuickForm2_JavascriptBuilder::encode($fp); $this->fail('Expected HTML_QuickForm2_InvalidArgumentException was not thrown'); } catch (HTML_QuickForm2_InvalidArgumentException $e) { } fclose($fp); }
/** * Generates a javascript function call to initialize hierselect behaviour * * @return string */ private function _generateInitScript() { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_JavascriptBuilder'); $ids = array(); /* @var $element HTML_QuickForm2_Element */ foreach ($this as $element) { $ids[] = $element->getId(); } return 'qf.elements.hierselect.init(' . HTML_QuickForm2_JavascriptBuilder::encode($ids) . (empty($this->jsCallback) ? '' : ", {$this->jsCallback}") . ');'; }
/** * Returns the client-side representation of the Rule * * The Javascript object returned contains the following fields: * - callback: {@see getJavascriptCallback()} * - elementId: element ID to set error for if validation fails * - errorMessage: error message to set if validation fails * - chained: chained rules, array of arrays like in $chainedRules property * * @return string * @throws HTML_QuickForm2_Exception if Rule or its chained Rules can only * be run server-side */ public function getJavascript($outputTriggers = true) { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_JavascriptBuilder'); $js = $this->getJavascriptCallback() . ",\n\t'" . $this->owner->getId() . "', " . HTML_QuickForm2_JavascriptBuilder::encode($this->getMessage()); $js = $outputTriggers && count($triggers = $this->getJavascriptTriggers()) ? 'new qf.LiveRule(' . $js . ', ' . HTML_QuickForm2_JavascriptBuilder::encode($triggers) : 'new qf.Rule(' . $js; if (count($this->chainedRules) > 1 || count($this->chainedRules[0]) > 0) { $chained = array(); foreach ($this->chainedRules as $item) { $multipliers = array(); foreach ($item as $multiplier) { $multipliers[] = $multiplier->getJavascript(false); } $chained[] = '[' . implode(",\n", $multipliers) . ']'; } $js .= ",\n\t [" . implode(",\n", $chained) . "]"; } return $js . ')'; }
/** * Returns the client-side representation of the Rule * * The Javascript object returned contains the following fields: * - callback: {@see getJavascriptCallback()} * - elementId: element ID to set error for if validation fails * - errorMessage: error message to set if validation fails * - chained: chained rules, array of arrays like in $chainedRules property * * @return string * @throws HTML_QuickForm2_Exception if Rule or its chained Rules can only * be run server-side */ public function getJavascript() { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_JavascriptBuilder'); $js = "{\n\tcallback: " . $this->getJavascriptCallback() . ",\n" . "\towner: '" . $this->owner->getId() . "',\n" . "\tmessage: " . HTML_QuickForm2_JavascriptBuilder::encode($this->getMessage()); if (count($this->chainedRules) > 1 || count($this->chainedRules[0]) > 0) { $chained = array(); foreach ($this->chainedRules as $item) { $multipliers = array(); foreach ($item as $multiplier) { $multipliers[] = $multiplier->getJavascript(); } $chained[] = '[' . implode(",\n", $multipliers) . ']'; } $js .= ",\n\tchained: [" . implode(",\n", $chained) . "]"; } return $js . "\n}"; }
protected function getJavascriptCallback() { HTML_QuickForm2_Loader::loadClass('HTML_QuickForm2_JavascriptBuilder'); $config = $this->getConfig(); $operand1 = $this->owner->getJavascriptValue(); $operand2 = $config['operand'] instanceof HTML_QuickForm2_Node ? $config['operand']->getJavascriptValue() : HTML_QuickForm2_JavascriptBuilder::encode($config['operand']); if (!in_array($config['operator'], array('===', '!=='))) { $check = "Number({$operand1}) {$config['operator']} Number({$operand2})"; } else { $check = "String({$operand1}) {$config['operator']} String({$operand2})"; } return "function () { return {$check}; }"; }
/** * Generates Javascript code to initialize repeat behaviour * * @param HTML_QuickForm2_Container_Repeat_JavascriptBuilder $evalBuilder * Javascript builder returning JS string literals * * @return string javascript */ private function _generateInitScript(HTML_QuickForm2_Container_Repeat_JavascriptBuilder $evalBuilder) { $myId = HTML_QuickForm2_JavascriptBuilder::encode($this->getId()); $protoId = HTML_QuickForm2_JavascriptBuilder::encode($this->getPrototype()->getId()); $triggers = array(); /* @var $child HTML_QuickForm2_Node */ foreach ($this->getRecursiveIterator() as $child) { $triggers[] = $child->getId(); } $triggers = HTML_QuickForm2_JavascriptBuilder::encode($triggers); list($rules, $scripts) = $evalBuilder->getFormJavascriptAsStrings(); return "new qf.elements.Repeat(document.getElementById({$myId}), {$protoId}, " . "{$triggers},\n{$rules},\n{$scripts}\n);"; }