1
0
mirror of synced 2025-01-18 06:21:40 +03:00

new templating model

This commit is contained in:
zYne 2007-08-03 11:52:24 +00:00
parent 90bf6241e4
commit 5490247cc7
5 changed files with 43 additions and 69 deletions

View File

@ -180,13 +180,13 @@ abstract class Doctrine_Configurable extends Doctrine_Object
*/
public function getImpl($template)
{
if ( ! isset($this->_impl[$attribute])) {
if ( ! isset($this->_impl[$template])) {
if (isset($this->parent)) {
return $this->parent->getImpl($attribute);
return $this->parent->getImpl($template);
}
return null;
}
return $this->_impl[$attribute];
return $this->_impl[$template];
}
/**
* getCacheDriver

View File

@ -72,10 +72,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* and saves will not cause infinite loops
*/
const STATE_LOCKED = 6;
/**
* @var object Doctrine_Table $_table the factory that created this data access object
*/
protected $_table;
/**
* @var Doctrine_Node_<TreeImpl> node object
*/

View File

@ -32,6 +32,10 @@ Doctrine::autoload('Doctrine_Access');
*/
abstract class Doctrine_Record_Abstract extends Doctrine_Access
{
/**
* @param Doctrine_Table $_table reference to associated Doctrine_Table instance
*/
protected $_table;
/**
* addListener
*
@ -244,7 +248,9 @@ abstract class Doctrine_Record_Abstract extends Doctrine_Access
{
$tpl = new $template($options);
$tpl->setTable($this->_table);
$tpl->setUp();
$tpl->setTableDefinition();
return $this;
}

View File

@ -110,59 +110,6 @@ class Doctrine_Relation_Parser
throw new Doctrine_Relation_Exception('Relation type not set.');
}
if (strpos($name, '[Component]') !== false) {
$name = str_replace('[Component]', $this->_table->getComponentName(), $name);
$templateName = substr($name, strlen($this->_table->getComponentName()));
if (substr($name, -8) === 'Template') {
$name = substr($name, 0, -8);
}
$parent = new ReflectionClass($this->_table->getComponentName());
$fileName = dirname($parent->getFileName()) . DIRECTORY_SEPARATOR . $name . '.php';
if (file_exists($fileName)) {
require_once($fileName);
}
if ( ! class_exists($name)) {
$template = new $templateName();
$conn = $this->_table->getConnection();
$refl = new ReflectionClass($templateName);
$file = file($refl->getFileName());
$lines[] = 'class ' . $name . ' extends Doctrine_Record' . "\n";
$lines[] = '{'. "\n";
// read all template method definitions
foreach ($refl->getMethods() as $method) {
if ($method->getDeclaringClass()->getName() === $refl->getName()) {
$start = $method->getStartLine() - 1;
$end = $method->getEndLine() - 1;
// append method definitions
$lines = array_merge($lines, array_slice($file, $start, ($end - $start) + 1));
}
}
$lines[] = '}' . "\n";
if (file_exists($fileName)) {
throw new Doctrine_Template_Exception("Couldn't generate class for template.");
}
$code = str_replace('[Component]', $this->_table->getComponentName(), implode("", $lines));
// create the actual class file
$fp = fopen($fileName, 'w+');
fwrite($fp, "<?php \n" . $code);
fclose($fp);
// include the generated class
require_once($fileName);
}
}
$this->_pending[$alias] = array_merge($options, array('class' => $name, 'alias' => $alias));
$m = Doctrine_Manager::getInstance();
@ -261,6 +208,30 @@ class Doctrine_Relation_Parser
return $this->_relations;
}
/**
* getImpl
* returns the table class of the concrete implementation for given template
* if the given template is not a template then this method just returns the
* table class for the given record
*
* @param string $template
*/
public function getImpl($template)
{
$conn = $this->_table->getConnection();
if (in_array('Doctrine_Template', class_parents($template))) {
$impl = $this->_table->getImpl($template);
if ($impl === null) {
throw new Doctrine_Relation_Parser_Exception("Couldn't find concrete implementation for template " . $template);
}
} else {
$impl = $template;
}
return $conn->getTable($impl);
}
/**
* Completes the given association definition
*
@ -270,8 +241,9 @@ class Doctrine_Relation_Parser
public function completeAssocDefinition($def)
{
$conn = $this->_table->getConnection();
$def['table'] = $conn->getTable($def['class']);
$def['refTable'] = $conn->getTable($def['refClass']);
$def['table'] = $this->getImpl($def['class']);
$def['class'] = $def['table']->getComponentName();
$def['refTable'] = $this->getImpl($def['refClass']);
$id = $def['refTable']->getIdentifier();
@ -378,7 +350,9 @@ class Doctrine_Relation_Parser
public function completeDefinition($def)
{
$conn = $this->_table->getConnection();
$def['table'] = $conn->getTable($def['class']);
$def['table'] = $this->getImpl($def['class']);
$def['class'] = $def['table']->getComponentName();
$foreignClasses = array_merge($def['table']->getOption('parents'), array($def['class']));
$localClasses = array_merge($this->_table->getOption('parents'), array($this->_table->getComponentName()));

View File

@ -32,10 +32,7 @@ Doctrine::autoload('Doctrine_Record_Abstract');
*/
class Doctrine_Template extends Doctrine_Record_Abstract
{
/**
* @param Doctrine_Table $_table reference to associated Doctrine_Table instance
*/
protected $_table;
/**
* setTable
*
@ -55,10 +52,10 @@ class Doctrine_Template extends Doctrine_Record_Abstract
{
return $this->_table;
}
public function setUp()
{
}
public function setTableDefinition()