Primire de avertismente neașteptate din codul opțiunilor de temă

4 aug. 2019, 11:21:20
Vizualizări: 53
Voturi: 0

De fapt, am construit propria clasă pentru înregistrarea opțiunilor de temă, care funcționează corect, dar odată ce am început să fac unele ajustări, au apărut avertismente și nu reușesc să identific problema.

Voi explica codul vechi și cel nou pentru a ajuta la înțelegerea problemei.

Funcțional

Următorul constructor acceptă trei array-uri care reprezintă elementele de meniu, setări (secțiuni/câmpuri) și widget-uri.

public function __construct($menu = array(), $sections = array(), $widgets = array())

În interiorul constructorului am început să setez proprietăți și să apelez hook-urile necesare pentru pagina de setări, care ar trebui să înregistreze setările și câmpurile folosind funcțiile de callback corespunzătoare. Fiecare câmp ar trebui să fie randat dinamic în funcție de numele clasei sale, ceva de genul $render = new $field_class($field, $value, $this); (Fiecare câmp are propria clasă care extinde clasa de setări a temei. Voi arăta mai târziu).

Metoda de randare a câmpului

 /**
  * Funcția de callback pentru câmpurile secțiunii
  */
    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();
            }
        }
    }

Fiecare clasă de câmp acceptă trei argumente: $field care conține datele câmpului (ex. id, label, tip), $value al opțiunii corespunzătoare ID-ului câmpului și un obiect al clasei părinte $this.

Apoi, în clasa specifică câmpului, următorul cod. (Problema este în constructor, așa că l-am scris doar pe acesta)

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;  
}
}

După cum puteți vedea, câmpul switch extinde clasa de setări a temei.

Nefuncțional

Până aici totul este în regulă, dar odată ce am început să mut unele linii din clasa părinte (metoda de randare a câmpului) în constructorul specific câmpului, au apărut avertismente.

Așa că funcția de randare a devenit astfel:

public function field_input($field){

        if(isset($field['callback']) && function_exists($field['callback'])){

        }
        //Array de input-uri care au același markup HTML
        $mixed_types = ['text','number','email', 'password','url'];

        if(isset($field['type'])){
            $field_class = 'ANONY_optf__'.ucfirst($field['type']);

            //Numele clasei statice pentru input-uri care au același 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();
            }
        }
    }

Și constructorul specific câmpului:

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;
}

După aceasta primesc:

Warning: Illegal string offset 'id'.

Notice: Uninitialized string offset: 0.

în timp ce doar am mutat codul de la părinte la copil.

Nu știu dacă am reușit să explic ce s-a întâmplat pentru a înțelege problema. Dar sper că puteți ajuta și sunt gata să explic mai multe dacă este necesar. Mulțumesc anticipat.

Notă

Avertismentele apar, dar totul este randat corect. Ceea ce poate însemna că ceva este apelat de două ori, dar prima dată nu a putut găsi valori.

Makiomar
Makiomar
151
Comentarii

Nu sunt sigur dacă asta te ajută, dar constructorul copilului tău nu are parametrul $value - function __construct( $field = array(), $parent = NULL ) - ar trebui să fie function __construct( $field = array(), $value ='', $parent = NULL )? Și ai încercat var_dump( $field ); pentru a vedea dacă conține chei/valori corecte?

Sally CJ Sally CJ
5 aug. 2019 10:20:04

Mulțumesc, dar nu, obiectul este instanțiat fără parametrul value new $field_class($field, $this)

Makiomar Makiomar
5 aug. 2019 10:23:39

Dar eu pot vedea $render = new $field_class($field, $value, $this); în cod și în textul întrebării tale de asemenea... Și care este rezultatul var_dump()-ului?

Sally CJ Sally CJ
5 aug. 2019 10:29:05

Cred că îți lipsește ceva... dacă ai verificat fragmentele din codul care nu funcționează, vei vedea că totul este în regulă... tu te uiți la fragmentele care funcționează

Makiomar Makiomar
5 aug. 2019 10:33:38

Ok, poate am greșit... dar ce zici să încerci să adaugi acel parametru $value și să instantiezi clasa cu trei parametri? Și încă nu mi-ai răspuns la întrebarea despre var_dump. Încearcă și verifică rezultatul.

Sally CJ Sally CJ
5 aug. 2019 10:43:34