pictcode / lib / Cake / View / Helper / JsBaseEngineHelper.php @ 9d2f0219
履歴 | 表示 | アノテート | ダウンロード (17.672 KB)
| 1 | 635eef61 | spyder1211 | <?php
|
|---|---|---|---|
| 2 | /**
|
||
| 3 | * CakePHP : Rapid Development Framework (http://cakephp.org)
|
||
| 4 | * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
| 5 | *
|
||
| 6 | * Licensed under The MIT License
|
||
| 7 | * For full copyright and license information, please see the LICENSE.txt
|
||
| 8 | * Redistributions of files must retain the above copyright notice.
|
||
| 9 | *
|
||
| 10 | * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
| 11 | * @link http://cakephp.org CakePHP(tm) Project
|
||
| 12 | * @package Cake.View.Helper
|
||
| 13 | * @since CakePHP(tm) v 2.0
|
||
| 14 | * @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
| 15 | */
|
||
| 16 | |||
| 17 | App::uses('AppHelper', 'View/Helper'); |
||
| 18 | |||
| 19 | /**
|
||
| 20 | * JsEngineBaseClass
|
||
| 21 | *
|
||
| 22 | * Abstract Base Class for All JsEngines to extend. Provides generic methods.
|
||
| 23 | *
|
||
| 24 | * @package Cake.View.Helper
|
||
| 25 | */
|
||
| 26 | abstract class JsBaseEngineHelper extends AppHelper { |
||
| 27 | |||
| 28 | /**
|
||
| 29 | * The js snippet for the current selection.
|
||
| 30 | *
|
||
| 31 | * @var string
|
||
| 32 | */
|
||
| 33 | public $selection; |
||
| 34 | |||
| 35 | /**
|
||
| 36 | * Collection of option maps. Option maps allow other helpers to use generic names for engine
|
||
| 37 | * callbacks and options. Allowing uniform code access for all engine types. Their use is optional
|
||
| 38 | * for end user use though.
|
||
| 39 | *
|
||
| 40 | * @var array
|
||
| 41 | */
|
||
| 42 | protected $_optionMap = array(); |
||
| 43 | |||
| 44 | /**
|
||
| 45 | * An array of lowercase method names in the Engine that are buffered unless otherwise disabled.
|
||
| 46 | * This allows specific 'end point' methods to be automatically buffered by the JsHelper.
|
||
| 47 | *
|
||
| 48 | * @var array
|
||
| 49 | */
|
||
| 50 | public $bufferedMethods = array('event', 'sortable', 'drag', 'drop', 'slider'); |
||
| 51 | |||
| 52 | /**
|
||
| 53 | * Contains a list of callback names -> default arguments.
|
||
| 54 | *
|
||
| 55 | * @var array
|
||
| 56 | */
|
||
| 57 | protected $_callbackArguments = array(); |
||
| 58 | |||
| 59 | /**
|
||
| 60 | * Create an `alert()` message in JavaScript
|
||
| 61 | *
|
||
| 62 | * @param string $message Message you want to alter.
|
||
| 63 | * @return string completed alert()
|
||
| 64 | */
|
||
| 65 | public function alert($message) { |
||
| 66 | return 'alert("' . $this->escape($message) . '");'; |
||
| 67 | } |
||
| 68 | |||
| 69 | /**
|
||
| 70 | * Redirects to a URL. Creates a window.location modification snippet
|
||
| 71 | * that can be used to trigger 'redirects' from JavaScript.
|
||
| 72 | *
|
||
| 73 | * @param string|array $url URL
|
||
| 74 | * @return string completed redirect in javascript
|
||
| 75 | */
|
||
| 76 | public function redirect($url = null) { |
||
| 77 | return 'window.location = "' . Router::url($url) . '";'; |
||
| 78 | } |
||
| 79 | |||
| 80 | /**
|
||
| 81 | * Create a `confirm()` message
|
||
| 82 | *
|
||
| 83 | * @param string $message Message you want confirmed.
|
||
| 84 | * @return string completed confirm()
|
||
| 85 | */
|
||
| 86 | public function confirm($message) { |
||
| 87 | return 'confirm("' . $this->escape($message) . '");'; |
||
| 88 | } |
||
| 89 | |||
| 90 | /**
|
||
| 91 | * Generate a confirm snippet that returns false from the current
|
||
| 92 | * function scope.
|
||
| 93 | *
|
||
| 94 | * @param string $message Message to use in the confirm dialog.
|
||
| 95 | * @return string completed confirm with return script
|
||
| 96 | */
|
||
| 97 | public function confirmReturn($message) { |
||
| 98 | $out = 'var _confirm = ' . $this->confirm($message); |
||
| 99 | $out .= "if (!_confirm) {\n\treturn false;\n}"; |
||
| 100 | return $out; |
||
| 101 | } |
||
| 102 | |||
| 103 | /**
|
||
| 104 | * Create a `prompt()` JavaScript function
|
||
| 105 | *
|
||
| 106 | * @param string $message Message you want to prompt.
|
||
| 107 | * @param string $default Default message
|
||
| 108 | * @return string completed prompt()
|
||
| 109 | */
|
||
| 110 | public function prompt($message, $default = '') { |
||
| 111 | return 'prompt("' . $this->escape($message) . '", "' . $this->escape($default) . '");'; |
||
| 112 | } |
||
| 113 | |||
| 114 | /**
|
||
| 115 | * Generates a JavaScript object in JavaScript Object Notation (JSON)
|
||
| 116 | * from an array. Will use native JSON encode method if available, and $useNative == true
|
||
| 117 | *
|
||
| 118 | * ### Options:
|
||
| 119 | *
|
||
| 120 | * - `prefix` - String prepended to the returned data.
|
||
| 121 | * - `postfix` - String appended to the returned data.
|
||
| 122 | *
|
||
| 123 | * @param array $data Data to be converted.
|
||
| 124 | * @param array $options Set of options, see above.
|
||
| 125 | * @return string A JSON code block
|
||
| 126 | */
|
||
| 127 | public function object($data = array(), $options = array()) { |
||
| 128 | $defaultOptions = array( |
||
| 129 | 'prefix' => '', 'postfix' => '', |
||
| 130 | ); |
||
| 131 | $options += $defaultOptions; |
||
| 132 | |||
| 133 | return $options['prefix'] . json_encode($data) . $options['postfix']; |
||
| 134 | } |
||
| 135 | |||
| 136 | /**
|
||
| 137 | * Converts a PHP-native variable of any type to a JSON-equivalent representation
|
||
| 138 | *
|
||
| 139 | * @param mixed $val A PHP variable to be converted to JSON
|
||
| 140 | * @param bool $quoteString If false, leaves string values unquoted
|
||
| 141 | * @param string $key Key name.
|
||
| 142 | * @return string a JavaScript-safe/JSON representation of $val
|
||
| 143 | */
|
||
| 144 | public function value($val = array(), $quoteString = null, $key = 'value') { |
||
| 145 | if ($quoteString === null) { |
||
| 146 | $quoteString = true; |
||
| 147 | } |
||
| 148 | switch (true) { |
||
| 149 | case (is_array($val) || is_object($val)): |
||
| 150 | $val = $this->object($val); |
||
| 151 | break;
|
||
| 152 | case ($val === null): |
||
| 153 | $val = 'null'; |
||
| 154 | break;
|
||
| 155 | case (is_bool($val)): |
||
| 156 | $val = ($val === true) ? 'true' : 'false'; |
||
| 157 | break;
|
||
| 158 | case (is_int($val)): |
||
| 159 | $val = $val; |
||
| 160 | break;
|
||
| 161 | case (is_float($val)): |
||
| 162 | $val = sprintf("%.11f", $val); |
||
| 163 | break;
|
||
| 164 | default:
|
||
| 165 | $val = $this->escape($val); |
||
| 166 | if ($quoteString) { |
||
| 167 | $val = '"' . $val . '"'; |
||
| 168 | } |
||
| 169 | } |
||
| 170 | return $val; |
||
| 171 | } |
||
| 172 | |||
| 173 | /**
|
||
| 174 | * Escape a string to be JSON friendly.
|
||
| 175 | *
|
||
| 176 | * List of escaped elements:
|
||
| 177 | *
|
||
| 178 | * - "\r" => '\n'
|
||
| 179 | * - "\n" => '\n'
|
||
| 180 | * - '"' => '\"'
|
||
| 181 | *
|
||
| 182 | * @param string $string String that needs to get escaped.
|
||
| 183 | * @return string Escaped string.
|
||
| 184 | */
|
||
| 185 | public function escape($string) { |
||
| 186 | return $this->_utf8ToHex($string); |
||
| 187 | } |
||
| 188 | |||
| 189 | /**
|
||
| 190 | * Encode a string into JSON. Converts and escapes necessary characters.
|
||
| 191 | *
|
||
| 192 | * @param string $string The string that needs to be utf8->hex encoded
|
||
| 193 | * @return void
|
||
| 194 | */
|
||
| 195 | protected function _utf8ToHex($string) { |
||
| 196 | $length = strlen($string); |
||
| 197 | $return = ''; |
||
| 198 | for ($i = 0; $i < $length; ++$i) { |
||
| 199 | $ord = ord($string{$i}); |
||
| 200 | switch (true) { |
||
| 201 | case $ord == 0x08: |
||
| 202 | $return .= '\b'; |
||
| 203 | break;
|
||
| 204 | case $ord == 0x09: |
||
| 205 | $return .= '\t'; |
||
| 206 | break;
|
||
| 207 | case $ord == 0x0A: |
||
| 208 | $return .= '\n'; |
||
| 209 | break;
|
||
| 210 | case $ord == 0x0C: |
||
| 211 | $return .= '\f'; |
||
| 212 | break;
|
||
| 213 | case $ord == 0x0D: |
||
| 214 | $return .= '\r'; |
||
| 215 | break;
|
||
| 216 | case $ord == 0x22: |
||
| 217 | case $ord == 0x2F: |
||
| 218 | case $ord == 0x5C: |
||
| 219 | $return .= '\\' . $string{$i}; |
||
| 220 | break;
|
||
| 221 | case (($ord >= 0x20) && ($ord <= 0x7F)): |
||
| 222 | $return .= $string{$i}; |
||
| 223 | break;
|
||
| 224 | case (($ord & 0xE0) == 0xC0): |
||
| 225 | if ($i + 1 >= $length) { |
||
| 226 | $i += 1; |
||
| 227 | $return .= '?'; |
||
| 228 | break;
|
||
| 229 | } |
||
| 230 | $charbits = $string{$i} . $string{$i + 1}; |
||
| 231 | $char = Multibyte::utf8($charbits); |
||
| 232 | $return .= sprintf('\u%04s', dechex($char[0])); |
||
| 233 | $i += 1; |
||
| 234 | break;
|
||
| 235 | case (($ord & 0xF0) == 0xE0): |
||
| 236 | if ($i + 2 >= $length) { |
||
| 237 | $i += 2; |
||
| 238 | $return .= '?'; |
||
| 239 | break;
|
||
| 240 | } |
||
| 241 | $charbits = $string{$i} . $string{$i + 1} . $string{$i + 2}; |
||
| 242 | $char = Multibyte::utf8($charbits); |
||
| 243 | $return .= sprintf('\u%04s', dechex($char[0])); |
||
| 244 | $i += 2; |
||
| 245 | break;
|
||
| 246 | case (($ord & 0xF8) == 0xF0): |
||
| 247 | if ($i + 3 >= $length) { |
||
| 248 | $i += 3; |
||
| 249 | $return .= '?'; |
||
| 250 | break;
|
||
| 251 | } |
||
| 252 | $charbits = $string{$i} . $string{$i + 1} . $string{$i + 2} . $string{$i + 3}; |
||
| 253 | $char = Multibyte::utf8($charbits); |
||
| 254 | $return .= sprintf('\u%04s', dechex($char[0])); |
||
| 255 | $i += 3; |
||
| 256 | break;
|
||
| 257 | case (($ord & 0xFC) == 0xF8): |
||
| 258 | if ($i + 4 >= $length) { |
||
| 259 | $i += 4; |
||
| 260 | $return .= '?'; |
||
| 261 | break;
|
||
| 262 | } |
||
| 263 | $charbits = $string{$i} . $string{$i + 1} . $string{$i + 2} . $string{$i + 3} . $string{$i + 4}; |
||
| 264 | $char = Multibyte::utf8($charbits); |
||
| 265 | $return .= sprintf('\u%04s', dechex($char[0])); |
||
| 266 | $i += 4; |
||
| 267 | break;
|
||
| 268 | case (($ord & 0xFE) == 0xFC): |
||
| 269 | if ($i + 5 >= $length) { |
||
| 270 | $i += 5; |
||
| 271 | $return .= '?'; |
||
| 272 | break;
|
||
| 273 | } |
||
| 274 | $charbits = $string{$i} . $string{$i + 1} . $string{$i + 2} . $string{$i + 3} . $string{$i + 4} . $string{$i + 5}; |
||
| 275 | $char = Multibyte::utf8($charbits); |
||
| 276 | $return .= sprintf('\u%04s', dechex($char[0])); |
||
| 277 | $i += 5; |
||
| 278 | break;
|
||
| 279 | } |
||
| 280 | } |
||
| 281 | return $return; |
||
| 282 | } |
||
| 283 | |||
| 284 | /**
|
||
| 285 | * Create javascript selector for a CSS rule
|
||
| 286 | *
|
||
| 287 | * @param string $selector The selector that is targeted
|
||
| 288 | * @return JsBaseEngineHelper instance of $this. Allows chained methods.
|
||
| 289 | */
|
||
| 290 | abstract public function get($selector); |
||
| 291 | |||
| 292 | /**
|
||
| 293 | * Add an event to the script cache. Operates on the currently selected elements.
|
||
| 294 | *
|
||
| 295 | * ### Options
|
||
| 296 | *
|
||
| 297 | * - `wrap` - Whether you want the callback wrapped in an anonymous function. (defaults to true)
|
||
| 298 | * - `stop` - Whether you want the event to stopped. (defaults to true)
|
||
| 299 | *
|
||
| 300 | * @param string $type Type of event to bind to the current dom id
|
||
| 301 | * @param string $callback The JavaScript function you wish to trigger or the function literal
|
||
| 302 | * @param array $options Options for the event.
|
||
| 303 | * @return string completed event handler
|
||
| 304 | */
|
||
| 305 | abstract public function event($type, $callback, $options = array()); |
||
| 306 | |||
| 307 | /**
|
||
| 308 | * Create a domReady event. This is a special event in many libraries
|
||
| 309 | *
|
||
| 310 | * @param string $functionBody The code to run on domReady
|
||
| 311 | * @return string completed domReady method
|
||
| 312 | */
|
||
| 313 | abstract public function domReady($functionBody); |
||
| 314 | |||
| 315 | /**
|
||
| 316 | * Create an iteration over the current selection result.
|
||
| 317 | *
|
||
| 318 | * @param string $callback The function body you wish to apply during the iteration.
|
||
| 319 | * @return string completed iteration
|
||
| 320 | */
|
||
| 321 | abstract public function each($callback); |
||
| 322 | |||
| 323 | /**
|
||
| 324 | * Trigger an Effect.
|
||
| 325 | *
|
||
| 326 | * ### Supported Effects
|
||
| 327 | *
|
||
| 328 | * The following effects are supported by all core JsEngines
|
||
| 329 | *
|
||
| 330 | * - `show` - reveal an element.
|
||
| 331 | * - `hide` - hide an element.
|
||
| 332 | * - `fadeIn` - Fade in an element.
|
||
| 333 | * - `fadeOut` - Fade out an element.
|
||
| 334 | * - `slideIn` - Slide an element in.
|
||
| 335 | * - `slideOut` - Slide an element out.
|
||
| 336 | *
|
||
| 337 | * ### Options
|
||
| 338 | *
|
||
| 339 | * - `speed` - Speed at which the animation should occur. Accepted values are 'slow', 'fast'. Not all effects use
|
||
| 340 | * the speed option.
|
||
| 341 | *
|
||
| 342 | * @param string $name The name of the effect to trigger.
|
||
| 343 | * @param array $options Array of options for the effect.
|
||
| 344 | * @return string completed string with effect.
|
||
| 345 | */
|
||
| 346 | abstract public function effect($name, $options = array()); |
||
| 347 | |||
| 348 | /**
|
||
| 349 | * Make an XHR request
|
||
| 350 | *
|
||
| 351 | * ### Event Options
|
||
| 352 | *
|
||
| 353 | * - `complete` - Callback to fire on complete.
|
||
| 354 | * - `success` - Callback to fire on success.
|
||
| 355 | * - `before` - Callback to fire on request initialization.
|
||
| 356 | * - `error` - Callback to fire on request failure.
|
||
| 357 | *
|
||
| 358 | * ### Options
|
||
| 359 | *
|
||
| 360 | * - `method` - The method to make the request with defaults to GET in more libraries
|
||
| 361 | * - `async` - Whether or not you want an asynchronous request.
|
||
| 362 | * - `data` - Additional data to send.
|
||
| 363 | * - `update` - Dom id to update with the content of the request.
|
||
| 364 | * - `type` - Data type for response. 'json' and 'html' are supported. Default is html for most libraries.
|
||
| 365 | * - `evalScripts` - Whether or not <script> tags should be eval'ed.
|
||
| 366 | * - `dataExpression` - Should the `data` key be treated as a callback. Useful for supplying `$options['data']` as
|
||
| 367 | * another JavaScript expression.
|
||
| 368 | *
|
||
| 369 | * @param string|array $url Array or String URL to target with the request.
|
||
| 370 | * @param array $options Array of options. See above for cross library supported options
|
||
| 371 | * @return string XHR request.
|
||
| 372 | */
|
||
| 373 | abstract public function request($url, $options = array()); |
||
| 374 | |||
| 375 | /**
|
||
| 376 | * Create a draggable element. Works on the currently selected element.
|
||
| 377 | * Additional options may be supported by the library implementation.
|
||
| 378 | *
|
||
| 379 | * ### Options
|
||
| 380 | *
|
||
| 381 | * - `handle` - selector to the handle element.
|
||
| 382 | * - `snapGrid` - The pixel grid that movement snaps to, an array(x, y)
|
||
| 383 | * - `container` - The element that acts as a bounding box for the draggable element.
|
||
| 384 | *
|
||
| 385 | * ### Event Options
|
||
| 386 | *
|
||
| 387 | * - `start` - Event fired when the drag starts
|
||
| 388 | * - `drag` - Event fired on every step of the drag
|
||
| 389 | * - `stop` - Event fired when dragging stops (mouse release)
|
||
| 390 | *
|
||
| 391 | * @param array $options Options array see above.
|
||
| 392 | * @return string Completed drag script
|
||
| 393 | */
|
||
| 394 | abstract public function drag($options = array()); |
||
| 395 | |||
| 396 | /**
|
||
| 397 | * Create a droppable element. Allows for draggable elements to be dropped on it.
|
||
| 398 | * Additional options may be supported by the library implementation.
|
||
| 399 | *
|
||
| 400 | * ### Options
|
||
| 401 | *
|
||
| 402 | * - `accept` - Selector for elements this droppable will accept.
|
||
| 403 | * - `hoverclass` - Class to add to droppable when a draggable is over.
|
||
| 404 | *
|
||
| 405 | * ### Event Options
|
||
| 406 | *
|
||
| 407 | * - `drop` - Event fired when an element is dropped into the drop zone.
|
||
| 408 | * - `hover` - Event fired when a drag enters a drop zone.
|
||
| 409 | * - `leave` - Event fired when a drag is removed from a drop zone without being dropped.
|
||
| 410 | *
|
||
| 411 | * @param array $options Array of options for the drop. See above.
|
||
| 412 | * @return string Completed drop script
|
||
| 413 | */
|
||
| 414 | abstract public function drop($options = array()); |
||
| 415 | |||
| 416 | /**
|
||
| 417 | * Create a sortable element.
|
||
| 418 | * Additional options may be supported by the library implementation.
|
||
| 419 | *
|
||
| 420 | * ### Options
|
||
| 421 | *
|
||
| 422 | * - `containment` - Container for move action
|
||
| 423 | * - `handle` - Selector to handle element. Only this element will start sort action.
|
||
| 424 | * - `revert` - Whether or not to use an effect to move sortable into final position.
|
||
| 425 | * - `opacity` - Opacity of the placeholder
|
||
| 426 | * - `distance` - Distance a sortable must be dragged before sorting starts.
|
||
| 427 | *
|
||
| 428 | * ### Event Options
|
||
| 429 | *
|
||
| 430 | * - `start` - Event fired when sorting starts
|
||
| 431 | * - `sort` - Event fired during sorting
|
||
| 432 | * - `complete` - Event fired when sorting completes.
|
||
| 433 | *
|
||
| 434 | * @param array $options Array of options for the sortable. See above.
|
||
| 435 | * @return string Completed sortable script.
|
||
| 436 | */
|
||
| 437 | abstract public function sortable($options = array()); |
||
| 438 | |||
| 439 | /**
|
||
| 440 | * Create a slider UI widget. Comprised of a track and knob.
|
||
| 441 | * Additional options may be supported by the library implementation.
|
||
| 442 | *
|
||
| 443 | * ### Options
|
||
| 444 | *
|
||
| 445 | * - `handle` - The id of the element used in sliding.
|
||
| 446 | * - `direction` - The direction of the slider either 'vertical' or 'horizontal'
|
||
| 447 | * - `min` - The min value for the slider.
|
||
| 448 | * - `max` - The max value for the slider.
|
||
| 449 | * - `step` - The number of steps or ticks the slider will have.
|
||
| 450 | * - `value` - The initial offset of the slider.
|
||
| 451 | *
|
||
| 452 | * ### Events
|
||
| 453 | *
|
||
| 454 | * - `change` - Fired when the slider's value is updated
|
||
| 455 | * - `complete` - Fired when the user stops sliding the handle
|
||
| 456 | *
|
||
| 457 | * @param array $options Array of options for the slider. See above.
|
||
| 458 | * @return string Completed slider script
|
||
| 459 | */
|
||
| 460 | abstract public function slider($options = array()); |
||
| 461 | |||
| 462 | /**
|
||
| 463 | * Serialize the form attached to $selector.
|
||
| 464 | * Pass `true` for $isForm if the current selection is a form element.
|
||
| 465 | * Converts the form or the form element attached to the current selection into a string/json object
|
||
| 466 | * (depending on the library implementation) for use with XHR operations.
|
||
| 467 | *
|
||
| 468 | * ### Options
|
||
| 469 | *
|
||
| 470 | * - `isForm` - is the current selection a form, or an input? (defaults to false)
|
||
| 471 | * - `inline` - is the rendered statement going to be used inside another JS statement? (defaults to false)
|
||
| 472 | *
|
||
| 473 | * @param array $options options for serialization generation.
|
||
| 474 | * @return string completed form serialization script
|
||
| 475 | */
|
||
| 476 | abstract public function serializeForm($options = array()); |
||
| 477 | |||
| 478 | /**
|
||
| 479 | * Parse an options assoc array into a JavaScript object literal.
|
||
| 480 | * Similar to object() but treats any non-integer value as a string,
|
||
| 481 | * does not include `{ }`
|
||
| 482 | *
|
||
| 483 | * @param array $options Options to be converted
|
||
| 484 | * @param array $safeKeys Keys that should not be escaped.
|
||
| 485 | * @return string Parsed JSON options without enclosing { }.
|
||
| 486 | */
|
||
| 487 | protected function _parseOptions($options, $safeKeys = array()) { |
||
| 488 | $out = array(); |
||
| 489 | $safeKeys = array_flip($safeKeys); |
||
| 490 | foreach ($options as $key => $value) { |
||
| 491 | if (!is_int($value) && !isset($safeKeys[$key])) { |
||
| 492 | $value = $this->value($value); |
||
| 493 | } |
||
| 494 | $out[] = $key . ':' . $value; |
||
| 495 | } |
||
| 496 | sort($out); |
||
| 497 | return implode(', ', $out); |
||
| 498 | } |
||
| 499 | |||
| 500 | /**
|
||
| 501 | * Maps Abstract options to engine specific option names.
|
||
| 502 | * If attributes are missing from the map, they are not changed.
|
||
| 503 | *
|
||
| 504 | * @param string $method Name of method whose options are being worked with.
|
||
| 505 | * @param array $options Array of options to map.
|
||
| 506 | * @return array Array of mapped options.
|
||
| 507 | */
|
||
| 508 | protected function _mapOptions($method, $options) { |
||
| 509 | if (!isset($this->_optionMap[$method])) { |
||
| 510 | return $options; |
||
| 511 | } |
||
| 512 | foreach ($this->_optionMap[$method] as $abstract => $concrete) { |
||
| 513 | if (isset($options[$abstract])) { |
||
| 514 | $options[$concrete] = $options[$abstract]; |
||
| 515 | unset($options[$abstract]); |
||
| 516 | } |
||
| 517 | } |
||
| 518 | return $options; |
||
| 519 | } |
||
| 520 | |||
| 521 | /**
|
||
| 522 | * Prepare callbacks and wrap them with function ([args]) { } as defined in
|
||
| 523 | * _callbackArgs array.
|
||
| 524 | *
|
||
| 525 | * @param string $method Name of the method you are preparing callbacks for.
|
||
| 526 | * @param array $options Array of options being parsed
|
||
| 527 | * @param array $callbacks Additional Keys that contain callbacks
|
||
| 528 | * @return array Array of options with callbacks added.
|
||
| 529 | */
|
||
| 530 | protected function _prepareCallbacks($method, $options, $callbacks = array()) { |
||
| 531 | $wrapCallbacks = true; |
||
| 532 | if (isset($options['wrapCallbacks'])) { |
||
| 533 | $wrapCallbacks = $options['wrapCallbacks']; |
||
| 534 | } |
||
| 535 | unset($options['wrapCallbacks']); |
||
| 536 | if (!$wrapCallbacks) { |
||
| 537 | return $options; |
||
| 538 | } |
||
| 539 | $callbackOptions = array(); |
||
| 540 | if (isset($this->_callbackArguments[$method])) { |
||
| 541 | $callbackOptions = $this->_callbackArguments[$method]; |
||
| 542 | } |
||
| 543 | $callbacks = array_unique(array_merge(array_keys($callbackOptions), (array)$callbacks)); |
||
| 544 | |||
| 545 | foreach ($callbacks as $callback) { |
||
| 546 | if (empty($options[$callback])) { |
||
| 547 | continue;
|
||
| 548 | } |
||
| 549 | $args = null; |
||
| 550 | if (!empty($callbackOptions[$callback])) { |
||
| 551 | $args = $callbackOptions[$callback]; |
||
| 552 | } |
||
| 553 | $options[$callback] = 'function (' . $args . ') {' . $options[$callback] . '}'; |
||
| 554 | } |
||
| 555 | return $options; |
||
| 556 | } |
||
| 557 | |||
| 558 | /**
|
||
| 559 | * Convenience wrapper method for all common option processing steps.
|
||
| 560 | * Runs _mapOptions, _prepareCallbacks, and _parseOptions in order.
|
||
| 561 | *
|
||
| 562 | * @param string $method Name of method processing options for.
|
||
| 563 | * @param array $options Array of options to process.
|
||
| 564 | * @return string Parsed options string.
|
||
| 565 | */
|
||
| 566 | protected function _processOptions($method, $options) { |
||
| 567 | $options = $this->_mapOptions($method, $options); |
||
| 568 | $options = $this->_prepareCallbacks($method, $options); |
||
| 569 | $options = $this->_parseOptions($options, array_keys($this->_callbackArguments[$method])); |
||
| 570 | return $options; |
||
| 571 | } |
||
| 572 | |||
| 573 | /**
|
||
| 574 | * Convert an array of data into a query string
|
||
| 575 | *
|
||
| 576 | * @param array $parameters Array of parameters to convert to a query string
|
||
| 577 | * @return string Querystring fragment
|
||
| 578 | */
|
||
| 579 | protected function _toQuerystring($parameters) { |
||
| 580 | $out = ''; |
||
| 581 | $keys = array_keys($parameters); |
||
| 582 | $count = count($parameters); |
||
| 583 | for ($i = 0; $i < $count; $i++) { |
||
| 584 | $out .= $keys[$i] . '=' . $parameters[$keys[$i]]; |
||
| 585 | if ($i < $count - 1) { |
||
| 586 | $out .= '&'; |
||
| 587 | } |
||
| 588 | } |
||
| 589 | return $out; |
||
| 590 | } |
||
| 591 | |||
| 592 | } |