--- tests/ZendX/JQuery/View/AjaxLinkTest.php (revision 24246) +++ tests/ZendX/JQuery/View/AjaxLinkTest.php (working copy) @@ -96,24 +96,24 @@ $link = $this->view->ajaxLink("Link to Inject", "inject.html", array('update' => '#test', 'inline' => true, 'beforeSend' => 'hide')); $this->assertContains('$j.get', $link); - $this->assertContains("\$j('#test')", $link); + $this->assertContains('$j("#test")', $link); $this->assertContains('$j(this).hide', $link); } public function testShouldAllowSwitchUpdateDataFunc() { $link = $this->view->ajaxLink("Link to Inject", "inject.html", array('update' => '#test', 'inline' => true, 'dataType' => 'text')); - $this->assertContains("('#test').text(data);", $link); + $this->assertContains('("#test").text(data);', $link); } static public function dataBeforeSendEffects() { return array( - array('hide', "hide();"), - array('hideslow', "hide('slow');"), - array('hidefast', "hide('fast');"), - array('fadeout', "fadeOut();"), - array('fadeoutslow', "fadeOut('slow');"), - array('fadeoutfast', "fadeOut('fast');"), + array('hide', 'hide();'), + array('hideslow', 'hide("slow");'), + array('hidefast', 'hide("fast");'), + array('fadeout', 'fadeOut();'), + array('fadeoutslow', 'fadeOut("slow");'), + array('fadeoutfast', 'fadeOut("fast");'), array('slideup', "slideUp(1000);"), ); } @@ -138,15 +138,15 @@ { return array( array('show', 'show();'), - array('showslow', "show('slow');"), - array('showfast', "show('fast');"), - array('shownormal', "show('normal');"), - array('fadein', "fadeIn('normal');"), - array('fadeinslow', "fadeIn('slow');"), - array('fadeinfast', "fadeIn('fast');"), - array('slidedown', "slideDown('normal');"), - array('slidedownslow', "slideDown('slow');"), - array('slidedownfast', "slideDown('fast');"), + array('showslow', 'show("slow");'), + array('showfast', 'show("fast");'), + array('shownormal', 'show("normal");'), + array('fadein', 'fadeIn("normal");'), + array('fadeinslow', 'fadeIn("slow");'), + array('fadeinfast', 'fadeIn("fast");'), + array('slidedown', 'slideDown("normal");'), + array('slidedownslow', 'slideDown("slow");'), + array('slidedownfast', 'slideDown("fast");'), ); } @@ -158,12 +158,12 @@ public function testShouldAllowUsingCompleteEffects($effect, $js) { $link = $this->view->ajaxLink("Link to Inject", "inject.html", array('update' => '#test', 'inline' => true, 'complete' => $effect)); - $this->assertContains(sprintf("$('#test').%s", $js), $link); + $this->assertContains(sprintf('$("#test").%s', $js), $link); ZendX_JQuery_View_Helper_JQuery::enableNoConflictMode(); $link = $this->view->ajaxLink("Link to Inject", "inject.html", array('update' => '#test', 'inline' => true, 'complete' => $effect)); - $this->assertContains(sprintf("\$j('#test').%s", $js), $link); + $this->assertContains(sprintf('$j("#test").%s', $js), $link); } public function testOptionsArrayAllowsForSettingAttributes() { @@ -226,4 +226,21 @@ $this->assertNotContains("'/some/url'", $html); $this->assertNotContains("'json'", $html); } + + /** @group ZF-9926 */ + public function testSingleQuotesAreEscapedInJsInlineLinks() + { + $view = $this->getView(); + + $html = $view->ajaxLink('Label1', '/some/url', array( + 'method' => 'post', + 'dataType' => 'json', + 'noscript' => true, + 'beforeSend' => "if(!confirm('Are you sure?')) {return false;}$('#progress-bar').show();", + 'complete' => '$("#progress-bar").hide();', + 'inline' => true + )); + + $this->assertContains('"Are you sure?"', $html); + } } Index: library/ZendX/JQuery/View/Helper/AjaxLink.php =================================================================== --- library/ZendX/JQuery/View/Helper/AjaxLink.php (revision 24246) +++ library/ZendX/JQuery/View/Helper/AjaxLink.php (working copy) @@ -153,34 +153,34 @@ if(!empty($callbacks['complete'])) { switch(strtolower($callbacks['complete'])) { case 'show': - $callbacks['complete'] = sprintf("%s('%s').show();", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").show();', $jqHandler, $updateContainer); break; case 'showslow': - $callbacks['complete'] = sprintf("%s('%s').show('slow');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").show("slow");', $jqHandler, $updateContainer); break; case 'shownormal': - $callbacks['complete'] = sprintf("%s('%s').show('normal');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").show("normal");', $jqHandler, $updateContainer); break; case 'showfast': - $callbacks['complete'] = sprintf("%s('%s').show('fast');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").show("fast");', $jqHandler, $updateContainer); break; case 'fadein': - $callbacks['complete'] = sprintf("%s('%s').fadeIn('normal');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").fadeIn("normal");', $jqHandler, $updateContainer); break; case 'fadeinslow': - $callbacks['complete'] = sprintf("%s('%s').fadeIn('slow');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").fadeIn("slow");', $jqHandler, $updateContainer); break; case 'fadeinfast': - $callbacks['complete'] = sprintf("%s('%s').fadeIn('fast');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").fadeIn("fast");', $jqHandler, $updateContainer); break; case 'slidedown': - $callbacks['complete'] = sprintf("%s('%s').slideDown('normal');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").slideDown("normal");', $jqHandler, $updateContainer); break; case 'slidedownslow': - $callbacks['complete'] = sprintf("%s('%s').slideDown('slow');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").slideDown("slow");', $jqHandler, $updateContainer); break; case 'slidedownfast': - $callbacks['complete'] = sprintf("%s('%s').slideDown('fast');", $jqHandler, $updateContainer); + $callbacks['complete'] = sprintf('%s("%s").slideDown("fast");', $jqHandler, $updateContainer); break; } } @@ -195,9 +195,9 @@ $callbackCompleteJs = array(); if($updateContainer != false) { if($options['dataType'] == "text") { - $callbackCompleteJs[] = sprintf("%s('%s').text(data);", $jqHandler, $updateContainer); + $callbackCompleteJs[] = sprintf('%s("%s").text(data);', $jqHandler, $updateContainer); } else { - $callbackCompleteJs[] = sprintf("%s('%s').html(data);", $jqHandler, $updateContainer); + $callbackCompleteJs[] = sprintf('%s("%s").html(data);', $jqHandler, $updateContainer); } } if($callbacks['complete'] != null) { @@ -214,25 +214,25 @@ if($callbacks['beforeSend'] != null) { switch(strtolower($callbacks['beforeSend'])) { case 'fadeout': - $js[] = sprintf("%s(this).fadeOut();", $jqHandler); + $js[] = sprintf('%s(this).fadeOut();', $jqHandler); break; case 'fadeoutslow': - $js[] = sprintf("%s(this).fadeOut('slow');", $jqHandler); + $js[] = sprintf('%s(this).fadeOut("slow");', $jqHandler); break; case 'fadeoutfast': - $js[] = sprintf("%s(this).fadeOut('fast');", $jqHandler); + $js[] = sprintf('%s(this).fadeOut("fast");', $jqHandler); break; case 'hide': - $js[] = sprintf("%s(this).hide();", $jqHandler); + $js[] = sprintf('%s(this).hide();', $jqHandler); break; case 'hideslow': - $js[] = sprintf("%s(this).hide('slow');", $jqHandler); + $js[] = sprintf('%s(this).hide("slow");', $jqHandler); break; case 'hidefast': - $js[] = sprintf("%s(this).hide('fast');", $jqHandler); + $js[] = sprintf('%s(this).hide("fast");', $jqHandler); break; case 'slideup': - $js[] = sprintf("%s(this).slideUp(1000);", $jqHandler); + $js[] = sprintf('%s(this).slideUp(1000);', $jqHandler); break; default: $js[] = $callbacks['beforeSend']; @@ -243,27 +243,27 @@ switch($requestHandler) { case 'GET': $js[] = sprintf('%s.get("%s", %s, function(data, textStatus) { %s }, "%s");return false;', - $jqHandler, $url, $params, implode(" ", $callbackCompleteJs), $options['dataType']); + $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']); + $jqHandler, $url, $params, implode(' ', $callbackCompleteJs), $options['dataType']); break; } $js = implode($js); if($inline == true) { - $attribs['onclick'] = $js; + $attribs['onclick'] = str_replace("'", """, $js); // Escape single quotes in inline 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); + $onLoad = sprintf('%s("a.%s").click(function() { %s });', $jqHandler, $clickClass, $js); } else { - $onLoad = sprintf("%s('a#%s').click(function() { %s });", $jqHandler, $attribs['id'], $js); + $onLoad = sprintf('%s("a#%s").click(function() { %s });', $jqHandler, $attribs['id'], $js); } $jquery->addOnLoad($onLoad);