plugin:template
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
plugin:template [2006-11-09 20:04] – old revision restored andi | plugin:template [2019-09-10 20:05] (current) – Aleksandr | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Template Extension for Command Plugin ====== | ||
+ | ---- plugin ---- | ||
+ | description: | ||
+ | author | ||
+ | email : | ||
+ | type : syntax | ||
+ | lastupdate : 2005-09-09 | ||
+ | compatible : | ||
+ | depends | ||
+ | conflicts | ||
+ | similar | ||
+ | tags : extension, command, template | ||
+ | |||
+ | downloadurl: | ||
+ | bugtracker : | ||
+ | sourcerepo : | ||
+ | donationurl: | ||
+ | |||
+ | screenshot_img: | ||
+ | ---- | ||
+ | |||
+ | ===== Overview ===== | ||
+ | |||
+ | The **Template Command** renders a data set from a template. The data set is just a DokuWiki page containing a series of lists representing records (< | ||
+ | |||
+ | This command is useful for... | ||
+ | |||
+ | * Representing data in DokuWiki separately from its formatting. | ||
+ | * Applying repetitive formatting to each of multiple data items. | ||
+ | * Generating rich HTML for inclusion in a DokuWiki page. | ||
+ | * Expressing DokuWiki-maintained data in rich HTML. | ||
+ | |||
+ | The command defines a kind of page called a //data page//. A data page is just a series of DokuWiki [[: | ||
+ | |||
+ | A template command takes optional parameters, a template file name, and the name of a data page. Here are some example uses: | ||
+ | |||
+ | < | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | The parameters are handed to the template file, allowing for parametrized templates. The template file may produce either HTML or DokuWiki [[: | ||
+ | |||
+ | Here are two demo pages that are generated by this command: | ||
+ | |||
+ | * < | ||
+ | * < | ||
+ | |||
+ | ===== Modification History ===== | ||
+ | |||
+ | * 2005/08/30 --- Created. [[http:// | ||
+ | * 2005/08/31 --- Was breaking RSS feed, which couldn' | ||
+ | * 2005/09/09 --- Added the ability to put the data set directly in the command. [[http:// | ||
+ | * 2005/09/09 --- Fixed another problem with RSS. template() was not available. [[http:// | ||
+ | |||
+ | ===== Installation ===== | ||
+ | |||
+ | To install this command, first make sure you have a recent version of the [[plugin: | ||
+ | |||
+ | < | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | You now need to create a template file and a data file, and then you're ready to try the command. | ||
+ | |||
+ | ====== Syntax ===== | ||
+ | |||
+ | The Template command conforms to the [[plugin: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | As described in the [[plugin: | ||
+ | |||
+ | ==== Command Name ==== | ||
+ | |||
+ | Each extension of the [[plugin: | ||
+ | |||
+ | ==== Parameters ==== | ||
+ | |||
+ | The values that may follow the ''?'' | ||
+ | |||
+ | * '' | ||
+ | |||
+ | All additional parameters are passed straight to the template file. This allows a template file to be designed so that each use of the template command can uniquely filter or format the data of a data page. | ||
+ | |||
+ | ==== Content ==== | ||
+ | |||
+ | The text that the user inserts between the opening '' | ||
+ | |||
+ | < | ||
+ | template_file|data_page | ||
+ | template_file|... data_set | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ===== Data Page Format ===== | ||
+ | |||
+ | A data page is a page that represents a set of records. Each record is a DokuWiki [[: | ||
+ | |||
+ | Here is an example data page: | ||
+ | |||
+ | < | ||
+ | Any text you put before the first list item of record is ignored. This is a good place to describe the data page or to describe the next record. | ||
+ | |||
+ | * date: 2005-7-31 | ||
+ | * category: DokuWiki | ||
+ | * page: [[http:// | ||
+ | * abstract: The amazing **Andi Gohr** has produced a [[plugin: | ||
+ | |||
+ | ---- | ||
+ | * date: 2005-8-30 | ||
+ | |||
+ | * category: Spiders | ||
+ | * page: [[http:// | ||
+ | * abstract: | ||
+ | Of the 900 or so species of spiders living in Texas, only seven lack poison glands. One of these spiders raised a family beside the dog house in my back yard. | ||
+ | * follow up: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Again, text you put before the first list item is ignored, so you can describe the record. | ||
+ | |||
+ | * date: 2000-1-1 | ||
+ | * #category: Warnings --- the # comments out a field | ||
+ | * category: Catastrophies | ||
+ | * page: [[http:// | ||
+ | * abstract: | ||
+ | |||
+ | We'd been waiting for it for centuries and now it has finally happened. **Armageddon** has finally occurred. | ||
+ | |||
+ | Read all about it from the comfort of your home, at your fancy multimedia computer. | ||
+ | |||
+ | * follow up: The world was reborn, minds were erased, and we were given another shot. Next Armageddon: Year 2100. Click [[http:// | ||
+ | ---- | ||
+ | Empty records are ignored. | ||
+ | </ | ||
+ | |||
+ | This example isn't exactly pretty, as it's meant to demonstrate the variety of formatting that the template command will accept. | ||
+ | |||
+ | Each list item represents a field and has the following format: | ||
+ | |||
+ | < | ||
+ | * field_name: field_value | ||
+ | multi_para_value | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Text that appears before the first list item of a record is ignored and may be used to comment the page or the record. Note that DokuWiki needs a blank line before each horizontal rule. Records not containing any list items are ignored and are not handed to the template. This happens when two horizontal rules appear back-to-back or when one appears at the start or end of the file. | ||
+ | |||
+ | Note that the '' | ||
+ | |||
+ | Whitespace preceding or trailing each '' | ||
+ | |||
+ | ===== Template Files ====== | ||
+ | |||
+ | A template file is a file that uses PHP to generate HTML or DokuWiki [[: | ||
+ | |||
+ | How a template file works can be summarized in a few points: | ||
+ | |||
+ | - Think of the file as a regular HTML or DokuWiki [[: | ||
+ | - The PHP in the file runs within an outer, invisible PHP function. All this means is that you must declare any globals you want to use. | ||
+ | - The '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | All field values are reported with preceding and trailing whitespace trimmed. Note that in records retrieved via '' | ||
+ | |||
+ | ===== Source (template.php) ===== | ||
+ | |||
+ | <file php template.php> | ||
+ | <?php | ||
+ | /** | ||
+ | * Template Command: Render a data set from a template. | ||
+ | * | ||
+ | * For a full description of this Command Plugin command, see: | ||
+ | | ||
+ | * | ||
+ | * (Thank you Esther Brunner for the include plugin, which | ||
+ | * showed me how to nab a DokuWiki-parsed page, and thank you | ||
+ | * Christopher Smith, who told me how to parse arbitrary text.) | ||
+ | * | ||
+ | * @license | ||
+ | * @author | ||
+ | * | ||
+ | * Modification History: | ||
+ | * | ||
+ | * 2005/08/30 - Created. JTL | ||
+ | * 2005/08/31 - Now uses ob nesting so RSS can write its headers. JTL | ||
+ | * 2005/09/09 - Added ability to include data set in command. JTL | ||
+ | * 2005/09/09 - template() was not available from within RSS. JTL | ||
+ | */ | ||
+ | |||
+ | define(' | ||
+ | define(' | ||
+ | define(' | ||
+ | |||
+ | class CommandPluginExtension_template extends CommandPluginExtension | ||
+ | { | ||
+ | function getCachedData($embedding, | ||
+ | & | ||
+ | { | ||
+ | // Extract the template file name and data set ID. | ||
+ | |||
+ | $barPos = strpos($content, | ||
+ | if($barPos === false) | ||
+ | { | ||
+ | $errorMessage = TEMPLATECOMMAND_CONTENT_ERROR; | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | /* next lines work even if get empty strings */ | ||
+ | $templateName = trim(substr($content, | ||
+ | $dataSet = trim(substr($content, | ||
+ | | ||
+ | if($templateName == '' | ||
+ | { | ||
+ | $errorMessage = TEMPLATECOMMAND_CONTENT_ERROR; | ||
+ | return; | ||
+ | } | ||
+ | $templateFN = CommandPluginExtension_template:: | ||
+ | if(strlen($dataSet) >= 3 && substr($dataSet, | ||
+ | { | ||
+ | $dataSetType = ' | ||
+ | $dataSet = substr($dataSet, | ||
+ | } | ||
+ | else | ||
+ | $dataSetType = ' | ||
+ | | ||
+ | // Cache the page if caller allows it. | ||
+ | | ||
+ | if(isset($paramHash[' | ||
+ | { | ||
+ | $errorMessage = CommandPluginExtension_template:: | ||
+ | $templateFN, | ||
+ | if($errorMessage) | ||
+ | return; | ||
+ | return CommandPluginExtension_template:: | ||
+ | $templateFN, | ||
+ | } | ||
+ | | ||
+ | // Cache info needed to dynamically load page. | ||
+ | | ||
+ | return array($templateFN, | ||
+ | } | ||
+ | | ||
+ | function runCommand($embedding, | ||
+ | & | ||
+ | { | ||
+ | if(is_string($cachedData)) | ||
+ | return $cachedData; | ||
+ | | ||
+ | list($templateFN, | ||
+ | |||
+ | $errorMessage = CommandPluginExtension_template:: | ||
+ | $templateFN, | ||
+ | if($errorMessage) | ||
+ | return; | ||
+ | |||
+ | $renderer-> | ||
+ | return CommandPluginExtension_template:: | ||
+ | $templateFN, | ||
+ | } | ||
+ | | ||
+ | function resolve($templateFN, | ||
+ | { | ||
+ | global $ID; | ||
+ | | ||
+ | if(strpos($templateFN, | ||
+ | !@file_exists($templateFN)) // PHP caches the results | ||
+ | return TEMPLATECOMMAND_TEMPLATE_NOT_FOUND; | ||
+ | | ||
+ | if($dataSetType == ' | ||
+ | { | ||
+ | $exists = false; | ||
+ | resolve_pageid(getNS($ID), | ||
+ | if(!$exists || auth_quickaclcheck($dataSet) < AUTH_READ) | ||
+ | return TEMPLATECOMMAND_DATA_NOT_FOUND; | ||
+ | } | ||
+ | return null; | ||
+ | } | ||
+ | | ||
+ | function generate($templateFN, | ||
+ | { | ||
+ | // Generate HTML or text from the template. | ||
+ | |||
+ | $source = new TemplateCommandSource($templateFN, | ||
+ | | ||
+ | ob_start(); | ||
+ | CommandPluginExtension_template:: | ||
+ | $outString = ob_get_contents(); | ||
+ | ob_end_clean(); | ||
+ | | ||
+ | // If the template generated text, translate into HTML. | ||
+ | | ||
+ | if(!$source-> | ||
+ | { | ||
+ | $instructs = p_get_instructions($outString); | ||
+ | $info = array(); | ||
+ | $outString = p_render(' | ||
+ | } | ||
+ | | ||
+ | return $outString; // return generated HTML | ||
+ | } | ||
+ | | ||
+ | function runTemplate(& | ||
+ | { | ||
+ | // Isolate template in its own function because it has access to | ||
+ | // the function variables. Template writes to standard out. | ||
+ | | ||
+ | include($TEMPLATECOMMAND_SOURCE-> | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * This is a duplicate of its namesake in template.php, | ||
+ | * namesake is not available in an RSS feed. | ||
+ | * | ||
+ | * @author Andreas Gohr < | ||
+ | */ | ||
+ | function template($tpl){ | ||
+ | global $conf; | ||
+ | |||
+ | if(@is_readable(DOKU_INC.' | ||
+ | return DOKU_INC.' | ||
+ | |||
+ | return DOKU_INC.' | ||
+ | } | ||
+ | } | ||
+ | |||
+ | / | ||
+ | TemplateCommandSource - Source of data for PHP implementing template | ||
+ | ******************************************************************************/ | ||
+ | |||
+ | class TemplateCommandSource | ||
+ | { | ||
+ | //// FRIEND VARIABLES ///////////////////////////////////////////////////// | ||
+ | |||
+ | var $isHTML = true; | ||
+ | var $templateFN; | ||
+ | |||
+ | //// PRIVATE VARIABLES //////////////////////////////////////////////////// | ||
+ | | ||
+ | var $dataSetText = null; | ||
+ | var $dataSetFN = null; | ||
+ | var $paramHash; | ||
+ | | ||
+ | var $textRecords = null; | ||
+ | var $htmlRecords = null; | ||
+ | |||
+ | //// PUBLIC METHODS /////////////////////////////////////////////////////// | ||
+ | |||
+ | function getParamHash() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | |||
+ | function getTextRecords() | ||
+ | { | ||
+ | $this-> | ||
+ | if($this-> | ||
+ | return $this-> | ||
+ | | ||
+ | if($this-> | ||
+ | $outline = $this-> | ||
+ | else | ||
+ | { | ||
+ | $outline = ''; | ||
+ | $outline = @file_get_contents($this-> | ||
+ | } | ||
+ | | ||
+ | $outlineParser = new TextOutlineRecordParser($outline); | ||
+ | $this-> | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | function getHtmlRecords() | ||
+ | { | ||
+ | $this-> | ||
+ | if($this-> | ||
+ | return $this-> | ||
+ | |||
+ | if($this-> | ||
+ | $instructs = p_get_instructions($this-> | ||
+ | else | ||
+ | $instructs = p_cached_instructions($this-> | ||
+ | | ||
+ | $info = array(); | ||
+ | $outline = p_render(' | ||
+ | |||
+ | $outlineParser = new HTMLOutlineRecordParser($outline); | ||
+ | $this-> | ||
+ | return $this-> | ||
+ | } | ||
+ | |||
+ | //// FRIEND METHODS /////////////////////////////////////////////////////// | ||
+ | |||
+ | function TemplateCommandSource($templateFN, | ||
+ | $paramHash) | ||
+ | { | ||
+ | $this-> | ||
+ | if($dataSetType == ' | ||
+ | $this-> | ||
+ | else | ||
+ | $this-> | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | / | ||
+ | OutlineRecordParser - Base class for outline record parsers | ||
+ | ******************************************************************************/ | ||
+ | |||
+ | class OutlineRecordParser | ||
+ | { | ||
+ | //// PROTECTED VARIABLES ////////////////////////////////////////////////// | ||
+ | |||
+ | var $records = array(); // list of records expressed as associative arrays | ||
+ | |||
+ | //// PUBLIC METHODS /////////////////////////////////////////////////////// | ||
+ | |||
+ | function getRecords() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | |||
+ | //// PROTECTED METHODS //////////////////////////////////////////////////// | ||
+ | |||
+ | function parseRecord($fieldSplits) | ||
+ | { | ||
+ | $record = array(); | ||
+ | |||
+ | // Iterate over the fields. Whatever precedes the first line item | ||
+ | // of a record is ignored and so may be used for comments. | ||
+ | | ||
+ | for($i = 1; $i < sizeof($fieldSplits); | ||
+ | $this-> | ||
+ | | ||
+ | if(!empty($record)) | ||
+ | array_push($this-> | ||
+ | } | ||
+ | | ||
+ | function parseLineItem($lineItem, | ||
+ | { | ||
+ | $colonPos = strpos($lineItem, | ||
+ | if($colonPos === false) | ||
+ | { | ||
+ | $fieldName = trim($lineItem); | ||
+ | $fieldValue = ''; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $fieldName = trim(substr($lineItem, | ||
+ | // next line works even if nothing follows colon | ||
+ | $fieldValue = trim(substr($lineItem, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | / | ||
+ | TextOutlineRecordParser - Parses wiki text for records expressed in outlines | ||
+ | ******************************************************************************/ | ||
+ | |||
+ | class TextOutlineRecordParser extends OutlineRecordParser | ||
+ | { | ||
+ | //// PUBLIC METHODS /////////////////////////////////////////////////////// | ||
+ | |||
+ | function TextOutlineRecordParser($outline) | ||
+ | { | ||
+ | $outline = " | ||
+ | | ||
+ | // wiki horizontal rules delimit records | ||
+ | $recordSplits = preg_split('/ | ||
+ | foreach($recordSplits as $recordSplit) | ||
+ | { | ||
+ | $fieldSplits = preg_split('/ | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //// PROTECTED METHODS //////////////////////////////////////////////////// | ||
+ | |||
+ | function parseField(& | ||
+ | { | ||
+ | // Extract the line item. | ||
+ | | ||
+ | $endLineItem = strcspn($fieldSplit, | ||
+ | | ||
+ | if($endLineItem === false) | ||
+ | $lineItem = $fieldSplit; | ||
+ | else | ||
+ | $lineItem = substr($fieldSplit, | ||
+ | | ||
+ | // Skip over commented out fields. | ||
+ | | ||
+ | if($lineItem{0} == '#' | ||
+ | return; // commented out field | ||
+ | | ||
+ | // Extract the field name and the line-item value. | ||
+ | | ||
+ | $fieldName = null; | ||
+ | $fieldValue = null; | ||
+ | $this-> | ||
+ | |||
+ | // Extract the field' | ||
+ | |||
+ | if($endLineItem !== false) | ||
+ | { | ||
+ | $multiline = trim(substr($fieldSplit, | ||
+ | if($multiline != '' | ||
+ | $fieldValue .= $multiline; | ||
+ | } | ||
+ | | ||
+ | // Record the extracted field. | ||
+ | | ||
+ | $record[$fieldName] = $fieldValue; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | / | ||
+ | HTMLOutlineRecordParser - Parses HTML for records expressed in outlines | ||
+ | ******************************************************************************/ | ||
+ | |||
+ | class HTMLOutlineRecordParser extends OutlineRecordParser | ||
+ | { | ||
+ | //// PUBLIC METHODS /////////////////////////////////////////////////////// | ||
+ | |||
+ | function HTMLOutlineRecordParser($outline) | ||
+ | { | ||
+ | // remove <ul>s and <ol>s | ||
+ | $outline = preg_replace('/< | ||
+ | | ||
+ | // < | ||
+ | $recordSplits = preg_split('/< | ||
+ | foreach($recordSplits as $recordSplit) | ||
+ | { | ||
+ | $fieldSplits = preg_split('/< | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //// PROTECTED METHODS //////////////////////////////////////////////////// | ||
+ | |||
+ | |||
+ | |||
+ | function parseField(& | ||
+ | { | ||
+ | // Extract the line item. | ||
+ | | ||
+ | $endLineItem = strpos($fieldSplit, | ||
+ | if($endLineItem === false) | ||
+ | return; // bad HTML | ||
+ | $lineItem = substr($fieldSplit, | ||
+ | | ||
+ | $firstChar = $lineItem{0}; | ||
+ | if($firstChar == '<' | ||
+ | { | ||
+ | $newLeft = strpos($lineItem, | ||
+ | $newLength = strrpos($lineItem, | ||
+ | $lineItem = ltrim(substr($lineItem, | ||
+ | $firstChar = $lineItem{0}; | ||
+ | } | ||
+ | | ||
+ | // Skip over commented out fields. | ||
+ | | ||
+ | if($firstChar == '#' | ||
+ | return; // commented out field | ||
+ | | ||
+ | // Extract the field name and the line-item value. | ||
+ | | ||
+ | $fieldName = null; | ||
+ | $fieldValue = null; | ||
+ | $this-> | ||
+ | |||
+ | // Extract the field' | ||
+ | | ||
+ | $endOutline = strpos($fieldSplit, | ||
+ | if($endOutline === false) | ||
+ | $endOutline = strpos($fieldSplit, | ||
+ | | ||
+ | if($endOutline !== false) | ||
+ | { | ||
+ | // next line works even if nothing follows </ol> or </ul> | ||
+ | $multiline = trim(substr($fieldSplit, | ||
+ | if($multiline != '' | ||
+ | $fieldValue .= $multiline; | ||
+ | } | ||
+ | | ||
+ | // Record the extracted field. | ||
+ | | ||
+ | $record[$fieldName] = $fieldValue; | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ===== Examples ===== | ||
+ | |||
+ | Bear in mind that, although the following examples generate HTML, the template file may instead generate DokuWiki [[: | ||
+ | |||
+ | |||
+ | * The [[http:// | ||
+ | |||
+ | <code html>< | ||
+ | |||
+ | <div class=" | ||
+ | <table width=" | ||
+ | <?php | ||
+ | $records = $TEMPLATECOMMAND_SOURCE-> | ||
+ | |||
+ | foreach($records as $record) | ||
+ | { | ||
+ | if(isset($record[' | ||
+ | { | ||
+ | ?> | ||
+ | <tr> | ||
+ | <td class=' | ||
+ | <tr> | ||
+ | <?php | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | ?> | ||
+ | <tr class=' | ||
+ | <td width=' | ||
+ | <td class=" | ||
+ | <td class=" | ||
+ | <td class=" | ||
+ | <td width=' | ||
+ | <td width=' | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td class=' | ||
+ | & | ||
+ | <?php } echo $record[' | ||
+ | </tr> | ||
+ | <?php | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * The [[http:// | ||
+ | |||
+ | <code html><? | ||
+ | global $conf; // template is executed from within a function | ||
+ | |||
+ | $records = $TEMPLATECOMMAND_SOURCE-> | ||
+ | |||
+ | $side = ' | ||
+ | foreach($records as $record) | ||
+ | { | ||
+ | $pageURL = $conf[' | ||
+ | $title = $record[' | ||
+ | |||
+ | echo '< | ||
+ | |||
+ | if(isset($record[' | ||
+ | { | ||
+ | $imageID = idfilter(cleanID($record[' | ||
+ | $imageURL = $conf[' | ||
+ | $imageWidth = ''; | ||
+ | if(isset($record[' | ||
+ | { | ||
+ | $imageWidth = $record[' | ||
+ | $imageURL .= "& | ||
+ | } | ||
+ | |||
+ | echo "<a href=' | ||
+ | " | ||
+ | } | ||
+ | |||
+ | echo "< | ||
+ | " | ||
+ | echo $title; | ||
+ | echo '</ | ||
+ | echo $record[' | ||
+ | echo "</ | ||
+ | | ||
+ | $side = ($side == ' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | > Note that the JavaScript function " | ||
+ | >-- [[todd@rollerorgans.com]] 2007-02-26 | ||
+ | |||
+ | ===== Discussion ===== | ||
+ | |||
+ | * The template command allows the user to name any file in the DokuWiki '' | ||
+ | |||
+ | * The example links (http:// | ||
+ | |||
+ | * < | ||
+ | |||
+ | * First, thanks for this plugin :) . I encountered some problems using this plugin with the [[plugin: | ||
+ | |||
+ | ===PHP error=== | ||
+ | |||
+ | This plugin seems to almost work for my DW2009-02-14 with default template. However when I try to insert template command < | ||
+ | $records = $TEMPLATECOMMAND_SOURCE-> | ||
+ | foreach($records as $record) | ||
+ | { | ||
+ | echo $record[' | ||
+ | }; | ||
+ | ?></ | ||
+ | < | ||
+ | (output started at / | ||
+ | in / | ||
+ | |||
+ | Furthermore, | ||
+ | |||
+ | ---// LukeWestwalker 2009/ |