?? ajax.php
字號:
<?php/* SVN FILE: $Id: ajax.php 7118 2008-06-04 20:49:29Z gwoo $ *//** * Helper for AJAX operations. * * Helps doing AJAX using the Prototype library. * * PHP versions 4 and 5 * * CakePHP(tm) : Rapid Development Framework <http://www.cakephp.org/> * Copyright 2005-2008, Cake Software Foundation, Inc. * 1785 E. Sahara Avenue, Suite 490-204 * Las Vegas, Nevada 89104 * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * * @filesource * @copyright Copyright 2005-2008, Cake Software Foundation, Inc. * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project * @package cake * @subpackage cake.cake.libs.view.helpers * @since CakePHP(tm) v 0.10.0.1076 * @version $Revision: 7118 $ * @modifiedby $LastChangedBy: gwoo $ * @lastmodified $Date: 2008-06-04 13:49:29 -0700 (Wed, 04 Jun 2008) $ * @license http://www.opensource.org/licenses/mit-license.php The MIT License *//** * AjaxHelper helper library. * * Helps doing AJAX using the Prototype library. * * @package cake * @subpackage cake.cake.libs.view.helpers */class AjaxHelper extends AppHelper {/** * Included helpers. * * @var array */ var $helpers = array('Html', 'Javascript', 'Form');/** * HtmlHelper instance * * @var object * @access public */ var $Html = null;/** * JavaScriptHelper instance * * @var object * @access public */ var $Javascript = null;/** * Names of Javascript callback functions. * * @var array */ var $callbacks = array('complete', 'create', 'exception', 'failure', 'interactive', 'loading', 'loaded', 'success', 'uninitialized');/** * Names of AJAX options. * * @var array */ var $ajaxOptions = array('after', 'asynchronous', 'before', 'confirm', 'condition', 'contentType', 'encoding', 'evalScripts', 'failure', 'fallback', 'form', 'indicator', 'insertion', 'interactive', 'loaded', 'loading', 'method', 'onCreate', 'onComplete', 'onException', 'onFailure', 'onInteractive', 'onLoaded', 'onLoading', 'onSuccess', 'onUninitialized', 'parameters', 'position', 'postBody', 'requestHeaders', 'success', 'type', 'update', 'with');/** * Options for draggable. * * @var array */ var $dragOptions = array('handle', 'revert', 'snap', 'zindex', 'constraint', 'change', 'ghosting', 'starteffect', 'reverteffect', 'endeffect');/** * Options for droppable. * * @var array */ var $dropOptions = array('accept', 'containment', 'greedy', 'hoverclass', 'onHover', 'onDrop', 'overlap');/** * Options for sortable. * * @var array */ var $sortOptions = array('constraint', 'containment', 'dropOnEmpty', 'ghosting', 'handle', 'hoverclass', 'onUpdate', 'onChange', 'only', 'overlap', 'scroll', 'scrollSensitivity', 'scrollSpeed', 'tag', 'tree', 'treeTag', 'update');/** * Options for slider. * * @var array */ var $sliderOptions = array('alignX', 'alignY', 'axis', 'disabled', 'handleDisabled', 'handleImage', 'increment', 'maximum', 'minimum', 'onChange', 'onSlide', 'range', 'sliderValue', 'values');/** * Options for in-place editor. * * @var array */ var $editorOptions = array('okText', 'cancelText', 'savingText', 'formId', 'externalControl', 'rows', 'cols', 'size', 'highlightcolor', 'highlightendcolor', 'savingClassName', 'formClassName', 'loadTextURL', 'loadingText', 'callback', 'ajaxOptions', 'clickToEditText', 'collection', 'okButton', 'cancelLink');/** * Options for auto-complete editor. * * @var array */ var $autoCompleteOptions = array('afterUpdateElement', 'callback', 'frequency', 'indicator', 'minChars', 'onShow', 'onHide', 'parameters', 'paramName', 'tokens', 'updateElement');/** * Output buffer for Ajax update content * * @var array */ var $__ajaxBuffer = array();/** * Returns link to remote action * * Returns a link to a remote action defined by <i>options[url]</i> * (using the url() format) that's called in the background using * XMLHttpRequest. The result of that request can then be inserted into a * DOM object whose id can be specified with <i>options[update]</i>. * * Examples: * <code> * link("Delete this post", * array("update" => "posts", "url" => "delete/{$postid->id}")); * link(imageTag("refresh"), * array("update" => "emails", "url" => "list_emails" )); * </code> * * By default, these remote requests are processed asynchronous during * which various callbacks can be triggered (for progress indicators and * the likes). * * Example: * <code> * link (word, * array("url" => "undo", "n" => word_counter), * array("complete" => "undoRequestCompleted(request)")); * </code> * * The callbacks that may be specified are: * * - <i>loading</i>:: Called when the remote document is being * loaded with data by the browser. * - <i>loaded</i>:: Called when the browser has finished loading * the remote document. * - <i>interactive</i>:: Called when the user can interact with the * remote document, even though it has not * finished loading. * - <i>complete</i>:: Called when the XMLHttpRequest is complete. * * If you for some reason or another need synchronous processing (that'll * block the browser while the request is happening), you can specify * <i>options[type] = synchronous</i>. * * You can customize further browser side call logic by passing * in Javascript code snippets via some optional parameters. In * their order of use these are: * * - <i>confirm</i>:: Adds confirmation dialog. * -<i>condition</i>:: Perform remote request conditionally * by this expression. Use this to * describe browser-side conditions when * request should not be initiated. * - <i>before</i>:: Called before request is initiated. * - <i>after</i>:: Called immediately after request was * initiated and before <i>loading</i>. * * @param string $title Title of link * @param string $href Href string "/products/view/12" * @param array $options Options for JavaScript function * @param string $confirm Confirmation message. Calls up a JavaScript confirm() message. * @param boolean $escapeTitle Escaping the title string to HTML entities * * @return string HTML code for link to remote action */ function link($title, $href = null, $options = array(), $confirm = null, $escapeTitle = true) { if (!isset($href)) { $href = $title; } if (!isset($options['url'])) { $options['url'] = $href; } if (isset($confirm)) { $options['confirm'] = $confirm; unset($confirm); } $htmlOptions = $this->__getHtmlOptions($options, array('url')); if (empty($options['fallback']) || !isset($options['fallback'])) { $options['fallback'] = $href; } $htmlOptions = array_merge(array('id' => 'link' . intval(rand()), 'onclick' => ''), $htmlOptions); $htmlOptions['onclick'] .= ' event.returnValue = false; return false;'; $return = $this->Html->link($title, $href, $htmlOptions, null, $escapeTitle); $script = $this->Javascript->event("'{$htmlOptions['id']}'", "click", $this->remoteFunction($options)); if (is_string($script)) { $return .= $script; } return $return; }/** * Creates JavaScript function for remote AJAX call * * This function creates the javascript needed to make a remote call * it is primarily used as a helper for AjaxHelper::link. * * @param array $options options for javascript * @return string html code for link to remote action * @see AjaxHelper::link() for docs on options parameter. */ function remoteFunction($options) { if (isset($options['update'])) { if (!is_array($options['update'])) { $func = "new Ajax.Updater('{$options['update']}',"; } else { $func = "new Ajax.Updater(document.createElement('div'),"; } if (!isset($options['requestHeaders'])) { $options['requestHeaders'] = array(); } if (is_array($options['update'])) { $options['update'] = join(' ', $options['update']); } $options['requestHeaders']['X-Update'] = $options['update']; } else { $func = "new Ajax.Request("; } $func .= "'" . $this->url(isset($options['url']) ? $options['url'] : "") . "'"; $func .= ", " . $this->__optionsForAjax($options) . ")"; if (isset($options['before'])) { $func = "{$options['before']}; $func"; } if (isset($options['after'])) { $func = "$func; {$options['after']};"; } if (isset($options['condition'])) { $func = "if ({$options['condition']}) { $func; }"; } if (isset($options['confirm'])) { $func = "if (confirm('" . $this->Javascript->escapeString($options['confirm']) . "')) { $func; } else { event.returnValue = false; return false; }"; } return $func; }/** * Periodically call remote url via AJAX. * * Periodically calls the specified url (<i>options[url]</i>) every <i>options[frequency]</i> seconds (default is 10). * Usually used to update a specified div (<i>options[update]</i>) with the results of the remote call. * The options for specifying the target with url and defining callbacks is the same as linkToRemote. * * @param array $options Callback options * @return string Javascript code */ function remoteTimer($options = null) { $frequency = (isset($options['frequency'])) ? $options['frequency'] : 10; $code = "new PeriodicalExecuter(function() {" . $this->remoteFunction($options) . "}, $frequency)"; return $this->Javascript->codeBlock($code); }/** * Returns form tag that will submit using Ajax. * * Returns a form tag that will submit using XMLHttpRequest in the background instead of the regular * reloading POST arrangement. Even though it's using Javascript to serialize the form elements, the form submission * will work just like a regular submission as viewed by the receiving side (all elements available in params). * The options for defining callbacks is the same as link(). * * @param array $params Form target * @param array $type How form data is posted: 'get' or 'post' * @param array $options Callback/HTML options * @return string JavaScript/HTML code */ function form($params = null, $type = 'post', $options = array()) { $model = false; if (is_array($params)) { extract($params, EXTR_OVERWRITE); } if (empty($options['url'])) { $options['url'] = array('action' => $params); } $htmlOptions = array_merge(array( 'id' => 'form' . intval(rand()), 'onsubmit' => "event.returnValue = false; return false;", 'type' => $type), $this->__getHtmlOptions($options, array('model', 'with')) ); $options = array_merge(array('model' => $model,'with' => "Form.serialize('{$htmlOptions['id']}')"), $options); return $this->Form->create($options['model'], $htmlOptions) . $this->Javascript->event("'" . $htmlOptions['id']. "'", 'submit', $this->remoteFunction($options)); }/** * Returns a button input tag that will submit using Ajax * * Returns a button input tag that will submit form using XMLHttpRequest in the background instead of regular * reloading POST arrangement. <i>options</i> argument is the same as in <i>form_remote_tag</i> * * @param string $title Input button title * @param array $options Callback options * @return string Ajaxed input button */ function submit($title = 'Submit', $options = array()) { $htmlOptions = $this->__getHtmlOptions($options); $htmlOptions['value'] = $title; if (!isset($options['with'])) { $options['with'] = 'Form.serialize(Event.element(event).form)'; } if (!isset($htmlOptions['id'])) { $htmlOptions['id'] = 'submit' . intval(rand()); } $htmlOptions['onclick'] = "event.returnValue = false; return false;"; return $this->Form->submit($title, $htmlOptions) . $this->Javascript->event('"' . $htmlOptions['id'] . '"', 'click', $this->remoteFunction($options)); }/** * Observe field and call ajax on change. * * Observes the field with the DOM ID specified by <i>field</i> and makes * an Ajax when its contents have changed. * * Required +options+ are: * - <i>frequency</i>:: The frequency (in seconds) at which changes to * this field will be detected. * - <i>url</i>:: @see url() -style options for the action to call * when the field has changed. * * Additional options are: * - <i>update</i>:: Specifies the DOM ID of the element whose * innerHTML should be updated with the * XMLHttpRequest response text. * - <i>with</i>:: A Javascript expression specifying the * parameters for the XMLHttpRequest. This defaults * to Form.Element.serialize('$field'), which can be * accessed from params['form']['field_id']. * * Additionally, you may specify any of the options documented in * @see linkToRemote(). * * @param string $field DOM ID of field to observe * @param array $options ajax options * @return string ajax script */ function observeField($field, $options = array()) { if (!isset($options['with'])) { $options['with'] = 'Form.Element.serialize(\'' . $field . '\')'; } $observer = 'Observer'; if (!isset($options['frequency']) || intval($options['frequency']) == 0) { $observer = 'EventObserver'; } return $this->Javascript->codeBlock($this->_buildObserver('Form.Element.' . $observer, $field, $options)); }/** * Observe entire form and call ajax on change. * * Like @see observeField(), but operates on an entire form identified by the * DOM ID <b>form</b>. <b>options</b> are the same as <b>observeField</b>, except * the default value of the <i>with</i> option evaluates to the * serialized (request string) value of the form. * * @param string $form DOM ID of form to observe * @param array $options ajax options * @return string ajax script */ function observeForm($form, $options = array()) { if (!isset($options['with'])) { $options['with'] = 'Form.serialize(\'' . $form . '\')'; } $observer = 'Observer'; if (!isset($options['frequency']) || intval($options['frequency']) == 0) { $observer = 'EventObserver'; } return $this->Javascript->codeBlock($this->_buildObserver('Form.' . $observer, $form, $options)); }/** * Create a text field with Autocomplete. * * Creates an autocomplete field with the given ID and options. * * options['with'] defaults to "Form.Element.serialize('$field')", * but can be any valid javascript expression defining the * * @param string $field DOM ID of field to observe * @param string $url URL for the autocomplete action * @param array $options Ajax options * @return string Ajax script */ function autoComplete($field, $url = "", $options = array()) { $var = ''; if (isset($options['var'])) { $var = 'var ' . $options['var'] . ' = '; unset($options['var']); } if (!isset($options['id'])) { $options['id'] = Inflector::camelize(str_replace(".", "_", $field)); } $divOptions = array('id' => $options['id'] . "_autoComplete", 'class' => isset($options['class']) ? $options['class'] : 'auto_complete'); if (isset($options['div_id'])) { $divOptions['id'] = $options['div_id']; unset($options['div_id']); } $htmlOptions = $this->__getHtmlOptions($options); $htmlOptions['autocomplete'] = "off"; foreach ($this->autoCompleteOptions as $opt) { unset($htmlOptions[$opt]); } if (isset($options['tokens'])) { if (is_array($options['tokens'])) { $options['tokens'] = $this->Javascript->object($options['tokens']); } else { $options['tokens'] = '"' . $options['tokens'] . '"'; } } $options = $this->_optionsToString($options, array('paramName', 'indicator')); $options = $this->_buildOptions($options, $this->autoCompleteOptions); return $this->Form->text($field, $htmlOptions) . "\n" . $this->Html->div(null, '', $divOptions) . "\n" . $this->Javascript->codeBlock("{$var}new Ajax.Autocompleter('" . $htmlOptions['id'] . "', '" . $divOptions['id'] . "', '" . $this->Html->url($url) . "', " .
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -