]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - data/Relationships/One2MRelationship.php
Release 6.4.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-2011 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 BAAAD
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     public function getQuery($link, $params = array())
111     {
112         //Self referenceing one to many relationships use one link for subpanels and normal views.
113         //This mean we have to reverse it for normal views
114         if (($link->getSide() == REL_LHS && !$this->selfReferencing)
115             || $link->getSide() == REL_RHS && $this->selfReferencing
116         ) {
117             $knownKey = $this->def['join_key_lhs'];
118             $targetKey = $this->def['join_key_rhs'];
119         }
120         else
121         {
122             $knownKey = $this->def['join_key_rhs'];
123             $targetKey = $this->def['join_key_lhs'];
124         }
125         $rel_table = $this->getRelationshipTable();
126
127         $where = "$rel_table.$knownKey = '{$link->getFocus()->id}'" . $this->getRoleWhere();
128
129         if (empty($params['return_as_array'])) {
130             return "SELECT $targetKey id FROM $rel_table WHERE $where AND deleted=0";
131         }
132         else
133         {
134             return array(
135                 'select' => "SELECT $targetKey id",
136                 'from' => "FROM $rel_table",
137                 'where' => "WHERE $where AND $rel_table.deleted=0",
138             );
139         }
140     }
141
142     /**
143      * @param  $lhs SugarBean left side bean to add to the relationship.
144      * @param  $rhs SugarBean right side bean to add to the relationship.
145      * @param  $additionalFields key=>value pairs of fields to save on the relationship
146      * @return boolean true if successful
147      */
148     public function add($lhs, $rhs, $additionalFields = array())
149     {
150         $dataToInsert = $this->getRowToInsert($lhs, $rhs, $additionalFields);
151         //If the current data matches the existing data, don't do anything
152         if (!$this->checkExisting($dataToInsert))
153         {
154             $rhsLinkName = $this->rhsLink;
155             //In a one to many, any existing links from the many (right) side must be removed first
156             $rhs->load_relationship($rhsLinkName);
157             $this->removeAll($rhs->$rhsLinkName);
158             parent::add($lhs, $rhs, $additionalFields);
159         }
160     }
161
162     /**
163      * Just overriding the function from M2M to prevent it from occuring
164      */
165     protected function addSelfReferencing($lhs, $rhs, $additionalFields = array())
166     {
167         //No opp on One2M.
168     }
169
170     /**
171      * Just overriding the function from M2M to prevent it from occuring
172      */
173     protected function removeSelfReferencing($lhs, $rhs, $additionalFields = array())
174     {
175         //No opp on One2M.
176     }
177 }