2 /*********************************************************************************
3 * SugarCRM Community Edition is a customer relationship management program developed by
4 * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
6 * This program is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Affero General Public License version 3 as published by the
8 * Free Software Foundation with the addition of the following permission added
9 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
11 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
18 * You should have received a copy of the GNU Affero General Public License along with
19 * this program; if not, see http://www.gnu.org/licenses or write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
24 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU Affero General Public License version 3.
30 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
33 * technical reasons, the Appropriate Legal Notices must display the words
34 * "Powered by SugarCRM".
35 ********************************************************************************/
39 require_once('include/TemplateHandler/TemplateHandler.php');
40 require_once('include/EditView/SugarVCR.php');
62 public $sectionPanels;
63 public $view = 'EditView';
64 public $formatFields = true;
65 public $showDetailData = true;
66 public $showVCRControl = true;
67 public $showSectionPanelsTitles = true;
68 public $quickSearchCode;
71 public $populateBean = true;
72 public $moduleTitleKey;
73 public $viewObject = null;
74 public $formName = '';
77 * EditView constructor
78 * This is the EditView constructor responsible for processing the new
81 * @param $module String value of module this Edit view is for
82 * @param $focus An empty sugarbean object of module
83 * @param $id The record id to retrieve and populate data for
84 * @param $metadataFile String value of file location to use in overriding default metadata file
85 * @param tpl String value of file location to use in overriding default Smarty template
86 * @param createFocus bool value to tell whether to create a new bean if we do not have one with an id, this is used from ConvertLead
89 function setup($module, $focus = null, $metadataFile = null, $tpl = 'include/EditView/EditView.tpl', $createFocus = true)
91 $this->th = $this->getTemplateHandler();
92 $this->th->ss =& $this->ss;
94 $this->module = $module;
95 $this->focus = $focus;
97 //this logic checks if the focus has an id and if it does not then it will create a new instance of the focus bean
98 //but in convert lead we do not want to create a new instance and do not want to populate id.
101 $this->createFocus();
104 if (empty($GLOBALS['sugar_config']['showDetailData']))
106 $this->showDetailData = false;
108 $this->metadataFile = $metadataFile;
110 if (isset($GLOBALS['sugar_config']['disable_vcr']))
112 $this->showVCRControl = !$GLOBALS['sugar_config']['disable_vcr'];
115 if (!empty($this->metadataFile) && file_exists($this->metadataFile))
117 include($this->metadataFile);
121 //If file doesn't exist we create a best guess
122 if (!file_exists("modules/$this->module/metadata/editviewdefs.php")
123 && file_exists("modules/$this->module/EditView.html"))
125 require_once('include/SugarFields/Parsers/EditViewMetaParser.php');
129 $htmlFile = "modules/" . $this->module . "/EditView.html";
130 $parser = new EditViewMetaParser();
131 if (!file_exists('modules/'.$this->module.'/metadata'))
133 sugar_mkdir('modules/'.$this->module.'/metadata');
136 $fp = sugar_fopen('modules/'.$this->module.'/metadata/editviewdefs.php', 'w');
137 fwrite($fp, $parser->parse($htmlFile, $dictionary[$focus->object_name]['fields'], $this->module));
141 //Flag an error... we couldn't create the best guess meta-data file
142 if (!file_exists("modules/$this->module/metadata/editviewdefs.php"))
146 $error = str_replace("[file]", "modules/$this->module/metadata/editviewdefs.php", $app_strings['ERR_CANNOT_CREATE_METADATA_FILE']);
147 $GLOBALS['log']->fatal($error);
152 require_once("modules/$this->module/metadata/editviewdefs.php");
155 $this->defs = $viewdefs[$this->module][$this->view];
156 $this->isDuplicate = isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true' && $this->focus->aclAccess('edit');
159 function createFocus()
161 global $beanList, $beanFiles;
163 if (empty($beanList[$this->module])) return;
166 $bean = $beanList[$this->module];
167 require_once($beanFiles[$bean]);
172 //If there is no idea, assume we are creating a new instance
173 //and call the fill_in_additional_detail_fields where initialization
174 //code has been moved to
175 if (empty($this->focus->id))
177 global $current_user;
179 $this->focus->fill_in_additional_detail_fields();
180 $this->focus->assigned_user_id = $current_user->id;
184 function populateBean()
186 if (!empty($_REQUEST['record']) && $this->populateBean)
190 $bean = $beanList[$this->module];
192 $this->focus = $obj->retrieve($_REQUEST['record']);
196 $GLOBALS['log']->debug("Unable to populate bean, no record parameter found");
202 * This method is used to manually turn on/off the field formatting
203 * @param $format boolean value to turn on/off field formatting
205 function enableFormatting($format = true)
207 $this->formatFields = $format;
211 * Enter description here ...
213 function requiredFirst()
215 $panels = array('required'=>array());
218 foreach($this->defs['panels'] as $key=>$p)
220 foreach ($p as $row=>$rowDef)
222 foreach($rowDef as $col => $colDef)
224 $field = (is_array($p[$row][$col])) ? $p[$row][$col]['name'] : $p[$row][$col];
225 if ((!empty($this->focus->field_defs[$field])
226 && !empty($this->focus->field_defs[$field]['required']))
227 || (!empty($p[$row][$col]['displayParams']['required'])))
230 if ($reqCol == $this->defs['templateMeta']['maxColumns'])
236 $panels['required'][$reqRow][$reqCol] = $p[$row][$col];
240 $panels[$key][$row][$col] = $p[$row][$col];
246 $this->defs['panels'] = $panels;
252 foreach ($this->defs['templateMeta']['widths'] as $col => $def) {
253 foreach ($def as $k => $value) {
254 $totalWidth += $value;
259 foreach ($this->defs['templateMeta']['widths'] as $col => $def) {
260 foreach ($def as $k => $value) {
261 $this->defs['templateMeta']['widths'][$col][$k] = round($value / ($totalWidth / 100), 2);
265 $this->sectionPanels = array();
266 $this->sectionLabels = array();
267 if (!empty($this->defs['panels']) && count($this->defs['panels']) > 0)
269 $keys = array_keys($this->defs['panels']);
270 if (is_numeric($keys[0]))
272 $defaultPanel = $this->defs['panels'];
273 unset($this->defs['panels']); //blow away current value
274 $this->defs['panels'][''] = $defaultPanel;
278 if ($this->view == 'EditView' && !empty($GLOBALS['sugar_config']['forms']['requireFirst'])){
279 $this->requiredFirst();
282 $maxColumns = isset($this->defs['templateMeta']['maxColumns']) ? $this->defs['templateMeta']['maxColumns'] : 2;
284 static $itemCount = 100; //Start the generated tab indexes at 100 so they don't step on custom ones.
286 /* loop all the panels */
287 foreach ($this->defs['panels'] as $key=>$p)
291 if (!is_array($this->defs['panels'][$key])) {
292 $this->sectionPanels[strtoupper($key)] = $p;
296 foreach ($p as $row=>$rowDef)
298 $columnsInRows = count($rowDef);
300 foreach ($rowDef as $col => $colDef)
302 $panel[$row][$col] = is_array($p[$row][$col])
303 ? array('field' => $p[$row][$col])
304 : array('field' => array('name'=>$p[$row][$col]));
306 $panel[$row][$col]['field']['tabindex'] =
307 (isset($p[$row][$col]['tabindex']) && is_numeric($p[$row][$col]['tabindex']))
308 ? $p[$row][$col]['tabindex']
311 if ($columnsInRows < $maxColumns)
313 if ($col == $columnsInRows - 1)
315 $panel[$row][$col]['colspan'] = 2 * $maxColumns - ($columnsUsed + 1);
319 $panel[$row][$col]['colspan'] = floor(($maxColumns * 2 - $columnsInRows) / $columnsInRows);
320 $columnsUsed = $panel[$row][$col]['colspan'];
324 //Set address types to have colspan value of 2 if colspan is not already defined
325 if (is_array($colDef) && !empty($colDef['hideLabel']) && !isset($panel[$row][$col]['colspan']))
327 $panel[$row][$col]['colspan'] = 2;
335 $panel = $this->getPanelWithFillers($panel);
337 $this->sectionPanels[strtoupper($key)] = $panel;
346 * Adds fillers to each row if required
348 * Panel alignment will be off if the panel doesn't have a row with the max column
349 * It will not be aligned to the other panels so we fill out the columns in the last row
351 * @param array $panel
354 protected function getPanelWithFillers($panel)
357 foreach($panel as $row)
359 if (count($row) == $this->defs['templateMeta']['maxColumns']
360 || 1 == count($panel))
369 $rowCount = count($panel);
370 $filler = count($panel[$rowCount-1]);
371 while ($filler < $this->defs['templateMeta']['maxColumns'])
373 $panel[$rowCount - 1][$filler++] = array('field' => array('name' => ''));
380 function process($checkFormName = false, $formName = '')
382 global $mod_strings, $sugar_config, $app_strings, $app_list_strings;
384 //the retrieve already did this work;
385 //$this->focus->fill_in_relationship_fields();
386 //Bug#53261: If quickeditview is loaded after editview.tpl is created,
387 // the th->checkTemplate will return true. So, the following
388 // code prevent avoid rendering popup editview container.
389 if(!empty($this->formName)) {
390 $formName = $this->formName;
391 $checkFormName = true;
394 if (!$this->th->checkTemplate($this->module, $this->view, $checkFormName, $formName))
399 if (isset($_REQUEST['offset']))
401 $this->offset = $_REQUEST['offset'] - 1;
404 if ($this->showVCRControl)
406 $this->th->ss->assign('PAGINATION', SugarVCR::menu($this->module, $this->offset, $this->focus->is_AuditEnabled(), ($this->view == 'EditView')));
409 if (isset($_REQUEST['return_module'])) $this->returnModule = $_REQUEST['return_module'];
410 if (isset($_REQUEST['return_action'])) $this->returnAction = $_REQUEST['return_action'];
411 if (isset($_REQUEST['return_id'])) $this->returnId = $_REQUEST['return_id'];
412 if (isset($_REQUEST['return_relationship'])) $this->returnRelationship = $_REQUEST['return_relationship'];
413 if (isset($_REQUEST['return_name'])) $this->returnName = $this->getValueFromRequest($_REQUEST, 'return_name' ) ;
415 // handle Create $module then Cancel
416 if (empty($this->returnId))
418 $this->returnAction = 'index';
421 $is_owner = $this->focus->isOwner($GLOBALS['current_user']->id);
423 $this->fieldDefs = array();
426 global $current_user;
428 if (!empty($this->focus->assigned_user_id))
430 $this->focus->assigned_user_name = get_assigned_user_name($this->focus->assigned_user_id);
433 foreach ($this->focus->toArray() as $name => $value)
435 $valueFormatted = false;
436 //if ($this->focus->field_defs[$name]['type']=='link')continue;
438 $this->fieldDefs[$name] = (!empty($this->fieldDefs[$name]) && !empty($this->fieldDefs[$name]['value']))
439 ? array_merge($this->focus->field_defs[$name], $this->fieldDefs[$name])
440 : $this->focus->field_defs[$name];
442 foreach (array("formula", "default", "comments", "help") as $toEscape)
444 if (!empty($this->fieldDefs[$name][$toEscape]))
446 $this->fieldDefs[$name][$toEscape] = htmlentities($this->fieldDefs[$name][$toEscape], ENT_QUOTES, 'UTF-8');
450 if (isset($this->fieldDefs[$name]['options']) && isset($app_list_strings[$this->fieldDefs[$name]['options']]))
452 $this->fieldDefs[$name]['options'] = $app_list_strings[$this->fieldDefs[$name]['options']];
453 if(isset($GLOBALS['sugar_config']['enable_autocomplete']) && $GLOBALS['sugar_config']['enable_autocomplete'] == true)
455 $this->fieldDefs[$name]['autocomplete'] = true;
456 $this->fieldDefs[$name]['autocomplete_options'] = $this->fieldDefs[$name]['options']; // we need the name for autocomplete
458 $this->fieldDefs[$name]['autocomplete'] = false;
462 if(isset($this->fieldDefs[$name]['options']) && is_array($this->fieldDefs[$name]['options']) && isset($this->fieldDefs[$name]['default_empty']) && !isset($this->fieldDefs[$name]['options'][$this->fieldDefs[$name]['default_empty']])) {
463 $this->fieldDefs[$name]['options'] = array_merge(array($this->fieldDefs[$name]['default_empty']=>$this->fieldDefs[$name]['default_empty']), $this->fieldDefs[$name]['options']);
466 if(isset($this->fieldDefs[$name]['function'])) {
467 $function = $this->fieldDefs[$name]['function'];
468 if(is_array($function) && isset($function['name'])){
469 $function = $this->fieldDefs[$name]['function']['name'];
471 $function = $this->fieldDefs[$name]['function'];
474 if(isset($this->fieldDefs[$name]['function']['include']) && file_exists($this->fieldDefs[$name]['function']['include']))
476 require_once($this->fieldDefs[$name]['function']['include']);
479 if(!empty($this->fieldDefs[$name]['function']['returns']) && $this->fieldDefs[$name]['function']['returns'] == 'html'){
480 if(!empty($this->fieldDefs[$name]['function']['include'])){
481 require_once($this->fieldDefs[$name]['function']['include']);
483 $value = call_user_func($function, $this->focus, $name, $value, $this->view);
484 $valueFormatted = true;
486 $this->fieldDefs[$name]['options'] = call_user_func($function, $this->focus, $name, $value, $this->view);
490 if(isset($this->fieldDefs[$name]['type']) && $this->fieldDefs[$name]['type'] == 'function' && isset($this->fieldDefs[$name]['function_name'])){
491 $value = $this->callFunction($this->fieldDefs[$name]);
492 $valueFormatted = true;
495 if(!$valueFormatted) {
496 // $this->focus->format_field($this->focus->field_defs[$name]);
497 $value = isset($this->focus->$name) ? $this->focus->$name : '';
500 if (empty($this->fieldDefs[$name]['value']))
502 $this->fieldDefs[$name]['value'] = $value;
506 //This code is used for QuickCreates that go to Full Form view. We want to overwrite the values from the bean
507 //with values from the request if they are set and either the bean is brand new (such as a create from a subpanels) or the 'full form' button has been clicked
508 if ((($this->populateBean && empty($this->focus->id)) || (isset($_REQUEST['full_form'])))
509 && (!isset($this->fieldDefs[$name]['function']['returns']) || $this->fieldDefs[$name]['function']['returns'] != 'html')
510 && isset($_REQUEST[$name]))
512 $this->fieldDefs[$name]['value'] = $this->getValueFromRequest($_REQUEST, $name);
516 * Populate any relate fields that are linked by a relationship to the calling module.
517 * Clicking the create button on a subpanel for example will populate three values in the $_REQUEST:
518 * 1. return_module => the name of the calling module
519 * 2. return_id => the id of the record in the calling module that the user was viewing and that should be associated with this new record
520 * 3. return_name => the display value of the return_id record - the value to show in any relate field in this EditView
521 * Only do if this fieldDef does not already have a value; if it does it will have been explicitly set, and that should overrule this less specific mechanism
523 if (isset($this->returnModule) && isset($this->returnName)
524 && empty($this->focus->id) && empty($this->fieldDefs['name']['value']) )
526 if (($this->focus->field_defs[$name]['type'] == 'relate')
527 && isset($this->focus->field_defs[$name][ 'module' ])
528 && $this->focus->field_defs[$name][ 'module' ] == $this->returnModule)
530 if (isset( $this->fieldDefs[$name]['id_name'])
531 && !empty($this->returnRelationship)
532 && isset($this->focus->field_defs[$this->fieldDefs[$name]['id_name']]['relationship'])
533 && ($this->returnRelationship == $this->focus->field_defs[$this->fieldDefs[$name]['id_name']]['relationship']))
535 $this->fieldDefs[$name]['value'] = $this->returnName ;
536 // set the hidden id field for this relate field to the correct value i.e., return_id
537 $this->fieldDefs[$this->fieldDefs[$name]['id_name']]['value'] = $this->returnId ;
544 if (isset($this->focus->additional_meta_fields))
546 $this->fieldDefs = array_merge($this->fieldDefs, $this->focus->additional_meta_fields);
549 if ($this->isDuplicate)
551 foreach ($this->fieldDefs as $name=>$defs) {
552 if (!empty($defs['auto_increment']))
554 $this->fieldDefs[$name]['value'] = '';
563 * This method makes the Smarty variable assignments and then displays the
565 * @param $showTitle boolean value indicating whether or not to show a title on the resulting page
566 * @param $ajaxSave boolean value indicating whether or not the operation is an Ajax save request
567 * @return HTML display for view as String
569 function display($showTitle = true, $ajaxSave = false)
571 global $mod_strings, $sugar_config, $app_strings, $app_list_strings, $theme, $current_user;
573 if(isset($this->defs['templateMeta']['javascript']))
575 if(is_array($this->defs['templateMeta']['javascript']))
577 //$this->th->ss->assign('externalJSFile', 'modules/' . $this->module . '/metadata/editvewdefs.js');
578 $this->th->ss->assign('externalJSFile', $this->defs['templateMeta']['javascript']);
582 $this->th->ss->assign('scriptBlocks', $this->defs['templateMeta']['javascript']);
586 $this->th->ss->assign('id', $this->fieldDefs['id']['value']);
587 $this->th->ss->assign('offset', $this->offset + 1);
588 $this->th->ss->assign('APP', $app_strings);
589 $this->th->ss->assign('MOD', $mod_strings);
590 $this->th->ss->assign('fields', $this->fieldDefs);
591 $this->th->ss->assign('sectionPanels', $this->sectionPanels);
592 $this->th->ss->assign('config', $sugar_config);
593 $this->th->ss->assign('returnModule', $this->returnModule);
594 $this->th->ss->assign('returnAction', $this->returnAction);
595 $this->th->ss->assign('returnId', $this->returnId);
596 $this->th->ss->assign('isDuplicate', $this->isDuplicate);
597 $this->th->ss->assign('def', $this->defs);
598 $this->th->ss->assign('useTabs', isset($this->defs['templateMeta']['useTabs']) && isset($this->defs['templateMeta']['tabDefs']) ? $this->defs['templateMeta']['useTabs'] : false);
599 $this->th->ss->assign('maxColumns', isset($this->defs['templateMeta']['maxColumns']) ? $this->defs['templateMeta']['maxColumns'] : 2);
600 $this->th->ss->assign('module', $this->module);
601 $this->th->ss->assign('headerTpl', isset($this->defs['templateMeta']['form']['headerTpl']) ? $this->defs['templateMeta']['form']['headerTpl'] : 'include/' . $this->view . '/header.tpl');
602 $this->th->ss->assign('footerTpl', isset($this->defs['templateMeta']['form']['footerTpl']) ? $this->defs['templateMeta']['form']['footerTpl'] : 'include/' . $this->view . '/footer.tpl');
603 $this->th->ss->assign('current_user', $current_user);
604 $this->th->ss->assign('bean', $this->focus);
605 $this->th->ss->assign('isAuditEnabled', $this->focus->is_AuditEnabled());
606 $this->th->ss->assign('gridline',$current_user->getPreference('gridline') == 'on' ? '1' : '0');
607 $this->th->ss->assign('tabDefs', isset($this->defs['templateMeta']['tabDefs']) ? $this->defs['templateMeta']['tabDefs'] : false);
608 $this->th->ss->assign('VERSION_MARK', getVersionedPath(''));
610 global $js_custom_version;
611 global $sugar_version;
613 $this->th->ss->assign('SUGAR_VERSION', $sugar_version);
614 $this->th->ss->assign('JS_CUSTOM_VERSION', $js_custom_version);
616 //this is used for multiple forms on one page
617 if (!empty($this->formName)) {
618 $form_id = $this->formName;
619 $form_name = $this->formName;
623 $form_id = $this->view;
624 $form_name = $this->view;
627 if ($ajaxSave && empty($this->formName))
629 $form_id = 'form_'.$this->view .'_'.$this->module;
630 $form_name = $form_id;
631 $this->view = $form_name;
632 //$this->defs['templateMeta']['form']['buttons'] = array();
633 //$this->defs['templateMeta']['form']['buttons']['ajax_save'] = array('id' => 'AjaxSave', 'customCode'=>'<input type="button" class="button" value="Save" onclick="this.form.action.value=\'AjaxFormSave\';return saveForm(\''.$form_name.'\', \'multiedit_form_{$module}\', \'Saving {$module}...\');"/>');
636 $form_name = $form_name == 'QuickCreate' ? "QuickCreate_{$this->module}" : $form_name;
637 $form_id = $form_id == 'QuickCreate' ? "QuickCreate_{$this->module}" : $form_id;
639 if (isset($this->defs['templateMeta']['preForm']))
641 $this->th->ss->assign('preForm', $this->defs['templateMeta']['preForm']);
644 if (isset($this->defs['templateMeta']['form']['closeFormBeforeCustomButtons']))
646 $this->th->ss->assign('closeFormBeforeCustomButtons', $this->defs['templateMeta']['form']['closeFormBeforeCustomButtons']);
649 if(isset($this->defs['templateMeta']['form']['enctype']))
651 $this->th->ss->assign('enctype', 'enctype="'.$this->defs['templateMeta']['form']['enctype'].'"');
654 //for SugarFieldImage, we must set form enctype to "multipart/form-data"
655 foreach ($this->fieldDefs as $field)
657 if (isset($field['type']) && $field['type'] == 'image')
659 $this->th->ss->assign('enctype', 'enctype="multipart/form-data"');
664 $this->th->ss->assign('showDetailData', $this->showDetailData);
665 $this->th->ss->assign('showSectionPanelsTitles', $this->showSectionPanelsTitles);
666 $this->th->ss->assign('form_id', $form_id);
667 $this->th->ss->assign('form_name', $form_name);
668 $this->th->ss->assign('set_focus_block', get_set_focus_js());
670 $this->th->ss->assign('form', isset($this->defs['templateMeta']['form']) ? $this->defs['templateMeta']['form'] : null);
671 $this->th->ss->assign('includes', isset($this->defs['templateMeta']['includes']) ? $this->defs['templateMeta']['includes'] : null);
672 $this->th->ss->assign('view', $this->view);
675 //Calculate time & date formatting (may need to calculate this depending on a setting)
678 $this->th->ss->assign('CALENDAR_DATEFORMAT', $timedate->get_cal_date_format());
679 $this->th->ss->assign('USER_DATEFORMAT', $timedate->get_user_date_format());
680 $time_format = $timedate->get_user_time_format();
681 $this->th->ss->assign('TIME_FORMAT', $time_format);
683 $date_format = $timedate->get_cal_date_format();
684 $time_separator = ':';
685 if (preg_match('/\d+([^\d])\d+([^\d]*)/s', $time_format, $match))
687 $time_separator = $match[1];
690 // Create Smarty variables for the Calendar picker widget
691 $t23 = strpos($time_format, '23') !== false ? '%H' : '%I';
692 if (!isset($match[2]) || $match[2] == '')
694 $this->th->ss->assign('CALENDAR_FORMAT', $date_format . ' ' . $t23 . $time_separator . '%M');
698 $pm = $match[2] == 'pm' ? '%P' : '%p';
699 $this->th->ss->assign('CALENDAR_FORMAT', $date_format . ' ' . $t23 . $time_separator . '%M' . $pm);
702 $this->th->ss->assign('CALENDAR_FDOW', $current_user->get_first_day_of_week());
703 $this->th->ss->assign('TIME_SEPARATOR', $time_separator);
705 $seps = get_number_seperators();
706 $this->th->ss->assign('NUM_GRP_SEP', $seps[0]);
707 $this->th->ss->assign('DEC_SEP', $seps[1]);
709 if ($this->view == 'EditView')
711 $height = $current_user->getPreference('text_editor_height');
712 $width = $current_user->getPreference('text_editor_width');
714 $height = isset($height) ? $height : '300px';
715 $width = isset($width) ? $width : '95%';
717 $this->th->ss->assign('RICH_TEXT_EDITOR_HEIGHT', $height);
718 $this->th->ss->assign('RICH_TEXT_EDITOR_WIDTH', $width);
722 $this->th->ss->assign('RICH_TEXT_EDITOR_HEIGHT', '100px');
723 $this->th->ss->assign('RICH_TEXT_EDITOR_WIDTH', '95%');
726 $this->th->ss->assign('SHOW_VCR_CONTROL', $this->showVCRControl);
728 $str = $this->showTitle($showTitle);
730 //Use the output filter to trim the whitespace
731 $this->th->ss->load_filter('output', 'trimwhitespace');
732 $str .= $this->th->displayTemplate($this->module, $form_name, $this->tpl, $ajaxSave, $this->defs);
737 function insertJavascript($javascript)
739 $this->ss->assign('javascript', $javascript);
742 function callFunction($vardef)
745 $execute_function = array();
746 $execute_params = array();
747 if (!empty($vardef['function_class']))
749 $execute_function[] = $vardef['function_class'];
750 $execute_function[] = $vardef['function_name'];
754 $execute_function = $vardef['function_name'];
757 foreach ($vardef['function_params'] as $param )
759 if (empty($vardef['function_params_source']) or $vardef['function_params_source']=='parent')
761 if (empty($this->focus->$param))
763 $can_execute = false;
767 $execute_params[] = $this->focus->$param;
770 else if ($vardef['function_params_source']=='this')
772 if (empty($this->focus->$param))
774 $can_execute = false;
776 $execute_params[] = $this->focus->$param;
781 $can_execute = false;
788 if (!empty($vardef['function_require']))
790 require_once($vardef['function_require']);
793 $value = call_user_func_array($execute_function, $execute_params);
800 * getValueFromRequest
801 * This is a helper method to extract a value from the request
802 * Array. We do some special processing for fields that start
803 * with 'date_' by checking to see if they also include time
804 * and meridiem values
806 * @param request The request Array
807 * @param name The field name to extract value for
808 * @return String value for given name
810 function getValueFromRequest($request, $name)
812 //Special processing for date values (combine to one field)
813 if (preg_match('/^date_(.*)$/s', $name, $matches))
815 $d = $request[$name];
817 if (isset($request['time_' . $matches[1]]))
819 $d .= ' ' . $request['time_' . $matches[1]];
820 if (isset($request[$matches[1] . '_meridiem']))
822 $d .= $request[$matches[1] . '_meridiem'];
827 if (isset($request['time_hour_' . $matches[1]])
828 && isset($request['time_minute_' . $matches[1]]))
830 $d .= sprintf(' %s:%s', $request['time_hour_' . $matches[1]], $request['time_minute_' . $matches[1]]);
833 if (isset($request['meridiem']))
835 $d .= $request['meridiem'];
842 if (empty($request[$name]) || !isset($this->fieldDefs[$name]))
844 return $request[$name];
847 //if it's a bean field - unformat it
848 require_once('include/SugarFields/SugarFieldHandler.php');
850 $sfh = new SugarFieldHandler();
851 $type = !empty($this->fieldDefs[$name]['custom_type'])
852 ? $this->fieldDefs[$name]['custom_type']
853 : $this->fieldDefs[$name]['type'];
854 $sf = $sfh->getSugarField($type);
856 return $sf ? $sf->unformatField($request[$name], $this->fieldDefs[$name]) : $request[$name];
861 * Allow Subviews to overwrite this method to show custom titles.
862 * Examples: Projects & Project Templates.
863 * params: $showTitle: boolean for backwards compatibility.
865 public function showTitle($showTitle = false)
867 global $mod_strings, $app_strings;
869 if (is_null($this->viewObject))
871 $this->viewObject = (!empty($GLOBALS['current_view']))
872 ? $GLOBALS['current_view']
878 return $this->viewObject->getModuleTitle();
885 * Get template handler object
886 * @return TemplateHandler
888 protected function getTemplateHandler()
890 return new TemplateHandler();