Completed
Push — master ( 5ab739...28084f )
by Daniel
02:27
created

MySQLiAdvancedOutput::setFieldLabel()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 6

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.4285
cc 3
eloc 6
nc 3
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 setField($tableSource, $dtl, $features, $fieldLabel)
561
    {
562
        $sReturn = [];
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...
563
        if (in_array($dtl['DATA_TYPE'], ['datetime', 'timestamp'])) {
564
            if (($dtl['COLUMN_DEFAULT'] == 'CURRENT_TIMESTAMP') || ($dtl['EXTRA'] == 'on update CURRENT_TIMESTAMP')) {
565
                return $this->getTimestamping($dtl);
566
            }
567
        } elseif ($dtl['COLUMN_NAME'] == 'host') {
568
            $inVl = gethostbyaddr($this->tCmnRequest->server->get('REMOTE_ADDR'));
569
            return [
570
                'label' => '<label for="' . $dtl['COLUMN_NAME'] . '">Numele calculatorului</label>',
571
                'input' => '<input type="text" name="host" size="15" readonly value="' . $inVl . '" />',
572
            ];
573
        } elseif ($dtl['COLUMN_NAME'] == 'ChoiceId') {
574
            $result = '<input type="text" name="ChoiceId" value="'
0 ignored issues
show
Unused Code introduced by
$result 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...
575
                    . $this->tCmnRequest->request->get($dtl['COLUMN_NAME']) . '" />';
576
        }
577
        $result = $this->setNeededFieldByType($tableSource, $dtl, $features);
578
        return ['label' => $this->setFieldLabel($dtl, $features, $fieldLabel), 'input' => $result];
579
    }
580
581
    private function setFieldLabel($details, $features, $fieldLabel)
582
    {
583
        $aLabel = ['for' => $details['COLUMN_NAME'], 'id' => $details['COLUMN_NAME'] . '_label'];
584
        if (isset($features['disabled'])) {
585
            if (in_array($details['COLUMN_NAME'], $features['disabled'])) {
586
                $aLabel = array_merge($aLabel, ['style' => 'color: grey;']);
587
            }
588
        }
589
        return $this->setStringIntoTag($fieldLabel, 'label', $aLabel);
590
    }
591
592
    private function setFormButtons($feat, $hiddenInfo)
593
    {
594
        $btn   = [];
595
        $btn[] = '<input type="submit" id="submit" style="margin-left:220px;" value="'
596
                . $this->lclMsgCmn('i18n_Form_ButtonSave') . '" />';
597
        if (isset($feat['insertAndUpdate'])) {
598
            $btn[] = '<input type="hidden" id="insertAndUpdate" name="insertAndUpdate" value="insertAndUpdate" />';
599
        }
600
        if (is_array($hiddenInfo)) {
601
            foreach ($hiddenInfo as $key => $value) {
602
                $btn[] = '<input type="hidden" id="' . $key . '" name="' . $key . '" value="' . $value . '" />';
603
            }
604
        }
605
        return '<div>' . implode('', $btn) . '</div>';
606
    }
607
608
    private function setFormJavascriptFinal($frmId)
609
    {
610
        $cnt = implode('', [
611
            '$(document).ready(function(){',
612
            '$("form#' . $frmId . '").submit(function(){',
613
            '$("input").attr("readonly", true);',
614
            '$("input[type=submit]").attr("disabled", "disabled");',
615
            '$("input[type=submit]").attr("value", "' . $this->lclMsgCmn('i18n_Form_ButtonSaving') . '");',
616
            '});',
617
            '});',
618
        ]);
619
        return $this->setJavascriptContent($cnt);
620
    }
621
622
    /**
623
     * Returns a generic form based on a given table
624
     *
625
     * @param string $tblSrc Table Source
626
     * @param array $feat
627
     * @param string|array $hdnInf List of hidden fields
628
     *
629
     * @return string Form to add/modify detail for a single row within a table
630
     */
631
    protected function setFormGenericSingleRecord($tblSrc, $feat, $hdnInf = '')
632
    {
633
        echo $this->setStringIntoTag('', 'div', ['id' => 'loading']);
634
        if (strpos($tblSrc, '.') !== false) {
635
            $tblSrc = explode('.', str_replace('`', '', $tblSrc))[1];
636
        }
637
        $this->setTableCache($tblSrc);
638
        $sReturn = [];
639
        if (count($this->advCache['tableStructureCache'][$this->advCache['workingDatabase']][$tblSrc]) != 0) {
640
            foreach ($this->advCache['tableStructureCache'][$this->advCache['workingDatabase']][$tblSrc] as $value) {
641
                $sReturn[] = $this->setNeededField($tblSrc, $value, $feat);
642
            }
643
        }
644
        $frmFtrs = ['id' => $feat['id'], 'action' => $feat['action'], 'method' => $feat['method']];
645
        return $this->setStringIntoTag(implode('', $sReturn) . $this->setFormButtons($feat, $hdnInf), 'form', $frmFtrs)
646
                . $this->setFormJavascriptFinal($feat['id']);
647
    }
648
649
    /**
650
     * Analyse the field and returns the proper line 2 use in forms
651
     *
652
     * @param string $tableSource
653
     * @param array $details
654
     * @param array $features
655
     * @return string|array
656
     */
657
    private function setNeededField($tableSource, $details, $features)
658
    {
659
        if (isset($features['hidden'])) {
660
            if (in_array($details['COLUMN_NAME'], $features['hidden'])) {
661
                return null;
662
            }
663
        }
664
        $fieldLabel = $this->getFieldNameForDisplay($details);
665
        if ($fieldLabel == 'hidden') {
666
            return null;
667
        }
668
        $sReturn     = $this->setField($tableSource, $details, $features, $fieldLabel);
669
        $finalReturn = $sReturn['label'] . $this->setStringIntoTag($sReturn['input'], 'span', ['class' => 'labell']);
670
        $wrkDb       = $this->advCache['workingDatabase'];
671
        if (isset($this->advCache['tableFKs'][$wrkDb][$tableSource])) {
672
            if (in_array($details['COLUMN_NAME'], $this->advCache['FKcol'][$wrkDb][$tableSource])) {
673
                $finalReturn .= $this->setFieldNumbers($details);
674
            }
675
        }
676
        return $this->setStringIntoTag($finalReturn, 'div');
677
    }
678
679
    /**
680
     * Analyse the field type and returns the proper lines 2 use in forms
681
     *
682
     * @param string $tblName
683
     * @param array $dtls
684
     * @param array $features
685
     * @return string|array
686
     */
687
    private function setNeededFieldByType($tblName, $dtls, $features)
688
    {
689
        if (isset($features['special']) && isset($features['special'][$dtls['COLUMN_NAME']])) {
690
            $sOpt = $this->setMySQLquery2Server($features['special'][$dtls['COLUMN_NAME']], 'array_key_value');
691
            return $this->setArrayToSelect($sOpt, $this->getFieldValue($dtls), $dtls['COLUMN_NAME'], ['size' => 1]);
692
        }
693
        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...
694
    }
695
696
    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...
697
    {
698
        $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...
699
        $sReturn  = '';
700
        $numTypes = ['bigint', 'int', 'mediumint', 'smallint', 'tinyint', 'float', 'double', 'decimal', 'numeric'];
701
        if (in_array($dtls['DATA_TYPE'], $numTypes)) {
702
            $sReturn = $this->getFieldOutputNumeric($tblName, $dtls, $iar);
703
        } elseif (in_array($dtls['DATA_TYPE'], ['char', 'tinytext', 'varchar', 'enum', 'set', 'text', 'blob'])) {
704
            $sReturn = $this->setNeededFieldTextRelated($tblName, $dtls, $iar);
705
        } elseif (in_array($dtls['DATA_TYPE'], ['date', 'datetime', 'time', 'timestamp', 'year'])) {
706
            $sReturn = $this->setNeededFieldSingleType($tblName, $dtls, $iar);
707
        }
708
        return $this->getFieldCompletionType($dtls) . $sReturn;
709
    }
710
711
    private function setNeededFieldSingleType($tblName, $dtls, $iar)
712
    {
713
        if ($dtls['DATA_TYPE'] == 'date') {
714
            return $this->getFieldOutputDate($dtls);
715
        } elseif ($dtls['DATA_TYPE'] == 'time') {
716
            return $this->getFieldOutputTime($dtls, $iar);
717
        } elseif (in_array($dtls['DATA_TYPE'], ['datetime', 'timestamp'])) {
718
            return $this->getFieldOutputTimestamp($dtls, $iar);
719
        }
720
        return $this->getFieldOutputYear($tblName, $dtls, $iar);
721
    }
722
723
    private function setNeededFieldTextRelated($tblName, $dtls, $iar)
724
    {
725
        if (in_array($dtls['DATA_TYPE'], ['char', 'tinytext', 'varchar'])) {
726
            return $this->getFieldOutputText($tblName, $dtls['DATA_TYPE'], $dtls, $iar);
727
        } elseif (in_array($dtls['DATA_TYPE'], ['text', 'blob'])) {
728
            return $this->getFieldOutputTextLarge($dtls['DATA_TYPE'], $dtls, $iar);
729
        }
730
        return $this->getFieldOutputEnumSet($tblName, $dtls['DATA_TYPE'], $dtls, $iar);
731
    }
732
733
    /**
734
     * create a Cache for given table to use it in many places
735
     *
736
     * @param type $tblSrc
737
     */
738
    private function setTableCache($tblSrc)
739
    {
740
        $dat = $this->establishDatabaseAndTable($this->fixTableSource($tblSrc));
741
        if (!isset($this->advCache['tableStructureCache'][$dat[0]][$dat[1]])) {
742
            $this->advCache['workingDatabase'] = $dat[0];
743
            if ($dat[1] == 'user_rights') {
744
                $this->advCache['workingDatabase'] = 'usefull_security';
745
            }
746
            $this->advCache['tableStructureCache'][$dat[0]][$dat[1]] = $this->getMySQLlistColumns([
747
                'TABLE_SCHEMA' => $dat[0],
748
                'TABLE_NAME'   => $dat[1],
749
            ]);
750
            $this->setTableForeginKeyCache($dat[0], $dat[1]);
751
        }
752
    }
753
754
    private function setTableForeginKeyCache($dbName, $tblName)
755
    {
756
        $frgnKs = $this->getMySQLlistIndexes([
757
            'TABLE_SCHEMA'          => $dbName,
758
            'TABLE_NAME'            => $tblName,
759
            'REFERENCED_TABLE_NAME' => 'NOT NULL',
760
        ]);
761
        if (!is_null($frgnKs)) {
762
            $this->advCache['tableFKs'][$dbName][$tblName] = $frgnKs;
763
            $this->advCache['FKcol'][$dbName][$tblName]    = array_column($frgnKs, 'COLUMN_NAME', 'CONSTRAINT_NAME');
764
        }
765
    }
766
}
767