Index: sapphire/core/model/DataObject.php =================================================================== --- sapphire/core/model/DataObject.php (revision 1656) +++ sapphire/core/model/DataObject.php (revision 1657) @@ -1638,7 +1638,7 @@ * @param string $component Name of component * @return array */ - public function many_many_extraFields($component = null) { + public function many_many_extraFields($component = null, $classOnly = true) { $classes = ClassInfo::ancestry($this); foreach($classes as $class) { @@ -1658,6 +1658,9 @@ $manyMany = $SNG_class->stat('many_many'); $candidate = (isset($manyMany[$component])) ? $manyMany[$component] : null; if($candidate) { + if($classOnly) { + $candidate = preg_replace('/(.+)?\..+/', '$1', $candidate); + } $SNG_candidate = singleton($candidate); $candidateManyMany = $SNG_candidate->stat('belongs_many_many'); @@ -1680,6 +1683,9 @@ $manyMany = $SNG_class->stat('belongs_many_many'); $candidate = (isset($manyMany[$component])) ? $manyMany[$component] : null; if($candidate) { + if($classOnly) { + $candidate = preg_replace('/(.+)?\..+/', '$1', $candidate); + } $SNG_candidate = singleton($candidate); $candidateManyMany = $SNG_candidate->stat('many_many'); @@ -1687,6 +1693,9 @@ if($candidateManyMany) foreach($candidateManyMany as $relation => $relatedClass) { if($relatedClass == $class) { $relationName = $relation; + } elseif($relatedClass == "$class.$component") { + $relationName = $relation; + break; } } @@ -1726,7 +1735,7 @@ * * @return array An array of (parentclass, childclass), or an array of all many-many components */ - public function many_many($component = null) { + public function many_many($component = null, $classOnly = true) { $classes = ClassInfo::ancestry($this); foreach($classes as $class) { @@ -1738,6 +1747,9 @@ // Try many_many $candidate = (isset($manyMany[$component])) ? $manyMany[$component] : null; if($candidate) { + if($classOnly) { + $candidate = preg_replace('/(.+)?\..+/', '$1', $candidate); + } $parentField = $class . "ID"; $childField = ($class == $candidate) ? "ChildID" : $candidate . "ID"; return array($class, $candidate, $parentField, $childField, "{$class}_$component"); @@ -1747,24 +1759,47 @@ $belongsManyMany = Object::uninherited_static($class, 'belongs_many_many'); $candidate = (isset($belongsManyMany[$component])) ? $belongsManyMany[$component] : null; if($candidate) { + + $candidateComponent = preg_replace('/(.+)?(?:\.(.*))?/', '$2', $candidate); + $candidate = preg_replace('/(.+)?\..+/', '$1', $candidate); $childField = $candidate . "ID"; - + // We need to find the inverse component name $otherManyMany = Object::uninherited_static($candidate, 'many_many'); if(!$otherManyMany) { user_error("Inverse component of $candidate not found ({$this->class})", E_USER_ERROR); } + if($candidateComponent) { + if(isset($otherManyMany[$candidateComponent])) { + $candidateClass = $otherManyMany[$candidateComponent]; + if($classOnly) { + $candidateClass = preg_replace('/(.+)?\..+/', '$1', $candidateClass); + } + if($candidateClass == $class || is_subclass_of($class, $candidateClass)) { + $parentField = ($class == $candidate) ? "ChildID" : $candidateClass . "ID"; + // HACK HACK HACK! + if($component == 'NestedProducts') { + $parentField = $candidateClass . "ID"; + } - foreach($otherManyMany as $inverseComponentName => $candidateClass) { - if($candidateClass == $class || is_subclass_of($class, $candidateClass)) { - $parentField = ($class == $candidate) ? "ChildID" : $candidateClass . "ID"; - // HACK HACK HACK! - if($component == 'NestedProducts') { - $parentField = $candidateClass . "ID"; + return array($class, $candidate, $parentField, $childField, "{$candidate}_$inverseComponentName"); } - - return array($class, $candidate, $parentField, $childField, "{$candidate}_$inverseComponentName"); } + } else { + foreach($otherManyMany as $inverseComponentName => $candidateClass) { + if($classOnly) { + $candidateClass = preg_replace('/(.+)?\..+/', '$1', $candidateClass); + } + if($candidateClass == $class || is_subclass_of($class, $candidateClass)) { + $parentField = ($class == $candidate) ? "ChildID" : $candidateClass . "ID"; + // HACK HACK HACK! + if($component == 'NestedProducts') { + $parentField = $candidateClass . "ID"; + } + + return array($class, $candidate, $parentField, $childField, "{$candidate}_$inverseComponentName"); + } + } } user_error("Orphaned \$belongs_many_many value for $this->class.$component", E_USER_ERROR); } @@ -2997,6 +3032,7 @@ if($manyMany = $this->uninherited('many_many', true)) { $extras = $this->uninherited('many_many_extraFields', true); foreach($manyMany as $relationship => $childClass) { + $childClass = preg_replace('#^(.+?)\..+$#', '$1', $childClass); // Build field list $manymanyFields = array( "{$this->class}ID" => "Int",