]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/ModuleBuilder/views/view.modulefield.php
Release 6.2.2
[Github/sugarcrm.git] / modules / ModuleBuilder / views / view.modulefield.php
1 <?php
2 /*********************************************************************************
3  * SugarCRM Community Edition is a customer relationship management program developed by
4  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
5  * 
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.
12  * 
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
16  * details.
17  * 
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
21  * 02110-1301 USA.
22  * 
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.
25  * 
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.
29  * 
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  ********************************************************************************/
36
37 require_once('modules/ModuleBuilder/MB/AjaxCompose.php');
38 require_once('modules/DynamicFields/FieldViewer.php');
39
40 class ViewModulefield extends SugarView
41 {
42     /**
43          * @see SugarView::_getModuleTitleParams()
44          */
45         protected function _getModuleTitleParams($browserTitle = false)
46         {
47             global $mod_strings;
48             
49         return array(
50            translate('LBL_MODULE_NAME','Administration'),
51            ModuleBuilderController::getModuleTitle(),
52            );
53     }
54
55         function display()
56         {
57         $ac = $this->fetch();
58         echo $ac->getJavascript();
59     }
60
61     function fetch(
62         $ac = false
63         )
64     {
65         $fv = new FieldViewer();
66         if(empty($_REQUEST['field'])&& !empty($_REQUEST['name']))$_REQUEST['field'] = $_REQUEST['name'];
67         $field_name = '';
68         if(!empty($this->view_object_map['field_name']))
69             $field_name = $this->view_object_map['field_name'];
70         elseif(!empty($_REQUEST['field']))
71             $field_name = $_REQUEST['field'];
72         else
73             $field_name = '';
74
75         $action = 'saveField'; // tyoung bug 17606: default action is to save as a dynamic field; but for standard OOB
76                                // fields we override this so don't create a new dynamic field instead of updating the existing field
77
78         $isClone = false;
79         if(!empty($this->view_object_map['is_clone']) && $this->view_object_map['is_clone'])
80             $isClone = true;
81                 /*
82                 $field_types =  array('varchar'=>'YourField', 'int'=>'Integer', 'float'=>'Decimal','bool'=>'Checkbox','enum'=>'DropDown',
83                                 'date'=>'Date', 'phone' => 'Phone', 'currency' => 'Currency', 'html' => 'HTML', 'radioenum' => 'Radio',
84                                 'relate' => 'Relate', 'address' => 'Address', 'text' => 'TextArea', 'url' => 'Link');
85                 */
86                 $field_types = $GLOBALS['mod_strings']['fieldTypes'];
87                 if (isset($field_types['encrypt']))
88                   unset($field_types['encrypt']);
89         $field_name_exceptions = array(
90             //bug 22264: Field name must not be an SQL keyword.
91             //Taken from SQL Server's list of reserved keywords; http://msdn.microsoft.com/en-us/library/aa238507(SQL.80).aspx
92             'ADD','EXCEPT','PERCENT','ALL','EXEC','PLAN','ALTER','EXECUTE','PRECISION','AND','EXISTS','PRIMARY',
93             'ANY','EXIT','PRINT','AS','FETCH','PROC','ASC','FILE','PROCEDURE','AUTHORIZATION','FILLFACTOR','PUBLIC',
94             'BACKUP','FOR','RAISERROR','BEGIN','FOREIGN','READ','BETWEEN','FREETEXT','READTEXT','BREAK','FREETEXTTABLE',
95             'RECONFIGURE','BROWSE','FROM','REFERENCES','BULK','FULL','REPLICATION','BY','FUNCTION','RESTORE',
96             'CASCADE','GOTO','RESTRICT','CASE','GRANT','RETURN','CHECK','GROUP','REVOKE','CHECKPOINT','HAVING','RIGHT','CLOSE',
97             'HOLDLOCK','ROLLBACK','CLUSTERED','IDENTITY','ROWCOUNT','COALESCE','IDENTITY_INSERT','ROWGUIDCOL','COLLATE','IDENTITYCOL',
98             'RULE','COLUMN','IF','SAVE','COMMIT','IN','SCHEMA','COMPUTE','INDEX','SELECT','CONSTRAINT','INNER','SESSION_USER',
99             'CONTAINS','INSERT','SET','CONTAINSTABLE','INTERSECT','SETUSER','CONTINUE','INTO','SHUTDOWN','CONVERT','IS','SOME',
100             'CREATE','JOIN','STATISTICS','CROSS','KEY','SYSTEM_USER','CURRENT','KILL','TABLE','CURRENT_DATE','LEFT','TEXTSIZE',
101             'CURRENT_TIME','LIKE','THEN','CURRENT_TIMESTAMP','LINENO','TO','CURRENT_USER','LOAD','TOP','CURSOR','NATIONAL','TRAN',
102             'DATABASE','NOCHECK','TRANSACTION','DBCC','NONCLUSTERED','TRIGGER','DEALLOCATE','NOT','TRUNCATE','DECLARE','NULL','TSEQUAL',
103             'DEFAULT','NULLIF','UNION','DELETE','OF','UNIQUE','DENY','OFF','UPDATE','DESC','OFFSETS','UPDATETEXT',
104             'DISK','ON','USE','DISTINCT','OPEN','USER','DISTRIBUTED','OPENCONNECTOR','VALUES','DOUBLE','OPENQUERY','VARYING',
105             'DROP','OPENROWSET','VIEW','DUMMY','OPENXML','WAITFOR','DUMP','OPTION','WHEN','ELSE','OR','WHERE',
106             'END','ORDER','WHILE','ERRLVL','OUTER','WITH','ESCAPE','OVER','WRITETEXT',
107             //Mysql Keywords from http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html (those not in MSSQL's list)
108                         'ANALYZE', 'ASENSITIVE', 'BEFORE', 'BIGINT', 'BINARY', 'BOTH', 'CALL', 'CHANGE', 'CHARACTER',
109                         'CONDITION', 'DATABASES', 'DAY_HOUR', 'DAY_MICROSECOND', 'DAY_MINUTE', 'DAY_SECOND', 'DEC', 'DECIMAL', 'DELAYED',
110                         'DESCRIBE', 'DETERMINISTIC', 'DISTINCTROW', 'DIV', 'DUAL', 'EACH', 'ELSEIF', 'ENCLOSED', 'ESCAPED', 'EXPLAIN',
111                         'FALSE', 'FLOAT', 'FLOAT4', 'FLOAT8', 'FORCE', 'FULLTEXT', 'HIGH_PRIORITY', 'HOUR_MICROSECOND', 'HOUR_MINUTE',
112                         'HOUR_SECOND', 'IGNORE', 'INFILE', 'INOUT', 'INSENSITIVE', 'INT', 'INT1', 'INT2', 'INT3', 'INT4', 'INT8',
113                         'INTEGER', 'ITERATE', 'KEYS', 'LEADING', 'LEAVE', 'LIMIT', 'LINES', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCK',
114                         'LONGBLOB', 'LONGTEXT', 'LOOP', 'LOW_PRIORITY', 'MATCH', 'MEDIUMBLOB', 'MEDIUMINT', 'MEDIUMTEXT', 'MIDDLEINT',
115                         'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'MOD', 'MODIFIES', 'NATURAL', 'NO_WRITE_TO_BINLOG', 'NUMERIC', 'OPTIMIZE',
116                         'OPTIONALLY', 'OUT', 'OUTFILE', 'PURGE', 'READS', 'REAL', 'REGEXP', 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE',
117                         'REQUIRE', 'RLIKE', 'SCHEMAS', 'SECOND_MICROSECOND', 'SENSITIVE', 'SEPARATOR', 'SHOW', 'SMALLINT', 'SONAME',
118                         'SPATIAL', 'SPECIFIC', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS',
119                         'SQL_SMALL_RESULT', 'SSL', 'STARTING', 'STRAIGHT_JOIN', 'TERMINATED', 'TINYBLOB', 'TINYINT', 'TINYTEXT',
120                         'TRAILING', 'TRUE', 'UNDO', 'UNLOCK', 'UNSIGNED', 'USAGE', 'USING', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP',
121                         'VARBINARY', 'VARCHARACTER', 'WRITE', 'XOR', 'YEAR_MONTH', 'ZEROFILL', 'CONNECTION', 'LABEL', 'UPGRADE',
122                         //Oracle datatypes
123             'DATE','VARCHAR','VARCHAR2','NVARCHAR2','CHAR','NCHAR','NUMBER','PLS_INTEGER','BINARY_INTEGER','LONG','TIMESTAMP',
124                         'INTERVAL','RAW','ROWID','UROWID','MLSLABEL','CLOB','NCLOB','BLOB','BFILE','XMLTYPE',
125                         //SugarCRM reserved
126                         'ID', 'ID_C',
127                         );
128
129
130         //C.L. - Add support to mark related module id columns as reserved keywords
131         require_once 'modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php';
132         $relatedModules = array_keys(DeployedRelationships::findRelatableModules()) ;
133         global $beanList;
134         foreach($relatedModules as $relModule)
135         {
136             if(isset($beanList[$relModule]))
137             {
138                 $field_name_exceptions[] = strtoupper($beanList[$relModule]) . '_ID';
139             }
140         }
141
142         if(! isset($_REQUEST['view_package']) || $_REQUEST['view_package'] == 'studio' || empty ( $_REQUEST [ 'view_package' ] ) ) {
143             $module = new stdClass;
144             $moduleName = $_REQUEST['view_module'];
145
146             $objectName = $beanList[$moduleName];
147             $className = $objectName;
148             if($objectName == 'aCase') // Bug 17614 - renamed aCase as Case in vardefs for backwards compatibililty with 451 modules
149                 $objectName = 'Case';
150                         
151                         $module = new $className();
152             
153             VardefManager::loadVardef($moduleName, $objectName,true);
154             global $dictionary;
155             $module->mbvardefs->vardefs =  $dictionary[$objectName];
156                         
157 //          $GLOBALS['log']->debug('vardefs from dictionary = '.print_r($module->mbvardefs->vardefs,true));
158             $module->name = $moduleName;
159             if(!$ac){
160                 $ac = new AjaxCompose();
161             }
162             $vardef = (!empty($module->mbvardefs->vardefs['fields'][$field_name]))? $module->mbvardefs->vardefs['fields'][$field_name]: array();
163             if($isClone){
164                 unset($vardef['name']);
165             }
166           
167             if(empty($vardef['name'])){
168                 if(!empty($_REQUEST['type']))
169                     $vardef['type'] = $_REQUEST['type'];
170                     $fv->ss->assign('hideLevel', 0);
171             }elseif(isset($vardef['custom_module'])){
172                 $fv->ss->assign('hideLevel', 2);
173             }else{
174                 $action = 'saveSugarField'; // tyoung - for OOB fields we currently only support modifying the label
175                 $fv->ss->assign('hideLevel', 3);
176             }
177             if($isClone && isset($vardef['type']) && $vardef['type'] == 'datetime'){
178                 $vardef['type'] = 'datetimecombo';
179             }
180             
181                         require_once ('modules/DynamicFields/FieldCases.php') ;
182             $tf = get_widget ( empty($vardef [ 'type' ]) ?  "" : $vardef [ 'type' ]) ;
183             $tf->module = $module;
184             $tf->populateFromRow($vardef);
185                         $vardef = array_merge($vardef, $tf->get_field_def());
186             
187             //          $GLOBALS['log']->debug('vardefs after loading = '.print_r($vardef,true));
188            
189             
190             //Check if autoincrement fields are allowed
191             $allowAutoInc = true;
192             foreach($module->field_defs as $field => $def)
193             {
194                 if (!empty($def['type']) && $def['type'] == "int" && !empty($def['auto_increment'])) {
195                    $allowAutoInc = false;
196                    break;
197                 }
198             }
199             $fv->ss->assign( 'allowAutoInc', $allowAutoInc);   
200
201             $GLOBALS['log']->warn('view.modulefield: hidelevel '.$fv->ss->get_template_vars('hideLevel')." ".print_r($vardef,true));
202             if(!empty($vardef['vname'])){
203                 $fv->ss->assign('lbl_value', htmlentities(translate($vardef['vname'], $moduleName), ENT_QUOTES, 'UTF-8'));
204             }
205             $fv->ss->assign('module', $module);
206             if(empty($module->mbvardefs->vardefs['fields']['parent_name']) || (isset($vardef['type']) && $vardef['type'] == 'parent'))
207                                 $field_types['parent'] = $GLOBALS['mod_strings']['parent'];
208
209             $edit_or_add = 'editField' ;
210
211         } else
212         {
213             require_once('modules/ModuleBuilder/MB/ModuleBuilder.php');
214             $mb = new ModuleBuilder();
215             $module =& $mb->getPackageModule($_REQUEST['view_package'], $_REQUEST['view_module']);
216             $package =& $mb->packages[$_REQUEST['view_package']];
217             $module->getVardefs();
218             if(!$ac){
219                 $ac = new AjaxCompose();
220             }
221             $vardef = (!empty($module->mbvardefs->vardefs['fields'][$field_name]))? $module->mbvardefs->vardefs['fields'][$field_name]: array();
222             if($isClone){
223                 unset($vardef['name']);
224             }
225
226             if(empty($vardef['name'])){
227                 if(!empty($_REQUEST['type']))$vardef['type'] = $_REQUEST['type'];
228                     $fv->ss->assign('hideLevel', 0);
229             }else{
230                 if(!empty($module->mbvardefs->vardef['fields'][$vardef['name']])){
231                     $fv->ss->assign('hideLevel', 1);
232                 }elseif(isset($vardef['custom_module'])){
233                     $fv->ss->assign('hideLevel', 2);
234                 }else{
235                     $fv->ss->assign('hideLevel', 3); // tyoung bug 17350 - effectively mark template derived fields as readonly
236                 }
237             }
238
239                         require_once ('modules/DynamicFields/FieldCases.php') ;
240             $tf = get_widget ( empty($vardef [ 'type' ]) ?  "" : $vardef [ 'type' ]) ;
241             $tf->module = $module;
242             $tf->populateFromRow($vardef);
243             $vardef = array_merge($vardef, $tf->get_field_def());
244                         
245                         
246
247             $fv->ss->assign('module', $module);
248             $fv->ss->assign('package', $package);
249             $fv->ss->assign('MB','1');
250
251             if(isset($vardef['vname']))
252                 $fv->ss->assign('lbl_value', htmlentities($module->getLabel('en_us',$vardef['vname']), ENT_QUOTES, 'UTF-8'));
253                         if(empty($module->mbvardefs->vardefs['fields']['parent_name']) || (isset($vardef['type']) && $vardef['type'] == 'parent'))
254                                 $field_types['parent'] = $GLOBALS['mod_strings']['parent'];
255
256             $edit_or_add = 'mbeditField';
257         }
258
259         if($_REQUEST['action'] == 'RefreshField'){
260                 require_once('modules/DynamicFields/FieldCases.php');
261             $field = get_widget($_POST['type']);
262             $field->populateFromPost();
263             $vardef = $field->get_field_def();
264             $vardef['options'] = $_REQUEST['new_dropdown'];
265             $fv->ss->assign('lbl_value', htmlentities($_REQUEST['labelValue'], ENT_QUOTES, 'UTF-8'));
266         }
267
268         foreach(array("formula", "default", "comments", "help") as $toEscape)
269                 {
270                         if (!empty($vardef[$toEscape]) && is_string($vardef[$toEscape])) {
271                         $vardef[$toEscape] = htmlentities($vardef[$toEscape], ENT_QUOTES, 'UTF-8');
272                 }
273                 }
274                 
275         if(!empty($vardef['studio']) && is_array($vardef['studio']) && !empty($vardef['studio']['no_duplicate']) && $vardef['studio']['no_duplicate'] == true) {
276             $fv->ss->assign('no_duplicate', true);
277         }
278
279         $fv->ss->assign('action',$action);
280         $fv->ss->assign('isClone', ($isClone ? 1 : 0));
281         $json = getJSONobj();
282
283         $fv->ss->assign('field_name_exceptions', $json->encode($field_name_exceptions));
284         ksort($field_types);
285         $fv->ss->assign('field_types',$field_types);
286         $fv->ss->assign('importable_options', $GLOBALS['app_list_strings']['custom_fields_importable_dom']);
287         $fv->ss->assign('duplicate_merge_options', $GLOBALS['app_list_strings']['custom_fields_merge_dup_dom']);
288
289         $triggers = array () ;
290         $existing_field_names = array () ;
291         foreach ( $module->mbvardefs->vardefs['fields'] as $field )
292         {
293                 if ($field [ 'type' ] == 'enum' || $field [ 'type'] == 'multienum' )
294                 {
295                         $triggers [] = $field [ 'name' ] ;
296                 }
297                 
298                 if (!isset($field['source']) || $field['source'] != 'non-db') {
299                         if(preg_match('/^(.*?)(_c)?$/', $field['name'], $matches))
300                         {
301                                 $existing_field_names [] = strtoupper($matches[1]);     
302                         }
303                 }
304         }
305         
306         $fv->ss->assign('triggers',$triggers);
307         $fv->ss->assign('existing_field_names', $json->encode($existing_field_names));
308         $fv->ss->assign('mod_strings',$GLOBALS['mod_strings']);
309
310                 // jchi #24880
311                 // end
312         $layout = $fv->getLayout($vardef);
313
314         $fv->ss->assign('fieldLayout', $layout);
315         if(empty($vardef['type']))
316             $vardef['type'] = 'varchar';
317         $fv->ss->assign('vardef', $vardef);
318
319
320         if(empty($_REQUEST['field'])){
321             $edit_or_add = 'addField';
322         }
323
324         $fv->ss->assign('help_group', $edit_or_add);
325         $body = $fv->ss->fetch('modules/ModuleBuilder/tpls/MBModule/field.tpl');
326         $ac->addSection('east', translate('LBL_SECTION_FIELDEDITOR','ModuleBuilder'), $body );
327         return $ac;
328     }
329 }