За последние 24 часа нас посетил 22391 программист и 1185 роботов. Сейчас ищут 709 программистов ...

ошибка отображения названия виджета Wordpress заданного по умолчанию

Тема в разделе "PHP для новичков", создана пользователем jurvrn.ru, 5 июл 2020.

  1. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    В названии виджета при его вставке отображается ошибка "Notice: Undefined index: title in /home/*****/vkalendar_php.php on line 42".
    42 строка: $title = apply_filters('widget_title', $instance['title']);
    Хотя указано имя виджета по умолчанию как "Укажите заголовок виджета".
    Основной код для формирования виджета
    PHP:
    1. class my_widget_plugin_vk_php extends WP_Widget
    2. {
    3.     function __construct()
    4.     {
    5.         parent::__construct(
    6.             'my-widget-plugin-vk-php',
    7.             'Календарь по годам (виджет) на php',
    8.             array('description' => 'Выводит таблицу календаря на php (виджет)',)
    9.         );
    10.     }
    11.  
    12.     public function form($instance)
    13.     {
    14.         if (isset($instance['title'])) {
    15.             $title = $instance['title'];
    16.         } else {
    17.             $title = 'Укажите заголовок виджета';
    18.         }
    19.         ?>
    20.         <p>
    21.             <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
    22.             <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>"
    23.                    name="<?php echo $this->get_field_name('title'); ?>" type="text"
    24.                    value="<?php echo esc_attr($title); ?>"/>
    25.         </p>
    26.         <?php
    27.     }
    28.  
    29.     public function widget($args, $instance)
    30.     {
    31.         $title = apply_filters('widget_title', $instance['title']); //ЗДЕСЬ 42 СТРОКА С ОШИБКОЙ
    32.         echo $args['before_widget'];
    33.         if (!empty($title))
    34.             echo $args['before_title'] . $title . $args['after_title'];
    35.  
    36. echo <<<HTML
    37. ............
    38. HTML;
    39.       echo $args['after_widget'];
    40.     }
    41.  
    42.     public function update($new_instance, $old_instance)
    43.     {
    44.         $instance = array();
    45.         $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
    46.         return $instance;
    47.     }
    48. }
    49.  
    50. function my_widget_plugin_vk_load_php() {
    51.     register_widget('my_widget_plugin_vk_php');
    52. }
    53.  
    54. add_action('widgets_init', 'my_widget_plugin_vk_load_php');
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    проверь просто так виджет заработает, или дальше проблемы посыпятся
    PHP:
    1. public function widget($args, $instance)
    2.     {
    3.         //$title = apply_filters('widget_title', $instance['title']);
    4.    $title = ' ';
     
    jurvrn.ru и SweD нравится это.
  3. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @Artur_hopf, так ошибка пропала, но, как ещё вариант, хотелось бы чтобы текст, заданный по умолчанию попадал в заголовок
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    потому... в методе form проверяешь $instance['title'], а в методе widget нет.
    --- Добавлено ---
    и по логике методы должны принимать готовую логику с данными, а не гадать "а может этой переменной/ключа не существует?"
    --- Добавлено ---
    PHP:
    1. function my_widget_plugin_vk_load_php() {
    2.     register_widget('my_widget_plugin_vk_php');
    3. }
    4. add_action('widgets_init', 'my_widget_plugin_vk_load_php');
    но судя по тому, что данные выдает сам движок, то мнение тут одно - ***л этот WP
     
    jurvrn.ru нравится это.
  5. nikolaevevge

    nikolaevevge Новичок

    С нами с:
    5 июл 2020
    Сообщения:
    15
    Симпатии:
    2
    Так разумеется её не существует по какой то причине, раз PHP выдаёт Notice
    Чтобы ошибки не было можно например строчку вписать if (!isset($instance['title'])) {$instance['title'] = '';} разумеется это не решит вопроса почему у Вас не выводится заголовок, зато поможет избежать последующих появлений вывода Notice.
    Вписывать перед с строкой в которой появляется ошибка.
     
  6. nikolaevevge

    nikolaevevge Новичок

    С нами с:
    5 июл 2020
    Сообщения:
    15
    Симпатии:
    2
    MouseZver, Вы пишите "но судя по тому, что данные выдает сам движок, то мнение тут одно - ***л этот WP", я тоже считаю что не контролировать пусть даже не критичные ошибки не правильно. Эта некоторая мода которая пришла с появлением PHP 7 и которая частично ещё и стимулировалась такой CMS как Bitrix, где серверные настройки регламентированы, и установка таковых не должна приводить к появлению ошибок, что привело к тому, что разработчики модулей под эту CMS получили возможность не обращать внимания на те места где может появиться такая ошибка.
    Касаемо тенденции PHP на это, частично делаю такой вывод из того насколько изменилось мнение автора книги о PHP 5 и PHP 7 Дмитрия Котерова о Web разработке. То есть о тенденциях и идеологии Web-разработке в книге про PHP 5-ой версии он излагал совершенно иное мнение. Точно не скажу сейчас в каком месте, но в PHP 7 там где он про применение Composer пишет.
     
    jurvrn.ru нравится это.
  7. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    как я понял путем apply_filters должно было переменной просто присвоиться (отфильтроваться) текстовая переменная из массива $instance...

    если просто заменить
    PHP:
    1. $title = apply_filters('widget_title', $instance['title']);
    на
    PHP:
    1. if (isset($instance['title'])) {
    2.                     $title = $instance['title'];
    3.                 } else {
    4.                     $title = 'Укажите заголовок виджета';
    5.                 }
    то вроде как всё работает, но логика ведь нарушена, так как получается что мы заново просто присвоили $title текст...
    а он уже был один раз указан при активации виджета в эту переменную
    так можно было бы просто сократить код до
    PHP:
    1. $title = 'Укажите заголовок виджета';
    но это уже дубль
    --- Добавлено ---
    так в том то и дело что вроде как она существует .... ей уже один раз присвоили значение в public function form($instance)
    --- Добавлено ---
    это просто уберет заголовок у виджета - а мне нужно чтобы текст из админки попал в отображение на сайте
     
  8. nikolaevevge

    nikolaevevge Новичок

    С нами с:
    5 июл 2020
    Сообщения:
    15
    Симпатии:
    2
    Вы пишите: "это просто уберет заголовок у виджета - а мне нужно чтобы текст из админки попал в отображение на сайте", это не так. Условие такое, если ключа массива не существует то только в этом случаи он будет создан с присвоенным значением пустой строки, если же ключ существует и в нём есть что угодно отличное от NULL в этом случаи замены не будет. Поэтому такая строка только для предотвращения ошибки Notice и она не трогает Ваши данные если они там есть, при этом из появления указанной ошибки следует, что их как раз там почему то и нет.
    Вы пишите: "как я понял путем apply_filters должно было переменной просто присвоиться (отфильтроваться)" - из логики работы метода думаю что так и должно. И тут нужно разбираться почему $instance['title'] не существует.
    --- Добавлено ---
    Как вариант жёсткий при этом эффективный можете посмотреть как работает функция debug_backtrace посмотреть стек вызова, а затем вписыванием в код конструкций типа var_dump($instance["title"]); найти то место где теряется Ваш заголовок и уже затем по логике метода смотреть почему это происходит.
     
    jurvrn.ru нравится это.
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. function ( $instance['title'] ?? 'Укажите заголовок виджета' )
     
    jurvrn.ru нравится это.
  10. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2