From 12c16fb3c7314b51d74dcaffdca4d311c6fad8c0 Mon Sep 17 00:00:00 2001 From: wei <> Date: Sun, 7 May 2006 09:47:15 +0000 Subject: Adding TAutoComplete --- .../UI/ActiveControls/TActiveControlAdapter.php | 4 +- .../Web/UI/ActiveControls/TActivePageAdapter.php | 2 +- framework/Web/UI/ActiveControls/TAutoComplete.php | 186 +++++++++++++++++++++ .../Web/UI/ActiveControls/TCallbackResponse.php | 13 +- 4 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 framework/Web/UI/ActiveControls/TAutoComplete.php (limited to 'framework/Web/UI/ActiveControls') diff --git a/framework/Web/UI/ActiveControls/TActiveControlAdapter.php b/framework/Web/UI/ActiveControls/TActiveControlAdapter.php index 2409d9fe..1cdd5d73 100644 --- a/framework/Web/UI/ActiveControls/TActiveControlAdapter.php +++ b/framework/Web/UI/ActiveControls/TActiveControlAdapter.php @@ -14,9 +14,11 @@ class TActiveControlAdapter extends TControlAdapter { if(!self::$_renderedPosts) { + $cs = $this->getPage()->getClientScript(); + $cs->registerPradoScript('ajax'); $options = TJavascript::encode($this->getPage()->getPostDataLoaders(),false); $script = "Prado.CallbackRequest.PostDataLoaders = {$options};"; - $this->getPage()->getClientScript()->registerEndScript(get_class($this), $script); + $cs->registerEndScript(get_class($this), $script); self::$_renderedPosts = true; } parent::render($writer); diff --git a/framework/Web/UI/ActiveControls/TActivePageAdapter.php b/framework/Web/UI/ActiveControls/TActivePageAdapter.php index 11c3303e..e92c9cdc 100644 --- a/framework/Web/UI/ActiveControls/TActivePageAdapter.php +++ b/framework/Web/UI/ActiveControls/TActivePageAdapter.php @@ -257,7 +257,7 @@ class TCallbackEventParameter extends TEventParameter */ public function getOutput() { - return $this->_response->createHtmlWriter(); + return $this->_response->createHtmlWriter(null,$this); } /** diff --git a/framework/Web/UI/ActiveControls/TAutoComplete.php b/framework/Web/UI/ActiveControls/TAutoComplete.php new file mode 100644 index 00000000..2ebba495 --- /dev/null +++ b/framework/Web/UI/ActiveControls/TAutoComplete.php @@ -0,0 +1,186 @@ +getSuggestions()->setDataSource($data); + } + + public function getResultPanel() + { + if(is_null($this->_resultPanel)) + $this->_resultPanel = $this->createResultPanel(); + return $this->_resultPanel; + } + + protected function createResultPanel() + { + $panel = Prado::createComponent('System.Web.UI.WebControls.TPanel'); + $this->getControls()->add($panel); + $panel->setID('result'); + return $panel; + } + + /** + * @return TRepeater suggestion list repeater + */ + public function getSuggestions() + { + if(is_null($this->_repeater)) + $this->_repeater = $this->createRepeater(); + return $this->_repeater; + } + + /** + * + */ + protected function createRepeater() + { + $repeater = Prado::createComponent('System.Web.UI.WebControls.TRepeater'); + $repeater->setHeaderTemplate(new TAutoCompleteTemplate('')); + $repeater->setItemTemplate(new TTemplate('
  • <%# $this->DataItem %>
  • ',null)); + $this->getControls()->add($repeater); + return $repeater; + } + + /** + * @return TCallbackClientSideOptions callback client-side options. + */ + protected function createClientSideOptions() + { + $options = new TAutoCompleteClientSideOptions; + $options->setEnablePageStateUpdate(false); + return $options; + } + + public function renderEndTag($writer) + { + $this->getPage()->getClientScript()->registerPradoScript('effects'); + parent::renderEndTag($writer); + $this->renderResultPanel($writer); + } + + public function renderResultPanel($writer) + { + $this->getResultPanel()->render($writer); + } + + public function render($writer) + { + if($this->canUpdateClientSide()) + { + $this->getSuggestions()->render($writer); + $boundary = $writer->getWriter()->getBoundary(); + $writer->getWriter()->getResponse()->setData($boundary); + } + else + parent::render($writer); + } + + /** + * @return array list of callback options. + */ + protected function getCallbackOptions() + { + $options = $this->getClientSide()->getOptions()->toArray(); + if($this->getAutoPostBack()) + $options = array_merge($options,$this->getPostBackOptions()); + $options['ResultPanel'] = $this->getResultPanel()->getClientID(); + $options['ID'] = $this->getClientID(); + $options['EventTarget'] = $this->getUniqueID(); + return $options; + } + + /** + * Adds attribute name-value pairs to renderer. + * This method overrides the parent implementation with additional textbox specific attributes. + * @param THtmlWriter the writer used for the rendering purpose + */ + protected function addAttributesToRender($writer) + { + parent::addAttributesToRender($writer); + $this->renderClientControlScript($writer); + } + +} + +/** + * Client-side options for TAutoComplete. + * + * @author Wei Zhuo + * @version $Revision: $ $Date: $ + * @package System.Web.UI.ActiveControls + * @since 3.0 + */ +class TAutoCompleteClientSideOptions extends TCallbackClientSideOptions +{ + public function getSeparator() + { + return $this->getOption('tokens'); + } + + public function setSeparator($value) + { + $this->setOption('tokens', $chars = preg_split('//', $value, -1, PREG_SPLIT_NO_EMPTY)); + } + + public function getFrequency() + { + return $this->getOption('frequency'); + } + + public function setFrequency($value) + { + $this->setOption('frequency', TPropertyValue::ensureFloat($value)); + } + + public function getMinChars() + { + return $this->getOption('minChars'); + } + + public function setMinChars($value) + { + $this->setOption('minChars', TPropertyValue::ensureInteger($value)); + } +} + +/** + * TWizardSideBarTemplate class. + * TWizardSideBarTemplate is the default template for wizard sidebar. + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TAutoCompleteTemplate extends TComponent implements ITemplate +{ + private $_template; + + public function __construct($template) + { + $this->_template = $template; + } + /** + * Instantiates the template. + * It creates a {@link TDataList} control. + * @param TControl parent to hold the content within the template + */ + public function instantiateIn($parent) + { + $parent->getControls()->add($this->_template); + } +} + +?> \ No newline at end of file diff --git a/framework/Web/UI/ActiveControls/TCallbackResponse.php b/framework/Web/UI/ActiveControls/TCallbackResponse.php index 024ad6ef..b28d817b 100644 --- a/framework/Web/UI/ActiveControls/TCallbackResponse.php +++ b/framework/Web/UI/ActiveControls/TCallbackResponse.php @@ -7,9 +7,9 @@ class TCallbackResponse extends THttpResponse { private $_writers=array(); - public function createHtmlWriter($type=null) + public function createHtmlWriter($type=null,$parameter=null) { - $writer = new TCallbackResponseWriter(); + $writer = new TCallbackResponseWriter($parameter); $this->_writers[] = $writer; if($type===null) $type=$this->getHtmlWriterType(); @@ -27,12 +27,19 @@ class TCallbackResponse extends THttpResponse class TCallbackResponseWriter extends TTextWriter { private $_boundary; + private $_response; - public function __construct() + public function __construct($response) { + $this->_response = $response; $this->_boundary = sprintf('%x',crc32((string)$this)); } + public function getResponse() + { + return $this->_response; + } + public function getBoundary() { return $this->_boundary; -- cgit v1.2.3