/** * Create an anchor that enables ajax-based requests and handling of the response. * * This helper creates links that make XmlHttpRequests to the server. It allows to * inject the response into the DOM. Fancy effects going with the links can be enabled * via simple callback shortnames. The functionality is mostly controlled by the $options * array: * * $options * Key Behaviour * ================================================================================= * 'update' Update a container with the content fetched from $url * 'method' Explicit Requesting method mimicing the jQuery functionality: GET, POST * 'inline' True or false, wheater to inline the javascript in onClick="" * atttribute or append it to jQuery onLoad Stack. * 'complete' String specifies javascript called after successful request or a * shortname of a jQuery effect that should be applied to the 'update' element. * 'beforeSend' String specifies javascript called before the request is sent, or a * shortname of a jQuery effect that should be applied to the link clicked. * 'noscript' True/false, include a noscript variant that directly requests * the given $url (make sure to check $request->isXmlHttpRequest()) * 'dataType' What type of data is the response returning? text, html, json? * 'title' HTML Attribute title of the Anchor * 'class' HTML Attribute class of the Anchor * 'id' HTML Attribute id of the Anchor * 'attribs' Array of Key-Value pairs with HTML Attribute names and their content. * * BeforeSend Callback: * Can include shortcuts as a string assignment to fire of effects before sending of request. * Possible shortcuts are 'fadeOut', 'fadeOutSlow', 'hide', 'hideSlow', 'slideUp', 'flash', * @example $options = array('beforeSend' => 'hideSlow', 'complete' => 'show'); * * @link http://docs.jquery.com/Ajax * @param String $label Urls Title * @param String $url Link to Point to * @param Array $options * @param Array $params Key Value Pairs of GET/POST Parameters * @return String */ public function ajaxLink($label, $url, $options = null, $params = null) { $jquery = $this->view->jQuery(); $jquery->enable(); $jqHandler = ZendX_JQuery_View_Helper_JQuery::getNoConflictMode() == true ? '$j' : '$'; $attribs = array(); if (isset($options['attribs']) && is_array($options['attribs'])) { $attribs = $options['attribs']; } // // The next following 4 conditions check for html attributes that the link might need // if (empty($options['noscript']) || $options['noscript'] == false) { $attribs['href'] = "#"; } else { $attribs['href'] = $url; } if (!empty($options['title'])) { $attribs['title'] = $options['title']; } // class value is an array because the jQuery CSS selector // click event needs its own classname later on if (!isset($attribs['class'])) { $attribs['class'] = array(); } elseif (is_string($attribs['class'])) { $attribs['class'] = explode(" ", $attribs['class']); } if (!empty($options['class'])) { $attribs['class'][] = $options['class']; } if (!empty($options['id'])) { $attribs['id'] = $options['id']; } // // Execute Javascript inline? // $inline = false; if (!empty($options['inline']) && $options['inline'] == true) { $inline = true; } // // Detect the callbacks: // Just those two callbacks, beforeSend and complete can be defined for the $.get and $.post options. // Pick all the defined callbacks and put them on their respective stacks. // $callbacks = array('beforeSend' => null, 'complete' => null); if (isset($options['beforeSend'])) { $callbacks['beforeSend'] = $options['beforeSend']; } if (isset($options['complete'])) { $callbacks['complete'] = $options['complete']; } $updateContainer = false; if (!empty($options['update']) && is_string($options['update'])) { $updateContainer = $options['update']; // Additionally check if there is a callback complete that is a shortcut to be executed // on the specified update container if (!empty($callbacks['complete'])) { switch (strtolower($callbacks['complete'])) { case 'show': $callbacks['complete'] = sprintf('%s("%s").show();', $jqHandler, $updateContainer); break; case 'showslow': $callbacks['complete'] = sprintf('%s("%s").show("slow");', $jqHandler, $updateContainer); break; case 'shownormal': $callbacks['complete'] = sprintf('%s("%s").show("normal");', $jqHandler, $updateContainer); break; case 'showfast': $callbacks['complete'] = sprintf('%s("%s").show("fast");', $jqHandler, $updateContainer); break; case 'fadein': $callbacks['complete'] = sprintf('%s("%s").fadeIn("normal");', $jqHandler, $updateContainer); break; case 'fadeinslow': $callbacks['complete'] = sprintf('%s("%s").fadeIn("slow");', $jqHandler, $updateContainer); break; case 'fadeinfast': $callbacks['complete'] = sprintf('%s("%s").fadeIn("fast");', $jqHandler, $updateContainer); break; case 'slidedown': $callbacks['complete'] = sprintf('%s("%s").slideDown("normal");', $jqHandler, $updateContainer); break; case 'slidedownslow': $callbacks['complete'] = sprintf('%s("%s").slideDown("slow");', $jqHandler, $updateContainer); break; case 'slidedownfast': $callbacks['complete'] = sprintf('%s("%s").slideDown("fast");', $jqHandler, $updateContainer); break; } } } if (empty($options['dataType'])) { $options['dataType'] = "html"; } $requestHandler = $this->_determineRequestHandler($options, count($params) > 0 ? true : false); $callbackCompleteJs = array(); if ($updateContainer != false) { if ($options['dataType'] == "text") { $callbackCompleteJs[] = sprintf('%s("%s").text(data);', $jqHandler, $updateContainer); } else { $callbackCompleteJs[] = sprintf('%s("%s").html(data);', $jqHandler, $updateContainer); } } if ($callbacks['complete'] != null) { $callbackCompleteJs[] = $callbacks['complete']; } if (isset($params) && count($params) > 0) { $params = ZendX_JQuery::encodeJson($params); } else { $params = '{}'; } $js = array(); if ($callbacks['beforeSend'] != null) { switch (strtolower($callbacks['beforeSend'])) { case 'fadeout': $js[] = sprintf('%s(this).fadeOut();', $jqHandler); break; case 'fadeoutslow': $js[] = sprintf('%s(this).fadeOut("slow");', $jqHandler); break; case 'fadeoutfast': $js[] = sprintf('%s(this).fadeOut("fast");', $jqHandler); break; case 'hide': $js[] = sprintf('%s(this).hide();', $jqHandler); break; case 'hideslow': $js[] = sprintf('%s(this).hide("slow");', $jqHandler); break; case 'hidefast': $js[] = sprintf('%s(this).hide("fast");', $jqHandler); break; case 'slideup': $js[] = sprintf('%s(this).slideUp(1000);', $jqHandler); break; default: $js[] = $callbacks['beforeSend']; break; } } switch ($requestHandler) { case 'GET': $js[] = sprintf('%s.get("%s", %s, function(data, textStatus) { %s }, "%s");return false;', $jqHandler, $url, $params, implode(' ', $callbackCompleteJs), $options['dataType']); break; case 'POST': $js[] = sprintf('%s.post("%s", %s, function(data, textStatus) { %s }, "%s");return false;', $jqHandler, $url, $params, implode(' ', $callbackCompleteJs), $options['dataType']); break; } $js = implode($js); if ($inline == true) { $attribs['onclick'] = $js; } else { if (!isset($attribs['id'])) { $clickClass = sprintf("ajaxLink%d", ZendX_JQuery_View_Helper_AjaxLink::$currentLinkCallbackId); ZendX_JQuery_View_Helper_AjaxLink::$currentLinkCallbackId++; $attribs['class'][] = $clickClass; $onLoad = sprintf('%s("a.%s").click(function() { %s });', $jqHandler, $clickClass, $js); } else { $onLoad = sprintf('%s("a#%s").click(function() { %s });', $jqHandler, $attribs['id'], $js); } $jquery->addOnLoad($onLoad); } if (count($attribs['class']) > 0) { $attribs['class'] = implode(" ", $attribs['class']); } else { unset($attribs['class']); } $html = '<a' . $this->_htmlAttribs($attribs) . '>' . $label . '</a>'; return $html; }
public function testNoConflictShouldBeDisabledDefault() { $this->assertFalse(ZendX_JQuery_View_Helper_JQuery::getNoConflictMode()); }
/** * Renders all javascript code related stuff of the jQuery enviroment. * * @return string */ protected function _renderExtras() { $onLoadActions = array(); if (($this->getRenderMode() & ZendX_JQuery::RENDER_JQUERY_ON_LOAD) > 0) { foreach ($this->getOnLoadActions() as $callback) { $onLoadActions[] = $callback; } } $javascript = ''; if (($this->getRenderMode() & ZendX_JQuery::RENDER_JAVASCRIPT) > 0) { $javascript = implode("\n ", $this->getJavascript()); } $content = ''; if (!empty($onLoadActions)) { if (ZendX_JQuery_View_Helper_JQuery::getNoConflictMode() == true) { $content .= '$j(document).ready(function() {' . "\n "; } else { $content .= '$(document).ready(function() {' . "\n "; } $content .= implode("\n ", $onLoadActions) . "\n"; $content .= '});' . "\n"; } if (!empty($javascript)) { $content .= $javascript . "\n"; } if (preg_match('/^\\s*$/s', $content)) { return ''; } $html = '<script type="text/javascript">' . PHP_EOL . ($this->_isXhtml ? '//<![CDATA[' : '//<!--') . PHP_EOL . $content . ($this->_isXhtml ? '//]]>' : '//-->') . PHP_EOL . PHP_EOL . '</script>'; return $html; }
public function testOptionsArePassedOn() { $options = array('noconflictmode' => true, 'version' => '1.2.3', 'localpath' => '/foo/bar/', 'ui_version' => '2.3.4', 'uilocalpath' => '/bar/foo/', 'cdn_ssl' => true, 'rendermode' => 192, 'javascriptfile' => '/fooBar.js', 'javascriptfiles' => array('johndoe.js', 'janedoe.js'), 'stylesheet' => '/fooBar.css', 'stylesheets' => array('johndoe.css', 'janedoe.css')); $this->bootstrap->registerPluginResource('view'); $resource = new ZendX_Application_Resource_Jquery(array()); $resource->setBootstrap($this->bootstrap); $resource->setOptions($options); $res = $resource->init(); $this->assertTrue(ZendX_JQuery_View_Helper_JQuery::getNoConflictMode()); $this->assertEquals('1.2.3', $res->getVersion()); $this->assertEquals('/foo/bar/', $res->getLocalPath()); $this->assertEquals('2.3.4', $res->getUiVersion()); $this->assertEquals('/bar/foo/', $res->getUiLocalPath()); $this->assertTrue($res->getCdnSsl()); $this->assertEquals(192, $res->getRenderMode()); $this->assertEquals(array('/fooBar.css', 'johndoe.css', 'janedoe.css'), $res->getStylesheets()); $this->assertEquals(array('/fooBar.js', 'johndoe.js', 'janedoe.js'), $res->getJavascriptFiles()); }