Files
2026-05-27 11:44:10 -04:00

119 lines
4.2 KiB
PHP

<?php
namespace App\Modules\DynamicForms\Libraries;
class FieldRenderer
{
public static function render(array $field, array $record = []): string
{
$value = $record[$field['db_column']] ?? '';
switch ($field['type']) {
case 'date':
return '<input class="w-full border border-zinc-300 rounded px-2 py-1" '
. 'type="date" '
. 'name="' . esc($field['db_column']) . '" '
. 'value="' . esc($value) . '">';
case 'lookup':
return '<span class="font-semibold">'
. esc($value)
. '</span>';
case 'select':
$html = '<select class="w-full border border-zinc-300 rounded px-2 py-1" '
. 'name="' . esc($field['db_column']) . '">';
foreach ($field['options'] ?? [] as $option) {
$selected = ($value == $option[$field['source_value_field']]) ? 'selected' : '';
$html .= '<option value="' . $option[$field['source_value_field']] . '" ' . $selected . '>'
. esc($option[$field['source_label_field']])
. '</option>';
}
$html .= '</select>';
return $html;
case 'blob':
return '<textarea class="w-full border border-zinc-300 rounded px-2 py-1" '
. 'name="' . esc($field['db_column']) . '" rows="5">'
. esc($value)
. '</textarea>';
case 'text':
return '<input class="w-full border border-zinc-300 rounded px-2 py-1" '
. 'type="text" '
. 'name="' . esc($field['db_column']) . '" '
. 'value="' . esc($value) . '">';
case 'qr':
if (!$value) {
return '';
}
$go = "inventaire/redirect/" . $value;
$qr = new \App\Libraries\QrCodeService();
$code = $qr->get($go);
return '<img src="data:image/png;base64,' . $code . '" width="120">';
case 'boolean':
$checkedYes = ($value == 1) ? 'checked' : '';
$checkedNo = ($value == 0) ? 'checked' : '';
return '
<label><input type="radio" name="' . esc($field['db_column']) . '" value="1" ' . $checkedYes . '> Oui</label>
<label class="ml-3"><input type="radio" name="' . esc($field['db_column']) . '" value="0" ' . $checkedNo . '> Non</label>
';
case 'integer':
return '<input class="w-full border border-zinc-300 rounded px-2 py-1" '
. 'type="number" '
. 'step="1" '
. 'name="' . esc($field['db_column']) . '" '
. 'value="' . esc($value) . '">';
case 'color':
$currentValue = esc($value ?: '#000000');
$inputId = 'color_' . esc($field['db_column']);
$colors = ['#000000','#ffffff','#ff0000','#00ff00','#0000ff','#ffbf80','#ffff00','#ff00ff','#00ffff','#808080'];
$html = '<input
id="' . $inputId . '"
class="w-full h-10 border border-zinc-300 rounded px-1 py-1 mb-2"
type="color"
name="' . esc($field['db_column']) . '"
value="' . $currentValue . '">';
$html .= '<div class="flex gap-2 flex-wrap">';
foreach ($colors as $c) {
$html .= '<button
type="button"
class="w-6 h-6 rounded border border-zinc-300"
style="background:' . $c . '"
onclick="document.getElementById(\'' . $inputId . '\').value=\'' . $c . '\'">
</button>';
}
$html .= '</div>';
return $html;
default:
return '<input class="w-full border border-zinc-300 rounded px-2 py-1" '
. 'type="text" '
. 'name="' . esc($field['db_column']) . '" '
. 'value="' . esc($value) . '">';
}
}
}