Completed
Push — master ( 383655...9d0963 )
by Daniel
02:13
created

MySQLiAdvancedOutput::setNeededFieldTextRelated()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 10
rs 9.2
cc 4
eloc 7
nc 4
nop 3
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           = ['for' => $details['COLUMN_NAME'], 'id' => $details['COLUMN_NAME'] . '_label'];
656
                if (isset($features['disabled'])) {
657
                    if (in_array($details['COLUMN_NAME'], $features['disabled'])) {
658
                        $aLabel = array_merge($aLabel, ['style' => 'color: grey;']);
659
                    }
660
                }
661
                $sReturn['label'] = $this->setStringIntoTag($fieldLabel, 'label', $aLabel);
662
                $result           = $this->setNeededFieldByType($tableSource, $details, $features);
663
                if ($details['COLUMN_NAME'] == 'ChoiceId') {
664
                    $result = $this->setStringIntoShortTag('input', [
665
                        'type'  => 'text',
666
                        'name'  => $details['COLUMN_NAME'],
667
                        'value' => $this->tCmnRequest->request->get($details['COLUMN_NAME']),
668
                    ]);
669
                }
670
                $sReturn['input'] = $result;
671
                break;
672
        }
673
        $finalReturn = $sReturn['label'] . $this->setStringIntoTag($sReturn['input'], 'span', ['class' => 'labell']);
674
        $wrkDb       = $this->advCache['workingDatabase'];
675
        if (isset($this->advCache['tableFKs'][$wrkDb][$tableSource])) {
676
            if (in_array($details['COLUMN_NAME'], $this->advCache['FKcol'][$wrkDb][$tableSource])) {
677
                $finalReturn .= $this->setFieldNumbers($details);
678
            }
679
        }
680
        return $this->setStringIntoTag($finalReturn, 'div');
681
    }
682
683
    /**
684
     * Analyse the field type and returns the proper lines 2 use in forms
685
     *
686
     * @param string $tblName
687
     * @param array $dtls
688
     * @param array $features
689
     * @return string|array
690
     */
691
    private function setNeededFieldByType($tblName, $dtls, $features)
692
    {
693
        if (isset($features['special']) && isset($features['special'][$dtls['COLUMN_NAME']])) {
694
            $sOpt = $this->setMySQLquery2Server($features['special'][$dtls['COLUMN_NAME']], 'array_key_value');
695
            return $this->setArrayToSelect($sOpt, $this->getFieldValue($dtls), $dtls['COLUMN_NAME'], ['size' => 1]);
696
        }
697
        return $this->setNeededFieldKnown($tblName, $dtls, $iar);
0 ignored issues
show
Bug introduced by
The variable $iar does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
698
    }
699
700
    private function setNeededFieldKnown($tblName, $dtls, $iar)
0 ignored issues
show
Unused Code introduced by
The parameter $iar is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
701
    {
702
        $iar      = $this->handleFeatures($dtls['COLUMN_NAME'], $features);
0 ignored issues
show
Bug introduced by
The variable $features does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
703
        $sReturn  = '';
704
        $numTypes = ['bigint', 'int', 'mediumint', 'smallint', 'tinyint', 'float', 'double', 'decimal', 'numeric'];
705
        if (in_array($dtls['DATA_TYPE'], $numTypes)) {
706
            $sReturn = $this->getFieldOutputNumeric($tblName, $dtls, $iar);
707
        } elseif (in_array($dtls['DATA_TYPE'], ['char', 'tinytext', 'varchar', 'enum', 'set', 'text', 'blob'])) {
708
            $sReturn = $this->setNeededFieldTextRelated($tblName, $dtls, $iar);
709
        } elseif (in_array($dtls['DATA_TYPE'], ['date', 'time', 'year'])) {
710
            $sReturn = $this->setNeededFieldSingleType($tblName, $dtls, $iar);
711
        }
712
        return $this->getFieldCompletionType($dtls) . $sReturn;
713
    }
714
715
    private function setNeededFieldSingleType($tblName, $dtls, $iar)
716
    {
717
        if ($dtls['DATA_TYPE'] == 'date') {
718
            return $this->getFieldOutputDate($dtls);
719
        } elseif ($dtls['DATA_TYPE'] == 'time') {
720
            return $this->getFieldOutputTime($dtls, $iar);
721
        } elseif ($dtls['DATA_TYPE'] == 'year') {
722
            return $this->getFieldOutputYear($tblName, $dtls, $iar);
723
        } elseif (in_array($dtls['DATA_TYPE'], ['datetime', 'timestamp'])) {
724
            $sReturn = $this->getFieldOutputTimestamp($dtls, $iar);
0 ignored issues
show
Unused Code introduced by
$sReturn is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
725
        }
726
    }
727
728
    private function setNeededFieldTextRelated($tblName, $dtls, $iar)
729
    {
730
        if (in_array($dtls['DATA_TYPE'], ['char', 'tinytext', 'varchar'])) {
731
            return $this->getFieldOutputText($tblName, $dtls['DATA_TYPE'], $dtls, $iar);
732
        } elseif (in_array($dtls['DATA_TYPE'], ['enum', 'set'])) {
733
            return $this->getFieldOutputEnumSet($tblName, $dtls['DATA_TYPE'], $dtls, $iar);
734
        } elseif (in_array($dtls['DATA_TYPE'], ['text', 'blob'])) {
735
            return $this->getFieldOutputTextLarge($dtls['DATA_TYPE'], $dtls, $iar);
736
        }
737
    }
738
739
    /**
740
     * create a Cache for given table to use it in many places
741
     *
742
     * @param type $tblSrc
743
     */
744
    private function setTableCache($tblSrc)
745
    {
746
        $dat = $this->establishDatabaseAndTable($this->fixTableSource($tblSrc));
747
        if (!isset($this->advCache['tableStructureCache'][$dat[0]][$dat[1]])) {
748
            switch ($dat[1]) {
749
                case 'user_rights':
750
                    $this->advCache['workingDatabase'] = 'usefull_security';
751
                    break;
752
                default:
753
                    $this->advCache['workingDatabase'] = $dat[0];
754
                    break;
755
            }
756
            $this->advCache['tableStructureCache'][$dat[0]][$dat[1]] = $this->getMySQLlistColumns([
757
                'TABLE_SCHEMA' => $dat[0],
758
                'TABLE_NAME'   => $dat[1],
759
            ]);
760
            $this->setTableForeginKeyCache($dat[0], $dat[1]);
761
        }
762
    }
763
764
    private function setTableForeginKeyCache($dbName, $tblName)
765
    {
766
        $frgnKs = $this->getMySQLlistIndexes([
767
            'TABLE_SCHEMA'          => $dbName,
768
            'TABLE_NAME'            => $tblName,
769
            'REFERENCED_TABLE_NAME' => 'NOT NULL',
770
        ]);
771
        if (!is_null($frgnKs)) {
772
            $this->advCache['tableFKs'][$dbName][$tblName] = $frgnKs;
773
            $this->advCache['FKcol'][$dbName][$tblName]    = array_column($frgnKs, 'COLUMN_NAME', 'CONSTRAINT_NAME');
774
        }
775
    }
776
}
777