2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
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.
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
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
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.
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.
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 ********************************************************************************/
41 require_once('include/generic/SugarWidgets/SugarWidgetSubPanelTopButton.php');
42 require_once('include/generic/SugarWidgets/SugarWidgetReportField.php');
43 require_once('include/database/DBHelper.php');
48 var $widget_prefix = 'SugarWidget';
49 var $default_widget_name = 'Field';
52 function LayoutManager()
54 // set a sane default for context
55 $this->defs['context'] = 'Detail';
56 $this->DBHelper = $GLOBALS['db']->getHelper();
59 function setAttribute($key,$value)
61 $this->defs[$key] = $value;
64 function setAttributePtr($key,&$value)
66 $this->defs[$key] = $value;
69 function getAttribute($key)
71 if ( isset($this->defs[$key]))
73 return $this->defs[$key];
79 // Take the class name from the widget definition and use the class to look it up
80 // $use_default will default classes to SugarWidgetFieldxxxxx
81 function getClassFromWidgetDef($widget_def, $use_default = false)
83 static $class_map = array(
84 'SugarWidgetSubPanelTopCreateButton' => array(
85 'widget_class'=>'SugarWidgetSubPanelTopButton',
86 'title'=>'LBL_NEW_BUTTON_TITLE',
87 'access_key'=>'LBL_NEW_BUTTON_KEY',
88 'form_value'=>'LBL_NEW_BUTTON_LABEL',
91 'SugarWidgetSubPanelTopButtonQuickCreate' => array(
92 'widget_class'=>'SugarWidgetSubPanelTopButtonQuickCreate',
93 'title'=>'LBL_NEW_BUTTON_TITLE',
94 'access_key'=>'LBL_NEW_BUTTON_KEY',
95 'form_value'=>'LBL_NEW_BUTTON_LABEL',
98 'SugarWidgetSubPanelTopScheduleMeetingButton' => array(
99 'widget_class'=>'SugarWidgetSubPanelTopScheduleMeetingButton',
100 'module'=>'Meetings',
101 'title'=>'LBL_NEW_BUTTON_TITLE',
102 'access_key'=>'LBL_NEW_BUTTON_KEY',
103 'form_value'=>'LNK_NEW_MEETING',
106 'SugarWidgetSubPanelTopScheduleCallButton' => array(
107 'widget_class'=>'SugarWidgetSubPanelTopScheduleCallButton',
109 'title'=>'LBL_NEW_BUTTON_TITLE',
110 'access_key'=>'LBL_NEW_BUTTON_KEY',
111 'form_value'=>'LNK_NEW_CALL',
114 'SugarWidgetSubPanelTopCreateTaskButton' => array(
115 'widget_class'=>'SugarWidgetSubPanelTopCreateTaskButton',
117 'title'=>'LBL_NEW_BUTTON_TITLE',
118 'access_key'=>'LBL_NEW_BUTTON_KEY',
119 'form_value'=>'LNK_NEW_TASK',
122 'SugarWidgetSubPanelTopCreateNoteButton' => array(
123 'widget_class'=>'SugarWidgetSubPanelTopCreateNoteButton',
125 'title'=>'LBL_NEW_BUTTON_TITLE',
126 'access_key'=>'LBL_NEW_BUTTON_KEY',
127 'form_value'=>'LNK_NEW_NOTE',
130 'SugarWidgetSubPanelTopCreateContactAccountButton' => array(
131 'widget_class'=>'SugarWidgetSubPanelTopButton',
132 'module'=>'Contacts',
133 'title'=>'LBL_NEW_BUTTON_TITLE',
134 'access_key'=>'LBL_NEW_BUTTON_KEY',
135 'form_value'=>'LBL_NEW_BUTTON_LABEL',
136 'additional_form_fields' => array(
137 'primary_address_street' => 'shipping_address_street',
138 'primary_address_city' => 'shipping_address_city',
139 'primary_address_state' => 'shipping_address_state',
140 'primary_address_country' => 'shipping_address_country',
141 'primary_address_postalcode' => 'shipping_address_postalcode',
142 'to_email_addrs' => 'email1'
146 'SugarWidgetSubPanelTopCreateContact' => array(
147 'widget_class'=>'SugarWidgetSubPanelTopButton',
148 'module'=>'Contacts',
149 'title'=>'LBL_NEW_BUTTON_TITLE',
150 'access_key'=>'LBL_NEW_BUTTON_KEY',
151 'form_value'=>'LBL_NEW_BUTTON_LABEL',
152 'additional_form_fields' => array(
153 'account_id' => 'account_id',
154 'account_name' => 'account_name',
158 'SugarWidgetSubPanelTopCreateRevisionButton'=> array(
159 'widget_class'=>'SugarWidgetSubPanelTopButton',
160 'module'=>'DocumentRevisions',
161 'title'=>'LBL_NEW_BUTTON_TITLE',
162 'access_key'=>'LBL_NEW_BUTTON_KEY',
163 'form_value'=>'LBL_NEW_BUTTON_LABEL',
164 'additional_form_fields' => array(
165 'parent_name'=>'document_name',
166 'document_name' => 'document_name',
167 'document_revision' => 'latest_revision',
168 'document_filename' => 'filename',
169 'document_revision_id' => 'document_revision_id',
174 'SugarWidgetSubPanelTopCreateDirectReport' => array(
175 'widget_class'=>'SugarWidgetSubPanelTopButton',
176 'module'=>'Contacts',
177 'title'=>'LBL_NEW_BUTTON_TITLE',
178 'access_key'=>'LBL_NEW_BUTTON_KEY',
179 'form_value'=>'LBL_NEW_BUTTON_LABEL',
180 'additional_form_fields' => array(
181 'reports_to_name' => 'name',
182 'reports_to_id' => 'id',
186 'SugarWidgetSubPanelTopSelectFromReportButton' => array(
187 'widget_class'=>'SugarWidgetSubPanelTopSelectButton',
189 'title'=>'LBL_SELECT_REPORTS_BUTTON_LABEL',
190 'access_key'=>'LBL_SELECT_BUTTON_KEY',
191 'form_value'=>'LBL_SELECT_REPORTS_BUTTON_LABEL',
193 'add_to_passthru_data'=>array (
194 'return_type'=>'report',
197 'SugarWidgetSubPanelAddToProspectListButton' => array(
198 'widget_class'=>'SugarWidgetSubPanelTopSelectButton',
199 'module'=>'ProspectLists',
200 'title'=>'LBL_ADD_TO_PROSPECT_LIST_BUTTON_LABEL',
201 'access_key'=>'LBL_ADD_TO_PROSPECT_LIST_BUTTON_KEY',
202 'form_value'=>'LBL_ADD_TO_PROSPECT_LIST_BUTTON_LABEL',
204 'add_to_passthru_data'=>array (
205 'return_type'=>'addtoprospectlist',
206 'parent_module'=>'ProspectLists',
207 'parent_type'=>'ProspectList',
208 'child_id'=>'target_id',
209 'link_attribute'=>'target_type',
210 'link_type'=>'polymorphic', //polymorphic or default
215 $fieldDef = $this->getFieldDef($widget_def);
216 if(!empty($fieldDef) && !empty($fieldDef['type']) && strtolower(trim($fieldDef['type'])) == 'multienum'){
217 $widget_def['widget_class'] = 'Fieldmultienum';
219 if(!empty($fieldDef) && !empty($fieldDef['type']) && strtolower(trim($fieldDef['type'])) == 'bool'){
220 $widget_def['widget_class'] = 'Fieldbool';
224 switch($widget_def['name']) {
225 case 'assigned_user_id':
226 $widget_def['widget_class'] = 'Fielduser_name';
229 if ( isset($widget_def['type']) ) {
230 $widget_def['widget_class'] = 'Field' . $widget_def['type'];
233 $widget_def['widget_class'] = 'Field' . $this->DBHelper->getFieldType($widget_def);
238 if(!empty($widget_def['name']) && $widget_def['name'] == 'team_set_id'){
239 $widget_def['widget_class'] = 'Fieldteam_set_id';
242 if(empty($widget_def['widget_class']))
244 // Default the class to SugarWidgetField
245 $class_name = $this->widget_prefix.$this->default_widget_name;
249 $class_name = $this->widget_prefix.$widget_def['widget_class'];
252 // Check to see if this is one of the known class mappings.
253 if(!empty($class_map[$class_name]))
255 if (empty($class_map[$class_name]['widget_class'])) {
256 $widget = new SugarWidgetSubPanelTopButton($class_map[$class_name]);
259 if (!class_exists($class_map[$class_name]['widget_class'])) {
260 require_once('include/generic/SugarWidgets/'.$class_map[$class_name]['widget_class'].'.php');
263 $widget = new $class_map[$class_name]['widget_class']($class_map[$class_name]);
270 // At this point, we have a class name and we do not have a valid class defined.
271 if(!class_exists($class_name))
274 // The class does not exist. Try including it.
275 if (file_exists('custom/include/generic/SugarWidgets/'.$class_name.'.php'))
276 require_once('custom/include/generic/SugarWidgets/'.$class_name.'.php');
277 else if (file_exists('include/generic/SugarWidgets/'.$class_name.'.php'))
278 require_once('include/generic/SugarWidgets/'.$class_name.'.php');
280 if(!class_exists($class_name))
282 // If we still do not have a class, oops....
283 die("LayoutManager: Class not found:".$class_name);
287 $widget = new $class_name($this); // cache disabled $this->getClassFromCache($class_name);
292 function getFieldDef($widget_def){
294 if(!empty($widget_def['module']) &&!empty($GLOBALS['beanList'][$widget_def['module']]) && !empty($GLOBALS['beanFiles'][$GLOBALS['beanList'][$widget_def['module']]])){
295 if (!isset($beanCache[$widget_def['module']])){
296 $beanCache[$widget_def['module']] = new $GLOBALS['beanList'][$widget_def['module']]();
298 $bean = $beanCache[$widget_def['module']];
299 if(!empty($widget_def['name']) && !empty($bean->field_name_map) &&!empty($bean->field_name_map[$widget_def['name']]) ){
300 return $bean->field_name_map[$widget_def['name']];
307 function widgetDisplay($widget_def, $use_default = false)
309 $theclass = $this->getClassFromWidgetDef($widget_def, $use_default);
310 $label = isset($widget_def['module']) ? $widget_def['module'] : '';
311 if (is_subclass_of($theclass, 'SugarWidgetSubPanelTopButton')) {
312 $label = $theclass->get_subpanel_relationship_name($widget_def);
314 $theclass->setWidgetId($label);
317 $fieldDef = $this->getFieldDef($widget_def);
318 if(!empty($fieldDef) && !empty($fieldDef['type']) && strtolower(trim($fieldDef['type'])) == 'multienum'){
319 $widget_def['fields'] = sugarArrayMerge($widget_def['fields'] , $fieldDef);
320 $widget_def['fields']['module'] = $label;
324 return $theclass->display($widget_def);
327 function widgetQuery($widget_def, $use_default = false)
329 $theclass = $this->getClassFromWidgetDef($widget_def, $use_default);
331 return $theclass->query($widget_def);
334 // display an input field
335 // module is the parent module of the def
336 function widgetDisplayInput($widget_def, $use_default = false)
338 $theclass = $this->getClassFromWidgetDef($widget_def, $use_default);
339 return $theclass->displayInput($widget_def);