Slide 1

Slide 1 text

CakeFest Conference 2014 - Mark Scherer (@dereuromark)

Slide 2

Slide 2 text

Using CakePHP for 6+ years (starting with 1.2) Core Developer since 2+ years Active blogger about CakePHP issues and solutions Germany (Berlin) Passionate PHP and Open Source Developer

Slide 3

Slide 3 text

What is AJAX When to use it Basics Using GET Using POST More examples Tips

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Load the whole page once. Then fetch only parts or tiny snippets of updates via follow-up requests. Only needs a fraction of the resource/bandwith.

Slide 6

Slide 6 text

Data exchange without changing position Inline editing Real time validation Native look and feel Pre-fetching Data lookups ...

Slide 7

Slide 7 text

SEO / Crawling Browser History Bookmarking Network issues Polling Same Origin Policy

Slide 8

Slide 8 text

GET requests should be used only to retrieve data

Slide 9

Slide 9 text

/controller/action text/html /controller/action.json application/json URL should match the expected format

Slide 10

Slide 10 text

// Config/routes.php Router::parseExtensions(); Router::setExtensions(array('json', 'xml', 'csv', 'rss', 'pdf')); // AppController.php public $components = array('RequestHandler');

Slide 11

Slide 11 text

if ($this->request->is(array('ajax'))) {} $this->request->allowMethod('ajax');

Slide 12

Slide 12 text

/** * AJAX action to get favorites * * @return string */ public function favorites() { $this->autoRender = false; // We don't render a view in this example $this->request->allowMethod(array('ajax')); // No direct access via browser URL $data = array( 'content' => ..., 'error' => '', ); $this->response->body(json_encode($data)); } GET /controller_name/favorites.json

Slide 13

Slide 13 text

/** * AJAX action to get favorites * * @return void */ public function favorites() { $this->request->allowMethod(array('ajax')); // No direct access via browser URL $data = array( 'content' => ..., 'error' => '', ); $this->set(compact('data')); // Pass $data to the view $this->set('_serialize', 'data'); // Let the JsonView class know what variable to use }

Slide 14

Slide 14 text

Click me

Result:

Slide 15

Slide 15 text

$(function() { $('.ajax-button').click(function(e) { var targeturl = $(this).data('url'); $.ajax({ type: "get", url: targeturl, beforeSend: function(xhr) { xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); }, success: function(res) { if (res.error != '') { alert(res.error); } else { $('#target').html(res.content); } }, error: function(e) { alert("Fehler bei der Anfrage!"); console.log(e); } }); }); });

Slide 16

Slide 16 text

$_ENV['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; $url = Router::url(array( 'controller' => 'controller_name', 'action' => 'favorites', 'ext' => 'json', '?' => array('id' => 2) )); $options = array( 'return' => 'vars' ); $result = $this->testAction($url, $options); ... Makes sure $this->request->allowMethod(array('ajax')); passes

Slide 17

Slide 17 text

... data: {'one' : $('#one').val(), 'two' : $('#two').val()}, ... $one = $this->request->data('one'); $two = $this->request->data('two');

Slide 18

Slide 18 text

$_ENV['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; $url = Router::url(array( 'controller' => 'controller_name', 'action' => 'favorites', 'ext' => 'json', '?' => array('id' => 2) )); $options = array( 'data' => array(...), 'method' => 'post' 'return' => 'vars' ); $result = $this->testAction($url, $options); ... 'data' array with method type 'post'

Slide 19

Slide 19 text

Toggle Autocomplete Chained dropdowns Pagination

Slide 20

Slide 20 text

// AppController.php - e.g. in beforeRender() if ($this->request->is('ajax')) { $this->response->disableCache(); }

Slide 21

Slide 21 text

Questions?

Slide 22

Slide 22 text

http://book.cakephp.org https://github.com/dereuromark/cakefest2014-app http://sandbox.dereuromark.de/sandbox/ajax_examples http://sandbox.dereuromark.de/sandbox/jquery_examples/ autocomplete http://www.dereuromark.de/2014/01/09/ajax-and- cakephp/ https://github.com/dereuromark/tools