Symfony integrates the visual effects of the script.aculo.us library, to allow you to do more than show and hide <div>
elements in your web pages. You will find good documentation on the effects syntax in the wiki at http://script.aculo.us/. Basically, the library provides JavaScript objects and functions that manipulate the DOM in order to achieve complex visual effects. See a few examples in Listing 11-23. Since the result is a visual animation of certain areas in a web page, it is recommended that you test the effects yourself to understand what they really do. The script.aculo.us website offers a gallery where you can get an idea of the dynamic effects.
Listing 11-23 - Visual Effects in JavaScript with Script.aculo.us
// Highlights the element 'my_field'
Effect.Highlight('my_field', { startcolor:'#ff99ff', endcolor:'#999999' })
// Blinds down an element
Effect.BlindDown('id_of_element');
// Fades away an element
Effect.Fade('id_of_element', { transition: Effect.Transitions.wobble })
Symfony encapsulates the JavaScript Effect
object in a helper called visual_effect()
, still part of the Javascript
helper group. It outputs JavaScript that can be used in a regular link, as shown in Listing 11-24.
Listing 11-24 - Visual Effects in Templates with the visual_effect()
Helper
<div id="secret_div" style="display:none">I was here all along!</div>
<?php echo link_to_function(
'Show the secret div',
visual_effect('appear', 'secret_div')
) ?>
// Will make a call to Effect.Appear('secret_div')
The visual_effects()
helper can also be used in the Ajax callbacks, as shown in Listing 11-25, which displays an activity indicator like Listing 11-22, but is visually more satisfactory. The indicator
element appears progressively when the Ajax call starts, and it fades progressively when the response arrives. In addition, the feedback element is highlighted after being updated by the remote call, to draw the user's attention to this part of the window.
Listing 11-25 - Visual Effects in Ajax Callbacks
<div id="feedback"></div>
<div id="indicator" style="display: none">Loading...</div>
<?php echo link_to_remote('Delete this post', array(
'update' => 'feedback',
'url' => 'post/delete?id='.$post->getId(),
'loading' => visual_effect('appear', 'indicator'),
'complete' => visual_effect('fade', 'indicator').
visual_effect('highlight', 'feedback'),
)) ?>
Notice how you can combine visual effects by concatenating them in a callback.