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 AT_Plugin { /** * Plugin name * @var string **/ var $plugin_name; /** * Plugin 'view' directory * @var string Directory **/ var $plugin_base; /** * Version URL(if enabled) * @var string URL **/ var $version_url; /** * 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; $this->add_action( 'init', 'load_locale' ); } /** * Hook called to change the locale directory * @return void **/ function load_locale() { // 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( $this->plugin_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 ); } /** * Special activation function that takes into account the plugin directory * * @param string $pluginfile The plugin file location(i.e. __FILE__) * @param string $function Optional function name, or default to 'activate' * @return void **/ function register_activation( $pluginfile, $function = '' ) { add_action( 'activate_'.basename( dirname( $pluginfile ) ).'/'.basename( $pluginfile ), array( &$this, $function == '' ? 'activate' : $function ) ); } function register_ajax( $action, $function = '', $priority = 10 ) { add_action( 'wp_ajax_'.$action, array( &$this, $function == '' ? $action : $function ), $priority ); } /** * Special deactivation function that takes into account the plugin directory * * @param string $pluginfile The plugin file location(i.e. __FILE__) * @param string $function Optional function name, or default to 'deactivate' * @return void **/ function register_deactivation( $pluginfile, $function = '' ) { add_action( 'deactivate_'.basename( dirname( $pluginfile ) ).'/'.basename( $pluginfile ), array( &$this, $function == '' ? 'deactivate' : $function ) ); } function register_plugin_settings( $pluginfile, $function = '' ) { add_action( 'plugin_action_links_'.basename( dirname( $pluginfile ) ).'/'.basename( $pluginfile ), array( &$this, $function == '' ? 'plugin_settings' : $function ), 10, 4 ); } /** * 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"; elseif ( 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 ) { ?>'; print_r( $thing ); echo ''; } }