Primire de avertismente neașteptate din codul opțiunilor de temă
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.
