]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - include/formbase.php
Release 6.5.9
[Github/sugarcrm.git] / include / formbase.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
40  * Description:  is a form helper
41  * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
42  * All Rights Reserved.
43  * Contributor(s): ______________________________________..
44  ********************************************************************************/
45
46 /**
47  * Check for null or zero for list of values
48  * @param $prefix the prefix of value to be checked
49  * @param $required array of value to be checked
50  * @return boolean true if all values are set in the array
51  */
52 function checkRequired($prefix, $required)
53 {
54         foreach($required as $key)
55         {
56                 if(!isset($_POST[$prefix.$key]) || number_empty($_POST[$prefix.$key]))
57                 {
58                         return false;
59                 }
60         }
61         return true;
62 }
63
64 function populateFromPost($prefix, &$focus, $skipRetrieve=false) {
65         global $current_user;
66
67         if(!empty($_REQUEST[$prefix.'record']) && !$skipRetrieve)
68                 $focus->retrieve($_REQUEST[$prefix.'record']);
69
70         if(!empty($_POST['assigned_user_id']) && 
71             ($focus->assigned_user_id != $_POST['assigned_user_id']) && 
72             ($_POST['assigned_user_id'] != $current_user->id)) {
73                 $GLOBALS['check_notify'] = true;
74         }
75     require_once('include/SugarFields/SugarFieldHandler.php');
76     $sfh = new SugarFieldHandler();
77    
78         foreach($focus->field_defs as $field=>$def) {
79         if ( $field == 'id' && !empty($focus->id) ) {
80             // Don't try and overwrite the ID
81             continue;
82         }
83             $type = !empty($def['custom_type']) ? $def['custom_type'] : $def['type'];
84                 $sf = $sfh->getSugarField($type);
85         if($sf != null){
86             $sf->save($focus, $_POST, $field, $def, $prefix);
87         } else {
88             $GLOBALS['log']->fatal("Field '$field' does not have a SugarField handler");
89         }
90
91 /*
92         if(isset($_POST[$prefix.$field])) {
93                         if(is_array($_POST[$prefix.$field]) && !empty($focus->field_defs[$field]['isMultiSelect'])) {
94                                 if($_POST[$prefix.$field][0] === '' && !empty($_POST[$prefix.$field][1]) ) {
95                                         unset($_POST[$prefix.$field][0]);
96                                 }
97                                 $_POST[$prefix.$field] = encodeMultienumValue($_POST[$prefix.$field]);  
98                         }
99
100                         $focus->$field = $_POST[$prefix.$field];
101                         /* 
102                          * overrides the passed value for booleans.
103                          * this will be fully deprecated when the change to binary booleans is complete.
104                          /
105                         if(isset($focus->field_defs[$prefix.$field]) && $focus->field_defs[$prefix.$field]['type'] == 'bool' && isset($focus->field_defs[$prefix.$field]['options'])) {
106                                 $opts = explode("|", $focus->field_defs[$prefix.$field]['options']);
107                                 $bool = $_POST[$prefix.$field];
108
109                                 if(is_int($bool) || ($bool === "0" || $bool === "1" || $bool === "2")) {
110                                         // 1=on, 2=off
111                                         $selection = ($_POST[$prefix.$field] == "0") ? 1 : 0;
112                                 } elseif(is_bool($_POST[$prefix.$field])) {
113                                         // true=on, false=off
114                                         $selection = ($_POST[$prefix.$field]) ? 0 : 1;
115                                 }
116                                 $focus->$field = $opts[$selection];
117                         }
118                 } else if(!empty($focus->field_defs[$field]['isMultiSelect']) && !isset($_POST[$prefix.$field]) && isset($_POST[$prefix.$field . '_multiselect'])) {
119                         $focus->$field = '';
120                 }
121 */
122         }
123
124         foreach($focus->additional_column_fields as $field) {
125                 if(isset($_POST[$prefix.$field])) {
126                         $value = $_POST[$prefix.$field];
127                         $focus->$field = $value;
128                 }
129         }
130         return $focus;
131 }
132
133 function add_hidden_elements($key, $value) {
134
135     $elements = '';
136
137     // if it's an array, we need to loop into the array and use square brackets []
138     if (is_array($value)) {
139         foreach ($value as $k=>$v) {
140             $elements .= "<input type='hidden' name='$key"."[$k]' value='$v'>\n";
141         }
142     } else {
143         $elements = "<input type='hidden' name='$key' value='$value'>\n";
144     }
145
146     return $elements;
147 }
148
149
150 function getPostToForm($ignore='', $isRegularExpression=false)
151 {
152         $fields = '';
153         if(!empty($ignore) && $isRegularExpression) {
154                 foreach ($_POST as $key=>$value){
155                         if(!preg_match($ignore, $key)) {
156                                 $fields .= add_hidden_elements($key, $value);
157                         }
158                 }       
159         } else {
160                 foreach ($_POST as $key=>$value){
161                         if($key != $ignore) {
162                                 $fields .= add_hidden_elements($key, $value);
163                         }
164                 }
165         }
166         return $fields;
167 }
168
169 function getGetToForm($ignore='', $usePostAsAuthority = false)
170 {
171         $fields = '';
172         foreach ($_GET as $key=>$value)
173         {
174                 if($key != $ignore){
175                         if(!$usePostAsAuthority || !isset($_POST[$key])){
176                                 $fields.= "<input type='hidden' name='$key' value='$value'>";
177                         }
178                 }
179         }
180         return $fields;
181
182 }
183 function getAnyToForm($ignore='', $usePostAsAuthority = false)
184 {
185         $fields = getPostToForm($ignore);
186         $fields .= getGetToForm($ignore, $usePostAsAuthority);
187         return $fields;
188
189 }
190
191 function handleRedirect($return_id='', $return_module='', $additionalFlags = false)
192 {
193         if(isset($_REQUEST['return_url']) && $_REQUEST['return_url'] != "")
194         {
195                 header("Location: ". $_REQUEST['return_url']);
196                 exit;
197         }
198
199         $url = buildRedirectURL($return_id, $return_module);
200         header($url);
201         exit;   
202 }
203
204 //eggsurplus: abstract to simplify unit testing
205 function buildRedirectURL($return_id='', $return_module='') 
206 {
207     if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "")
208         {
209                 $return_module = $_REQUEST['return_module'];
210         }
211         else
212         {
213                 $return_module = $return_module;
214         }
215         if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "")
216         {
217             
218            //if we are doing a "Close and Create New"
219         if(isCloseAndCreateNewPressed())
220         {
221             $return_action = "EditView";    
222             $isDuplicate = "true";        
223             $status = "";
224             
225             // Meeting Integration
226             if(isset($_REQUEST['meetingIntegrationFlag']) && $_REQUEST['meetingIntegrationFlag'] == 1) {
227                 $additionalFlags = array('meetingIntegrationShowForm' => '1');
228             }
229             // END Meeting Integration
230         } 
231                 // if we create a new record "Save", we want to redirect to the DetailView
232                 else if(isset($_REQUEST['action']) && $_REQUEST['action'] == "Save" 
233                         && $_REQUEST['return_module'] != 'Activities'
234                         && $_REQUEST['return_module'] != 'Home' 
235                         && $_REQUEST['return_module'] != 'Forecasts' 
236                         && $_REQUEST['return_module'] != 'Calendar'
237                         && $_REQUEST['return_module'] != 'MailMerge'
238                         ) 
239                         {
240                             $return_action = 'DetailView';
241                         } elseif($_REQUEST['return_module'] == 'Activities' || $_REQUEST['return_module'] == 'Calendar') {
242                         $return_module = $_REQUEST['module'];
243                         $return_action = $_REQUEST['return_action']; 
244                         // wp: return action needs to be set for one-click close in task list
245                 } 
246                 else 
247                 {
248                         // if we "Cancel", we go back to the list view.
249                         $return_action = $_REQUEST['return_action'];
250                 }
251         }
252         else
253         {
254                 $return_action = "DetailView";
255         }
256         
257         if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "")
258         {
259                 $return_id = $_REQUEST['return_id'];
260         }
261
262     $add = "";
263     if(isset($additionalFlags) && !empty($additionalFlags)) {
264         foreach($additionalFlags as $k => $v) {
265             $add .= "&{$k}={$v}";
266         }
267     }
268     
269     if (!isset($isDuplicate) || !$isDuplicate)
270     {
271         $url="index.php?action=$return_action&module=$return_module&record=$return_id&return_module=$return_module&return_action=$return_action{$add}";
272         if(isset($_REQUEST['offset']) && empty($_REQUEST['duplicateSave'])) {
273             $url .= "&offset=".$_REQUEST['offset'];
274         }
275         if(!empty($_REQUEST['ajax_load']))
276         {
277             $ajax_ret = array(
278                 'content' => "<script>SUGAR.ajaxUI.loadContent('$url');</script>\n",
279                 'menu' => array(
280                     'module' => $return_module,
281                     'label' => translate($return_module),
282                 ),
283             );
284             $json = getJSONobj();
285             echo $json->encode($ajax_ret);
286         } else {
287             return "Location: $url";
288         }
289     } else {
290         $standard = "action=$return_action&module=$return_module&record=$return_id&isDuplicate=true&return_module=$return_module&return_action=$return_action&status=$status";
291         $url="index.php?{$standard}{$add}";
292         if(!empty($_REQUEST['ajax_load']))
293         {
294             $ajax_ret = array(
295                  'content' => "<script>SUGAR.ajaxUI.loadContent('$url');</script>\n",
296                  'menu' => array(
297                      'module' => $return_module,
298                      'label' => translate($return_module),
299                  ),
300             );
301             $json = getJSONobj();
302             echo $json->encode($ajax_ret);
303         } else {
304             return "Location: $url";
305         }
306     }
307 }
308
309 function getLikeForEachWord($fieldname, $value, $minsize=4)
310 {
311         $value = trim($value);
312         $values = explode(' ',$value);
313         $ret = '';
314         foreach($values as $val)
315         {
316                 if(strlen($val) >= $minsize)
317                 {
318                         if(!empty($ret))
319                         {
320                                 $ret .= ' or';
321                         }
322                         $ret .= ' '. $fieldname . ' LIKE %'.$val.'%';
323                 }
324
325         }
326
327
328 }
329
330 function isCloseAndCreateNewPressed() {
331     return isset($_REQUEST['action']) && 
332            $_REQUEST['action'] == "Save" &&
333            isset($_REQUEST['isSaveAndNew']) && 
334            $_REQUEST['isSaveAndNew'] == 'true'; 
335 }
336
337
338 /**
339  * Functions from Save2.php
340  * @see include/generic/Save2.php
341  */
342
343 function add_prospects_to_prospect_list($parent_id,$child_id)
344 {
345     $focus=BeanFactory::getBean('Prospects');
346     if(is_array($child_id)){
347         $uids = $child_id;
348     }
349     else{
350         $uids = array($child_id);
351     }
352
353     $relationship = '';
354     foreach($focus->get_linked_fields() as $field => $def) {
355         if ($focus->load_relationship($field)) {
356             if ( $focus->$field->getRelatedModuleName() == 'ProspectLists' ) {
357                 $relationship = $field;
358                 break;
359             }
360         }
361     }
362
363     if ( $relationship != '' ) {
364         foreach ( $uids as $id) {
365             $focus->retrieve($id);
366             $focus->load_relationship($relationship);
367             $focus->prospect_lists->add( $parent_id );
368         }
369     }
370 }
371
372 function add_to_prospect_list($query_panel,$parent_module,$parent_type,$parent_id,$child_id,$link_attribute,$link_type,$parent)
373 {
374     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$query_panel);
375     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$parent_module);
376     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$parent_type);
377     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$parent_id);
378     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$child_id);
379     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$link_attribute);
380     $GLOBALS['log']->debug('add_prospects_to_prospect_list:parameters:'.$link_type);
381     require_once('include/SubPanel/SubPanelTiles.php');
382
383
384     if (!class_exists($parent_type)) {
385         require_once('modules/'.cleanDirName($parent_module).'/'.cleanDirName($parent_type).'.php');
386     }
387     $focus = new $parent_type();
388     $focus->retrieve($parent_id);
389     if(empty($focus->id)) {
390         return false;
391     }
392     if(empty($parent)) {
393         return false;
394     }
395
396     //if link_type is default then load relationship once and add all the child ids.
397     $relationship_attribute=$link_attribute;
398
399     //find all prospects based on the query
400
401     $subpanel = new SubPanelTiles($parent, $parent->module_dir);
402     $thisPanel=$subpanel->subpanel_definitions->load_subpanel($query_panel);
403     if(empty($thisPanel)) {
404         return false;
405     }
406     $result = SugarBean::get_union_related_list($parent, '', '', '', 0, -99,-99,'', $thisPanel);
407
408     if(!empty($result['list'])) {
409         foreach($result['list'] as $object) {
410             if ($link_type != 'default') {
411                 $relationship_attribute=strtolower($object->$link_attribute);
412             }
413             $GLOBALS['log']->debug('add_prospects_to_prospect_list:relationship_attribute:'.$relationship_attribute);
414             // load relationship for the first time or on change of relationship atribute.
415             if (empty($focus->$relationship_attribute)) {
416                 $focus->load_relationship($relationship_attribute);
417             }
418             //add
419             $focus->$relationship_attribute->add($object->$child_id);
420         }
421     }
422 }
423
424 //Link rows returned by a report to parent record.
425 function save_from_report($report_id,$parent_id, $module_name, $relationship_attr_name) {
426     global $beanFiles;
427     global $beanList;
428
429     $GLOBALS['log']->debug("Save2: Linking with report output");
430     $GLOBALS['log']->debug("Save2:Report ID=".$report_id);
431     $GLOBALS['log']->debug("Save2:Parent ID=".$parent_id);
432     $GLOBALS['log']->debug("Save2:Module Name=".$module_name);
433     $GLOBALS['log']->debug("Save2:Relationship Attribute Name=".$relationship_attr_name);
434
435     $bean_name = $beanList[$module_name];
436     $GLOBALS['log']->debug("Save2:Bean Name=".$bean_name);
437     require_once($beanFiles[$bean_name]);
438     $focus = new $bean_name();
439
440     $focus->retrieve($parent_id);
441     $focus->load_relationship($relationship_attr_name);
442
443     //fetch report definition.
444     global $current_language, $report_modules, $modules_report;
445
446     $mod_strings = return_module_language($current_language,"Reports");
447
448
449     $saved = new SavedReport();
450     $saved->disable_row_level_security = true;
451     $saved->retrieve($report_id, false);
452
453     //initiailize reports engine with the report definition.
454     require_once('modules/Reports/SubpanelFromReports.php');
455     $report = new SubpanelFromReports($saved);
456     $report->run_query();
457
458     $sql = $report->query_list[0];
459     $GLOBALS['log']->debug("Save2:Report Query=".$sql);
460     $result = $report->db->query($sql);
461     while($row = $report->db->fetchByAssoc($result))
462     {
463         $focus->$relationship_attr_name->add($row['primaryid']);
464     }
465 }
466
467 ?>