Skip to content
Browse files

remove base object, first try

  • Loading branch information...
1 parent 8c3c7a8 commit e350664677c85ace070f223b6cc672f74e0a1247 @jaugustin jaugustin committed with willdurand Jul 28, 2012
View
31 src/Propel/Generator/Builder/Om/AbstractOMBuilder.php
@@ -11,6 +11,7 @@
namespace Propel\Generator\Builder\Om;
use Propel\Generator\Builder\DataModelBuilder;
+use Propel\Generator\Builder\Util\PropelTemplate;
use Propel\Generator\Exception\InvalidArgumentException;
use Propel\Generator\Exception\LogicException;
use Propel\Generator\Exception\RuntimeException;
@@ -746,4 +747,34 @@ public function getBehaviorContentBase($contentName, $modifier)
}
}
}
+
+ /**
+ * Use Propel simple templating system to render a PHP file using variables
+ * passed as arguments. The template file name is relative to the behavior's
+ * directory name.
+ *
+ * @param string $filename
+ * @param array $vars
+ * @param string $templateDir
+ * @return string
+ */
+ public function renderTemplate($filename, $vars = array(), $templateDir = '/templates/')
+ {
+ $filePath = __DIR__ . $templateDir . $filename;
+ if (!file_exists($filePath)) {
+ // try with '.php' at the end
+ $filePath = $filePath . '.php';
+ if (!file_exists($filePath)) {
+ throw new \InvalidArgumentException(sprintf('Template "%s" not found in "%s" directory',
+ $filename,
+ __DIR__ . $templateDir
+ ));
+ }
+ }
+ $template = new PropelTemplate();
+ $template->setTemplateFile($filePath);
+ $vars = array_merge($vars, array('behavior' => $this));
+
+ return $template->render($vars);
+ }
}
View
7 src/Propel/Generator/Builder/Om/AbstractObjectBuilder.php
@@ -115,12 +115,7 @@ protected function addColumnMutatorMethods(&$script)
*/
protected function getBaseClass()
{
- $class = $this->getTable()->getBaseClass();
- if (null === $class) {
- $class = 'propel.om.BaseObject';
- }
-
- return $class;
+ return $this->getTable()->getBaseClass();
}
/**
View
93 src/Propel/Generator/Builder/Om/ObjectBuilder.php
@@ -202,8 +202,11 @@ protected function addClassOpen(&$script)
$tableName = $table->getName();
$tableDesc = $table->getDescription();
$interface = $this->getInterface();
- $parentClass = $this->getBehaviorContent('parentClass');
- $parentClass = (null !== $parentClass) ? $parentClass : ClassTools::classname($this->getBaseClass());
+
+ if (null !== ($parentClass = $this->getBehaviorContent('parentClass')) ||
+ null !== ($parentClass = ClassTools::classname($this->getBaseClass()))) {
+ $parentClass = ' extends '.$parentClass;
+ }
$script .= "
/**
* Base class that represents a row from the '$tableName' table.
@@ -220,10 +223,10 @@ protected function addClassOpen(&$script)
}
$script .= "
*/
-abstract class ".$this->getUnqualifiedClassName()." extends ".$parentClass." ";
+abstract class ".$this->getUnqualifiedClassName().$parentClass." ";
if ($interface = $this->getTable()->getInterface()) {
- $script .= "implements " . "Child" . ClassTools::classname($interface);
+ $script .= "implements Child" . ClassTools::classname($interface);
if ($interface !== ClassTools::classname($interface)) {
$this->declareClass($interface);
} else {
@@ -249,17 +252,20 @@ protected function addClassBody(&$script)
$this->declareClassFromBuilder($this->getStubPeerBuilder());
$this->declareClassFromBuilder($this->getStubQueryBuilder());
$this->declareClasses(
- '\Propel\Runtime\Propel',
- '\Propel\Runtime\Exception\PropelException',
+ '\Exception',
'\PDO',
+ '\Propel\Runtime\Exception\PropelException',
'\Propel\Runtime\Connection\ConnectionInterface',
+ '\Propel\Runtime\Collection\Collection',
+ '\Propel\Runtime\Collection\ObjectCollection',
+ '\Propel\Runtime\Exception\BadMethodCallException',
+ '\Propel\Runtime\Exception\PropelException',
'\Propel\Runtime\Query\Criteria',
'\Propel\Runtime\Om\BaseObject',
'\Propel\Runtime\Om\Persistent',
- '\Propel\Runtime\Util\BasePeer',
- '\Propel\Runtime\Collection\Collection',
- '\Propel\Runtime\Collection\ObjectCollection',
- '\Exception'
+ '\Propel\Runtime\Parser\AbstractParser',
+ '\Propel\Runtime\Propel',
+ '\Propel\Runtime\Util\BasePeer'
);
$table = $this->getTable();
@@ -283,8 +289,10 @@ protected function addClassBody(&$script)
if ($this->hasDefaultValues()) {
$this->addApplyDefaultValues($script);
- $this->addConstructor($script);
}
+ $this->addConstructor($script);
+
+ $this->addBaseObjectMethods($script);
$this->addColumnAccessorMethods($script);
$this->addColumnMutatorMethods($script);
@@ -333,6 +341,10 @@ protected function addClassBody(&$script)
// apply behaviors
$this->applyBehaviorModifier('objectMethods', $script, " ");
+ if ($this->getGeneratorConfig()->getBuildProperty('addHooks')) {
+ $this->addHookMethods($script);
+ }
+
$this->addMagicCall($script);
}
@@ -382,6 +394,9 @@ protected function addAttributes(&$script)
*/
protected static \$peer;
";
+
+ $script .= $this->renderTemplate('baseObjectAttributes');
+
if (!$table->isAlias()) {
$this->addColumnAttributes($script);
}
@@ -623,7 +638,9 @@ protected function addConstructor(&$script)
{
$this->addConstructorComment($script);
$this->addConstructorOpen($script);
- $this->addConstructorBody($script);
+ if ($this->hasDefaultValues()) {
+ $this->addConstructorBody($script);
+ }
$this->addConstructorClose($script);
}
@@ -636,8 +653,12 @@ protected function addConstructorComment(&$script)
{
$script .= "
/**
- * Initializes internal state of ".$this->getQualifiedClassName()." object.
- * @see applyDefaults()
+ * Initializes internal state of ".$this->getQualifiedClassName()." object.";
+ if ($this->hasDefaultValues()) {
+ $script .= "
+ * @see applyDefaults()";
+ }
+ $script .= "
*/";
}
@@ -661,7 +682,6 @@ public function __construct()
protected function addConstructorBody(&$script)
{
$script .= "
- parent::__construct();
\$this->applyDefaultValues();";
}
@@ -678,6 +698,32 @@ protected function addConstructorClose(&$script)
}
/**
+ * Adds the base object functions.
+ *
+ * @param string &$script
+ */
+ protected function addBaseObjectMethods(&$script)
+ {
+ $script .= $this->renderTemplate('baseObjectMethods');
+ }
+
+ /**
+ * Adds the base object hook functions.
+ *
+ * @param string &$script
+ */
+ protected function addHookMethods(&$script)
+ {
+ $hooks = array();
+ foreach (array('pre', 'post') as $hook) {
+ foreach (array('Insert', 'Update', 'Save', 'Delete') as $action) {
+ $hooks[$hook.$action] = false !== strpos($script, "function $hook.$action(");
+ }
+ }
+ $script .= $this->renderTemplate('baseObjectMethodHook', $hooks);
+ }
+
+ /**
* Adds the applyDefaults() method, which is called from the constructor.
*
* @param string &$script
@@ -5065,19 +5111,10 @@ public function __toString()
protected function addMagicCall(&$script)
{
$behaviorCallScript = '';
- $this->applyBehaviorModifier('objectCall', $behaviorCallScript, " ");
- if ($behaviorCallScript) {
- $script .= "
- /**
- * Catches calls to virtual methods
- */
- public function __call(\$name, \$params)
- {
- $behaviorCallScript
+ $this->applyBehaviorModifier('objectCall', $behaviorCallScript, " ");
- return parent::__call(\$name, \$params);
- }
-";
- }
+ $script .= $this->renderTemplate('baseObjectMethodMagicCall', array(
+ 'behaviorCallScript' => $behaviorCallScript
+ ));
}
}
View
26 src/Propel/Generator/Builder/Om/templates/baseObjectAttributes.php
@@ -0,0 +1,26 @@
+
+ /**
+ * attribute to determine if this object has previously been saved.
+ * @var boolean
+ */
+ protected $new = true;
+
+ /**
+ * attribute to determine whether this object has been deleted.
+ * @var boolean
+ */
+ protected $deleted = false;
+
+ /**
+ * The columns that have been modified in current object.
+ * Tracking modified columns allows us to only update modified columns.
+ * @var array
+ */
+ protected $modifiedColumns = array();
+
+ /**
+ * The (virtual) columns that are added at runtime
+ * The formatters can add supplementary columns based on a resultset
+ * @var array
+ */
+ protected $virtualColumns = array();
View
93 src/Propel/Generator/Builder/Om/templates/baseObjectMethodHook.php
@@ -0,0 +1,93 @@
+
+<?php if ($preSave):?>
+ /**
+ * Code to be run before persisting the object
+ * @param ConnectionInterface $con
+ * @return boolean
+ */
+ public function preSave(ConnectionInterface $con = null)
+ {
+ return true;
+ }
+
+<?php endif?>
+<?php if ($postSave):?>
+ /**
+ * Code to be run after persisting the object
+ * @param ConnectionInterface $con
+ */
+ public function postSave(ConnectionInterface $con = null)
+ {
+
+ }
+
+<?php endif?>
+<?php if ($preInsert):?>
+ /**
+ * Code to be run before inserting to database
+ * @param ConnectionInterface $con
+ * @return boolean
+ */
+ public function preInsert(ConnectionInterface $con = null)
+ {
+ return true;
+ }
+
+<?php endif?>
+<?php if ($postInsert):?>
+ /**
+ * Code to be run after inserting to database
+ * @param ConnectionInterface $con
+ */
+ public function postInsert(ConnectionInterface $con = null)
+ {
+
+ }
+
+<?php endif?>
+<?php if ($preUpdate):?>
+ /**
+ * Code to be run before updating the object in database
+ * @param ConnectionInterface $con
+ * @return boolean
+ */
+ public function preUpdate(ConnectionInterface $con = null)
+ {
+ return true;
+ }
+
+<?php endif?>
+<?php if ($postUpdate):?>
+ /**
+ * Code to be run after updating the object in database
+ * @param ConnectionInterface $con
+ */
+ public function postUpdate(ConnectionInterface $con = null)
+ {
+
+ }
+
+<?php endif?>
+<?php if ($postSave):?>
+ /**
+ * Code to be run before deleting the object in database
+ * @param ConnectionInterface $con
+ * @return boolean
+ */
+ public function preDelete(ConnectionInterface $con = null)
+ {
+ return true;
+ }
+
+<?php endif?>
+<?php if ($postSave):?>
+ /**
+ * Code to be run after deleting the object in database
+ * @param ConnectionInterface $con
+ */
+ public function postDelete(ConnectionInterface $con = null)
+ {
+
+ }
+
+<?php endif?>
View
61 src/Propel/Generator/Builder/Om/templates/baseObjectMethodMagicCall.php
@@ -0,0 +1,61 @@
+
+<?php if ($behaviorCallScript) :?>
+ /**
+ * Catches calls to undefined methods.
+ *
+ * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.).
+ * Allows to define default __call() behavior if you overwrite __call()
+ *
+ * @param string $name
+ * @param mixed $params
+ *
+ * @return array|string
+ */
+ public function __call($name, $params)
+ {
+ <?php echo $behaviorCallScript?>
+
+ return $this->__parentCall($name, $param);
+ }
+
+<?php endif?>
+ /**
+ * Derived method to catches calls to undefined methods.
+ *
+ * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.).
+ * Allows to define default __call() behavior if you overwrite __call()
+ *
+ * @param string $name
+ * @param mixed $params
+ *
+ * @return array|string
+ */
+ public function __<?php echo ($behaviorCallScript)? 'parentCall' : 'call'?>($name, $params)
+ {
+ if (0 === strpos($name, 'get')) {
+ $virtualColumn = substr($name, 3);
+ if ($this->hasVirtualColumn($virtualColumn)) {
+ return $this->getVirtualColumn($virtualColumn);
+ }
+
+ $virtualColumn = lcfirst($virtualColumn);
+ if ($this->hasVirtualColumn($virtualColumn)) {
+ return $this->getVirtualColumn($virtualColumn);
+ }
+ }
+
+ if (0 === strpos($name, 'from')) {
+ $format = substr($name, 4);
+
+ return $this->importFrom($format, reset($params));
+ }
+
+ if (0 === strpos($name, 'to')) {
+ $format = substr($name, 2);
+ $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true;
+
+ return $this->exportTo($format, $includeLazyLoadColumns);
+ }
+
+ throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name));
+ }
View
248 src/Propel/Generator/Builder/Om/templates/baseObjectMethods.php
@@ -0,0 +1,248 @@
+
+ /**
+ * Returns whether the object has been modified.
+ *
+ * @return boolean True if the object has been modified.
+ */
+ public function isModified()
+ {
+ return !empty($this->modifiedColumns);
+ }
+
+ /**
+ * Has specified column been modified?
+ *
+ * @param string $col column fully qualified name (BasePeer::TYPE_COLNAME), e.g. Book::AUTHOR_ID
+ * @return boolean True if $col has been modified.
+ */
+ public function isColumnModified($col)
+ {
+ return in_array($col, $this->modifiedColumns);
+ }
+
+ /**
+ * Get the columns that have been modified in this object.
+ * @return array A unique list of the modified column names for this object.
+ */
+ public function getModifiedColumns()
+ {
+ return array_unique($this->modifiedColumns);
+ }
+
+ /**
+ * Returns whether the object has ever been saved. This will
+ * be false, if the object was retrieved from storage or was created
+ * and then saved.
+ *
+ * @return true, if the object has never been persisted.
+ */
+ public function isNew()
+ {
+ return $this->new;
+ }
+
+ /**
+ * Setter for the isNew attribute. This method will be called
+ * by Propel-generated children and Peers.
+ *
+ * @param boolean $b the state of the object.
+ */
+ public function setNew($b)
+ {
+ $this->new = (Boolean) $b;
+ }
+
+ /**
+ * Whether this object has been deleted.
+ * @return boolean The deleted state of this object.
+ */
+ public function isDeleted()
+ {
+ return $this->deleted;
+ }
+
+ /**
+ * Specify whether this object has been deleted.
+ * @param boolean $b The deleted state of this object.
+ * @return void
+ */
+ public function setDeleted($b)
+ {
+ $this->deleted = (Boolean) $b;
+ }
+
+ /**
+ * Sets the modified state for the object to be false.
+ * @param string $col If supplied, only the specified column is reset.
+ * @return void
+ */
+ public function resetModified($col = null)
+ {
+ if (null !== $col) {
+ while (false !== ($offset = array_search($col, $this->modifiedColumns))) {
+ array_splice($this->modifiedColumns, $offset, 1);
+ }
+ } else {
+ $this->modifiedColumns = array();
+ }
+ }
+
+ /**
+ * Compares this with another <code>BaseObject</code> instance. If
+ * <code>obj</code> is an instance of <code>BaseObject</code>, delegates to
+ * <code>equals(BaseObject)</code>. Otherwise, returns <code>false</code>.
+ *
+ * @param obj The object to compare to.
+ * @return Whether equal to the object specified.
+ */
+ public function equals($obj)
+ {
+ $thisclazz = get_class($this);
+ if (!is_object($obj) || !($obj instanceof $thisclazz)) {
+ return false;
+ }
+
+ if ($this === $obj) {
+ return true;
+ }
+
+ if (null === $this->getPrimaryKey()
+ || null === $obj->getPrimaryKey()) {
+ return false;
+ }
+
+ return $this->getPrimaryKey() === $obj->getPrimaryKey();
+ }
+
+ /**
+ * If the primary key is not <code>null</code>, return the hashcode of the
+ * primary key. Otherwise calls <code>Object.hashCode()</code>.
+ *
+ * @return int Hashcode
+ */
+ public function hashCode()
+ {
+ $ok = $this->getPrimaryKey();
+ if (null === $ok) {
+ return crc32(serialize($this));
+ }
+
+ return crc32(serialize($ok)); // serialize because it could be an array ("ComboKey")
+ }
+
+ /**
+ * Get the associative array of the virtual columns in this object
+ *
+ * @param string $name The virtual column name
+ *
+ * @return array
+ */
+ public function getVirtualColumns()
+ {
+ return $this->virtualColumns;
+ }
+
+ /**
+ * Checks the existence of a virtual column in this object
+ *
+ * @return boolean
+ */
+ public function hasVirtualColumn($name)
+ {
+ return isset($this->virtualColumns[$name]);
+ }
+
+ /**
+ * Get the value of a virtual column in this object
+ *
+ * @return mixed
+ */
+ public function getVirtualColumn($name)
+ {
+ if (!$this->hasVirtualColumn($name)) {
+ throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name));
+ }
+
+ return $this->virtualColumns[$name];
+ }
+
+ /**
+ * Set the value of a virtual column in this object
+ *
+ * @param string $name The virtual column name
+ * @param mixed $value The value to give to the virtual column
+ *
+ * @return BaseObject The current object, for fluid interface
+ */
+ public function setVirtualColumn($name, $value)
+ {
+ $this->virtualColumns[$name] = $value;
+
+ return $this;
+ }
+
+ /**
+ * Logs a message using Propel::log().
+ *
+ * @param string $msg
+ * @param int $priority One of the Propel::LOG_* logging levels
+ * @return boolean
+ */
+ protected function log($msg, $priority = Propel::LOG_INFO)
+ {
+ return Propel::log(get_class($this) . ': ' . $msg, $priority);
+ }
+
+ /**
+ * Populate the current object from a string, using a given parser format
+ * <code>
+ * $book = new Book();
+ * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}');
+ * </code>
+ *
+ * @param mixed $parser A AbstractParser instance,
+ * or a format name ('XML', 'YAML', 'JSON', 'CSV')
+ * @param string $data The source data to import from
+ *
+ * @return BaseObject The current object, for fluid interface
+ */
+ public function importFrom($parser, $data)
+ {
+ if (!$parser instanceof AbstractParser) {
+ $parser = AbstractParser::getParser($parser);
+ }
+
+ return $this->fromArray($parser->toArray($data), BasePeer::TYPE_PHPNAME);
+ }
+
+ /**
+ * Export the current object properties to a string, using a given parser format
+ * <code>
+ * $book = BookQuery::create()->findPk(9012);
+ * echo $book->exportTo('JSON');
+ * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}');
+ * </code>
+ *
+ * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV')
+ * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE.
+ * @return string The exported data
+ */
+ public function exportTo($parser, $includeLazyLoadColumns = true)
+ {
+ if (!$parser instanceof AbstractParser) {
+ $parser = AbstractParser::getParser($parser);
+ }
+
+ return $parser->fromArray($this->toArray(BasePeer::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true));
+ }
+
+ /**
+ * Clean up internal collections prior to serializing
+ * Avoids recursive loops that turn into segmentation faults when serializing
+ */
+ public function __sleep()
+ {
+ $this->clearAllReferences();
+
+ return array_keys(get_object_vars($this));
+ }

0 comments on commit e350664

Please sign in to comment.
Something went wrong with that request. Please try again.