Files
@ c7d7e38b2269
Branch filter:
Location: hot67beta/libraries/pattemplate/patTemplate/Reader/DB.php
c7d7e38b2269
4.2 KiB
text/x-php
Initial import of the site.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | <?PHP
/**
* patTemplate Reader that reads from a database using PEAR::DB
*
* $Id: DB.php 10381 2008-06-01 03:35:53Z pasamio $
*
* @package patTemplate
* @subpackage Readers
* @author Stephan Schmidt <schst@php.net>
*/
// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();
/**
* PEAR::DB is not installed
*/
define('PATTEMPLATE_READER_DB_ERROR_CLASS_NOT_FOUND', 'patTemplate::Reader::DB::001');
/**
* Connection could not be established
*/
define('PATTEMPLATE_READER_DB_ERROR_NO_CONNECTION', 'patTemplate::Reader::DB::002');
/**
* Could not find input
*/
define('PATTEMPLATE_READER_DB_ERROR_NO_INPUT', 'patTemplate::Reader::DB::003');
/**
* Unknown input syntax
*/
define('PATTEMPLATE_READER_DB_ERROR_UNKNOWN_INPUT', 'patTemplate::Reader::DB::004');
/**
* patTemplate Reader that reads from a database using PEAR::DB
*
* $Id: DB.php 10381 2008-06-01 03:35:53Z pasamio $
*
* @package patTemplate
* @subpackage Readers
* @author Stephan Schmidt <schst@php.net>
*/
class patTemplate_Reader_DB extends patTemplate_Reader
{
/**
* reader name
* @access private
* @var string
*/
var $_name = 'DB';
/**
* read templates from the database
*
* Input may either be an SQL query or a string defining the location
* of the template using the format:
* <code>
* table[@key=value]/@templateField
* </code>
*
* @final
* @access public
* @param string file to parse
* @return array templates
*/
function readTemplates($input)
{
$content = $this->getDataFromDb($input);
if (patErrorManager::isError($content)) {
return $content;
}
$templates = $this->parseString($content);
return $templates;
}
/**
* fetch the template data from the database
*
* @access protected
* @param string input to read from
*/
function getDataFromDb($input)
{
// check for PEAR DB
if (!class_exists('DB')) {
@include_once 'DB.php';
if (!class_exists('DB')) {
return patErrorManager::raiseError(PATTEMPLATE_READER_DB_ERROR_CLASS_NOT_FOUND, 'This reader requires PEAR::DB which could not be found on your system.');
}
}
// establish connection
$db = &DB::connect($this->getTemplateRoot());
if (PEAR::isError($db)) {
return patErrorManager::raiseError(PATTEMPLATE_READER_DB_ERROR_NO_CONNECTION, 'Could not establish database connection: ' . $db->getMessage());
}
$input = $this->parseInputStringToQuery($input, $db);
if (patErrorManager::isError($input)) {
return $input;
}
$content = $db->getOne($input);
if (PEAR::isError($content)) {
return patErrorManager::raiseError(PATTEMPLATE_READER_DB_ERROR_NO_INPUT, 'Could not fetch template: ' . $content->getMessage());
}
return $content;
}
/**
* Parse the template location syntax to a query
*
* @access private
* @param string
* @param DB_common
*/
function parseInputStringToQuery($input, $db)
{
// Input is no query
if (strstr($input, 'SELECT') !== false) {
return $input;
}
$matches = array();
if (!preg_match('/^([a-z]+)\[([^]]+)\]\/@([a-z]+)$/i', $input, $matches)) {
return patErrorManager::raiseError(PATTEMPLATE_READER_DB_ERROR_UNKNOWN_INPUT, 'Could not parse input string.');
}
$table = $matches[1];
$templateField = $matches[3];
$where = array();
$tmp = explode(',', $matches[2]);
foreach ($tmp as $clause) {
list($field, $value) = explode('=', trim($clause));
if ($field{0} !== '@') {
return patErrorManager::raiseError(PATTEMPLATE_READER_DB_ERROR_UNKNOWN_INPUT, 'Could not parse input string.');
}
$field = substr($field, 1);
array_push($where, $field . '=' . $db->quoteSmart($value));
}
$query = sprintf('SELECT %s FROM %s WHERE %s', $templateField, $table, implode(' AND ', $where));
return $query;
}
/**
* load template from any input
*
* If the a template is loaded, the content will not get
* analyzed but the whole content is returned as a string.
*
* @abstract must be implemented in the template readers
* @param mixed input to load from.
* This can be a string, a filename, a resource or whatever the derived class needs to read from
* @return string template content
*/
function loadTemplate($input)
{
$content = $this->getDataFromDb($input);
return $content;
}
}
?>
|