This document is for a version of CakePHP that is no longer supported. Please upgrade to a newer release!

AJAX

The AjaxHelper utilizes the ever-popular Prototype and script.aculo.us libraries for Ajax operations and client side effects. To use the AjaxHelper, you must have a current version of the JavaScript libraries from www.prototypejs.org and https://script.aculo.us placed in /app/webroot/js/. In addition, you must include the Prototype and script.aculo.us JavaScript libraries in any layouts or views that require AjaxHelper functionality.

You’ll need to include the Ajax and Javascript helpers in your controller:

class WidgetsController extends AppController {
    var $name = 'Widgets';
    var $helpers = array('Html','Ajax','Javascript');
}

Once you have the javascript helper included in your controller, you can use the javascript helper link() method to include Prototype and Scriptaculous:

echo $javascript->link('prototype');
echo $javascript->link('scriptaculous');

Now you can use the Ajax helper in your view:

$ajax->whatever();

If the Request Handling is included in the controller then CakePHP will automatically apply the Ajax layout when an action is requested via AJAX

class WidgetsController extends AppController {
    var $name = 'Widgets';
    var $helpers = array('Html','Ajax','Javascript');
    var $components = array( 'RequestHandler' );
}

AjaxHelper Options

Most of the methods of the AjaxHelper allow you to supply an $options array. You can use this array to configure how the AjaxHelper behaves. Before we cover the specific methods in the helper, let’s look at the different options available through this special array. You’ll want to refer to this section as you start using the methods in the AjaxHelper later on.

General Options

$option keys

Description

$options['evalScripts']

Determines if script tags in the returned content are evaluated. Set to true by default.

$options['frequency']

The number of seconds between interval based checks.

$options['indicator']

The DOM id of an element to show while a request is loading and to hide when a request is completed.

$options['position']

To insert rather than replace, use this option to specify an insertion position of top, bottom, after, or before.

$options['update']

The id of the DOM element to be updated with returned content.

$options['url']

The url of the controller/action that you want to call.

$options['type']

Indicate whether the request should be ‘synchronous’ or ‘asynchronous’ (default).

$options['with']

A URL-encoded string which will be added to the URL for get methods or in to the post body for any other method. Example: x=1&foo=bar&y=2. The parameters will be available in $this->params['form'] or available in $this->data depending on formatting. For more information see the Prototype Serialize method.

Callback Options

Callback options allow you to call JavaScript functions at specific points in the request process. If you’re looking for a way to inject a bit of logic before, after, or during your AjaxHelper operations, use these callbacks to set things up.

$options keys

Description

$options[‘condition’]

JavaScript code snippet that needs to evaluate to true before request is initiated.

$options[‘before’]

Executed before request is made. A common use for this callback is to enable the visibility of a progress indicator.

$options[‘confirm’]

Text to display in a JavaScript confirmation alert before proceeding.

$options[‘loading’]

Callback code to be executed while data is being fetched from server.

$options[‘after’]

JavaScript called immediately after request has run; fires before the $options[‘loading’] callback runs.

$options[‘loaded’]

Callback code to be executed when the remote document has been received by client.

$options[‘interactive’]

Called when the user can interact with the remote document, even though it has not finished loading.

$options[‘complete’]

JavaScript callback to be run when XMLHttpRequest is complete.

Methods

remoteFunction

remoteFunction(array $options);

This function creates the JavaScript needed to make a remote call. It is primarily used as a helper for link(). This is not used very often unless you need to generate some custom scripting.

The $options for this function are the same as for the link method

Example:

<div id="post">
</div>
<script type="text/javascript">
<?php echo $ajax->remoteFunction(
    array(
        'url' => array( 'controller' => 'posts', 'action' => 'view', 1 ),
        'update' => 'post'
    )
); ?>
</script>

It can also be assigned to HTML Event Attributes:

<?php
    $remoteFunction = $ajax->remoteFunction(
        array(
        'url' => array( 'controller' => 'posts', 'action' => 'view', 1 ),
        'update' => 'post' )
    );
?>
<div id="post" onmouseover="<?php echo $remoteFunction; ?>" >
Mouse Over This
</div>

If $options['update'] is not passed, the browser will ignore the server response.

remoteTimer

remoteTimer(array $options)

Periodically calls the action at $options['url'], every $options['frequency'] seconds. Usually used to update a specific div (specified by $options['update']) with the result of the remote call. Callbacks can be used.

remoteTimer is the same as the remoteFunction except for the extra $options['frequency']

Example:

<div id="post">
</div>
<?php
echo $ajax->remoteTimer(
    array(
    'url' => array( 'controller' => 'posts', 'action' => 'view', 1 ),
    'update' => 'post', 'complete' => 'alert( "request completed" )',
    'position' => 'bottom', 'frequency' => 5
    )
);
?>

The default $options['frequency'] is 10 seconds

form

form(string $action, string $type, array $options)

Returns a form tag that submits to $action using XMLHttpRequest instead of a normal HTTP request via $type (‘post’ or ‘get’). Otherwise, form submission will behave exactly like normal: data submitted is available at $this->data inside your controllers. If $options[‘update’] is specified, it will be updated with the resulting document. Callbacks can be used.

The options array should include the model name e.g.

$ajax->form('edit','post',array('model'=>'User','update'=>'UserInfoDiv'));

Alternatively, if you need to cross post to another controller from your form:

$ajax->form(array('type' => 'post',
    'options' => array(
        'model'=>'User',
        'update'=>'UserInfoDiv',
        'url' => array(
            'controller' => 'comments',
            'action' => 'edit'
        )
    )
));

You should not use the $ajax->form() and $ajax->submit() in the same form. If you want the form validation to work properly use the $ajax->submit() method as shown below.

submit

submit(string $title, array $options)

Returns a submit button that submits the form to $options['url'] and updates the div specified in $options['update']

<div id='testdiv'>
<?php
echo $form->create('User');
echo $form->input('email');
echo $form->input('name');
echo $ajax->submit('Submit', array('url'=> array('controller'=>'users', 'action'=>'add'), 'update' => 'testdiv'));
echo $form->end();
?>
</div>

Use the $ajax->submit() method if you want form validation to work properly. i.e. You want the messages you specify in your validation rules to show up correctly.

observeField

observeField(string $field, array $options)

Observes the field with the DOM id specified by $field (every $options[‘frequency’] seconds) and makes an XMLHttpRequest when its contents have changed.

When no frequency or a small frequency interval (between 0 and 1) is specified, a prototype Form.Element.EventObserver will be used instead of a Form.Element.Observer. The Form.Element.EventObserver is not timed and will execute at the same time the value of the element has changed.

<?php echo $form->create( 'Post' ); ?>
<?php $titles = array( 1 => 'Tom', 2 => 'Dick', 3 => 'Harry' ); ?>
<?php echo $form->input( 'title', array( 'options' => $titles ) ) ?>
</form>

<?php
echo $ajax->observeField( 'PostTitle',
    array(
        'url' => array( 'action' => 'edit' ),
        'frequency' => 0.2,
    )
);
?>

observeField uses the same options as link

The field to send up can be set using $options['with']. This defaults to Form.Element.serialize('$field'). Data submitted is available at $this->data inside your controllers. Callbacks can be used with this function.

To send up the entire form when the field changes use $options['with'] = Form.serialize( $('Form ID') )

observeForm

observeForm(string $form, array $options)

Similar to observeField(), but operates on an entire form identified by the DOM id $form. The supplied $options are the same as observeField(), except the default value of the $options[‘with’] option evaluates to the serialized (request string) value of the form.

autoComplete

autoComplete(string $field, string $url,  array $options)

Renders a text field with $field with autocomplete. The remote action at $url should return a suitable list of autocomplete terms. Often an unordered list is used for this. First, you need to set up a controller action that fetches and organizes the data you’ll need for your list, based on user input:

function autoComplete() {
    //Partial strings will come from the autocomplete field as
    //$this->data['Post']['subject']
    $this->set('posts', $this->Post->find('all', array(
                'conditions' => array(
                    'Post.subject LIKE' => $this->data['Post']['subject'].'%'
                ),
                'fields' => array('subject')
    )));
    $this->layout = 'ajax';
}

Next, create app/views/posts/auto_complete.ctp that uses that data and creates an unordered list in (X)HTML:

<ul>
 <?php foreach($posts as $post): ?>
     <li><?php echo $post['Post']['subject']; ?></li>
 <?php endforeach; ?>
</ul>

Finally, utilize autoComplete() in a view to create your auto-completing form field:

<?php echo $form->create('User', array('url' => '/users/index')); ?>
    <?php echo $ajax->autoComplete('Post.subject', '/posts/autoComplete')?>
<?php echo $form->end('View Post')?>

Once you’ve got the autoComplete() call working correctly, use CSS to style the auto-complete suggestion box. You might end up using something similar to the following:

div.auto_complete    {
     position         :absolute;
     width            :250px;
     background-color :white;
     border           :1px solid #888;
     margin           :0px;
     padding          :0px;
}
li.selected    { background-color: #ffb; }

If you want the user to enter a minimum number of characters before the autocomplete starts, you can use the minChars-Option as follows:

$ajax->autoComplete('Post.subject', '/posts/autoComplete',array('minChars' => 3));

isAjax

isAjax()

Allows you to check if the current request is a Prototype Ajax request inside a view. Returns a boolean. Can be used for presentational logic to show/hide blocks of content.

drag & drop

drag(string $id, array $options)

Makes a Draggable element out of the DOM element specified by $id. For more information on the parameters accepted in $options see https://github.com/madrobby/scriptaculous/wikis/draggable.

Common options might include:

$options keys

Description

$options[‘handle’]

Sets whether the element should only be draggable by an embedded handle. The value must be an element reference or element id or a string referencing a CSS class value. The first child/grandchild/etc. element found within the element that has this CSS class value will be used as the handle.

$options[‘revert’]

If set to true, the element returns to its original position when the drags ends. Revert can also be an arbitrary function reference, called when the drag ends.

$options[‘constraint’]

Constrains the drag to either ‘horizontal’ or ‘vertical’, leave blank for no constraints.

drop(string $id, array $options)

Makes the DOM element specified by $id able to accept dropped elements. Additional parameters can be specified with $options. For more information see https://github.com/madrobby/scriptaculous/wikis/droppables.

Common options might include:

$options keys

Description

$options[‘accept’]

Set to a string or javascript array of strings describing CSS classes that the droppable element will accept. The drop element will only accept elements of the specified CSS classes.

$options[‘containment’]

The droppable element will only accept the dragged element if it is contained in the given elements (element ids). Can be a string or a javascript array of id references.

$options[‘overlap’]

If set to ‘horizontal’ or ‘vertical’, the droppable element will only react to a draggable element if it is overlapping the droparea by more than 50% in the given axis.

$options[‘onDrop’]

A javascript call back that is called when the dragged element is dropped on the droppable element.

dropRemote(string $id, array $options)

Makes a drop target that creates an XMLHttpRequest when a draggable element is dropped on it. The $options array for this function are the same as those specified for drop() and link().

slider

slider(string $id, string $track_id, array  $options)

Creates a directional slider control. For more information see https://wiki.github.com/madrobby/scriptaculous/slider.

Common options might include:

$options keys

Description

$options[‘axis’]

Sets the direction the slider will move in. ‘horizontal’ or ‘vertical’. Defaults to horizontal

$options[‘handleImage’]

The id of the image that represents the handle. This is used to swap out the image src with disabled image src when the slider is enabled. Used in conjunction with handleDisabled.

$options[‘increment’]

Sets the relationship of pixels to values. Setting to 1 will make each pixel adjust the slider value by one.

$options[‘handleDisabled’]

The id of the image that represents the disabled handle. This is used to change the image src when the slider is disabled. Used in conjunction handleImage.

$options[‘change’]

$options[‘onChange’]

JavaScript callback fired when the slider has finished moving, or has its value changed. The callback function receives the slider’s current value as a parameter.

$options[‘slide’]

$options[‘onSlide’]

JavaScript callback that is called whenever the slider is moved by dragging. It receives the slider’s current value as a parameter.

editor

editor(string $id, string $url, array $options)

Creates an in-place editor at DOM id. The supplied $url should be an action that is responsible for saving element data. For more information and demos see https://github.com/madrobby/scriptaculous/wikis/ajax-inplaceeditor.

Common options might include:

$options keys

Description

$options['collection']

Activate the ‘collection’ mode of in-place editing. $options[‘collection’] takes an array which is turned into options for the select. To learn more about collection see https://github.com/madrobby/scriptaculous/wikis/ajax-inplacecollectioneditor.

$options['callback']

A function to execute before the request is sent to the server. This can be used to format the information sent to the server. The signature is function(form, value)

$options['okText']

Text of the submit button in edit mode

$options['cancelText']

The text of the link that cancels editing

$options['savingText']

The text shown while the text is sent to the server

$options['formId']

$options['externalControl']

$options['rows']

The row height of the input field

$options['cols']

The number of columns the text area should span

$options['size']

Synonym for ‘cols’ when using single-line

$options['highlightcolor']

The highlight color

$options['highlightendcolor']

The color which the highlight fades to

$options['savingClassName']

$options['formClassName']

$options['loadingText']

$options['loadTextURL']

Example

<div id="in_place_editor_id">Text To Edit</div>
<?php
echo $ajax->editor(
    "in_place_editor_id",
    array(
        'controller' => 'Posts',
        'action' => 'update_title',
        $id
    ),
    array()
);
?>

sortable

sortable(string $id, array $options)

Makes a list or group of floated objects contained by $id sortable. The options array supports a number of parameters. To find out more about sortable see https://wiki.github.com/madrobby/scriptaculous/sortable.

<div id='sortableContainer'>
    <div id='element_1' class='sortableItem'>
        Element 1
    </div>
    <div id='element_2' class='sortableItem'>
        Element 2
    </div>
    <div id='element_3' class='sortableItem'>
        Element 3
    </div>
</div>
<script type='text/javascript'>
function writeupdate () {
    var id_array = Sortable.sequence('sortableContainer');
    new Ajax.Request('/reports/updatesortorder/'+ id_array.join(','),
                         {
                        onSuccess: function() {alert("Order Updated");}
                        }
                    );
}
</script>
<?php
echo $ajax->sortable('sortableContainer',array('tag'=>'div','only'=>'sortableItem','onUpdate'=>'writeupdate'));
?>

Make sure that you do not include the parenthesis on the onUpdate callback, or it will not execute.

Common options might include:

$options keys

Description

$options[‘tag’]

Indicates what kind of child elements of the container will be made sortable. Defaults to ‘li’.

$options[‘only’]

Allows for further filtering of child elements. Accepts a CSS class.

$options[‘overlap’]

Either ‘vertical’ or ‘horizontal’. Defaults to vertical.

$options[‘constraint’]

Restrict the movement of the draggable elements. accepts ‘horizontal’ or ‘vertical’. Defaults to vertical.

$options[‘handle’]

Makes the created Draggables use handles, see the handle option on Draggables.

$options[‘onUpdate’]

Called when the drag ends and the Sortable’s order is changed in any way. When dragging from one Sortable to another, the callback is called once on each Sortable.

$options[‘hoverclass’]

Give the created droppable a hoverclass.

$options[‘ghosting’]

If set to true, dragged elements of the sortable will be cloned and appear as a ghost, instead of directly manipulating the original element.