Risoluzione di avvisi inaspettati nel codice delle opzioni del tema

4 ago 2019, 11:21:20
Visualizzazioni: 53
Voti: 0

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.

Makiomar
Makiomar
151
Commenti

Non sono sicuro che questo aiuti, ma il tuo costruttore figlio manca del parametro $value - function __construct( $field = array(), $parent = NULL ) - dovrebbe essere function __construct( $field = array(), $value ='', $parent = NULL ) ? E hai provato var_dump( $field ); per vedere se contiene le chiavi/valori corretti?

Sally CJ Sally CJ
5 ago 2019 10:20:04

Grazie, ma no, l'oggetto viene istanziato senza il parametro value new $field_class($field, $this)

Makiomar Makiomar
5 ago 2019 10:23:39

Ma posso vedere $render = new $field_class($field, $value, $this); nel codice e anche nel testo della tua domanda... E qual è l'output del var_dump()?

Sally CJ Sally CJ
5 ago 2019 10:29:05

Penso che ti stia sfuggendo qualcosa... se hai controllato gli snippet nel codice che non funziona vedrai che tutto è corretto... stai guardando gli snippet funzionanti

Makiomar Makiomar
5 ago 2019 10:33:38

Ok, forse è così... ma che ne dici di provare semplicemente ad aggiungere quel parametro $value e istanziare la classe con tre parametri? E non hai ancora risposto alla mia domanda sulla cosa del var_dump. Provalo e analizza l'output.

Sally CJ Sally CJ
5 ago 2019 10:43:34