Display Rendering * The class uses a similar technique to Ruby On Rails views, whereby the display HTML is kept * in a separate directory and file from the main code. A display is 'rendered' (sent to the browser) * or 'captured' (returned to the calling function). * * Template files are separated into two areas: admin and user. Admin templates are only for display in * the WordPress admin interface, while user templates are typically for display on the site (although neither * of these are enforced). All templates are PHP code, but are referred to without .php extension. * * The reason for this separation is that one golden rule of plugin creation is that someone will always want to change * the formatting and style of your output. Rather than forcing them to modify the plugin (bad), or modify files within * the plugin (equally bad), the class allows user templates to be overridden with files contained within the theme. * * An additional benefit is that it leads to code re-use, especially with regards to Ajax (i.e. your display code can be called from * many locations) * * Template files are located within the 'view' subdirectory of the plugins base (specified when registering the plugin): * *
myplugin/view/admin * myplugin/view/myplugin* * Admin templates are contained within 'admin', and user templates are contained within a directory of the same name as the plugin. * * User files can be overridden within the theme by creating a similar directory structure: * *
/themes/mytheme/view/myplugin* * The class will first look in the theme and then defaults to the plugin. A plugin should always provide default templates. * *
<p>You processed <?php echo $items ?> items</p>* * When you want to display this in your plugin you use: * *
$this->render_admin ('processed', array ('items' => 100));
*
* @package WordPress base library
* @author John Godley
* @copyright Copyright (C) John Godley
**/
class JumpTo_Plugin
{
/**
* Plugin name
* @var string
**/
var $plugin_name;
/**
* Plugin 'view' directory
* @var string Directory
**/
var $plugin_base;
/**
* Register your plugin with a name and base directory. This must be called once.
*
* @param string $name Name of your plugin. Is used to determine the plugin locale domain
* @param string $base Directory containing the plugin's 'view' files.
* @return void
**/
function register_plugin ($name, $base)
{
$this->plugin_base = rtrim (dirname ($base), '/');
$this->plugin_name = $name;
// Here we manually fudge the plugin locale as WP doesnt allow many options
$locale = get_locale ();
if ( empty($locale) )
$locale = 'en_US';
$mofile = dirname (__FILE__)."/locale/$locale.mo";
load_textdomain ($name, $mofile);
}
/**
* Register a WordPress action and map it back to the calling object
*
* @param string $action Name of the action
* @param string $function Function name (optional)
* @param int $priority WordPress priority (optional)
* @param int $accepted_args Number of arguments the function accepts (optional)
* @return void
**/
function add_action ($action, $function = '', $priority = 10, $accepted_args = 1)
{
add_action ($action, array (&$this, $function == '' ? $action : $function), $priority, $accepted_args);
}
/**
* Register a WordPress filter and map it back to the calling object
*
* @param string $action Name of the action
* @param string $function Function name (optional)
* @param int $priority WordPress priority (optional)
* @param int $accepted_args Number of arguments the function accepts (optional)
* @return void
**/
function add_filter ($filter, $function = '', $priority = 10, $accepted_args = 1)
{
add_filter ($filter, array (&$this, $function == '' ? $filter : $function), $priority, $accepted_args);
}
/**
* Renders an admin section of display code
*
* @param string $ug_name Name of the admin file (without extension)
* @param string $array Array of variable name=>value that is available to the display code (optional)
* @return void
**/
function render_admin ($ug_name, $ug_vars = array ())
{
global $plugin_base;
foreach ($ug_vars AS $key => $val)
$$key = $val;
if (file_exists ("{$this->plugin_base}/view/admin/$ug_name.php"))
include ("{$this->plugin_base}/view/admin/$ug_name.php");
else
echo "Rendering of admin template {$this->plugin_base}/view/admin/$ug_name.php failed
";
}
/**
* Renders a section of user display code. The code is first checked for in the current theme display directory
* before defaulting to the plugin
*
* @param string $ug_name Name of the admin file (without extension)
* @param string $array Array of variable name=>value that is available to the display code (optional)
* @return void
**/
function render ($ug_name, $ug_vars = array ())
{
foreach ($ug_vars AS $key => $val)
$$key = $val;
if (file_exists (TEMPLATEPATH."/view/{$this->plugin_name}/$ug_name.php"))
include (TEMPLATEPATH."/view/{$this->plugin_name}/$ug_name.php");
else if (file_exists ("{$this->plugin_base}/view/{$this->plugin_name}/$ug_name.php"))
include ("{$this->plugin_base}/view/{$this->plugin_name}/$ug_name.php");
else
echo "Rendering of template $ug_name.php failed
";
}
/**
* Renders a section of user display code. The code is first checked for in the current theme display directory
* before defaulting to the plugin
*
* @param string $ug_name Name of the admin file (without extension)
* @param string $array Array of variable name=>value that is available to the display code (optional)
* @return void
**/
function capture ($ug_name, $ug_vars = array ())
{
ob_start ();
$this->render ($ug_name, $ug_vars);
$output = ob_get_contents ();
ob_end_clean ();
return $output;
}
/**
* Captures an admin section of display code
*
* @param string $ug_name Name of the admin file (without extension)
* @param string $array Array of variable name=>value that is available to the display code (optional)
* @return string Captured code
**/
function capture_admin ($ug_name, $ug_vars = array ())
{
ob_start ();
$this->render_admin ($ug_name, $ug_vars);
$output = ob_get_contents ();
ob_end_clean ();
return $output;
}
/**
* Display a standard error message (using CSS ID 'message' and classes 'fade' and 'error)
*
* @param string $message Message to display
* @return void
**/
function render_error ($message)
{
?>
0) : ?>
plugin_base;
}
/**
* Get a URL to the plugin. Useful for specifying JS and CSS files
*
* For example,
*
* @return string URL
**/
function url ()
{
$url = substr ($this->plugin_base, strlen (realpath (ABSPATH)));
if (DIRECTORY_SEPARATOR != '/')
$url = str_replace (DIRECTORY_SEPARATOR, '/', $url);
$url = get_bloginfo ('wpurl').$url;
// Do an SSL check - only works on Apache
if (isset ($_SERVER['HTTPS']))
$url = str_replace ('http://', 'https://', $url);
return $url;
}
/**
* Performs a version update check using an RSS feed. The function ensures that the feed is only
* hit once every given number of days, and the data is cached using the WordPress Magpie library
*
* @param string $url URL of the RSS feed
* @param int $days Number of days before next check
* @return string Text to display
**/
function version_update ($url, $days = 7)
{
if (!function_exists ('fetch_rss'))
include (ABSPATH.'wp-includes/rss.php');
$now = time ();
$checked = get_option ('plugin_urbangiraffe_rss');
// Use built-in Magpie caching
if (!isset ($checked[$this->plugin_name]) || $now > $checked[$this->plugin_name] + ($days * 24 * 60 * 60))
{
$rss = fetch_rss ($url);
if (count ($rss->items) > 0)
{
foreach ($rss->items AS $pos => $item)
{
if (isset ($checked[$this->plugin_name]) && strtotime ($item['pubdate']) < $checked[$this->plugin_name])
unset ($rss->items[$pos]);
}
}
$checked[$this->plugin_name] = $now;
update_option ('plugin_urbangiraffe_rss', $checked);
return $rss;
}
}
}
?>