sfActsAsVersionablePlugin: sfPropelVersionableBehaviorPlugin.patch
| File sfPropelVersionableBehaviorPlugin.patch, 32.4 kB (added by piers.warmers, 10 months ago) |
|---|
-
sfPropelVersionableBehaviorPlugin/test/unit/PropelVersionableBehaviorTest.php
old new 56 56 $test_class_version_column = sfConfig::get('app_sfPropelVersionableBehaviorPlugin_test_version_column', 'version'); 57 57 $test_class_title_column = sfConfig::get('app_sfPropelVersionableBehaviorPlugin_test_title_column', 'title'); 58 58 59 $titleSetMethod = forgeMethodName('set', $test_class_title_column); 60 $titleGetMethod = forgeMethodName('get', $test_class_title_column); 59 61 62 $versionSetMethod = forgeMethodName('set', $test_class_version_column); 63 $versionGetMethod = forgeMethodName('get', $test_class_version_column); 64 65 $createdBySetMethod = forgeMethodName('set', 'created_by'); 66 $createdByGetMethod = forgeMethodName('get', 'created_by'); 67 68 $commentSetMethod = forgeMethodName('set', 'comment'); 69 $commentGetMethod = forgeMethodName('get', 'comment'); 70 71 60 72 // create a new test browser 61 73 $browser = new sfTestBrowser(); 62 74 $browser->initialize(); … … 77 89 'version' => $test_class_version_column 78 90 )))); 79 91 80 $t = new lime_test( 49, new lime_output_color());92 $t = new lime_test(53, new lime_output_color()); 81 93 82 94 // save() 83 95 $t->diag('save()'); 84 96 85 97 $r = _create_resource(); 86 $r-> setByName($test_class_title_column, 'V1', BasePeer::TYPE_FIELDNAME);98 $r->$titleSetMethod('V1'); 87 99 $r->save(); 88 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 1, 'save() initializes the version number to 1 for new objects');100 $t->is($r->$versionGetMethod(), 1, 'save() initializes the version number to 1 for new objects'); 89 101 90 102 $c = new Criteria(); 91 103 $c->add(ResourceVersionPeer::RESOURCE_ID, $r->getPrimaryKey()); 92 104 $c->add(ResourceVersionPeer::RESOURCE_NAME, get_class($r)); 93 $c->add(ResourceVersionPeer::NUMBER, $r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME));105 $c->add(ResourceVersionPeer::NUMBER, $r->$versionGetMethod()); 94 106 $version = ResourceVersionPeer::doSelectOne($c); 95 107 $t->isnt($version, null, 'save() creates a new version of resource in database'); 96 108 foreach ($version->getResourceAttributeVersions() as $attrib_version) … … 98 110 $getter = sprintf('get%s', $attrib_version->getAttributeName()); 99 111 $t->is($attrib_version->getAttributeValue(), $r->$getter(), 'save() creates a new version of resource in database with appropriate parameters'); 100 112 } 101 $r-> setByName($test_class_title_column, 'V2', BasePeer::TYPE_FIELDNAME);113 $r->$titleSetMethod('V2'); 102 114 $r->save(); 103 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 2, 'save() increments the version number');115 $t->is($r->$versionGetMethod(), 2, 'save() increments the version number'); 104 116 117 118 105 119 // getLastResourceVersion() and getCurrentResourceVersion() 106 120 $t->diag('getLastResourceVersion() and getCurrentResourceVersion()'); 107 121 108 $t->is($r->getLastResourceVersion()->getResourceInstance()-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME), 'V2', 'getLastResourceVersion() returns last version of resource');109 $t->is($r->getCurrentResourceVersion()->getResourceInstance()-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME), 'V2', 'getCurrentResourceVersion() returns current version of resource');122 $t->is($r->getLastResourceVersion()->getResourceInstance()->$titleGetMethod(), 'V2', 'getLastResourceVersion() returns last version of resource'); 123 $t->is($r->getCurrentResourceVersion()->getResourceInstance()->$titleGetMethod(), 'V2', 'getCurrentResourceVersion() returns current version of resource'); 110 124 $r->toVersion(1); 111 $t->is($r->getLastResourceVersion()->getResourceInstance()-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME), 'V2', 'getLastResourceVersion() returns last version of resource');112 $t->is($r->getCurrentResourceVersion()->getResourceInstance()-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME), 'V1', 'getCurrentResourceVersion() returns current version of resource');125 $t->is($r->getLastResourceVersion()->getResourceInstance()->$titleGetMethod(), 'V2', 'getLastResourceVersion() returns last version of resource'); 126 $t->is($r->getCurrentResourceVersion()->getResourceInstance()->$titleGetMethod(), 'V1', 'getCurrentResourceVersion() returns current version of resource'); 113 127 $r->toVersion(2); 114 128 115 129 // setVersionComment() and setVersionUpdatedBy 116 130 $t->diag('setVersionComment() and setVersionCreatedBy'); 117 131 118 132 $r2 = _create_resource(); 119 $r2-> setByName($test_class_title_column, 'v0', BasePeer::TYPE_FIELDNAME);133 $r2->$titleSetMethod('v0'); 120 134 $r2->setVersionCreatedBy('foo'); 121 135 $r2->setVersionComment('bar'); 122 136 $r2->save(); 137 123 138 $r3 = call_user_func(array(_create_resource()->getPeer(), 'retrieveByPk'), $r2->getPrimaryKey()); 124 139 $t->is($r2->getCurrentResourceVersion()->getCreatedBy(), 'foo', 'setVersionCreatedBy() defines the author name to be saved in the ResourceVersion object'); 125 140 $t->is($r2->getVersionCreatedBy(), 'foo', 'getVersionCreatedBy() returns the creation date of the revision'); … … 127 142 $t->is($r2->getCurrentResourceVersion()->getComment(), 'bar', 'setVersionComment() defines the comment to be saved in the ResourceVersion object'); 128 143 $t->is($r2->getVersionComment(), 'bar', 'getVersionComment() is a proxy method for getCurrentResourceVersion()->getComment()'); 129 144 $t->is($r3->getVersionComment(), 'bar', 'getVersionComment() is a proxy method for getCurrentResourceVersion()->getComment()'); 130 $r2-> setByName($test_class_title_column, 'v0', BasePeer::TYPE_FIELDNAME);145 $r2->$titleSetMethod('v0'); 131 146 $r2->save(); 132 147 $resourceVersion = $r2->getCurrentResourceVersion(); 133 148 $t->is($resourceVersion->getCreatedBy(), '', 'setVersionCreatedBy() only affects the next version saved'); … … 135 150 136 151 // conditional versioning 137 152 $t->diag('conditional versioning'); 138 $r-> setByName($test_class_title_column, 'do not version me', BasePeer::TYPE_FIELDNAME);153 $r->$titleSetMethod('do not version me'); 139 154 $r->save(); 140 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 2, 'save() hooks can be deactivated by a versionConditionMet() method');155 $t->is($r->$versionGetMethod(), 2, 'save() hooks can be deactivated by a versionConditionMet() method'); 141 156 142 157 sfConfig::set('app_sfPropelVersionableBehaviorPlugin_auto_versioning', false); 143 $r-> setByName($test_class_title_column, 'do not version me either, but for another reason', BasePeer::TYPE_FIELDNAME);158 $r->$titleSetMethod('do not version me either, but for another reason'); 144 159 $r->save(); 145 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 2, 'save() hooks can be deactivated by changing app_sfPropelVersionableBehaviorPlugin_auto_versioning to off');160 $t->is($r->$versionGetMethod(), 2, 'save() hooks can be deactivated by changing app_sfPropelVersionableBehaviorPlugin_auto_versioning to off'); 146 161 sfConfig::set('app_sfPropelVersionableBehaviorPlugin_auto_versioning', true); 147 162 148 163 // addVersion() 149 164 $t->diag('addVersion()'); 150 165 sfConfig::set('app_sfPropelVersionableBehaviorPlugin_auto_versioning', false); 151 $r-> setByName($test_class_title_column, 'this time, please version me, but manually', BasePeer::TYPE_FIELDNAME);166 $r->$titleSetMethod('this time, please version me, but manually'); 152 167 $r->addVersion(); 153 168 $r->save(); 154 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 3, 'addVersion() creates a new version even when app_sfPropelVersionableBehaviorPlugin_auto_versioning is set to off');169 $t->is($r->$versionGetMethod(), 3, 'addVersion() creates a new version even when app_sfPropelVersionableBehaviorPlugin_auto_versioning is set to off'); 155 170 156 171 $r2 = _create_resource(); 157 172 try 158 173 { 159 $r2-> setByName($test_class_title_column, 'v0', BasePeer::TYPE_FIELDNAME);174 $r2->$titleSetMethod('v0'); 160 175 $r2->addVersion(); 161 176 $r2->save(); 162 177 $t->pass('calling addVersion() on an unsaved object does not throw an exception'); 163 178 } catch (Exception $e) { 164 179 $t->fail('calling addVersion() on an unsaved object does not throw an exception'); 165 180 } 166 $t->is($r2->getLastResourceVersion()->getNumber(), 1, ' addVersion() creates a version object even on unsaved objects');181 $t->is($r2->getLastResourceVersion()->getNumber(), 1, 'getLastResourceVersion() returns the correct version'); 167 182 168 $r2-> setByName($test_class_title_column, 'v1', BasePeer::TYPE_FIELDNAME);183 $r2->$titleSetMethod('v1'); 169 184 $r2->setVersionCreatedBy('author2'); 170 185 $r2->setVersionComment('baz'); 171 186 $r2->addVersion(); … … 174 189 $t->is($resourceVersion->getCreatedBy(), 'author2', 'addVersion() allows for use of setVersionCreatedBy()'); 175 190 $t->is($resourceVersion->getComment(), 'baz', 'addVersion() allows for use of setVersionComment()'); 176 191 177 $r2-> setByName($test_class_title_column, 'v2', BasePeer::TYPE_FIELDNAME);192 $r2->$titleSetMethod('v2'); 178 193 $r2->addVersion('author3', 'bazz'); 179 194 $r2->save(); 180 195 $resourceVersion = $r2->getCurrentResourceVersion(); 181 196 $t->is($resourceVersion->getCreatedBy(), 'author3', 'addVersion() accepts a version author name as first parameter'); 182 197 $t->is($resourceVersion->getComment(), 'bazz', 'addVersion() accepts a version comment as second parameter'); 183 198 184 185 199 sfConfig::set('app_sfPropelVersionableBehaviorPlugin_auto_versioning', true); 186 200 try 187 201 { … … 195 209 $t->diag('toVersion()'); 196 210 197 211 $r->toVersion(1); 198 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 1, 'toVersion() sets resource version to appropriate values');199 $t->is($r-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME), 'V1', 'toVersion() sets resource attributes to appropriate values');212 $t->is($r->$versionGetMethod(), 1, 'toVersion() sets resource version to appropriate values'); 213 $t->is($r->$titleGetMethod(), 'V1', 'toVersion() sets resource attributes to appropriate values'); 200 214 $r->save(); 201 $t->is($r-> getByName($test_class_version_column, BasePeer::TYPE_FIELDNAME), 4, 'save() correctly increments version number after toVersion() call');215 $t->is($r->$versionGetMethod(), 4, 'save() correctly increments version number after toVersion() call'); 202 216 try 203 217 { 204 218 $r->toVersion(0); … … 210 224 // getAllResourceVersions() 211 225 $t->diag('getAllResourceVersions()'); 212 226 213 $r-> setByName($test_class_title_column, 'V5', BasePeer::TYPE_FIELDNAME);227 $r->$titleSetMethod('V5'); 214 228 $r->save(); 215 229 $all_versions = $r->getAllResourceVersions(); 216 230 $target_versions = array('V1', 'V2', 'this time, please version me, but manually', 'V1', 'V5'); … … 218 232 $versions_titles = array(); 219 233 foreach($all_versions as $v) 220 234 { 221 $versions_titles[] = $v->getResourceInstance()-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME);235 $versions_titles[] = $v->getResourceInstance()->$titleGetMethod(); 222 236 } 223 237 $t->is($versions_titles, $target_versions, 'getAllResourceVersions() returns the right versions'); 224 238 239 240 225 241 // getAllVersions() 226 242 $t->diag('getAllVersions()'); 227 243 $all_object_versions = $r->getAllVersions(); … … 230 246 $versions_versions = array(); 231 247 foreach($all_object_versions as $obj) 232 248 { 233 $versions_titles[] = $obj-> getByName($test_class_title_column, BasePeer::TYPE_FIELDNAME);249 $versions_titles[] = $obj->$titleGetMethod(); 234 250 $versions_versions[] = $obj->getVersion(); 235 251 } 236 252 $t->is($versions_titles, $target_versions, 'getAllVersions() returns the right versions'); … … 263 279 264 280 sfConfig::set('app_sfPropelVersionableBehaviorPlugin_auto_versioning', false); 265 281 $r = _create_resource(); 266 $r-> setByName($test_class_title_column, 'v1', BasePeer::TYPE_FIELDNAME);282 $r->$titleSetMethod('v1'); 267 283 $r->addVersion('author1'); 268 284 $r->save(); 269 $r-> setByName($test_class_title_column, 'v2', BasePeer::TYPE_FIELDNAME);285 $r->$titleSetMethod('v2'); 270 286 $r->addVersion(null, 'because you\'re worth it'); 271 287 $r->save(); 272 $r-> setByName($test_class_title_column, 'v3', BasePeer::TYPE_FIELDNAME);288 $r->$titleSetMethod('v3'); 273 289 $r->addVersion('author2', 'minor corrections'); 274 290 $r->save(); 275 $r-> setByName($test_class_title_column, 'v4', BasePeer::TYPE_FIELDNAME);291 $r->$titleSetMethod('v4'); 276 292 $r->addVersion(); 277 293 $r->save(); 278 294 $versionAuthors = array(); … … 293 309 $t->diag('#1563 : sfPropelVersionableBehaviorPlugin does not create a version if YourClass::versionConditionMet() is not found'); 294 310 295 311 $r = _create_resource(); 296 $r-> setByName($test_class_title_column, 'v1', BasePeer::TYPE_FIELDNAME);312 $r->$titleSetMethod('v1'); 297 313 $r->save(); 298 314 sfPropelVersionableBehavior::setVersionConditionMethod('nonExistentMethod'); 299 $r-> setByName($test_class_title_column, 'do not version me', BasePeer::TYPE_FIELDNAME);315 $r->$titleSetMethod('do not version me'); 300 316 $r->save(); 301 317 $t->is($r->getLastResourceVersion()->getNumber(), 2, 'save() creates a version even if YourClass::versionConditionMet() is not found'); 302 318 … … 307 323 try 308 324 { 309 325 $r->save(); 310 $r-> setByName($test_class_title_column, '#1564', BasePeer::TYPE_FIELDNAME);326 $r->$titleSetMethod('#1564'); 311 327 $r->save(); 312 328 $t->pass('save() does not crash when creating a new version if no prior version exists and object is not new'); 313 329 } catch (Exception $e) { 314 $t->fail('save() does not crashwhen creating a new version if no prior version exists and object is not new');330 $t->fail('save() crashes when creating a new version if no prior version exists and object is not new'); 315 331 } 316 332 333 334 $r5 = _create_resource(); 335 336 if(method_exists($r5, "setCulture")) 337 { 338 339 $r5->setCulture('en'); 340 $r5->$titleSetMethod('V1 C-EN'); 341 342 $r5->setCulture('fr'); 343 $r5->$titleSetMethod('V1 C-FR'); 344 $r5->save(); 345 346 $r5->setCulture('en'); 347 $r5->$titleSetMethod('V2 C-EN'); 348 349 $r5->setCulture('fr'); 350 $r5->$titleSetMethod('V2 C-FR'); 351 $r5->save(); 352 353 $r5->toVersion(1); 354 $r5->setCulture('en'); 355 $t->is($r5->$titleGetMethod(), 'V1 C-EN', 'toVersion() sets resource attributes to appropriate values'); 356 357 358 } 359 360 361 362 363 364 317 365 // Helper functions 318 366 319 367 /** 368 * Return an accessor or setter method name 369 * 370 * @return string 371 */ 372 function forgeMethodName($prefix, $column) 373 { 374 return sprintf('%s%s', $prefix, sfInflector::camelize($column)); 375 } 376 377 /** 320 378 * Resource creation "abstraction". 321 379 * 322 380 * @return BaseObject -
sfPropelVersionableBehaviorPlugin/config/schema.yml
old new 14 14 15 15 resource_attribute_version: 16 16 id: 17 culture: { type: varchar(7), default: "" } 17 18 resource_version_id: { type: integer, size: 11, required: true, foreignTable: resource_version, foreignReference: id, onDelete: cascade } 18 19 attribute_name: { type: varchar, size: 255, required: true } 19 20 attribute_value: { type: longvarchar } -
sfPropelVersionableBehaviorPlugin/lib/model/ResourceVersion.php
old new 1 1 <?php 2 2 /* 3 3 * This file is part of the sfPropelActAsNestedSetBehavior package. 4 * 4 * 5 5 * (c) 2006-2007 Tristan Rivoallan <tristan@rivoallan.net> 6 * 6 * 7 7 * For the full copyright and license information, please view the LICENSE 8 8 * file that was distributed with this source code. 9 9 */ 10 10 11 11 /** 12 12 * Subclass for representing a row from the 'resource_version' table. 13 13 * 14 14 * * @package plugins.sfPropelVersionableBehaviorPlugin.lib.model 15 */ 15 */ 16 16 class ResourceVersion extends BaseResourceVersion 17 17 { 18 18 19 19 /** 20 20 * Populates version properties and creates necessary entries in the resource_attribute_version table. 21 * 21 * 22 22 * @param BaseObject $resource 23 23 */ 24 24 public function populateFromObject(BaseObject $resource) … … 26 26 $this->setResourceId($resource->getPrimaryKey()); 27 27 $this->setResourceName(get_class($resource)); 28 28 $this->setNumber($resource->getVersion()); 29 29 //$this->setCreatedBy($resource->getVersionCreatedBy()); 30 //$this->setComment($resource->getVersionComment()); 31 30 32 foreach ($resource->getPeer()->getFieldNames() as $attribute_name) 31 33 { 32 34 $getter = sprintf('get%s', $attribute_name); … … 35 37 $attribute_version->setAttributeValue($resource->$getter()); 36 38 $this->addResourceAttributeVersion($attribute_version); 37 39 } 40 41 // Handle any i18n data 42 if(method_exists($resource, "getCulture")) 43 { 44 $resourcePeer = $resource->getPeer()->retrieveByPk($resource->getId()); 45 46 if($resourcePeer) 47 { 48 $getI18ns = sprintf('get%si18ns', get_class($resource)); 49 $localizations = $resourcePeer->$getI18ns(); 50 foreach ($localizations as $l) 51 { 52 $resource->setCulture($l->getCulture()); 53 foreach ($l->getPeer()->getFieldNames() as $attribute_name) 54 { 55 $getter = sprintf('get%s', $attribute_name); 56 $attribute_version = new ResourceAttributeVersion(); 57 $attribute_version->setCulture($l->getCulture()); 58 $attribute_version->setAttributeName($attribute_name); 59 $attribute_version->setAttributeValue($resource->$getter()); 60 $this->addResourceAttributeVersion($attribute_version); 61 } 62 } 63 } 64 } 38 65 } 39 66 40 67 /** 41 68 * Returns resource instance corresponding to version. 42 * 69 * 43 70 * @return BaseObject 44 71 */ 45 72 public function getResourceInstance() … … 49 76 } 50 77 51 78 } 79 80 // $change_columns = array('created_details' => ResourceVersionPeer::NOTES, 'updated_details' => ResourceVersionPeer::NOTES); 81 82 // sfPropelBehavior::add('ResourceVersion', array('changeNotes' => array('columns' => $change_columns))); -
sfPropelVersionableBehaviorPlugin/lib/sfPropelVersionableBehavior.class.php
old new 1 1 <?php 2 2 /* 3 3 * This file is part of the sfPropelVersionableBehaviorPlugin package. 4 * 4 * 5 5 * (c) 2006-2007 Tristan Rivoallan <tristan@rivoallan.net> 6 * 6 * 7 7 * For the full copyright and license information, please view the LICENSE 8 8 * file that was distributed with this source code. 9 9 */ 10 10 11 11 /** 12 12 * This behavior adds versioning capabilities to any Propel object. 13 * 13 * 14 14 * To enable this behavior add this after Propel stub class declaration : 15 * 15 * 16 16 * <code> 17 17 * $columns_map = array('version' => MyClassPeer::VERSION); 18 * 18 * 19 19 * sfPropelBehavior::add('MyClass', array('versionable' => array('columns' => $columns_map))); 20 20 * </code> 21 * 21 * 22 22 * Column map values signification : 23 * 23 * 24 24 * - version : Model column holding resource's current version number 25 * 25 * 26 26 * @author Tristan Rivoallan <tristan@rivoallan.net> 27 27 * @author Francois Zaninotto <francois.zaninotto@symfony-project.com> 28 28 */ … … 31 31 32 32 /** 33 33 * Holds name of the method used for conditional versioning. 34 * 34 * 35 35 * @var string 36 36 */ 37 37 protected static $condition_method; 38 39 /** 40 * Holds holds the propel save count for i18n objects. 41 * 42 * @var string 43 */ 44 protected $i18n_save_count = 0; 38 45 39 # ---- PUBLIC API46 # ---- PUBLIC API 40 47 41 48 /** 42 49 * Sets resource properties to their value for requested version. 43 * 50 * 44 51 * @param BaseObject $resource 45 52 * @param integer $version_num 46 53 * @throws Exception When requested version does not exist 47 54 */ 48 public function toVersion(BaseObject $resource, $version_num )55 public function toVersion(BaseObject $resource, $version_num, $cultures = array()) 49 56 { 50 57 $c = new Criteria(); 51 58 $c->add(ResourceVersionPeer::RESOURCE_ID, $resource->getPrimaryKey()); 52 59 $c->add(ResourceVersionPeer::RESOURCE_NAME, get_class($resource)); 53 60 $c->add(ResourceVersionPeer::NUMBER, $version_num); 54 61 $version = ResourceVersionPeer::doSelectOne($c); 55 62 56 63 if (is_null($version)) 57 64 { 58 65 $msg = sprintf('Resource "%s" has no version "%d"', $resource->getPrimaryKey(), $version_num); 59 66 throw new Exception($msg); 60 67 } 61 62 $resource = self::populateResourceFromVersion($resource, $version );68 69 $resource = self::populateResourceFromVersion($resource, $version, $cultures); 63 70 } 64 71 65 72 /** 66 73 * Returns last version of resource. 67 * 74 * 68 75 * @param BaseObject $resource 69 76 * @return ResourceVersion 70 77 */ … … 74 81 $c->add(ResourceVersionPeer::RESOURCE_ID, $resource->getPrimaryKey()); 75 82 $c->add(ResourceVersionPeer::RESOURCE_NAME, get_class($resource)); 76 83 $c->addDescendingOrderByColumn(ResourceVersionPeer::NUMBER); 77 84 78 85 return ResourceVersionPeer::doSelectOne($c); 79 86 } 80 87 81 88 /** 82 89 * Returns current version of resource. 83 * 90 * 84 91 * @param BaseObject $resource 85 92 * @return ResourceVersion 86 93 */ … … 90 97 $c->add(ResourceVersionPeer::RESOURCE_ID, $resource->getPrimaryKey()); 91 98 $c->add(ResourceVersionPeer::RESOURCE_NAME, get_class($resource)); 92 99 $c->add(ResourceVersionPeer::NUMBER, $resource->getVersion()); 93 100 94 101 return ResourceVersionPeer::doSelectOne($c); 95 102 } 96 103 97 104 /** 98 105 * Returns all ResourceVersion instances related to the object, ordered by version asc. 99 * 106 * 100 107 * @param BaseObject $resource 101 108 * @return array List of ResourceVersion objects 102 109 */ … … 106 113 $c->add(ResourceVersionPeer::RESOURCE_ID, $resource->getPrimaryKey()); 107 114 $c->add(ResourceVersionPeer::RESOURCE_NAME, get_class($resource)); 108 115 $c->addAscendingOrderByColumn(ResourceVersionPeer::NUMBER); 109 116 110 117 return ResourceVersionPeer::doSelect($c); 111 118 } 112 119 113 120 /** 114 121 * Returns all ResourceVersion instances related to the object, ordered by version asc. 115 * 122 * 116 123 * @param BaseObject $resource 117 124 * @return array List of BaseObject objects 118 125 */ … … 124 131 $c->addAscendingOrderByColumn(ResourceVersionPeer::NUMBER); 125 132 $c->addJoin(ResourceAttributeVersionPeer::RESOURCE_VERSION_ID, ResourceVersionPeer::ID); 126 133 $attributes = ResourceAttributeVersionPeer::doSelect($c); 127 134 128 135 $objects = array(); 129 136 $object = null; 130 137 $class= get_class($resource); … … 142 149 } 143 150 $attrib_name = $attribute->getAttributeName(); 144 151 $setter = sprintf('set%s', $attrib_name); 145 152 146 153 if (!method_exists($resource, $setter)) 147 154 { 148 $msg = sprintf('Impossible to set attribute "%s" on resource "%s"', 149 $attrib_name, get_class($resource));155 $msg = sprintf('Impossible to set attribute "%s" on resource "%s"', 156 $attrib_name, get_class($resource)); 150 157 throw new Exception($msg); 151 158 } 152 159 $object->$setter($attribute->getAttributeValue()); 153 160 154 161 } 155 162 $objects[] = $object; 156 163 157 164 return $objects; 158 165 } 159 166 160 167 /** 161 168 * Increments the object's version number (without saving it) and creates a new ResourceVersion record. 162 169 * To be used when versionConditionMet() is false 163 * 170 * 164 171 * @param BaseObject $resource 165 172 * @param string Optional name of the revision author 166 173 * @param string Optional comment about the revision … … 185 192 self::createResourceVersion($resource, $createdBy, $comment); 186 193 } 187 194 188 # ---- GETTERS & SETTERS195 # ---- GETTERS & SETTERS 189 196 190 197 /** 191 198 * Returns resource version number. Proxy method to real getter. 192 * 199 * 193 200 * @param BaseObject $resource 194 201 * @return integer 195 202 */ … … 201 208 202 209 /** 203 210 * Sets resource version number. Proxy method to real setter. 204 * 211 * 205 212 * @param BaseObject $resource 206 213 * @param integer $version_number 207 214 */ 208 215 public function setVersion(BaseObject $resource, $version_number) 209 216 { 210 217 $setter = self::forgeMethodName($resource, 'set', 'version'); 211 return $resource->$setter($version_number); 218 return $resource->$setter($version_number); 212 219 } 213 220 214 221 /** 215 222 * Sets resource version comment. Temporarily stored in the resource itself. 216 * 223 * 217 224 * @param BaseObject $resource 218 225 * @param string $comment 219 226 */ … … 224 231 225 232 /** 226 233 * Gets resource version comment. 227 * 234 * 228 235 * @param BaseObject $resource 229 236 * 230 237 * @return string … … 243 250 244 251 /** 245 252 * Sets resource version author. Temporarily stored in the resource itself 246 * 253 * 247 254 * @param BaseObject $resource 248 255 * @param string $createdBy 249 256 */ … … 255 262 256 263 /** 257 264 * Gets resource version author. 258 * 265 * 259 266 * @param BaseObject $resource 260 267 * 261 268 * @return string … … 275 282 /** 276 283 * Proxy method for getting resource version creation date. 277 284 * But you'd better define an 'updated_at' column directly in the resource 278 * 285 * 279 286 * @param BaseObject $resource 280 287 * 281 288 * @return string … … 284 291 { 285 292 return $resource->getCurrentResourceVersion()->getCreatedAt($format); 286 293 } 287 288 # ---- HOOKS289 294 295 # ---- HOOKS 296 290 297 /** 291 298 * This hook is called before object is saved. 292 * 299 * 293 300 * @param BaseObject $resource 294 301 */ 295 302 public function preSave(BaseObject $resource) … … 299 306 self::incrementVersion($resource); 300 307 } 301 308 } 302 309 303 310 /** 304 * This hook is called just eafter object is saved. It takes care of creating a new version of resource.305 * 311 * This hook is called just after object is saved. It takes care of creating a new version of resource. 312 * 306 313 * @param BaseObject $resource 307 314 */ 308 315 public function postSave(BaseObject $resource) 309 { 316 { 310 317 if (self::versionConditionMet($resource)) 311 318 { 312 319 $createdBy = ''; … … 314 321 if(isset($resource->versionCreatedBy) && $resource->versionCreatedBy != '') 315 322 { 316 323 $createdBy = $resource->versionCreatedBy; 317 $resource->versionCreatedBy = ''; 324 if((method_exists($resource, "setCulture") && isset($resource->passedInitialI18nSave)) || !method_exists($resource, "setCulture")) 325 { 326 $resource->versionCreatedBy = ''; 327 } 318 328 } 319 329 if(isset($resource->versionComment) && $resource->versionComment != '') 320 330 { 321 331 $comment = $resource->versionComment; 322 $resource->versionComment = ''; 332 if((method_exists($resource, "setCulture") && isset($resource->passedInitialI18nSave)) || !method_exists($resource, "setCulture")) 333 { 334 $resource->versionComment = ''; 335 } 323 336 } 324 337 self::createResourceVersion($resource, $createdBy, $comment); 338 $this->cleanVersioningStore($resource); 325 339 } 326 340 if(isset($resource->resourceVersion) && $resource->resourceVersion instanceOf ResourceVersion) 327 341 { 328 342 $resource->resourceVersion->setResourceId($resource->getPrimaryKey()); 343 //if((method_exists($resource, "setCulture") && isset($resource->passedInitialI18nSave)) || !method_exists($resource, "setCulture")) 329 344 $resource->resourceVersion->save(); 330 345 $resource->resourceVersion = null; 331 346 } 347 $resource->passedInitialI18nSave = true; 348 self::cleanVersioningStore($resource); 332 349 } 333 350 334 351 /** 335 352 * This hook is called just after a resource is deleted and takes care of deleting its version history. 336 353 */ … … 342 359 ResourceVersionPeer::doDelete($c); 343 360 } 344 361 345 # ---- HELPER METHODS362 # ---- HELPER METHODS 346 363 347 364 /** 348 365 * Increments the version number of the current object or initializes it … … 378 395 if(!$resource->isNew()) 379 396 { 380 397 $version->save(); 398 self::cleanVersioningStore($resource); 381 399 } 382 400 else 383 401 { … … 385 403 // And leave it to the postSave() to save the version with the resource 386 404 } 387 405 } 388 406 389 407 /** 408 * An ugly hack, we know :D 409 * 410 * Here's the run-down. It seems that there is a behavior of propel i18n objects which makes the post 411 * save method run twice. This left us with the a difficult bug... 2 version with the same version number, 412 * and twice the attribute items. 413 * 414 * TODO: Find more elegant solution to i18n versioning bug 415 * 416 * @param BaseObject $resource 417 */ 418 private static function cleanVersioningStore(BaseObject $resource) 419 { 420 $c = new Criteria(); 421 $c->add(ResourceVersionPeer::RESOURCE_NAME,get_class($resource)); 422 $c->add(ResourceVersionPeer::NUMBER, $resource->getVersion()); 423 $c->add(ResourceVersionPeer::RESOURCE_ID, $resource->getID()); 424 $c->addDescendingOrderByColumn(ResourceVersionPeer::ID); 425 426 $versionInstances = ResourceVersionPeer::doSelect($c); 427 428 if(count($versionInstances) > 1) 429 { 430 $c->clear(); 431 $versionLatest = $versionInstances[0]; 432 $c->add(ResourceVersionPeer::ID, $versionLatest->getId(), Criteria::NOT_EQUAL); 433 $c->add(ResourceVersionPeer::RESOURCE_ID, $resource->getID()); 434 $c->add(ResourceVersionPeer::NUMBER, $resource->getVersion()); 435 ResourceVersionPeer::doDelete($c); 436 } 437 } 438 439 /** 390 440 * Returns a resource populated with attribute values of given version. 391 * 441 * 392 442 * @param BaseObject $resource 393 443 * @param BaseObject $version 444 * @param array $cultures An optional list of cultures to roll-back to 394 445 * @return BaseObject 395 446 */ 396 public static function populateResourceFromVersion(BaseObject $resource, BaseObject $version )447 public static function populateResourceFromVersion(BaseObject $resource, BaseObject $version, $cultures = array()) 397 448 { 398 449 foreach ($version->getResourceAttributeVersions() as $attrib_version) 399 450 { 400 451 $attrib_name = $attrib_version->getAttributeName(); 401 452 $setter = sprintf('set%s', $attrib_name); 402 453 403 454 if (!method_exists($resource, $setter)) 404 455 { 405 $msg = sprintf('Impossible to set attribute "%s" on resource "%s"', 406 $attrib_name, get_class($resource));456 $msg = sprintf('Impossible to set attribute "%s" on resource "%s"', 457 $attrib_name, get_class($resource)); 407 458 throw new Exception($msg); 408 459 } 460 461 if($attrib_version->getCulture() != '' && method_exists($resource, 'setCulture')) 462 { 463 $resource->setCulture($attrib_version->getCulture()); 464 } 465 409 466 $resource->$setter($attrib_version->getAttributeValue()); 410 467 } 411 412 413 468 return $resource; 414 469 } 415 470 416 471 /** 417 472 * Returns getter / setter name for requested column. 418 * 473 * 419 474 * @param BaseObject $resource 420 475 * @param string $prefix Usually 'get' or 'set' 421 476 * @param string $column version 422 477 */ 423 478 private static function forgeMethodName($resource, $prefix, $column) 424 479 { 425 $method_name = sprintf('%s%s', $prefix, 426 $resource->getPeer()->translateFieldName(self::getColumnConstant(get_class($resource), $column),427 BasePeer::TYPE_FIELDNAME,428 BasePeer::TYPE_PHPNAME));480 $method_name = sprintf('%s%s', $prefix, 481 $resource->getPeer()->translateFieldName(self::getColumnConstant(get_class($resource), $column), 482 BasePeer::TYPE_FIELDNAME, 483 BasePeer::TYPE_PHPNAME)); 429 484 return $method_name; 430 485 } 431 486 432 487 /** 433 488 * Returns constant value for requested column. 434 * 489 * 435 490 * @param string $resource_class 436 491 * @param string $column 437 492 * @return string … … 441 496 $conf_directive = sprintf('propel_behavior_versionable_%s_columns', $resource_class); 442 497 $columns = sfConfig::get($conf_directive); 443 498 444 return $columns[$column]; 499 return $columns[$column]; 445 500 } 446 501 447 502 /** 448 503 * Used to decide wether or not a new version of resource should be created. 449 * 504 * 450 505 * @param BaseObject $resource 451 506 * @return bool 452 507 */ … … 456 511 { 457 512 return false; 458 513 } 459 514 460 515 if (!$method = self::$condition_method) 461 516 { 462 517 $conf_directive = sprintf('propel_behavior_versionable_%s_conditional', get_class($resource)); … … 464 519 } 465 520 466 521 $has_condition_method = method_exists($resource, $method); 467 468 return !$has_condition_method || ($has_condition_method && $resource->$method()); 522 523 return !$has_condition_method || ($has_condition_method && $resource->$method()); 469 524 } 470 525 471 526 /** 472 527 * Sets object method used to decide if a new version should be created 473 * 528 * 474 529 * @param string 475 530 */ 476 531 public static function setVersionConditionMethod($method_name) 477 532 { 478 533 $previous_method = self::$condition_method; 479 534 self::$condition_method = $method_name; 480 535 481 536 return $previous_method; 482 537 } 483 538 484 539 /** 485 * 540 * 486 541 */ 487 542 public static function getVersionConditionMethod() 488 543 {
