2017-08-04 16:28:16 +02:00
|
|
|
<?php
|
2020-09-07 15:04:06 +02:00
|
|
|
/*
|
|
|
|
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
2021-01-20 15:08:51 +01:00
|
|
|
* Copyright (C) DevCode s.r.l.
|
2020-09-07 15:04:06 +02:00
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2017-08-04 16:28:16 +02:00
|
|
|
|
|
|
|
namespace HTMLBuilder;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Classe dedicata alla gestione della conversione di tag in codice HTML.
|
|
|
|
*
|
2017-08-31 11:32:49 +02:00
|
|
|
* <b>Tag di input</b>
|
|
|
|
*
|
2017-08-04 16:28:16 +02:00
|
|
|
* Campo di input generico:
|
|
|
|
* {[ "type": "text", "required": 1, "value": "$idintervento$" ]}
|
|
|
|
*
|
|
|
|
* Campo di testo normale e non modificabile:
|
|
|
|
* {[ "type": "span", "value": "$testo$" ]}
|
|
|
|
*
|
|
|
|
* Campo select automatizzatp:
|
|
|
|
* {[ "type": "select", "required": 1, "values": "query=SELECT id, descrizione FROM co_contratti WHERE idanagrafica=$idanagrafica$", "value": "$idcontratto$" ]}
|
|
|
|
*
|
|
|
|
* La sostituzione dei parametri compresi tra $$ viene effettuata attraverso il parametro $records.
|
|
|
|
*
|
2017-08-31 11:32:49 +02:00
|
|
|
* <b>Tag personalizzati</b>
|
|
|
|
*
|
|
|
|
* Struttura per l'inserimento e la visualizzazione dei file:
|
|
|
|
* {( "name": "filelist_and_upload", "id_module": "3", "id_record": "17" )}
|
|
|
|
*
|
2017-08-04 16:28:16 +02:00
|
|
|
* @since 2.3
|
|
|
|
*/
|
|
|
|
class HTMLBuilder
|
|
|
|
{
|
|
|
|
/** @var array Codici di apertura dei tag personalizzati */
|
|
|
|
public static $open = [
|
|
|
|
'handler' => '{[',
|
|
|
|
'manager' => '{(',
|
|
|
|
];
|
|
|
|
|
|
|
|
/** @var array Codici di chiusura dei tag personalizzati */
|
|
|
|
public static $close = [
|
|
|
|
'handler' => ']}',
|
|
|
|
'manager' => ')}',
|
|
|
|
];
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/** @var array Elenco degli attributi che necessitano esclusivamente di essere presenti */
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static $specifics = [
|
|
|
|
'multiple',
|
|
|
|
'checked',
|
|
|
|
'disabled',
|
|
|
|
'readonly',
|
|
|
|
'required',
|
|
|
|
];
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/** @var array Elenco dei gestori dei campi HTML */
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static $handlers = [
|
|
|
|
'list' => [
|
2018-09-19 10:44:32 +02:00
|
|
|
'default' => Handler\DefaultHandler::class,
|
|
|
|
'image' => Handler\MediaHandler::class,
|
|
|
|
'select' => Handler\SelectHandler::class,
|
|
|
|
'checkbox' => Handler\ChoicesHandler::class,
|
|
|
|
'radio' => Handler\ChoicesHandler::class,
|
|
|
|
'bootswitch' => Handler\ChoicesHandler::class,
|
|
|
|
'timestamp' => Handler\DateHandler::class,
|
|
|
|
'date' => Handler\DateHandler::class,
|
|
|
|
'time' => Handler\DateHandler::class,
|
2018-09-07 17:43:52 +02:00
|
|
|
'ckeditor' => Handler\CKEditorHandler::class,
|
2017-08-04 16:28:16 +02:00
|
|
|
],
|
|
|
|
'instances' => [],
|
|
|
|
];
|
|
|
|
|
|
|
|
/** @var array Generatore del contenitore per i campi HTML */
|
|
|
|
protected static $wrapper = [
|
2018-09-19 10:44:32 +02:00
|
|
|
'class' => Wrapper\HTMLWrapper::class,
|
2017-08-04 16:28:16 +02:00
|
|
|
'istance' => null,
|
|
|
|
];
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/** @var array Elenco dei gestori delle strutture HTML */
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static $managers = [
|
|
|
|
'list' => [
|
2018-09-19 10:44:32 +02:00
|
|
|
'filelist_and_upload' => Manager\FileManager::class,
|
|
|
|
'button' => Manager\ButtonManager::class,
|
2020-09-23 13:36:37 +02:00
|
|
|
//'csrf' => Manager\CSRFManager::class,
|
2018-09-19 10:44:32 +02:00
|
|
|
'custom_fields' => Manager\FieldManager::class,
|
|
|
|
'widgets' => Manager\WidgetManager::class,
|
2018-09-28 16:17:10 +02:00
|
|
|
'log_email' => Manager\EmailManager::class,
|
2017-08-04 16:28:16 +02:00
|
|
|
],
|
|
|
|
'instances' => [],
|
|
|
|
];
|
|
|
|
|
2018-02-16 09:32:50 +01:00
|
|
|
/** @var int Limite di ricorsione interna */
|
2018-02-16 09:40:28 +01:00
|
|
|
protected static $max_recursion = 10;
|
2018-02-16 09:32:50 +01:00
|
|
|
|
2018-07-18 14:50:46 +02:00
|
|
|
/** @var array Elenco degli elementi abilitati per la sostituzione automatica nei valori ($nome$) */
|
|
|
|
protected static $record = [];
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/**
|
|
|
|
* Esegue la sostituzione dei tag personalizzati con il relativo codice HTML.
|
|
|
|
*
|
|
|
|
* @param string $html
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
2018-02-16 09:32:50 +01:00
|
|
|
public static function replace($html, $depth = 0)
|
2017-08-04 16:28:16 +02:00
|
|
|
{
|
2018-01-12 16:23:26 +01:00
|
|
|
// Gestione dei manager generici
|
2017-09-11 18:12:41 +02:00
|
|
|
preg_match_all('/'.preg_quote(self::$open['manager']).'(.+?)'.preg_quote(self::$close['manager']).'/is', $html, $managers);
|
2017-08-04 16:28:16 +02:00
|
|
|
|
|
|
|
foreach ($managers[0] as $value) {
|
|
|
|
$json = self::decode($value, 'manager');
|
|
|
|
$class = self::getManager($json['name']);
|
|
|
|
|
2019-01-19 10:33:57 +01:00
|
|
|
$result = '';
|
|
|
|
try {
|
|
|
|
$result = !empty($class) ? $class->manage($json) : '';
|
|
|
|
} catch (\Exception $exception) {
|
|
|
|
logger()->error($exception->getMessage(), [
|
|
|
|
'code' => $exception->getCode(),
|
|
|
|
'message' => $exception->getMessage(),
|
|
|
|
'file' => $exception->getFile(),
|
|
|
|
'line' => $exception->getLine(),
|
|
|
|
'trace' => $exception->getTraceAsString(),
|
|
|
|
]);
|
|
|
|
}
|
2017-09-24 12:10:22 +02:00
|
|
|
|
2018-02-14 18:39:41 +01:00
|
|
|
// Ricorsione
|
2018-02-16 09:40:28 +01:00
|
|
|
if ($depth < self::$max_recursion) {
|
2018-02-16 09:41:28 +01:00
|
|
|
$result = self::replace($result, $depth + 1);
|
2018-02-16 09:32:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
$html = str_replace($value, !empty($result) ? $result : $value, $html);
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
|
2018-01-12 16:23:26 +01:00
|
|
|
// Gestione del formato di input HTML semplificato
|
2017-09-11 18:12:41 +02:00
|
|
|
preg_match_all('/'.preg_quote(self::$open['handler']).'(.+?)'.preg_quote(self::$close['handler']).'/is', $html, $handlers);
|
2017-08-04 16:28:16 +02:00
|
|
|
|
|
|
|
foreach ($handlers[0] as $value) {
|
|
|
|
$json = self::decode($value, 'handler');
|
2019-01-19 10:33:57 +01:00
|
|
|
|
|
|
|
$result = null;
|
|
|
|
try {
|
|
|
|
$result = self::generate($json);
|
|
|
|
} catch (\Exception $exception) {
|
|
|
|
logger()->error($exception->getMessage(), [
|
|
|
|
'code' => $exception->getCode(),
|
|
|
|
'message' => $exception->getMessage(),
|
|
|
|
'file' => $exception->getFile(),
|
|
|
|
'line' => $exception->getLine(),
|
|
|
|
'trace' => $exception->getTraceAsString(),
|
|
|
|
]);
|
|
|
|
}
|
2017-09-24 12:10:22 +02:00
|
|
|
|
2018-02-14 18:39:41 +01:00
|
|
|
// Ricorsione
|
2018-02-16 09:40:28 +01:00
|
|
|
if ($depth < self::$max_recursion) {
|
2018-02-16 09:41:28 +01:00
|
|
|
$result = self::replace($result, $depth + 1);
|
2018-02-16 09:32:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
$html = str_replace($value, !empty($result) ? $result : $value, $html);
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return $html;
|
|
|
|
}
|
|
|
|
|
2019-09-11 08:48:37 +02:00
|
|
|
/**
|
|
|
|
* Esegue la sostituzione per un singolo tag personalizzato con il relativo codice HTML.
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public static function parse(array $json)
|
|
|
|
{
|
|
|
|
$result = null;
|
|
|
|
try {
|
|
|
|
$result = self::generate($json);
|
|
|
|
} catch (\Exception $exception) {
|
|
|
|
logger()->error($exception->getMessage(), [
|
|
|
|
'code' => $exception->getCode(),
|
|
|
|
'message' => $exception->getMessage(),
|
|
|
|
'file' => $exception->getFile(),
|
|
|
|
'line' => $exception->getLine(),
|
|
|
|
'trace' => $exception->getTraceAsString(),
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ricorsione
|
2020-09-23 13:36:37 +02:00
|
|
|
$result = self::replace($result);
|
2019-09-11 08:48:37 +02:00
|
|
|
|
|
|
|
return !empty($result) ? $result : json_encode($json);
|
|
|
|
}
|
|
|
|
|
2018-12-29 12:03:22 +01:00
|
|
|
/**
|
|
|
|
* Restituisce il nome della classe resposabile per la gestione di una determinata tipologia di tag di input.
|
|
|
|
*
|
|
|
|
* @param string $input
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public static function getHandlerName($input)
|
|
|
|
{
|
|
|
|
$result = empty(self::$handlers['list'][$input]) ? self::$handlers['list']['default'] : self::$handlers['list'][$input];
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Restituisce l'istanza della classe resposabile per la gestione di una determinata tipologia di tag di input.
|
|
|
|
*
|
|
|
|
* @param string $input
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public static function getHandler($input)
|
|
|
|
{
|
|
|
|
$class = self::getHandlerName($input);
|
|
|
|
if (empty(self::$handlers['instances'][$class])) {
|
|
|
|
self::$handlers['instances'][$class] = new $class();
|
|
|
|
}
|
|
|
|
|
|
|
|
return self::$handlers['instances'][$class];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Imposta una determinata classe come resposabile per la gestione di una determinata tipologia di tag di input.
|
|
|
|
*
|
|
|
|
* @param string $input
|
|
|
|
* @param string|mixed $class
|
|
|
|
*/
|
|
|
|
public static function setHandler($input, $class)
|
|
|
|
{
|
|
|
|
$original = $class;
|
|
|
|
|
|
|
|
$class = is_object($class) ? $class : new $class();
|
|
|
|
|
|
|
|
if ($class instanceof Handler\HandlerInterface) {
|
|
|
|
self::$handlers['list'][$input] = $original;
|
|
|
|
self::$handlers['instances'][$original] = $class;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Restituisce l'oggetto responsabile per la costruzione del codice HTML contenente gli input effettivi.
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public static function getWrapper()
|
|
|
|
{
|
|
|
|
if (empty(self::$wrapper['instance'])) {
|
|
|
|
$class = self::$wrapper['class'];
|
|
|
|
self::$wrapper['instance'] = new $class();
|
|
|
|
}
|
|
|
|
|
|
|
|
return self::$wrapper['instance'];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Imposta l'oggetto responsabile per la costruzione del codice HTML contenente gli input effettivi.
|
|
|
|
*
|
|
|
|
* @param string|mixed $class
|
|
|
|
*/
|
|
|
|
public static function setWrapper($class)
|
|
|
|
{
|
|
|
|
$original = $class;
|
|
|
|
|
|
|
|
$class = is_object($class) ? $class : new $class();
|
|
|
|
|
|
|
|
if ($class instanceof Wrapper\WrapperInterface) {
|
|
|
|
self::$wrapper['class'] = $original;
|
|
|
|
self::$wrapper['instance'] = $class;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Restituisce l'oggetto responsabile per la costruzione del codice HTML per il tag personalizzato.
|
|
|
|
*
|
|
|
|
* @param string $input
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public static function getManager($input)
|
|
|
|
{
|
|
|
|
$result = null;
|
|
|
|
|
|
|
|
$class = self::$managers['list'][$input];
|
|
|
|
if (!empty($class)) {
|
|
|
|
if (empty(self::$managers['instances'][$class])) {
|
|
|
|
self::$managers['instances'][$class] = new $class();
|
|
|
|
}
|
|
|
|
|
|
|
|
$result = self::$managers['instances'][$class];
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Imposta l'oggetto responsabile per la costruzione del codice HTML per il tag personalizzato.
|
|
|
|
*
|
|
|
|
* @param string $input
|
|
|
|
* @param string|mixed $class
|
|
|
|
*/
|
|
|
|
public static function setManager($input, $class)
|
|
|
|
{
|
|
|
|
$original = $class;
|
|
|
|
|
|
|
|
$class = is_object($class) ? $class : new $class();
|
|
|
|
|
2020-09-23 13:36:37 +02:00
|
|
|
if ($class instanceof Manager\ManagerInterface) {
|
2018-12-29 12:03:22 +01:00
|
|
|
self::$managers['list'][$input] = $original;
|
|
|
|
self::$managers['instances'][$original] = $class;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Imposta l'oggetto responsabile per la costruzione del codice HTML per il tag personalizzato.
|
|
|
|
*
|
2020-09-23 13:36:37 +02:00
|
|
|
* @param array $record
|
2018-12-29 12:03:22 +01:00
|
|
|
*/
|
|
|
|
public static function setRecord($record)
|
|
|
|
{
|
|
|
|
self::$record = $record;
|
|
|
|
}
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/**
|
|
|
|
* Genera il codice HTML per i singoli tag di input.
|
|
|
|
*
|
|
|
|
* @param string $json
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static function generate($json)
|
|
|
|
{
|
|
|
|
// Elaborazione del formato
|
2018-02-03 15:03:48 +01:00
|
|
|
$elaboration = self::elaborate($json);
|
|
|
|
$values = $elaboration[0];
|
|
|
|
$extras = $elaboration[1];
|
2017-08-04 16:28:16 +02:00
|
|
|
|
|
|
|
$result = null;
|
|
|
|
if (!empty($values)) {
|
|
|
|
// Generazione dell'elemento
|
|
|
|
$html = self::getHandler($values['type'])->handle($values, $extras);
|
|
|
|
|
|
|
|
// Generazione del parte iniziale del contenitore
|
|
|
|
$before = self::getWrapper()->before($values, $extras);
|
|
|
|
|
|
|
|
// Generazione del parte finale del contenitore
|
|
|
|
$after = self::getWrapper()->after($values, $extras);
|
|
|
|
|
|
|
|
$result = $before.$html.$after;
|
|
|
|
|
|
|
|
// Elaborazione del codice HTML
|
|
|
|
$result = self::process($result, $values, $extras);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/**
|
|
|
|
* Decodifica i tag personalizzati e li converte in un array basato sul formato JSON.
|
|
|
|
*
|
|
|
|
* @param string $string
|
|
|
|
* @param string $type
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static function decode($string, $type)
|
|
|
|
{
|
|
|
|
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
|
|
|
|
|
2018-01-12 16:23:26 +01:00
|
|
|
// Fix per contenuti con newline integrati
|
2017-09-11 18:12:41 +02:00
|
|
|
$string = str_replace(["\n", "\r"], ['\\n', '\\r'], $string);
|
|
|
|
|
2018-01-12 16:23:26 +01:00
|
|
|
$json = (array) json_decode($string, true);
|
2017-08-04 16:28:16 +02:00
|
|
|
|
|
|
|
return $json;
|
|
|
|
}
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/**
|
|
|
|
* Elabora l'array contenente le impostazioni del tag per renderlo fruibile alla conversione in HTML (per i tag di input).
|
|
|
|
*
|
|
|
|
* @param array $json
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static function elaborate($json)
|
|
|
|
{
|
|
|
|
$values = [];
|
|
|
|
$extras = [];
|
|
|
|
|
|
|
|
if (!empty($json)) {
|
2018-07-19 14:34:52 +02:00
|
|
|
// Conversione delle variabili con i campi di database ($record)
|
2017-08-04 16:28:16 +02:00
|
|
|
foreach ($json as $key => $value) {
|
|
|
|
if (empty($value) && !is_numeric($value)) {
|
|
|
|
unset($json[$key]);
|
|
|
|
}
|
|
|
|
// Sostituzione delle variabili $nome$ col relativo valore da database
|
2018-06-23 15:41:32 +02:00
|
|
|
elseif (is_string($json[$key]) && preg_match_all('/\$([a-z0-9\_]+)\$/i', $json[$key], $m)) {
|
2017-08-04 16:28:16 +02:00
|
|
|
for ($i = 0; $i < count($m[0]); ++$i) {
|
2018-07-18 14:50:46 +02:00
|
|
|
$record = isset(self::$record[$m[1][$i]]) ? self::$record[$m[1][$i]] : '';
|
2017-08-04 16:28:16 +02:00
|
|
|
$json[$key] = str_replace($m[0][$i], prepareToField($record), $json[$key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Valori speciali che richiedono solo la propria presenza
|
|
|
|
foreach (self::$specifics as $specific) {
|
|
|
|
if (isset($json[$specific])) {
|
|
|
|
if (!empty($json[$specific])) {
|
|
|
|
$extras[] = trim($specific);
|
|
|
|
}
|
|
|
|
unset($json[$specific]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Campo personalizzato "extra"
|
|
|
|
if (isset($json['extra'])) {
|
|
|
|
if (!empty($json['extra'])) {
|
|
|
|
$extras[] = trim($json['extra']);
|
|
|
|
}
|
|
|
|
unset($json['extra']);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Attributi normali
|
|
|
|
foreach ($json as $key => $value) {
|
2018-01-12 16:23:26 +01:00
|
|
|
$values[trim($key)] = is_string($value) ? trim($value) : $value;
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Valori particolari
|
|
|
|
$values['name'] = str_replace(' ', '_', $values['name']);
|
|
|
|
$values['id'] = empty($values['id']) ? $values['name'] : $values['id'];
|
|
|
|
$values['id'] = str_replace(['[', ']', ' '], ['', '', '_'], $values['id']);
|
|
|
|
$values['value'] = isset($values['value']) ? $values['value'] : '';
|
|
|
|
|
|
|
|
// Gestione delle classi CSS
|
|
|
|
$values['class'] = [];
|
|
|
|
$values['class'][] = 'form-control';
|
|
|
|
if (!empty($json['class'])) {
|
|
|
|
$classes = explode(' ', $json['class']);
|
|
|
|
foreach ($classes as $class) {
|
|
|
|
if (!empty($class)) {
|
|
|
|
$values['class'][] = trim($class);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Gestione grafica dell'attributo required
|
|
|
|
if (in_array('required', $extras)) {
|
|
|
|
if (!empty($values['label'])) {
|
|
|
|
$values['label'] .= '*';
|
|
|
|
} elseif (!empty($values['placeholder'])) {
|
|
|
|
$values['placeholder'] .= '*';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return [$values, $extras];
|
|
|
|
}
|
|
|
|
|
2017-08-31 11:32:49 +02:00
|
|
|
/**
|
|
|
|
* Sostituisce i placeholder delle impostazioni con i relativi valori (per i tag di input).
|
|
|
|
*
|
|
|
|
* @param string $result
|
|
|
|
* @param array $values
|
|
|
|
* @param array $extras
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
2017-08-04 16:28:16 +02:00
|
|
|
protected static function process($result, $values, $extras)
|
|
|
|
{
|
|
|
|
unset($values['label']);
|
|
|
|
|
|
|
|
$values['class'] = array_unique($values['class']);
|
|
|
|
|
2019-01-02 14:15:16 +01:00
|
|
|
$attributes = [];
|
2017-08-04 16:28:16 +02:00
|
|
|
foreach ($values as $key => $value) {
|
|
|
|
// Fix per la presenza di apici doppi
|
|
|
|
$value = prepareToField(is_array($value) ? implode(' ', $value) : $value);
|
2020-10-29 16:48:37 +01:00
|
|
|
if (string_contains($result, '|'.$key.'|')) {
|
2017-08-04 16:28:16 +02:00
|
|
|
$result = str_replace('|'.$key.'|', $value, $result);
|
|
|
|
} elseif (!empty($value) || is_numeric($value)) {
|
|
|
|
$attributes[] = $key.'="'.$value.'"';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$attributes = array_unique(array_merge($attributes, $extras));
|
|
|
|
|
|
|
|
$result = str_replace('|attr|', implode(' ', $attributes), $result);
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
}
|