From 18be1418cde865210dcb6fa52b7be1720880b6c5 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sun, 9 Aug 2009 17:32:29 -0400 Subject: [PATCH 1/7] Adding ability to inject an ajax provider class into paginator helper. updating tests. --- cake/libs/view/helpers/paginator.php | 26 +++++++++++++++++-- .../libs/view/helpers/paginator.test.php | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/cake/libs/view/helpers/paginator.php b/cake/libs/view/helpers/paginator.php index fae687ae6..33afa5beb 100644 --- a/cake/libs/view/helpers/paginator.php +++ b/cake/libs/view/helpers/paginator.php @@ -33,7 +33,7 @@ class PaginatorHelper extends AppHelper { * * @var array */ - var $helpers = array('Html', 'Ajax'); + var $helpers = array('Html'); /** * Holds the default model for paged recordsets @@ -42,6 +42,13 @@ class PaginatorHelper extends AppHelper { */ var $__defaultModel = null; +/** + * The class used for 'Ajax' pagination links. + * + * @var string + **/ + var $_ajaxHelperClass = 'Js'; + /** * Holds the default options for pagination links * @@ -66,6 +73,21 @@ class PaginatorHelper extends AppHelper { */ var $options = array(); +/** + * Constructor for the helper. Sets up the helper that is used for creating 'AJAX' links. + * + * Use `var $helpers = array('Paginator' => array('ajax' => 'CustomHelper'));` to set a custom Helper + * or choose a non JsHelper Helper. If you want to use a specific library with JsHelper declare JsHelper and its + * adapter before including PaginatorHelper in your helpers array. + * + * @return void + **/ + function __construct($config = array()) { + $ajaxProvider = isset($config['ajax']) ? $config['ajax'] : 'Js'; + $this->helpers[] = $ajaxProvider; + $this->_ajaxHelperClass = $ajaxProvider; + } + /** * Gets the current paging parameters from the resultset for the given model * @@ -271,7 +293,7 @@ class PaginatorHelper extends AppHelper { } $url = $this->url($url, true, $model); - $obj = isset($options['update']) ? 'Ajax' : 'Html'; + $obj = isset($options['update']) ? $this->_ajaxHelperClass : 'Html'; $url = array_merge(array('page' => $this->current($model)), $url); $url = array_merge(Set::filter($url, true), array_intersect_key($url, array('plugin'=>true))); return $this->{$obj}->link($title, $url, $options); diff --git a/cake/tests/cases/libs/view/helpers/paginator.test.php b/cake/tests/cases/libs/view/helpers/paginator.test.php index 329328ae8..857e7a1d4 100644 --- a/cake/tests/cases/libs/view/helpers/paginator.test.php +++ b/cake/tests/cases/libs/view/helpers/paginator.test.php @@ -42,7 +42,7 @@ class PaginatorHelperTest extends CakeTestCase { * @return void */ function setUp() { - $this->Paginator = new PaginatorHelper(); + $this->Paginator = new PaginatorHelper(array('ajax' => 'Ajax')); $this->Paginator->params['paging'] = array( 'Article' => array( 'current' => 9, From 48e0e951ec439e14245606c9922100b5d1b471a9 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sun, 9 Aug 2009 17:53:18 -0400 Subject: [PATCH 2/7] Adding tests to test arbitrary class injection. --- .../libs/view/helpers/paginator.test.php | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/cake/tests/cases/libs/view/helpers/paginator.test.php b/cake/tests/cases/libs/view/helpers/paginator.test.php index 857e7a1d4..4f958bf44 100644 --- a/cake/tests/cases/libs/view/helpers/paginator.test.php +++ b/cake/tests/cases/libs/view/helpers/paginator.test.php @@ -25,7 +25,9 @@ * @lastmodified $Date$ * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License */ -App::import('Helper', array('Html', 'Paginator', 'Form', 'Ajax', 'Javascript')); +App::import('Helper', array('Html', 'Paginator', 'Form', 'Ajax', 'Javascript', 'Js')); + +Mock::generate('JsHelper', 'PaginatorMockJsHelper'); /** * PaginatorHelperTest class @@ -1613,5 +1615,28 @@ class PaginatorHelperTest extends CakeTestCase { ); $this->assertTags($result, $expected); } + +/** + * test that mock classes injected into paginatorHelper are called when using link() + * + * @return void + **/ + function testMockAjaxProviderClassInjection() { + $Paginator =& new PaginatorHelper(array('ajax' => 'PaginatorMockJs')); + $Paginator->params['paging'] = array( + 'Article' => array( + 'current' => 9, + 'count' => 62, + 'prevPage' => false, + 'nextPage' => true, + 'pageCount' => 7, + 'defaults' => array(), + 'options' => array() + ) + ); + $Paginator->PaginatorMockJs =& new PaginatorMockJsHelper(); + $Paginator->PaginatorMockJs->expectOnce('link'); + $result = $Paginator->link('Page 2', array('page' => 2), array('update' => '#content')); + } } ?> \ No newline at end of file From 4e6aa35155b0756cbd23e1deb802535739025823 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sun, 9 Aug 2009 19:51:11 -0400 Subject: [PATCH 3/7] Adding warning errors when an incompatible class is used. --- cake/libs/view/helpers/paginator.php | 9 +++++++++ cake/tests/cases/libs/view/helpers/paginator.test.php | 3 +++ 2 files changed, 12 insertions(+) diff --git a/cake/libs/view/helpers/paginator.php b/cake/libs/view/helpers/paginator.php index 33afa5beb..a6872faa8 100644 --- a/cake/libs/view/helpers/paginator.php +++ b/cake/libs/view/helpers/paginator.php @@ -80,12 +80,21 @@ class PaginatorHelper extends AppHelper { * or choose a non JsHelper Helper. If you want to use a specific library with JsHelper declare JsHelper and its * adapter before including PaginatorHelper in your helpers array. * + * The chosen custom helper must implement a `link()` method. + * * @return void **/ function __construct($config = array()) { $ajaxProvider = isset($config['ajax']) ? $config['ajax'] : 'Js'; $this->helpers[] = $ajaxProvider; $this->_ajaxHelperClass = $ajaxProvider; + if (!method_exists($ajaxProvider . 'Helper', 'link')) { + $message = sprintf( + __('%s does not implement a link() method, it is incompatible with PaginatorHelper', true), + $ajaxProvider . 'Helper' + ); + trigger_error($message, E_USER_WARNING); + } } /** diff --git a/cake/tests/cases/libs/view/helpers/paginator.test.php b/cake/tests/cases/libs/view/helpers/paginator.test.php index 4f958bf44..c197f1f95 100644 --- a/cake/tests/cases/libs/view/helpers/paginator.test.php +++ b/cake/tests/cases/libs/view/helpers/paginator.test.php @@ -1637,6 +1637,9 @@ class PaginatorHelperTest extends CakeTestCase { $Paginator->PaginatorMockJs =& new PaginatorMockJsHelper(); $Paginator->PaginatorMockJs->expectOnce('link'); $result = $Paginator->link('Page 2', array('page' => 2), array('update' => '#content')); + + $this->expectError(); + $Paginator =& new PaginatorHelper(array('ajax' => 'Form')); } } ?> \ No newline at end of file From 856392e916474c11f439964b500ed67cea81b2f8 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sun, 9 Aug 2009 20:51:59 -0400 Subject: [PATCH 4/7] Fixing method dispatching errors in JsHelper with regards to Object::object, and PHP4 workarounds. --- cake/libs/view/helpers/js.php | 16 +++++++++++++++- cake/tests/cases/libs/view/helpers/js.test.php | 11 +++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cake/libs/view/helpers/js.php b/cake/libs/view/helpers/js.php index a44f2bb1d..3073e7287 100644 --- a/cake/libs/view/helpers/js.php +++ b/cake/libs/view/helpers/js.php @@ -115,7 +115,7 @@ class JsHelper extends AppHelper { * @param string $method Method to be called * @param array $params Parameters for the method being called. * @access public - * @return mixed + * @return mixed Depends on the return of the dispatched method, or it could be an instance of the EngineHelper **/ function call__($method, $params) { if (isset($this->{$this->__engineName}) && method_exists($this->{$this->__engineName}, $method)) { @@ -150,6 +150,20 @@ class JsHelper extends AppHelper { trigger_error(sprintf(__('JsHelper:: Missing Method %s is undefined', true), $method), E_USER_WARNING); } +/** + * Workaround for Object::Object() existing. Since Object::object exists, it does not + * fall into call__ and is not passed onto the engine helper. See JsBaseEngineHelper::object() for + * more information on this method. + * + * @param mixed $data Data to convert into JSON + * @param array $options Options to use for encoding JSON. See JsBaseEngineHelper::object() for more details. + * @return string encoded JSON + * @deprecated Remove when support for PHP4 and Object::object are removed. + **/ + function object($data = array(), $options = array()) { + return $this->{$this->__engineName}->object($data, $options); + } + /** * Writes all Javascript generated so far to a code block or * caches them to a file and returns a linked script. diff --git a/cake/tests/cases/libs/view/helpers/js.test.php b/cake/tests/cases/libs/view/helpers/js.test.php index ee87727bf..6dd5bce15 100644 --- a/cake/tests/cases/libs/view/helpers/js.test.php +++ b/cake/tests/cases/libs/view/helpers/js.test.php @@ -415,6 +415,17 @@ CODE; ); $this->assertTags($result, $expected); } + +/** + * Test that Object::Object() is not breaking json output in JsHelper + * + * @return void + **/ + function testObjectPassThrough() { + $result = $this->Js->object(array('one' => 'first', 'two' => 'second')); + $expected = '{"one":"first","two":"second"}'; + $this->assertEqual($result, $expected); + } } From 6b575673f7a42c38e73bd52d80507f40306f6bc6 Mon Sep 17 00:00:00 2001 From: mark_story Date: Tue, 11 Aug 2009 23:33:41 -0400 Subject: [PATCH 5/7] Updating doc block. --- cake/libs/view/helpers/js.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cake/libs/view/helpers/js.php b/cake/libs/view/helpers/js.php index 3073e7287..5b2a61ff6 100644 --- a/cake/libs/view/helpers/js.php +++ b/cake/libs/view/helpers/js.php @@ -215,7 +215,7 @@ class JsHelper extends AppHelper { /** * Get all the cached scripts * - * @param boolean $clear Whether or not to clear the script caches + * @param boolean $clear Whether or not to clear the script caches (default true) * @return array Array of scripts added to the request. **/ function getBuffer($clear = true) { From c02a8faebd85381bfa61eb6f24db0c7c0ab31369 Mon Sep 17 00:00:00 2001 From: mark_story Date: Wed, 12 Aug 2009 09:24:23 -0400 Subject: [PATCH 6/7] Applying patch from 'evilbloodydemon'. Fixes JqueryEngine::request() when wrapCallbacks is true. Test cases added. Fixes #20 --- cake/libs/view/helpers/jquery_engine.php | 8 +++++++- .../cases/libs/view/helpers/jquery_engine.test.php | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cake/libs/view/helpers/jquery_engine.php b/cake/libs/view/helpers/jquery_engine.php index 476327b91..407eca62b 100644 --- a/cake/libs/view/helpers/jquery_engine.php +++ b/cake/libs/view/helpers/jquery_engine.php @@ -240,7 +240,13 @@ class JqueryEngineHelper extends JsBaseEngineHelper { } $options['url'] = $url; if (isset($options['update'])) { - $options['success'] = 'function (msg, status) {$("' . $options['update'] . '").html(msg);}'; + $wrapCallbacks = isset($options['wrapCallbacks']) ? $options['wrapCallbacks'] : true; + if ($wrapCallbacks) { + $success = '$("' . $options['update'] . '").html(data);'; + } else { + $success = 'function (data, textStatus) {$("' . $options['update'] . '").html(data);}'; + } + $options['success'] = $success; unset($options['update']); } $callbacks = array('success', 'error', 'beforeSend', 'complete'); diff --git a/cake/tests/cases/libs/view/helpers/jquery_engine.test.php b/cake/tests/cases/libs/view/helpers/jquery_engine.test.php index 65194a7df..0313f23d5 100644 --- a/cake/tests/cases/libs/view/helpers/jquery_engine.test.php +++ b/cake/tests/cases/libs/view/helpers/jquery_engine.test.php @@ -160,6 +160,12 @@ class JqueryEngineHelperTestCase extends CakeTestCase { $expected = '$.ajax({url:"\\/posts\\/view\\/1"});'; $this->assertEqual($result, $expected); + $result = $this->Jquery->request(array('controller' => 'posts', 'action' => 'view', 1), array( + 'update' => '#content' + )); + $expected = '$.ajax({success:function (data, textStatus) {$("#content").html(data);}, url:"\/posts\/view\/1"});'; + $this->assertEqual($result, $expected); + $result = $this->Jquery->request('/people/edit/1', array( 'method' => 'post', 'before' => 'doBefore', @@ -179,7 +185,7 @@ class JqueryEngineHelperTestCase extends CakeTestCase { 'method' => 'post', 'wrapCallbacks' => false )); - $expected = '$.ajax({success:function (msg, status) {$("#updated").html(msg);}, type:"post", url:"\\/people\\/edit\\/1"});'; + $expected = '$.ajax({success:function (data, textStatus) {$("#updated").html(data);}, type:"post", url:"\\/people\\/edit\\/1"});'; $this->assertEqual($result, $expected); $result = $this->Jquery->request('/people/edit/1', array( @@ -190,7 +196,7 @@ class JqueryEngineHelperTestCase extends CakeTestCase { 'data' => '$("#someId").serialize()', 'wrapCallbacks' => false )); - $expected = '$.ajax({data:$("#someId").serialize(), success:function (msg, status) {$("#updated").html(msg);}, type:"post", url:"\\/people\\/edit\\/1"});'; + $expected = '$.ajax({data:$("#someId").serialize(), success:function (data, textStatus) {$("#updated").html(data);}, type:"post", url:"\\/people\\/edit\\/1"});'; $this->assertEqual($result, $expected); $result = $this->Jquery->request('/people/edit/1', array( From abdcfcb5e8d5173223561e32071e75587646399e Mon Sep 17 00:00:00 2001 From: mark_story Date: Wed, 12 Aug 2009 09:27:01 -0400 Subject: [PATCH 7/7] Fixing whitespace. --- .../cases/libs/view/helpers/jquery_engine.test.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cake/tests/cases/libs/view/helpers/jquery_engine.test.php b/cake/tests/cases/libs/view/helpers/jquery_engine.test.php index 0313f23d5..23d237cb0 100644 --- a/cake/tests/cases/libs/view/helpers/jquery_engine.test.php +++ b/cake/tests/cases/libs/view/helpers/jquery_engine.test.php @@ -160,11 +160,11 @@ class JqueryEngineHelperTestCase extends CakeTestCase { $expected = '$.ajax({url:"\\/posts\\/view\\/1"});'; $this->assertEqual($result, $expected); - $result = $this->Jquery->request(array('controller' => 'posts', 'action' => 'view', 1), array( - 'update' => '#content' - )); - $expected = '$.ajax({success:function (data, textStatus) {$("#content").html(data);}, url:"\/posts\/view\/1"});'; - $this->assertEqual($result, $expected); + $result = $this->Jquery->request(array('controller' => 'posts', 'action' => 'view', 1), array( + 'update' => '#content' + )); + $expected = '$.ajax({success:function (data, textStatus) {$("#content").html(data);}, url:"\/posts\/view\/1"});'; + $this->assertEqual($result, $expected); $result = $this->Jquery->request('/people/edit/1', array( 'method' => 'post',