Completed
Push — master ( 68b79b...383655 )
by Daniel
03:01
created

MySQLiAdvancedOutput::setFormJavascriptFinal()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 1
eloc 10
nc 1
nop 1
1
<?php
2
3
/**
4
 *
5
 * The MIT License (MIT)
6
 *
7
 * Copyright (c) 2015 Daniel Popiniuc
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a copy
10
 * of this software and associated documentation files (the "Software"), to deal
11
 * in the Software without restriction, including without limitation the rights
12
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
 * copies of the Software, and to permit persons to whom the Software is
14
 * furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included in all
17
 * copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
 * SOFTWARE.
26
 *
27
 */
28
29
namespace danielgp\common_lib;
30
31
/**
32
 * usefull functions to get quick results
33
 *
34
 * @author Daniel Popiniuc
35
 */
36
trait MySQLiAdvancedOutput
37
{
38
39
    use MySQLiByDanielGP;
40
41
    protected $advCache = null;
42
43
    /**
44
     * Establish Database and Table intended to work with
45
     * (in case the DB is ommited get the default one)
46
     *
47
     * @param string $tblSrc
48
     */
49
    private function establishDatabaseAndTable($tblSrc)
50
    {
51
        if (strpos($tblSrc, '.') === false) {
52
            if (!defined('MYSQL_DATABASE')) {
53
                define('MYSQL_DATABASE', 'information_schema');
54
            }
55
            return [$tblSrc, MYSQL_DATABASE];
56
        }
57
        return explode('.', str_replace('`', '', $tblSrc));
58
    }
59
60
    private function establishDefaultEnumSet($fldType)
61
    {
62
        $dfltArray = [
63
            'enum' => ['additional' => ['size' => 1], 'suffix' => ''],
64
            'set'  => ['additional' => ['size' => 5, 'multiselect'], 'suffix' => '[]'],
65
        ];
66
        return $dfltArray[$fldType];
67
    }
68
69
    private function fixTableSource($refTbl)
70
    {
71
        $outS = [];
72
        if (substr($refTbl, 0, 1) !== '`') {
73
            $outS[] = '`';
74
        }
75
        $psT = strpos($refTbl, '.`');
76
        if ($psT !== false) {
77
            $refTbl = substr($refTbl, $psT + 2, strlen($refTbl) - $psT);
78
        }
79
        $outS[] = $refTbl;
80
        if (substr($refTbl, -1) !== '`') {
81
            $outS[] = '`';
82
        }
83
        return implode('', $outS);
84
    }
85
86
    private function getFieldCompletionType($details)
87
    {
88
        $inputFeatures = ['display' => '***', 'ftrs' => ['title' => 'Mandatory', 'class' => 'inputMandatory']];
89
        if ($details['IS_NULLABLE'] == 'YES') {
90
            $inputFeatures = ['display' => '~', 'ftrs' => ['title' => 'Optional', 'class' => 'inputOptional']];
91
        }
92
        return $this->setStringIntoTag($inputFeatures['display'], 'span', $inputFeatures['ftrs']);
93
    }
94
95
    /**
96
     * Returns the name of a field for displaying
97
     *
98
     * @param array $details
99
     * @return string
100
     */
101
    private function getFieldNameForDisplay($details)
102
    {
103
        $tableUniqueId = $details['TABLE_SCHEMA'] . '.' . $details['TABLE_NAME'];
104
        if ($details['COLUMN_COMMENT'] != '') {
105
            return $details['COLUMN_COMMENT'];
106
        } elseif (isset($this->advCache['tableStructureLocales'][$tableUniqueId][$details['COLUMN_NAME']])) {
107
            return $this->advCache['tableStructureLocales'][$tableUniqueId][$details['COLUMN_NAME']];
108
        }
109
        return $details['COLUMN_NAME'];
110
    }
111
112
    /**
113
     * Returns a Date field 2 use in a form
114
     *
115
     * @param array $value
116
     * @return string
117
     */
118
    private function getFieldOutputDate($value)
119
    {
120
        $defaultValue = $this->getFieldValue($value);
121
        if (is_null($defaultValue)) {
122
            $defaultValue = date('Y-m-d');
123
        }
124
        $inA = [
125
            'type'      => 'text',
126
            'name'      => $value['Field'],
127
            'id'        => $value['Field'],
128
            'value'     => $defaultValue,
129
            'size'      => 10,
130
            'maxlength' => 10,
131
            'onfocus'   => implode('', [
132
                'javascript:NewCssCal(\'' . $value['Field'],
133
                '\',\'yyyyMMdd\',\'dropdown\',false,\'24\',false);',
134
            ]),
135
        ];
136
        return $this->setStringIntoShortTag('input', $inA) . $this->setCalendarControl($value['Field']);
137
    }
138
139
    /**
140
     * Returns a Enum or Set field to use in form
141
     *
142
     * @param string $tblSrc
143
     * @param string $fldType
144
     * @param array $val
145
     * @param array $iar
146
     * @return string
147
     */
148
    private function getFieldOutputEnumSet($tblSrc, $fldType, $val, $iar = [])
149
    {
150
        $adnlThings = $this->establishDefaultEnumSet($fldType);
151
        if (array_key_exists('readonly', $val)) {
152
            return $this->getFieldOutputEnumSetReadOnly($val, $adnlThings);
153
        }
154
        $inAdtnl = $adnlThings['additional'];
155
        if ($iar !== []) {
156
            $inAdtnl = array_merge($inAdtnl, $iar);
157
        }
158
        $vlSlct    = explode(',', $this->getFieldValue($val));
159
        $slctOptns = $this->getSetOrEnum2Array($tblSrc, $val['COLUMN_NAME']);
160
        return $this->setArrayToSelect($slctOptns, $vlSlct, $val['COLUMN_NAME'] . $adnlThings['suffix'], $inAdtnl);
161
    }
162
163
    private function getFieldOutputEnumSetReadOnly($val, $adnlThings)
164
    {
165
        $inputFeatures = [
166
            'name'     => $val['COLUMN_NAME'] . $adnlThings['suffix'],
167
            'id'       => $val['COLUMN_NAME'],
168
            'readonly' => 'readonly',
169
            'class'    => 'input_readonly',
170
            'size'     => 50,
171
            'value'    => $this->getFieldValue($val),
172
        ];
173
        return $this->setStringIntoShortTag('input', $inputFeatures);
174
    }
175
176
    /**
177
     * Returns a Numeric field 2 use in a form
178
     *
179
     * @param string $tblSrc
180
     * @param array $value
181
     * @param array $iar
182
     * @return string
183
     */
184
    private function getFieldOutputNumeric($tblSrc, $value, $iar = [])
185
    {
186
        if ($value['EXTRA'] == 'auto_increment') {
187
            return $this->getFieldOutputNumericAI($value, $iar);
188
        }
189
        $fkArray = $this->getForeignKeysToArray($this->advCache['workingDatabase'], $tblSrc, $value['COLUMN_NAME']);
190
        if (is_null($fkArray)) {
191
            $fldNos = $this->setFieldNumbers($value);
192
            return $this->getFieldOutputTT($value, min(50, $fldNos['l']), $iar);
193
        }
194
        return $this->getFieldOutputNumericNonFK($fkArray, $value, $iar);
195
    }
196
197
    private function getFieldOutputNumericAI($value, $iar = [])
198
    {
199
        if ($this->getFieldValue($value) == '') {
200
            $spF = ['id' => $value['COLUMN_NAME'], 'style' => 'font-style:italic;'];
201
            return $this->setStringIntoTag('auto-numar', 'span', $spF);
202
        }
203
        $inAdtnl = [
204
            'type'  => 'hidden',
205
            'name'  => $value['COLUMN_NAME'],
206
            'id'    => $value['COLUMN_NAME'],
207
            'value' => $this->getFieldValue($value),
208
        ];
209
        if ($iar !== []) {
210
            $inAdtnl = array_merge($inAdtnl, $iar);
211
        }
212
        return '<b>' . $this->getFieldValue($value) . '</b>' . $this->setStringIntoShortTag('input', $inAdtnl);
213
    }
214
215
    private function getFieldOutputNumericNonFK($fkArray, $value, $iar = [])
216
    {
217
        $query         = $this->sQueryGenericSelectKeyValue([
218
            $fkArray[$value['COLUMN_NAME']][1],
219
            $fkArray[$value['COLUMN_NAME']][2],
220
            $fkArray[$value['COLUMN_NAME']][0],
221
        ]);
222
        $selectOptions = $this->setMySQLquery2Server($query, 'array_key_value')['result'];
223
        $selectValue   = $this->getFieldValue($value);
224
        $inAdtnl       = ['size' => 1];
225
        if ($value['IS_NULLABLE'] == 'YES') {
226
            $inAdtnl = array_merge($inAdtnl, ['include_null']);
227
        }
228
        if ($iar !== []) {
229
            $inAdtnl = array_merge($inAdtnl, $iar);
230
        }
231
        return $this->setArrayToSelect($selectOptions, $selectValue, $value['COLUMN_NAME'], $inAdtnl);
232
    }
233
234
    /**
235
     * Returns a Char field 2 use in a form
236
     *
237
     * @param string $tbl
238
     * @param string $fieldType
239
     * @param array $value
240
     * @param array $iar
241
     * @return string
242
     */
243
    private function getFieldOutputText($tbl, $fieldType, $value, $iar = [])
244
    {
245
        if (!in_array($fieldType, ['char', 'tinytext', 'varchar'])) {
246
            return '';
247
        }
248
        $foreignKeysArray = $this->getFieldOutputTextPrerequisites($tbl, $value);
249
        if (is_null($foreignKeysArray)) {
250
            return $this->getFieldOutputTextFK($foreignKeysArray, $value, $iar);
251
        }
252
        return $this->getFieldOutputTextNonFK($value, $iar);
253
    }
254
255
    private function getFieldOutputTextFK($foreignKeysArray, $value, $iar)
256
    {
257
        $query   = $this->sQueryGenericSelectKeyValue([
258
            $foreignKeysArray[$value['COLUMN_NAME']][1],
259
            $foreignKeysArray[$value['COLUMN_NAME']][2],
260
            $foreignKeysArray[$value['COLUMN_NAME']][0]
261
        ]);
262
        $inAdtnl = ['size' => 1];
263
        if ($value['IS_NULLABLE'] == 'YES') {
264
            $inAdtnl = array_merge($inAdtnl, ['include_null']);
265
        }
266
        if ($iar !== []) {
267
            $inAdtnl = array_merge($inAdtnl, $iar);
268
        }
269
        $slct = [
270
            'Options' => $this->setMySQLquery2Server($query, 'array_key_value'),
271
            'Value'   => $this->getFieldValue($value),
272
        ];
273
        return $this->setArrayToSelect($slct['Options'], $slct['Value'], $value['COLUMN_NAME'], $inAdtnl);
274
    }
275
276
    /**
277
     * Returns a Text field 2 use in a form
278
     *
279
     * @param string $fieldType
280
     * @param array $value
281
     * @param array $iar
282
     * @return string
283
     */
284
    private function getFieldOutputTextLarge($fieldType, $value, $iar = [])
285
    {
286
        if (!in_array($fieldType, ['blob', 'text'])) {
287
            return '';
288
        }
289
        $inAdtnl = [
290
            'name' => $value['COLUMN_NAME'],
291
            'id'   => $value['COLUMN_NAME'],
292
            'rows' => 4,
293
            'cols' => 55,
294
        ];
295
        if ($iar !== []) {
296
            $inAdtnl = array_merge($inAdtnl, $iar);
297
        }
298
        return $this->setStringIntoTag($this->getFieldValue($value), 'textarea', $inAdtnl);
299
    }
300
301
    private function getFieldOutputTextNonFK($value, $iar)
302
    {
303
        $fldNos  = $this->setFieldNumbers($value);
304
        $inAdtnl = [
305
            'type'      => ($value['COLUMN_NAME'] == 'password' ? 'password' : 'text'),
306
            'name'      => $value['COLUMN_NAME'],
307
            'id'        => $value['COLUMN_NAME'],
308
            'size'      => min(30, $fldNos['l']),
309
            'maxlength' => min(255, $fldNos['l']),
310
            'value'     => $this->getFieldValue($value),
311
        ];
312
        if ($iar !== []) {
313
            $inAdtnl = array_merge($inAdtnl, $iar);
314
        }
315
        return $this->setStringIntoShortTag('input', $inAdtnl);
316
    }
317
318
    private function getFieldOutputTextPrerequisites($tbl, $value)
319
    {
320
        $foreignKeysArray = null;
321
        if (($tbl != 'user_rights') && ($value['COLUMN_NAME'] != 'eid')) {
322
            $database = $this->advCache['workingDatabase'];
323
            if (strpos($tbl, '`.`')) {
324
                $database = substr($tbl, 0, strpos($tbl, '`.`'));
325
            }
326
            $foreignKeysArray = $this->getForeignKeysToArray($database, $tbl, $value['COLUMN_NAME']);
327
        }
328
        return $foreignKeysArray;
329
    }
330
331
    private function getFieldOutputTT($value, $szN, $iar = [])
332
    {
333
        $inAdtnl = [
334
            'id'        => $value['COLUMN_NAME'],
335
            'maxlength' => $szN,
336
            'name'      => $value['COLUMN_NAME'],
337
            'size'      => $szN,
338
            'type'      => 'text',
339
            'value'     => $this->getFieldValue($value),
340
        ];
341
        if ($iar !== []) {
342
            $inAdtnl = array_merge($inAdtnl, $iar);
343
        }
344
        return $this->setStringIntoShortTag('input', $inAdtnl);
345
    }
346
347
    /**
348
     * Returns a Time field 2 use in a form
349
     *
350
     * @param array $value
351
     * @param array $iar
352
     * @return string
353
     */
354
    private function getFieldOutputTime($value, $iar = [])
355
    {
356
        return $this->getFieldOutputTT($value, 8, $iar);
357
    }
358
359
    /**
360
     * Returns a Timestamp field 2 use in a form
361
     *
362
     * @param array $value
363
     * @param array $iar
364
     * @return string
365
     */
366
    private function getFieldOutputTimestamp($value, $iar = [])
367
    {
368
        $input = $this->getFieldOutputTT($value, 19, $iar);
369
        if (!array_key_exists('readonly', $iar)) {
370
            $input .= $this->setCalendarControlWithTime($value['COLUMN_NAME']);
371
        }
372
        return $input;
373
    }
374
375
    /**
376
     * Returns a Year field 2 use in a form
377
     *
378
     * @param array $details
379
     * @param array $iar
380
     * @return string
381
     */
382
    private function getFieldOutputYear($tblName, $details, $iar)
383
    {
384
        $listOfValues = [];
385
        for ($cntr = 1901; $cntr <= 2155; $cntr++) {
386
            $listOfValues[$cntr] = $cntr;
387
        }
388
        if ($iar == []) {
389
            $slDflt = $this->getFieldValue($details);
390
            return $this->setArrayToSelect($listOfValues, $slDflt, $details['COLUMN_NAME'], ['size' => 1]);
391
        }
392
        return $this->getFieldOutputText($tblName, 'varchar', $details, $iar);
393
    }
394
395
    /**
396
     * Returns given value for a field from REQUEST global variable
397
     *
398
     * @param array $details
399
     * @return string
400
     */
401
    private function getFieldValue($details)
402
    {
403
        $this->initializeSprGlbAndSession();
404
        $rqCN = $this->tCmnRequest->request->get($details['COLUMN_NAME']);
405
        if (!is_null($rqCN)) {
406
            if (($details['IS_NULLABLE'] == 'YES') && ($rqCN == '')) {
407
                return 'NULL';
408
            }
409
            return $rqCN;
410
        }
411
        return $this->getFieldValueWithoutUserInput($details);
412
    }
413
414
    /**
415
     * Handles field value ignoring any input from the user
416
     *
417
     * @param array $details
418
     * @return string
419
     */
420
    private function getFieldValueWithoutUserInput($details)
421
    {
422
        if ($details['COLUMN_DEFAULT'] === null) {
423
            if ($details['IS_NULLABLE'] == 'YES') {
424
                return 'NULL';
425
            }
426
            return '';
427
        }
428
        return $details['COLUMN_DEFAULT'];
429
    }
430
431
    private function getForeignKeysQuery($value)
432
    {
433
        $flt = [
434
            'TABLE_SCHEMA' => $value['REFERENCED_TABLE_SCHEMA'],
435
            'TABLE_NAME'   => $value['REFERENCED_TABLE_NAME'],
436
            'DATA_TYPE'    => ['char', 'varchar', 'text'],
437
        ];
438
        return $this->sQueryMySqlColumns($flt);
439
    }
440
441
    /**
442
     * Returns an array with fields referenced by a Foreign key
443
     *
444
     * @param string $database
445
     * @param string $tblName
446
     * @param string|array $onlyCol
447
     * @return array
448
     */
449
    private function getForeignKeysToArray($database, $tblName, $onlyCol = '')
450
    {
451
        $this->setTableForeginKeyCache($database, $this->fixTableSource($tblName));
452
        $array2return = null;
453
        if (isset($this->advCache['tableFKs'][$database][$tblName])) {
454
            foreach ($this->advCache['tableFKs'][$database][$tblName] as $value) {
455
                if ($value['COLUMN_NAME'] == $onlyCol) {
456
                    $query                  = $this->getForeignKeysQuery($value);
457
                    $targetTblTxtFlds       = $this->setMySQLquery2Server($query, 'full_array_key_numbered')['result'];
458
                    $array2return[$onlyCol] = [
459
                        $this->glueDbTb($value['REFERENCED_TABLE_SCHEMA'], $value['REFERENCED_TABLE_NAME']),
460
                        $value['REFERENCED_COLUMN_NAME'],
461
                        '`' . $targetTblTxtFlds[0]['COLUMN_NAME'] . '`',
462
                    ];
463
                }
464
            }
465
        }
466
        return $array2return;
467
    }
468
469
    private function getLabel($details)
470
    {
471
        return $this->setStringIntoTag($this->getFieldNameForDisplay($details), 'span', ['class' => 'fake_label']);
472
    }
473
474
    /**
475
     * Returns an array with possible values of a SET or ENUM column
476
     *
477
     * @param string $refTbl
478
     * @param string $refCol
479
     * @return array
480
     */
481
    protected function getSetOrEnum2Array($refTbl, $refCol)
482
    {
483
        $dat = $this->establishDatabaseAndTable($this->fixTableSource($refTbl));
484
        foreach ($this->advCache['tableStructureCache'][$dat[0]][$dat[1]] as $value) {
485
            if ($value['COLUMN_NAME'] == $refCol) {
486
                $clndVls = explode(',', str_replace([$value['DATA_TYPE'], '(', "'", ')'], '', $value['COLUMN_TYPE']));
487
                $enmVls  = array_combine($clndVls, $clndVls);
488
                if ($value['IS_NULLABLE'] == 'YES') {
489
                    $enmVls['NULL'] = '';
490
                }
491
            }
492
        }
493
        ksort($enmVls);
494
        return $enmVls;
495
    }
496
497
    /**
498
     * Returns a timestamp field value
499
     *
500
     * @param array $dtl
501
     * @return array
502
     */
503
    private function getTimestamping($dtl)
504
    {
505
        $inM = $this->setStringIntoTag($this->getFieldValue($dtl), 'span');
506
        if (in_array($this->getFieldValue($dtl), ['', 'CURRENT_TIMESTAMP', 'NULL'])) {
507
            $mCN = [
508
                'InsertDateTime'        => 'data/timpul ad. informatiei',
509
                'ModificationDateTime'  => 'data/timpul modificarii inf.',
510
                'modification_datetime' => 'data/timpul modificarii inf.',
511
            ];
512
            if (array_key_exists($dtl['COLUMN_NAME'], $mCN)) {
513
                $inM = $this->setStringIntoTag($mCN[$dtl['COLUMN_NAME']], 'span', ['style' => 'font-style:italic;']);
514
            }
515
        }
516
        return ['label' => $this->getLabel($dtl), 'input' => $inM];
517
    }
518
519
    private function glueDbTb($dbName, $tbName)
520
    {
521
        return '`' . $dbName . '`.`' . $tbName . '`';
522
    }
523
524
    /**
525
     * Manages features flag
526
     *
527
     * @param string $fieldName
528
     * @param array $features
529
     * @return string
530
     */
531
    private function handleFeatures($fieldName, $features)
532
    {
533
        $rOly  = $this->handleFeaturesSingle($fieldName, $features, 'readonly');
534
        $rDbld = $this->handleFeaturesSingle($fieldName, $features, 'disabled');
535
        $rNl   = [];
536
        if (isset($features['include_null']) && in_array($fieldName, $features['include_null'])) {
537
            $rNl = ['include_null'];
538
        }
539
        return array_merge([], $rOly, $rDbld, $rNl);
540
    }
541
542
    private function handleFeaturesSingle($fieldName, $features, $featureKey)
543
    {
544
        $fMap    = [
545
            'readonly' => ['readonly', 'class', 'input_readonly'],
546
            'disabled' => ['disabled']
547
        ];
548
        $aReturn = [];
549
        if (array_key_exists($featureKey, $features)) {
550
            if (array_key_exists($fieldName, $features[$featureKey])) {
551
                $aReturn[$featureKey][$fMap[$featureKey][0]] = $fMap[$featureKey][0];
552
                if (count($fMap[$featureKey]) > 1) {
553
                    $aReturn[$featureKey][$fMap[$featureKey][1]] = $fMap[$featureKey][2];
554
                }
555
            }
556
        }
557
        return $aReturn;
558
    }
559
560
    private function setFormButtons($feat, $hiddenInfo)
561
    {
562
        $btn   = [];
563
        $btn[] = '<input type="submit" id="submit" style="margin-left:220px;" value="'
564
                . $this->lclMsgCmn('i18n_Form_ButtonSave') . '" />';
565
        if (isset($feat['insertAndUpdate'])) {
566
            $btn[] = '<input type="hidden" id="insertAndUpdate" name="insertAndUpdate" value="insertAndUpdate" />';
567
        }
568
        if (is_array($hiddenInfo)) {
569
            foreach ($hiddenInfo as $key => $value) {
570
                $btn[] = '<input type="hidden" id="' . $key . '" name="' . $key . '" value="' . $value . '" />';
571
            }
572
        }
573
        return '<div>' . implode('', $btn) . '</div>';
574
    }
575
576
    private function setFormJavascriptFinal($frmId)
577
    {
578
        $cnt = implode('', [
579
            '$(document).ready(function(){',
580
            '$("form#' . $frmId . '").submit(function(){',
581
            '$("input").attr("readonly", true);',
582
            '$("input[type=submit]").attr("disabled", "disabled");',
583
            '$("input[type=submit]").attr("value", "' . $this->lclMsgCmn('i18n_Form_ButtonSaving') . '");',
584
            '});',
585
            '});',
586
        ]);
587
        return $this->setJavascriptContent($cnt);
588
    }
589
590
    /**
591
     * Returns a generic form based on a given table
592
     *
593
     * @param string $tblSrc Table Source
594
     * @param array $feat
595
     * @param string|array $hdnInf List of hidden fields
596
     *
597
     * @return string Form to add/modify detail for a single row within a table
598
     */
599
    protected function setFormGenericSingleRecord($tblSrc, $feat, $hdnInf = '')
600
    {
601
        echo $this->setStringIntoTag('', 'div', ['id' => 'loading']);
602
        if (strpos($tblSrc, '.') !== false) {
603
            $tblSrc = explode('.', str_replace('`', '', $tblSrc))[1];
604
        }
605
        $this->setTableCache($tblSrc);
606
        $sReturn = [];
607
        if (count($this->advCache['tableStructureCache'][$this->advCache['workingDatabase']][$tblSrc]) != 0) {
608
            foreach ($this->advCache['tableStructureCache'][$this->advCache['workingDatabase']][$tblSrc] as $value) {
609
                $sReturn[] = $this->setNeededField($tblSrc, $value, $feat);
610
            }
611
        }
612
        $frmFtrs = ['id' => $feat['id'], 'action' => $feat['action'], 'method' => $feat['method']];
613
        return $this->setStringIntoTag(implode('', $sReturn) . $this->setFormButtons($feat, $hdnInf), 'form', $frmFtrs)
614
                . $this->setFormJavascriptFinal($feat['id']);
615
    }
616
617
    /**
618
     * Analyse the field and returns the proper line 2 use in forms
619
     *
620
     * @param string $tableSource
621
     * @param array $details
622
     * @param array $features
623
     * @return string|array
624
     */
625
    private function setNeededField($tableSource, $details, $features)
626
    {
627
        if (isset($features['hidden'])) {
628
            if (in_array($details['COLUMN_NAME'], $features['hidden'])) {
629
                return null;
630
            }
631
        }
632
        $fieldLabel = $this->getFieldNameForDisplay($details);
633
        if ($fieldLabel == 'hidden') {
634
            return null;
635
        }
636
        $sReturn = [];
637
        switch ($details['COLUMN_NAME']) {
638
            case 'host':
639
                $sReturn['label'] = $this->setStringIntoTag('Numele calculatorului', 'label', [
640
                    'for' => $details['COLUMN_NAME']
641
                ]);
642
                $sReturn['input'] = $this->setStringIntoShortTag('input', [
643
                    'type'     => 'input',
644
                    'size'     => 15,
645
                    'readonly' => 'readonly',
646
                    'value'    => gethostbyaddr($this->tCmnRequest->server->get('REMOTE_ADDR')),
647
                ]);
648
                break;
649
            case 'InsertDateTime':
650
            case 'modification_datetime':
651
            case 'ModificationDateTime':
652
                $sReturn          = call_user_func_array([$this, 'getTimestamping'], [$details]);
653
                break;
654
            default:
655
                $aLabel           = [
656
                    'for' => $details['COLUMN_NAME'],
657
                    'id'  => $details['COLUMN_NAME'] . '_label'
658
                ];
659
                if (isset($features['disabled'])) {
660
                    if (in_array($details['COLUMN_NAME'], $features['disabled'])) {
661
                        $aLabel = array_merge($aLabel, ['style' => 'color: grey;']);
662
                    }
663
                }
664
                $sReturn['label'] = $this->setStringIntoTag($fieldLabel, 'label', $aLabel);
665
                $result           = $this->setNeededFieldByType($tableSource, $details, $features);
666
                if ($details['COLUMN_NAME'] == 'ChoiceId') {
667
                    $result = $this->setStringIntoShortTag('input', [
668
                        'type'  => 'text',
669
                        'name'  => $details['COLUMN_NAME'],
670
                        'value' => $this->tCmnRequest->request->get($details['COLUMN_NAME']),
671
                    ]);
672
                }
673
                $sReturn['input'] = $result;
674
                break;
675
        }
676
        $finalReturn = $sReturn['label'] . $this->setStringIntoTag($sReturn['input'], 'span', ['class' => 'labell']);
677
        $wrkDb       = $this->advCache['workingDatabase'];
678
        if (isset($this->advCache['tableFKs'][$wrkDb][$tableSource])) {
679
            if (in_array($details['COLUMN_NAME'], $this->advCache['FKcol'][$wrkDb][$tableSource])) {
680
                $finalReturn .= $this->setFieldNumbers($details);
681
            }
682
        }
683
        return $this->setStringIntoTag($finalReturn, 'div');
684
    }
685
686
    /**
687
     * Analyse the field type and returns the proper lines 2 use in forms
688
     *
689
     * @param string $tblName
690
     * @param array $details
691
     * @param array $features
692
     * @return string|array
693
     */
694
    private function setNeededFieldByType($tblName, $details, $features)
695
    {
696
        if (isset($features['special']) && isset($features['special'][$details['COLUMN_NAME']])) {
697
            $slctOpt = $this->setMySQLquery2Server($features['special'][$details['COLUMN_NAME']], 'array_key_value');
698
            return $this->setArrayToSelect($slctOpt, $this->getFieldValue($details), $details['COLUMN_NAME'], [
699
                        'size' => 1
700
            ]);
701
        }
702
        $iar      = $this->handleFeatures($details['COLUMN_NAME'], $features);
703
        $sReturn  = '';
704
        $numTypes = ['bigint', 'int', 'mediumint', 'smallint', 'tinyint', 'float', 'double', 'decimal', 'numeric'];
705
        if (in_array($details['DATA_TYPE'], $numTypes)) {
706
            $sReturn = $this->getFieldOutputNumeric($tblName, $details, $iar);
707
        } elseif (in_array($details['DATA_TYPE'], ['char', 'tinytext', 'varchar'])) {
708
            $sReturn = $this->getFieldOutputText($tblName, $details['DATA_TYPE'], $details, $iar);
709
        } elseif ($details['DATA_TYPE'] == 'date') {
710
            $sReturn = $this->getFieldOutputDate($details);
711
        } elseif (in_array($details['DATA_TYPE'], ['datetime', 'timestamp'])) {
712
            $sReturn = $this->getFieldOutputTimestamp($details, $iar);
713
        } elseif (in_array($details['DATA_TYPE'], ['enum', 'set'])) {
714
            $sReturn = $this->getFieldOutputEnumSet($tblName, $details['DATA_TYPE'], $details, $iar);
715
        } elseif (in_array($details['DATA_TYPE'], ['text', 'blob'])) {
716
            $sReturn = $this->getFieldOutputTextLarge($details['DATA_TYPE'], $details, $iar);
717
        } elseif ($details['DATA_TYPE'] == 'time') {
718
            $sReturn = $this->getFieldOutputTime($details, $iar);
719
        } elseif ($details['DATA_TYPE'] == 'year') {
720
            $sReturn = $this->getFieldOutputYear($tblName, $details, $iar);
721
        }
722
        return $this->getFieldCompletionType($details) . $sReturn;
723
    }
724
725
    /**
726
     * create a Cache for given table to use it in many places
727
     *
728
     * @param type $tblSrc
729
     */
730
    private function setTableCache($tblSrc)
731
    {
732
        $dat = $this->establishDatabaseAndTable($this->fixTableSource($tblSrc));
733
        if (!isset($this->advCache['tableStructureCache'][$dat[0]][$dat[1]])) {
734
            switch ($dat[1]) {
735
                case 'user_rights':
736
                    $this->advCache['workingDatabase'] = 'usefull_security';
737
                    break;
738
                default:
739
                    $this->advCache['workingDatabase'] = $dat[0];
740
                    break;
741
            }
742
            $this->advCache['tableStructureCache'][$dat[0]][$dat[1]] = $this->getMySQLlistColumns([
743
                'TABLE_SCHEMA' => $dat[0],
744
                'TABLE_NAME'   => $dat[1],
745
            ]);
746
            $this->setTableForeginKeyCache($dat[0], $dat[1]);
747
        }
748
    }
749
750
    private function setTableForeginKeyCache($dbName, $tblName)
751
    {
752
        $frgnKs = $this->getMySQLlistIndexes([
753
            'TABLE_SCHEMA'          => $dbName,
754
            'TABLE_NAME'            => $tblName,
755
            'REFERENCED_TABLE_NAME' => 'NOT NULL',
756
        ]);
757
        if (!is_null($frgnKs)) {
758
            $this->advCache['tableFKs'][$dbName][$tblName] = $frgnKs;
759
            $this->advCache['FKcol'][$dbName][$tblName]    = array_column($frgnKs, 'COLUMN_NAME', 'CONSTRAINT_NAME');
760
        }
761
    }
762
}
763