]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - data/Relationships/One2MRelationship.php
Release 6.5.3
[Github/sugarcrm.git] / data / Relationships / One2MRelationship.php
1 <?php
2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4  * SugarCRM Community Edition is a customer relationship management program developed by
5  * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
6  * 
7  * This program is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU Affero General Public License version 3 as published by the
9  * Free Software Foundation with the addition of the following permission added
10  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13  * 
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
17  * details.
18  * 
19  * You should have received a copy of the GNU Affero General Public License along with
20  * this program; if not, see http://www.gnu.org/licenses or write to the Free
21  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301 USA.
23  * 
24  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26  * 
27  * The interactive user interfaces in modified source and object code versions
28  * of this program must display Appropriate Legal Notices, as required under
29  * Section 5 of the GNU Affero General Public License version 3.
30  * 
31  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32  * these Appropriate Legal Notices must retain the display of the "Powered by
33  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34  * technical reasons, the Appropriate Legal Notices must display the words
35  * "Powered by SugarCRM".
36  ********************************************************************************/
37
38
39 require_once("data/Relationships/M2MRelationship.php");
40
41 /**
42  * Represents a one to many relationship that is table based.
43  * @api
44  */
45 class One2MRelationship extends M2MRelationship
46 {
47
48     public function __construct($def)
49     {
50         global $dictionary;
51
52         $this->def = $def;
53         $this->name = $def['name'];
54
55         $this->selfReferencing = $def['lhs_module'] == $def['rhs_module'];
56         $lhsModule = $def['lhs_module'];
57         $rhsModule = $def['rhs_module'];
58
59         if ($this->selfReferencing)
60         {
61             $links = VardefManager::getLinkFieldForRelationship(
62                 $lhsModule, BeanFactory::getObjectName($lhsModule), $this->name
63             );
64             if (empty($links))
65             {
66                 $GLOBALS['log']->fatal("No Links found for relationship {$this->name}");
67             }
68             else {
69                 if (!is_array($links)) //Only one link for a self referencing relationship, this is very bad.
70                 {
71                     $this->lhsLinkDef = $this->rhsLinkDef = $links;
72                 }
73                 else if (!empty($links[0]) && !empty($links[1]))
74                 {
75
76                     if ((!empty($links[0]['side']) && $links[0]['side'] == "right")
77                         || (!empty($links[0]['link_type']) && $links[0]['link_type'] == "one"))
78                     {
79                         //$links[0] is the RHS
80                         $this->lhsLinkDef = $links[1];
81                         $this->rhsLinkDef = $links[0];
82                     } else
83                     {
84                         //$links[0] is the LHS
85                         $this->lhsLinkDef = $links[0];
86                         $this->rhsLinkDef = $links[1];
87                     }
88                 }
89             }
90         } else
91         {
92             $this->lhsLinkDef = VardefManager::getLinkFieldForRelationship(
93                 $lhsModule, BeanFactory::getObjectName($lhsModule), $this->name
94             );
95             $this->rhsLinkDef = VardefManager::getLinkFieldForRelationship(
96                 $rhsModule, BeanFactory::getObjectName($rhsModule), $this->name
97             );
98             if (!isset($this->lhsLinkDef['name']) && isset($this->lhsLinkDef[0]))
99             {
100               $this->lhsLinkDef = $this->lhsLinkDef[0];
101             }
102             if (!isset($this->rhsLinkDef['name']) && isset($this->rhsLinkDef[0])) {
103                 $this->rhsLinkDef = $this->rhsLinkDef[0];
104             }
105         }
106         $this->lhsLink = $this->lhsLinkDef['name'];
107         $this->rhsLink = $this->rhsLinkDef['name'];
108     }
109
110     protected function linkIsLHS($link) {
111         return ($link->getSide() == REL_LHS && !$this->selfReferencing) ||
112                ($link->getSide() == REL_RHS && $this->selfReferencing);
113     }
114
115     /**
116      * @param  $lhs SugarBean left side bean to add to the relationship.
117      * @param  $rhs SugarBean right side bean to add to the relationship.
118      * @param  $additionalFields key=>value pairs of fields to save on the relationship
119      * @return boolean true if successful
120      */
121     public function add($lhs, $rhs, $additionalFields = array())
122     {
123         $dataToInsert = $this->getRowToInsert($lhs, $rhs, $additionalFields);
124         
125         //If the current data matches the existing data, don't do anything
126         if (!$this->checkExisting($dataToInsert))
127         {
128                         // Pre-load the RHS relationship, which is used later in the add() function and expects a Bean
129                         // and we also use it for clearing relationships in case of non self-referencing O2M relations
130                         // (should be preloaded because when using the relate_to field for updating/saving relationships,
131                         // only the bean id is loaded into $rhs->$rhsLinkName)
132                         $rhsLinkName = $this->rhsLink;
133                         $rhs->load_relationship($rhsLinkName);
134                 
135                         // If it's a One2Many self-referencing relationship
136                 // the positions of the default One (LHS) and Many (RHS) are swaped
137                 // so we should clear the links from the many (left) side
138                 if ($this->selfReferencing) {
139                         // Load right hand side relationship name
140                     $linkName = $this->rhsLink;
141                     // Load the relationship into the left hand side bean
142                     $lhs->load_relationship($linkName);
143                     
144                     // Pick the loaded link
145                     $link = $lhs->$linkName;
146                     // Get many (LHS) side bean
147                     $focus = $link->getFocus();
148                     // Get relations
149                         $related = $link->getBeans();
150                         
151                         // Clear the relations from many side bean
152                         foreach($related as $relBean) {
153                                 $this->remove($focus, $relBean);
154                         }
155             } else { // For non self-referencing, remove all the relationships from the many (RHS) side
156                 $this->removeAll($rhs->$rhsLinkName);
157             }
158             
159             // Add relationship
160             parent::add($lhs, $rhs, $additionalFields);
161         }
162     }
163
164     /**
165      * Just overriding the function from M2M to prevent it from occuring
166      * 
167      * The logic for dealing with adding self-referencing one-to-many relations is in the add() method
168      */
169     protected function addSelfReferencing($lhs, $rhs, $additionalFields = array())
170     {
171         //No-op on One2M.
172     }
173
174     /**
175      * Just overriding the function from M2M to prevent it from occuring
176      */
177     protected function removeSelfReferencing($lhs, $rhs, $additionalFields = array())
178     {
179         //No-op on One2M.
180     }
181 }