Fix: Funzione i40_setting() Mancante
Fix: Funzione i40_setting() Mancante
Data: 20 Ottobre 2025
Problema: Call to undefined function i40_setting()
Status: ✅ Risolto
---
Problema
L'ArchiveController (riga 97) e la view archive/index.blade.php (riga 236) utilizzano la funzione helper i40_setting() che non esisteva.
``php
// ArchiveController.php:97
$days = $request->input('days', i40_setting('archive_retention_days', 90));
// archive/index.blade.php:236
<input type="number" name="days" value="{{ i40_setting('archive_retention_days', 90) }}">
`
---
Soluzione
1. Aggiunta Helper Function
File: app/helpers.php
`php
if (!function_exists('i40_setting')) {
/
* Get I40 setting value with optional default
*
* @param string $key Setting key (e.g., 'archive_retention_days')
* @param mixed $default Default value if setting not found
* @return mixed
*/
function i40_setting(string $key, $default = null)
{
try {
$setting = \App\Models\I40\I40Setting::where('setting_key', $key)->first();
if (!$setting) {
return $default;
}
// Return il valore casted al tipo corretto
$value = $setting->setting_value;
// Auto-cast basato sul default (se fornito)
if ($default !== null) {
if (is_bool($default)) {
return filter_var($value, FILTER_VALIDATE_BOOLEAN);
} elseif (is_int($default)) {
return (int) $value;
} elseif (is_float($default)) {
return (float) $value;
}
}
return $value;
} catch (\Exception $e) {
\Log::warning("Errore lettura i40_setting: {$key}", [
'error' => $e->getMessage()
]);
return $default;
}
}
}
`
2. Verifica Helper Caricato
L'helper è già registrato in AppServiceProvider::register():
`php
public function register(): void
{
// Carica helpers globali
require_once app_path('helpers.php');
}
`
3. Popolamento Database
Assicurati che lo script SQL sia stato eseguito:
`bash
mysql -u uv4xcitr_joom404 -p capera_sartupDB < database/sql/insert_i40_settings_archive.sql
`
Oppure tramite PHPMyAdmin, esegui:
`sql
INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value) VALUES
('archive_enabled', 'true', 'cleanup', 'Abilita archiviazione automatica CSV elaborati', 'true'),
('archive_failed_separately', 'true', 'cleanup', 'Archivia CSV failed in folder separato', 'true'),
('archive_retention_days', '90', 'cleanup', 'Giorni di retention archivio (0 = infinito)', '90'),
('archive_delete_after_days', '0', 'cleanup', 'Giorni dopo i quali eliminare definitivamente (0 = mai)', '0')
ON DUPLICATE KEY UPDATE
setting_value = VALUES(setting_value),
description = VALUES(description);
`
---
Funzionalità Helper
Uso Base
`php
// Con default
$days = i40_setting('archive_retention_days', 90); // Ritorna 90 se non trovato
// Senza default
$days = i40_setting('archive_retention_days'); // Ritorna null se non trovato
`
Auto-Cast Intelligente
L'helper auto-casta il valore in base al tipo del default:
`php
// Boolean
$enabled = i40_setting('archive_enabled', true); // Ritorna boolean
// Integer $days = i40_setting('archive_retention_days', 90); // Ritorna int
// Float $threshold = i40_setting('some_float_value', 1.5); // Ritorna float
// String (nessun cast)
$path = i40_setting('archive_path', '/default/path'); // Ritorna string
`
Gestione Errori
- Se il setting non esiste nel DB, ritorna il $default
- Se c'è un'eccezione durante la lettura, logga un warning e ritorna il $default
- Non solleva mai eccezioni (graceful degradation)
- I40Setting::get()
usa cache (3600s) - i40_setting()
query diretta (nessuna cache) - La funzione è ora disponibile globalmente in tutta l'applicazione
- Può essere usata nei Controller, Blade views, Service classes, ovunque
- È safe: non solleva mai eccezioni, ritorna sempre un valore
- ✅ app/helpers.php
(aggiunta funzione) - ℹ️ app/Providers/AppServiceProvider.php
(già caricava helpers) - ℹ️ database/sql/insert_i40_settings_archive.sql` (già esistente)
---
Alternative: Model Method
Se preferisci usare il Model direttamente (con cache):
`php
use App\Models\I40\I40Setting;
$days = I40Setting::get('archive_retention_days', 90);
`
Differenza:
---
Testing
Test 1: Verifica Helper Caricato
`php
php artisan tinker
>>> i40_setting('archive_retention_days', 90)
=> 90
`
Test 2: Verifica Setting nel DB
`sql
SELECT * FROM i40_settings WHERE setting_key = 'archive_retention_days';
`
Output atteso:
`
setting_key | setting_value | setting_type | default_value
-----------------------|---------------|--------------|---------------
archive_retention_days | 90 | cleanup | 90
`
Test 3: Test Funzionale (Archive View)
1. Vai su /admin/i40/archive
2. Seleziona una macchina
3. Click "Cleanup"
4. Il modal dovrebbe mostrare "90" nel campo giorni
5. ✅ Nessun errore i40_setting() undefined
---
Note
---
Files Modificati
Analisi Codice
Blocco 1 php
// ArchiveController.php:97
$days = $request->input('days', i40_setting('archive_retention_days', 90));
// archive/index.blade.php:236
<input type="number" name="days" value="{{ i40_setting('archive_retention_days', 90) }}">
Blocco 2 php
if (!function_exists('i40_setting')) {
/**
* Get I40 setting value with optional default
*
* @param string $key Setting key (e.g., 'archive_retention_days')
* @param mixed $default Default value if setting not found
* @return mixed
*/
function i40_setting(string $key, $default = null)
{
try {
$setting = \App\Models\I40\I40Setting::where('setting_key', $key)->first();
if (!$setting) {
return $default;
}
// Return il valore casted al tipo corretto
$value = $setting->setting_value;
// Auto-cast basato sul default (se fornito)
if ($default !== null) {
if (is_bool($default)) {
return filter_var($value, FILTER_VALIDATE_BOOLEAN);
} elseif (is_int($default)) {
return (int) $value;
} elseif (is_float($default)) {
return (float) $value;
}
}
return $value;
} catch (\Exception $e) {
\Log::warning("Errore lettura i40_setting: {$key}", [
'error' => $e->getMessage()
]);
return $default;
}
}
}
Blocco 3 php
public function register(): void
{
// Carica helpers globali
require_once app_path('helpers.php');
}
Blocco 4 bash
mysql -u uv4xcitr_joom404 -p capera_sartupDB < database/sql/insert_i40_settings_archive.sql
Blocco 5 sql
INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value) VALUES
('archive_enabled', 'true', 'cleanup', 'Abilita archiviazione automatica CSV elaborati', 'true'),
('archive_failed_separately', 'true', 'cleanup', 'Archivia CSV failed in folder separato', 'true'),
('archive_retention_days', '90', 'cleanup', 'Giorni di retention archivio (0 = infinito)', '90'),
('archive_delete_after_days', '0', 'cleanup', 'Giorni dopo i quali eliminare definitivamente (0 = mai)', '0')
ON DUPLICATE KEY UPDATE
setting_value = VALUES(setting_value),
description = VALUES(description);
Blocco 6 php
// Con default
$days = i40_setting('archive_retention_days', 90); // Ritorna 90 se non trovato
// Senza default
$days = i40_setting('archive_retention_days'); // Ritorna null se non trovato
Blocco 7 php
// Boolean
$enabled = i40_setting('archive_enabled', true); // Ritorna boolean
// Integer
$days = i40_setting('archive_retention_days', 90); // Ritorna int
// Float
$threshold = i40_setting('some_float_value', 1.5); // Ritorna float
// String (nessun cast)
$path = i40_setting('archive_path', '/default/path'); // Ritorna string
Blocco 8 php
use App\Models\I40\I40Setting;
$days = I40Setting::get('archive_retention_days', 90);
Blocco 9 php
php artisan tinker
>>> i40_setting('archive_retention_days', 90)
=> 90
Blocco 10 sql
SELECT * FROM i40_settings WHERE setting_key = 'archive_retention_days';
Blocco 11
setting_key | setting_value | setting_type | default_value
-----------------------|---------------|--------------|---------------
archive_retention_days | 90 | cleanup | 90