Loading helper
To see some how the loading helper can be used, look at the example.
You can view the source on GitHub.
Example setup
$loading = new loading(); $loading = new loading('profile'); $loading = new loading(array( 'profile' => 'profile', // Use 'loading.profile.*' config. 'time_out' => (5 * 60), // Seconds before script will timeout. 'refresh_frequency' => 2, // Seconds browser will wait before trying again. 'refresh_url' => '/../', // If you want the user to load a different url while waiting (e.g. add a new parameter). 'template_name' => 'loading', // Customised loading page name (in /app/template/), see example below. 'template_path' => '/../', // Customised loading page path. 'lock' => $lock, // See lock example below. ));
Basic example
This uses the session helper to store the loading state:
// $loading->template_test(); $loading->check(); // Will exit() with loading page if still running, // return the variables if there was a time-out, // or return false if not running. if ($form->submitted()) { // Any extra validation if ($form->valid() && !$loading->start('Starting action')) { // The start string will replace [MESSAGE] in the template, // or you can use an array for multiple tags. $form->error_add('Already processing'); } if ($form->valid()) { sleep(5); $loading->update('Updating progress'); sleep(5); $loading->done('/../'); // If you specify a URL, it will perform a redirect. exit(); } }
Lock example
If you have a process that shouldn't allow multiple users to run it at the same time, we can use the lock helper.
$lock = new lock('loading'); $loading = new loading(array( 'lock' => $lock, )); $loading->check(); if ($form->submitted()) { // Any extra validation if ($form->valid() && !$loading->start('Starting action')) { $form->error_add('Could not open lock'); } if ($form->valid()) { sleep(5); $loading->update('Updating progress'); sleep(5); $loading->done('/../'); // If you specify a URL, it will perform a redirect. exit(); } }
Templates
If you want to change the layout/content of the loading page, use these files:
/app/public/a/css/global/loading.css This file will be used with a template like the one below, or you can create your own. /app/template/loading.ctp This file will be used if 'template_name' is set to 'loading', the contents should be something like the following. <!DOCTYPE html> <html lang="<?= html(config::get('output.lang')) ?>" xml:lang="<?= html(config::get('output.lang')) ?>" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="<?= html(config::get('output.charset')) ?>" /> <title>Loading</title> <link rel="stylesheet" type="text/css" href="<?= html(timestamp_url('/a/css/global/loading.css')) ?>" media="all" /> </head> <body> <main id="page_content"> <h1>Loading</h1> <p>[MESSAGE]... [[TIME_START]]</p> </main> </body> </html>
The templates can use a few tags:
[MESSAGE] [TIME_START] [TIME_UPDATE] [URL]
You can include additional tags if you pass an array to the start/update methods:
$loading->update(array( 'message' => 'Updating progress', ));
You can also test the template by running:
$loading->template_test(); exit();