Risoluzione di avvisi inaspettati nel codice delle opzioni del tema
In realtà ho costruito la mia classe per registrare le opzioni del tema, e funziona bene, ma una volta che ho iniziato a fare alcune modifiche sono comparsi degli avvisi e non riesco a capire cosa ho sbagliato.
Spiegherò il codice vecchio e nuovo per aiutarti a comprendere il problema.
Funzionante
Il seguente costruttore accetta tre array che rappresentano voci di menu, impostazioni (sezioni/campi) e widget.
public function __construct($menu = array(), $sections = array(), $widgets = array())
All'interno del costruttore ho iniziato a impostare le proprietà e a chiamare gli hook necessari per la pagina delle impostazioni, che dovrebbero registrare le impostazioni e i campi utilizzando le callback corrispondenti. Ogni campo dovrebbe essere renderizzato dinamicamente in base al suo nome della classe, qualcosa come $render = new $field_class($field, $value, $this);
(Ogni campo ha la sua classe che estende la classe delle impostazioni del tema. Te lo mostrerò più avanti).
Il metodo di renderizzazione del campo
/**
* Funzione di callback per i campi della sezione della classe
*/
public function field_input($field){
if(isset($field['callback']) && function_exists($field['callback'])){
}
if(isset($field['type'])){
$field_class = 'ANONY_optf__'.ucfirst($field['type']);
if(class_exists($field_class)){
$fieldID = $field['id'];
$fieldDefault = isset($field['default']) ? $field['default'] : '';
$value = (isset($this->options->$fieldID))? $this->options->$fieldID : $fieldDefault;
$render = new $field_class($field, $value, $this);
$render->render();
}
}
}
Ogni classe di campo accetta tre argomenti, $field
che contiene i dati del campo (es. id, label, tipo), $value
dell'opzione corrispondente all'id del campo e un oggetto della classe genitore $this
.
Poi nella classe specifica del campo, il seguente codice. (Il problema è all'interno del costruttore quindi ho scritto solo quello)
class ANONY_optf__Switch extends ANONY__Theme_Settings{
function __construct( $field = array(), $value ='', $parent = NULL ){
if( is_object($parent) ) parent::__construct($parent->sections, $parent->args);
$this->field = $field;
$this->value = $value;
}
}
Come puoi vedere il campo switch estende la classe delle impostazioni del tema.
Non funzionante
Fino a qui tutto bene, ma una volta che ho iniziato a spostare alcune righe dalla classe genitore (metodo di renderizzazione del campo) al costruttore specifico del campo, sono comparsi degli avvisi.
Quindi la funzione render è diventata così
public function field_input($field){
if(isset($field['callback']) && function_exists($field['callback'])){
}
//Array di input che hanno lo stesso markup HTML
$mixed_types = ['text','number','email', 'password','url'];
if(isset($field['type'])){
$field_class = 'ANONY_optf__'.ucfirst($field['type']);
//Nome della classe statica per input che hanno lo stesso markup HTML
if(in_array($field['type'], $mixed_types)) $field_class = 'ANONY_optf__Mixed';
if(class_exists($field_class)){
$field = new $field_class($field, $this);
$field->render();
}
}
}
E il costruttore specifico del campo:
function __construct( $field = array(), $parent = NULL ){
if( is_object($parent) ) parent::__construct($parent->sections, $parent->args, $parent->widgets);
$this->field = $field;
$fieldID = $this->field['id'];
$fieldDefault = isset($this->field['default']) ? $this->field['default'] : '';
$this->value = (isset($parent->options->$fieldID))? $parent->options->$fieldID : $fieldDefault;
}
Dopo questo ottengo:
Warning: Illegal string offset 'id'.
Notice: Uninitialized string offset: 0.
mentre ho solo spostato il codice dal genitore al figlio.
Non so se sono riuscito a spiegare cosa è successo, così che tu possa capire il problema. Ma spero che tu possa aiutarmi, e sono pronto a spiegare meglio se necessario. Grazie in anticipo.
Nota
Gli avvisi vengono visualizzati ma tutto viene comunque renderizzato correttamente. Il che potrebbe significare che qualcosa viene chiamato due volte ma la prima volta non riesce a trovare i valori.
