Получение неожиданных предупреждений в коде настроек темы

4 авг. 2019 г., 11:21:20
Просмотры: 53
Голосов: 0

Я создал собственный класс для регистрации настроек темы, и он работал нормально, но после внесения некоторых изменений начали появляться предупреждения, и я не могу понять, в чем ошибка.

Я объясню старый и новый код, чтобы помочь вам понять проблему.

Рабочая версия

Следующий конструктор принимает три массива, представляющие элементы меню, настройки (секции/поля) и виджеты.

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

В конструкторе я устанавливаю свойства и вызываю необходимые хуки для страницы настроек, которые должны регистрировать настройки и поля с помощью соответствующих callback-функций. Каждое поле должно отображаться динамически в соответствии с именем его класса, например $render = new $field_class($field, $value, $this); (Каждое поле имеет свой собственный класс, который расширяет класс настроек темы. Позже я покажу это).

Метод рендеринга поля

/**
 * class section fields callback function
 */
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();
        }
    }
}

Каждый класс поля принимает три аргумента: $field, содержащий данные поля (например, id, label, type), $value - значение опции, соответствующее id поля, и объект родительского класса $this.

Затем в классе конкретного поля следующий код. (Проблема в конструкторе, поэтому я привел только его)

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

Как видите, класс поля Switch расширяет класс настроек темы.

Проблемная версия

До этого момента все работало нормально, но как только я начал перемещать некоторые строки из родительского класса (метод рендеринга поля) в конструктор конкретного поля, начали появляться предупреждения.

Теперь функция рендеринга выглядит так:

public function field_input($field){

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

    }
    //Массив полей ввода с одинаковой HTML-разметкой
    $mixed_types = ['text','number','email', 'password','url'];

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

        //Статическое имя класса для полей с одинаковой 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();
        }
    }
}

И конструктор конкретного поля:

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

После этих изменений я получаю:

Warning: Illegal string offset 'id'.

Notice: Uninitialized string offset: 0.

Хотя я просто переместил код из родительского класса в дочерний.

Не знаю, смог ли я достаточно понятно объяснить проблему, но надеюсь на вашу помощь. Готов объяснить дополнительно, если нужно. Заранее спасибо.

Примечание

Предупреждения появляются, но при этом все отображается корректно. Это может означать, что что-то вызывается дважды, но в первый раз не может найти значения.

Комментарии

Не уверен, поможет ли это, но в вашем дочернем конструкторе отсутствует параметр $value - function __construct( $field = array(), $parent = NULL ) - должно быть function __construct( $field = array(), $value ='', $parent = NULL )? И вы пробовали var_dump( $field ); чтобы убедиться, что он содержит правильные ключи/значения?

Sally CJ Sally CJ
5 авг. 2019 г. 10:20:04

Спасибо, но нет, объект создаётся без параметра value new $field_class($field, $this)

Makiomar Makiomar
5 авг. 2019 г. 10:23:39

Но я вижу $render = new $field_class($field, $value, $this); в коде и в тексте вашего вопроса тоже... И каков результат выполнения var_dump()?

Sally CJ Sally CJ
5 авг. 2019 г. 10:29:05

Думаю, ты что-то упускаешь... если проверить сниппеты в неработающем коде, то увидишь, что там всё правильно.. ты смотришь на рабочие сниппеты

Makiomar Makiomar
5 авг. 2019 г. 10:33:38

Ладно, возможно ты прав... но как насчёт того, чтобы просто попробовать добавить параметр $value и создать экземпляр класса с тремя параметрами? И ты так и не ответил на мой вопрос про var_dump. Попробуй и посмотри на вывод.

Sally CJ Sally CJ
5 авг. 2019 г. 10:43:34