From cbabe27966dbcbc87e80eaf73280b4e7d985c607 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sun, 4 Feb 2018 17:26:25 +0100 Subject: [PATCH] Aggiornamento dei pulsanti stampe Aggiornamento dei pulsanti stampe, ora gestiti attraverso HTMLBuilder e non con la classe principale per permettere il futuro ampliamento con le email. Fix sui numeri di pagina per le stampe con HTML2PDF. --- modules/contratti/edit.php | 16 +-- modules/ddt/edit.php | 17 +-- modules/fatture/edit.php | 6 +- modules/interventi/edit.php | 7 +- modules/ordini/edit.php | 9 +- modules/preventivi/edit.php | 19 ++- src/AJAX.php | 8 +- src/HTMLBuilder/HTMLBuilder.php | 1 + src/HTMLBuilder/Manager/ButtonManager.php | 133 ++++++++++++++++++ src/Prints.php | 60 +------- templates/info.php | 39 +++-- templates/interventi/init.php | 2 +- .../pdfgen.partitario_mastrino.php | 40 +++--- templates/pdfgen_variables.php | 5 +- 14 files changed, 215 insertions(+), 147 deletions(-) create mode 100644 src/HTMLBuilder/Manager/ButtonManager.php diff --git a/modules/contratti/edit.php b/modules/contratti/edit.php index ee29eaaf6..cfb33c9d2 100644 --- a/modules/contratti/edit.php +++ b/modules/contratti/edit.php @@ -27,10 +27,10 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica']; ".tr('Rinnova').'... '; } - - echo Prints::getDropdown($id_module, $id_record); - ?> + + {( "name": "button", "type": "print", "id_module": "", "id_record": "" )} +

@@ -51,8 +51,9 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
{[ "type": "select", "label": "", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE descrizione='Agente' AND deleted=0 ORDER BY ragione_sociale", "value": "$idagente$" ]}
@@ -117,8 +118,8 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
{[ "type": "number", "label": "", "name": "sconto_generico", "value": "$sconto_globale$", "help": "", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
@@ -282,7 +283,6 @@ if ($records[0]['stato'] != 'Pagato') {
@@ -386,7 +386,7 @@ if (!empty($fatture)) {

'.tr('_NUM_ altr_I_ document_I_ collegat_I_', [ '_NUM_' => count($fatture), - '_I_' => (count($fatture)>1) ? tr('i') : tr('o') + '_I_' => (count($fatture) > 1) ? tr('i') : tr('o'), ]).':

@@ -149,7 +147,6 @@ if ($records[0]['stato'] != 'Evaso') { @@ -158,18 +155,16 @@ if ($records[0]['stato'] != 'Evaso') { ... + + {( "name": "button", "type": "print", "id_module": "", "id_record": "" )}
@@ -206,9 +201,9 @@ if (!empty($fatture)) { echo '

'.tr('_NUM_ altr_I_ document_I_ collegat_I_', [ - '_NUM_' => count($fatture), - '_I_' => (count($fatture)>1) ? tr('i') : tr('o') - ]).':

+ '_NUM_' => count($fatture), + '_I_' => (count($fatture) > 1) ? tr('i') : tr('o'), + ]).':

'; $label = tr('Numero secondario'); } else { - $label = tr('Numero fattura'); + $label = tr('Numero fattura'); } ?>
@@ -302,7 +302,7 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') { Riga generica '; - + echo ' Descrizione @@ -339,7 +339,7 @@ if ($dir == 'entrata') { echo "
Prima di procedere alla stampa completa i seguenti campi dell'anagrafica:
".implode(', ', $campi_mancanti).'
'.Modules::link('Anagrafiche', $records[0]['idanagrafica'], tr('Vai alla scheda anagrafica'), null).'
'; } else { - echo Prints::getDropdown($id_module, $id_record); + echo '{( "name": "button", "type": "print", "id_module": "'.$id_module.'", "id_record": "'.$id_record.'" )}'; } } } diff --git a/modules/interventi/edit.php b/modules/interventi/edit.php index 961dc11c5..655fc49ad 100644 --- a/modules/interventi/edit.php +++ b/modules/interventi/edit.php @@ -34,9 +34,8 @@ if (empty($records[0]['firma_file'])) {
- + {( "name": "button", "type": "print", "id_module": "", "id_record": "" )} +
 
@@ -310,7 +309,7 @@ if (!empty($fatture)) {

@@ -137,7 +136,7 @@ if (!empty($elementi)) {

'.tr('_NUM_ altr_I_ document_I_ collegat_I_', [ '_NUM_' => count($elementi), - '_I_' => (count($elementi)>1) ? tr('i') : tr('o') + '_I_' => (count($elementi) > 1) ? tr('i') : tr('o'), ]).':

    '; diff --git a/modules/preventivi/edit.php b/modules/preventivi/edit.php index 6a077ad46..928dbb812 100644 --- a/modules/preventivi/edit.php +++ b/modules/preventivi/edit.php @@ -17,9 +17,9 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
    - + + {( "name": "button", "type": "print", "id_module": "", "id_record": "" )} +

    @@ -39,8 +39,9 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
    {[ "type": "select", "label": "", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE descrizione='Agente' AND deleted=0 ORDER BY ragione_sociale", "value": "$idagente$" ]}
    @@ -140,19 +141,17 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
    + ?> Riga Descrizione + } ?>
    - + {( "name": "button", "type": "print", "id_module": "", "id_record": "" )}

    @@ -180,7 +179,7 @@ if (!empty($fatture)) {

    '.tr('_NUM_ altr_I_ document_I_ collegat_I_', [ '_NUM_' => count($fatture), - '_I_' => (count($fatture)>1) ? tr('i') : tr('o') + '_I_' => (count($fatture) > 1) ? tr('i') : tr('o'), ]).':

      '; diff --git a/src/AJAX.php b/src/AJAX.php index e98ffb874..b57679bd5 100644 --- a/src/AJAX.php +++ b/src/AJAX.php @@ -84,7 +84,7 @@ class AJAX return $results; } - private static function getSelectResults($file, $resource, $elements = [], $search = null) + protected static function getSelectResults($file, $resource, $elements = [], $search = null) { $superselect = self::getSelectInfo(); @@ -110,7 +110,7 @@ class AJAX return $results; } - private static function getSelectInfo() + protected static function getSelectInfo() { return !empty($_SESSION['superselect']) ? $_SESSION['superselect'] : []; } @@ -149,7 +149,7 @@ class AJAX return $results; } - private static function getSearchResults($file, $term) + protected static function getSearchResults($file, $term) { // Database $database = Database::getConnection(); @@ -208,7 +208,7 @@ class AJAX return $result; } - private static function getCompleteResults($file, $resource) + protected static function getCompleteResults($file, $resource) { // Database $database = Database::getConnection(); diff --git a/src/HTMLBuilder/HTMLBuilder.php b/src/HTMLBuilder/HTMLBuilder.php index ab38884c6..dde31c3df 100644 --- a/src/HTMLBuilder/HTMLBuilder.php +++ b/src/HTMLBuilder/HTMLBuilder.php @@ -74,6 +74,7 @@ class HTMLBuilder protected static $managers = [ 'list' => [ 'filelist_and_upload' => 'HTMLBuilder\Manager\FileManager', + 'button' => 'HTMLBuilder\Manager\ButtonManager', 'csrf' => 'HTMLBuilder\Manager\CSRFManager', ], 'instances' => [], diff --git a/src/HTMLBuilder/Manager/ButtonManager.php b/src/HTMLBuilder/Manager/ButtonManager.php new file mode 100644 index 000000000..6febf7df5 --- /dev/null +++ b/src/HTMLBuilder/Manager/ButtonManager.php @@ -0,0 +1,133 @@ +link($options); + } else { + $result = $this->dropdown($options); + } + + return $result; + } + + protected function getInfo($options) + { + $result = []; + + if ($options['type'] == 'print') { + $print = \Prints::get($options['id']); + + $result = [ + 'link' => \Prints::getHref($options['id'], $options['id_record'], $options['parameters']), + 'title' => $print['title'], + 'icon' => $print['icon'], + ]; + } + + return $result; + } + + protected function link($options) + { + $info = $this->getInfo($options); + + $class = isset($options['class']) ? $options['class'] : 'btn-info'; + $class = !empty($class) ? ' class="btn '.$class.'" ' : ''; + + $title = isset($options['label']) ? $options['label'] : $info['title']; + + $icon = !empty($options['icon']) ? $options['icon'] : $info['icon']; + $icon = str_replace('|default|', $info['icon'], $icon); + + return ' + '.$title.''; + } + + protected function getList($options) + { + $results = []; + + if ($options['type'] == 'print') { + $results = \Prints::getModulePrints($options['id_module']); + } + + return $results; + } + + protected function dropdown($options) + { + $list = $this->getList($options); + + $options['class'] = isset($options['class']) ? $options['class'] : 'btn-info'; + + if (count($list) > 1) { + $result = ' +
      '; + + $main = array_search(1, array_column($list, 'main')); + if ($main !== false) { + $element = $list[$main]; + + $result .= $this->link([ + 'type' => $options['type'], + 'id' => $element['id'], + 'id_record' => $options['id_record'], + 'class' => $options['class'], + ]); + + unset($list[$main]); + } + + $result .= ' + + +
      '; + } else { + $result = $this->link([ + 'type' => $options['type'], + 'id' => $list[0]['id']['id'], + 'id_record' => $options['id_record'], + 'class' => $options['class'], + ]); + } + + return $result; + } + + protected function defaultText($options) + { + $result = ''; + + if ($options['type'] == 'print') { + $result = ' '.tr('Stampe'); + } + + return $result; + } +} diff --git a/src/Prints.php b/src/Prints.php index 4dc506611..83c9af344 100644 --- a/src/Prints.php +++ b/src/Prints.php @@ -384,64 +384,6 @@ class Prints public static function getLink($print, $id_record, $btn = null, $title = null, $icon = null, $get = '') { - $print = self::get($print); - - if (empty($print)) { - return false; - } - - $class = isset($btn) ? $btn : 'btn-info'; - $class = !empty($class) ? ' class="btn '.$class.'" ' : ''; - - $title = isset($title) ? $title : $print['title']; - - $icon = !empty($icon) ? $icon : $print['icon']; - $icon = str_replace('|default|', $print['icon'], $icon); - - return ' - '.$title.''; - } - - public static function getDropdown($module, $id_record, $class = 'btn-info') - { - $prints = self::getModulePrints($module); - - if (empty($prints) || empty($id_record)) { - return false; - } - - if (count($prints) > 1) { - $result = ' -
      '; - - $main = array_search(1, array_column($prints, 'main')); - if ($main !== false) { - $print = $prints[$main]; - - $result .= self::getLink($print['id'], $id_record, $class); - - unset($prints[$main]); - } - - $result .= ' - - -
      '; - } else { - $result = self::getLink($prints[0]['id'], $id_record, $class); - } - - return $result; + return '{( "name": "button", "type": "print", "id": "'.$print.'", "id_record": "'.$id_record.'", "label": "'.$title.'", "icon": "'.$icon.'", "parameters": "'.$get.'", "class": "'.$btn.'" )}'; } } diff --git a/templates/info.php b/templates/info.php index ef6df0011..c7fa55f1f 100644 --- a/templates/info.php +++ b/templates/info.php @@ -33,19 +33,7 @@ $keys = []; // Predisposizione delle informazioni delle anagrafiche per la sostituzione automatica foreach ($replace as $prefix => $values) { - // Individuazione dei campi minimi $values = (array) $values; - if ($prefix == 'c_') { - $keys = array_keys($values); - } - - // Se l'azienda predefinita non è impostata - if (empty($values) && $prefix == 'f_') { - $values = []; - foreach ($keys as $key) { - $values[$key] = ''; - } - } // Rinominazione dei campi foreach ($rename as $key => $value) { @@ -53,11 +41,6 @@ foreach ($replace as $prefix => $values) { unset($values[$key]); } - // Salvataggio dei campi come variabili PHP - foreach ($values as $key => $value) { - ${$prefix.$key} = $value; - } - // Eventuali estensioni dei contenuti $citta = ''; if (!empty($values['cap'])) { @@ -72,13 +55,25 @@ foreach ($replace as $prefix => $values) { $values['citta_full'] = $citta; - // Completamento dei campi minimi - if ($key == 'c_') { - $keys = array_unique(array_merge($keys, array_keys($values))); + $replace[$prefix] = $values; + + // Individuazione dei campi minimi + $keys = array_merge($keys, array_keys($values)); +} + +$keys = array_unique($keys); + +foreach ($replace as $prefix => $values) { + // Impostazione di default per le informazioni mancanti + foreach ($keys as $key) { + if (!isset($values[$key])) { + $values[$key] = ''; + } } - // Aggiunta delle informazioni per la sostituzione automatica + // Salvataggio dei campi come variabili PHP e aggiunta delle informazioni per la sostituzione automatica foreach ($values as $key => $value) { + ${$prefix.$key} = $value; $replaces[$prefix.$key] = $value; } } @@ -93,3 +88,5 @@ $replaces = array_merge($replaces, [ 'footer' => !empty($footer) ? $footer : '', 'dicitura_fissa_fattura' => get_var('Dicitura fissa fattura'), ]); + +unset($replace); diff --git a/templates/interventi/init.php b/templates/interventi/init.php index 115ea8f08..70b7f73bd 100644 --- a/templates/interventi/init.php +++ b/templates/interventi/init.php @@ -7,7 +7,7 @@ include_once $docroot.'/modules/interventi/modutil.php'; $module_name = 'Interventi'; // carica intervento -$query = 'SELECT in_interventi.*, (SELECT numero FROM co_contratti WHERE id=(SELECT idcontratto FROM co_righe_contratti WHERE idintervento=in_interventi.id)) AS numero_contratto, (SELECT numero FROM co_preventivi WHERE id=(SELECT idpreventivo FROM co_preventivi_interventi WHERE idintervento=in_interventi.id ORDER BY idpreventivo DESC LIMIT 0,1)) AS numero_preventivo, (SELECT SUM(prezzo_dirittochiamata) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_dirittochiamata`, (SELECT SUM(km) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_km`, (SELECT SUM(ore*prezzo_ore_unitario) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_ore_consuntivo`, (SELECT SUM(prezzo_km_consuntivo) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_km_consuntivo`, in_interventi.descrizione AS `descrizione_intervento`, richiesta, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS tipointervento FROM in_interventi INNER JOIN in_tipiintervento ON in_interventi.idtipointervento=in_tipiintervento.idtipointervento WHERE id='.prepare($idintervento).' '.Modules::getAdditionalsQuery('Interventi'); +$query = 'SELECT in_interventi.*, (SELECT numero FROM co_contratti WHERE id=(SELECT idcontratto FROM co_righe_contratti WHERE idintervento=in_interventi.id)) AS numero_contratto, (SELECT numero FROM co_preventivi WHERE id=(SELECT idpreventivo FROM co_preventivi_interventi WHERE idintervento=in_interventi.id ORDER BY idpreventivo DESC LIMIT 0,1)) AS numero_preventivo, (SELECT SUM(prezzo_dirittochiamata) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_dirittochiamata`, (SELECT SUM(km) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_km`, (SELECT SUM(ore*prezzo_ore_unitario) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_ore_consuntivo`, (SELECT SUM(prezzo_km_consuntivo) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_km_consuntivo`, in_interventi.descrizione AS `descrizione_intervento`, richiesta, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS tipointervento FROM in_interventi INNER JOIN in_tipiintervento ON in_interventi.idtipointervento=in_tipiintervento.idtipointervento WHERE id='.prepare($id_record).' '.Modules::getAdditionalsQuery('Interventi'); $records = $dbo->fetchArray($query); $costi_intervento = get_costi_intervento($id_record); diff --git a/templates/partitario_mastrino/pdfgen.partitario_mastrino.php b/templates/partitario_mastrino/pdfgen.partitario_mastrino.php index d38a2f96d..8c777110b 100644 --- a/templates/partitario_mastrino/pdfgen.partitario_mastrino.php +++ b/templates/partitario_mastrino/pdfgen.partitario_mastrino.php @@ -51,11 +51,11 @@ if ($_GET['lev'] == '3') { \n"; - // Inizializzo saldo finale - $saldo_finale = 0; + // Inizializzo saldo finale + $saldo_finale = 0; - // Calcolo saldo iniziale - $rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$idconto.'" AND data < "'.$_SESSION['period_start'].'"'); + // Calcolo saldo iniziale + $rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$idconto.'" AND data < "'.$_SESSION['period_start'].'"'); $saldo_iniziale = $rs[0]['totale']; $saldo_finale = $saldo_iniziale; @@ -93,8 +93,8 @@ if ($_GET['lev'] == '3') { $avere = ''; } - // Mostro il saldo finale - $body .= " SALDO FINALE".Translator::numberToLocale(abs($dare))."".Translator::numberToLocale(abs($avere))."\n"; + // Mostro il saldo finale + $body .= " SALDO FINALE".Translator::numberToLocale(abs($dare))."".Translator::numberToLocale(abs($avere))."\n"; $body .= " \n"; @@ -106,15 +106,15 @@ elseif ($_GET['lev'] == '2') { \n"; - // Ciclo fra i sotto-conti di livello 2 - $rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$idconto.'"'); + // Ciclo fra i sotto-conti di livello 2 + $rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$idconto.'"'); for ($z = 0; $z < sizeof($rs3); ++$z) { // Inizializzo saldo finale - $saldo_finale = 0; + $saldo_finale = 0; - // Calcolo saldo iniziale - $rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data < "'.$_SESSION['period_start'].'"'); + // Calcolo saldo iniziale + $rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data < "'.$_SESSION['period_start'].'"'); $saldo_iniziale = $rs[0]['totale']; $saldo_finale = $saldo_iniziale; @@ -146,8 +146,8 @@ elseif ($_GET['lev'] == '2') { $avere = Translator::numberToLocale(abs($totale)); } - // Mostro il saldo finale del conto di livello 3 - $body .= " ".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."".$dare."".$avere."\n"; + // Mostro il saldo finale del conto di livello 3 + $body .= " ".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."".$dare."".$avere."\n"; } $body .= " @@ -165,18 +165,18 @@ elseif ($_GET['lev'] == '1') { \n"; - // Ciclo fra il conto principale scelto (Economico o Patrimoniale) - $rs1 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti1 WHERE id="'.$idconto.'" ORDER BY numero DESC'); + // Ciclo fra il conto principale scelto (Economico o Patrimoniale) + $rs1 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti1 WHERE id="'.$idconto.'" ORDER BY numero DESC'); for ($x = 0; $x < sizeof($rs1); ++$x) { // Ciclo fra i sotto-conti di livello 1 - $rs2 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti2 WHERE idpianodeiconti1="'.$rs1[$x]['id'].'"'); + $rs2 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti2 WHERE idpianodeiconti1="'.$rs1[$x]['id'].'"'); for ($y = 0; $y < sizeof($rs2); ++$y) { $body .= " ".$rs2[$y]['numero'].' '.$rs2[$y]['descrizione']."\n"; - // Ciclo fra i sotto-conti di livello 2 - $rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$rs2[$y]['id'].'"'); + // Ciclo fra i sotto-conti di livello 2 + $rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$rs2[$y]['id'].'"'); for ($z = 0; $z < sizeof($rs3); ++$z) { $dare = 0; @@ -206,8 +206,8 @@ elseif ($_GET['lev'] == '1') { $ricavi += abs($avere); } - // Mostro il saldo finale del conto di livello 3 - $body .= " ".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."".Translator::numberToLocale(abs($dare))."".Translator::numberToLocale(abs($avere))."\n"; + // Mostro il saldo finale del conto di livello 3 + $body .= " ".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."".Translator::numberToLocale(abs($dare))."".Translator::numberToLocale(abs($avere))."\n"; } } } diff --git a/templates/pdfgen_variables.php b/templates/pdfgen_variables.php index e0780c61a..8f16613dd 100644 --- a/templates/pdfgen_variables.php +++ b/templates/pdfgen_variables.php @@ -3,7 +3,10 @@ include_once __DIR__.'/info.php'; // Retrocompatibilità con le stampe gestite da HTML2PDF -$replaces['pagination'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['pagination']); +$replaces['default_header'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['default_header']); + +$replaces['footer'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['footer']); +$replaces['default_footer'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['default_footer']); $prefixes = [ 'c_',