]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - data/Relationships/One2MRelationship.php
Release 6.5.0
[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         //If the current data matches the existing data, don't do anything
125         if (!$this->checkExisting($dataToInsert))
126         {
127             $rhsLinkName = $this->rhsLink;
128             //In a one to many, any existing links from the many (right) side must be removed first
129             $rhs->load_relationship($rhsLinkName);
130             $this->removeAll($rhs->$rhsLinkName);
131             parent::add($lhs, $rhs, $additionalFields);
132         }
133     }
134
135     /**
136      * Just overriding the function from M2M to prevent it from occuring
137      */
138     protected function addSelfReferencing($lhs, $rhs, $additionalFields = array())
139     {
140         //No-op on One2M.
141     }
142
143     /**
144      * Just overriding the function from M2M to prevent it from occuring
145      */
146     protected function removeSelfReferencing($lhs, $rhs, $additionalFields = array())
147     {
148         //No-op on One2M.
149     }
150 }