Автор Тема: Поиск ошибки в шаблоне.  (Прочитано 1046 раз)

11 Октябрь 2016, 16:25:17
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
Добро всем.

Prestashop 1.6.1.6

На повестке вопрос по кривому шаблону.

В логи сыпет:
PHP message: PHP Notice:  Undefined index: legend in ./prestashop/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 80
PHP message: PHP Notice:  Undefined index: legend in ./prestashop/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 70
......

10-12 килобайт за загрузку главной.

Причина в модуле Baked Category Products. После его отключения ошибок нет.
Ясно, что сообщения "Notice" влияния на работу сайта не оказывают, но ситуация не устраивает. Во первых, лог чаще ротируется и важные сообщения искать труднее, а во вторых при таком положении дел я испытываю дискомфорт. Непорядок, есть непорядок.

В связи с этим,  просьба - ткните, где ошибка в шаблоне? Сам не вижу.  Шаблон в модуле единственный.

Файл прилагаю.

 
11 Октябрь 2016, 16:32:55
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Кеширование отключите, нужно название файла, чтобы не искать по всем. Или поиск по сожержимому файлов используйте "legend". Найдите где используется и определите переменную перед применением.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
11 Октябрь 2016, 16:47:10
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Цитировать
Причина в модуле Baked Category Products. После его отключения ошибок нет.
В php файле модуля находишь $legend и инициализируешь.
11 Октябрь 2016, 19:20:17
Ответ #3
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
coder
В файлах модуля её нет.  Видимо, эту переменную следует объявить глобально. В каком классе и как это сделать?
Поиск по корню даёт длинный список файлов с  использованием этой переменной. 
Из классов :


Здесь строки   закомментированы:
./classes/webservice/WebserviceSpecificManagementImages.php:217:         *      GET    (xml) (legend, declinations, xlink to images/product/[1,+]/bin)
./classes/webservice/WebserviceSpecificManagementImages.php:223:         *      POST   (xml) (legend)
./classes/webservice/WebserviceSpecificManagementImages.php:224:         *      PUT    (xml) (legend)
./classes/webservice/WebserviceSpecificManagementImages.php:249:         *      GET    (xml) (legend, declinations, xlink to images/product/[1,+]/bin)
./classes/webservice/WebserviceSpecificManagementImages.php:255:         *      POST   (xml) (legend)
./classes/webservice/WebserviceSpecificManagementImages.php:256:         *      PUT    (xml) (legend)

--------------------------------------------------------------------------------------------------------------------------------------------

./classes/module/ModuleGraph.php:34:    /** @var array of strings graph legends (X axis) */
./classes/module/ModuleGraph.php:35:    protected $_legend = array();
./classes/module/ModuleGraph.php:55:    protected function setDateGraph($layers, $legend = false)
./classes/module/ModuleGraph.php:63:            if ($legend) {
./classes/module/ModuleGraph.php:72:                    $this->_legend[$i] = ($i % 2) ? '' : sprintf('%02dh', $i);
./classes/module/ModuleGraph.php:82:            if ($legend) {
./classes/module/ModuleGraph.php:105:                    $this->_legend[$i] = ($i % 2) ? '' : sprintf('%02d', $i);
./classes/module/ModuleGraph.php:114:            if ($legend) {
./classes/module/ModuleGraph.php:136:                    $this->_legend[$i] = sprintf('%02d', $i);
./classes/module/ModuleGraph.php:145:            if ($legend) {
./classes/module/ModuleGraph.php:158:                    $this->_legend[$i] = sprintf('%04d', $i);
./classes/module/ModuleGraph.php:195:        if (count($this->_legend)) {
./classes/module/ModuleGraph.php:198:                foreach ($this->_legend as $key => $legend) {
./classes/module/ModuleGraph.php:204:            foreach ($this->_legend as $key => $legend) {
./classes/module/ModuleGraph.php:205:                $this->_csv .= $legend.';';
./classes/module/ModuleGraph.php:259:        $this->_render->setLegend($this->_legend);
./classes/module/ModuleGraphEngine.php:68:    abstract public function setLegend($legend);
./classes/Supplier.php:286:                                     il.`legend`,
./classes/AdminTab.php:1898:            $legend = '<img src="'.(!empty($tab['module']) && file_exists($_SERVER['DOCUMENT_ROOT']._MODULE_DIR_.$tab['module'].'/'.$tab['class_name'].'.gif') ? _MODULE_DIR_.$tab['module'].'/' : '../img/t/').$tab['class_name'].'.gif" /> ';
./classes/AdminTab.php:1899:            $legend .= ((isset($categoryData['title'])) ? $categoryData['title'] : $this->l('Options'));
./classes/AdminTab.php:1900:            echo '<legend>'.$legend.'</legend>';
./classes/Cart.php:578:        $sql->select('image_shop.`id_image` id_image, il.`legend`');
./classes/Category.php:664:            $row['legend'] = 'no picture';
./classes/Category.php:747:                                     il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
./classes/FileUploader.php:110:            $legends = Tools::getValue('legend');
./classes/FileUploader.php:111:            if (is_array($legends)) {
./classes/FileUploader.php:112:                foreach ($legends as $key => $legend) {
./classes/FileUploader.php:113:                    if (Validate::isGenericName($legend)) {
./classes/FileUploader.php:114:                        $image->legend[(int)$key] = $legend;
./classes/FileUploader.php:116:                        return array('error' => sprintf(Tools::displayError('Error on image caption: "%1s" is not a valid caption.'), Tools::safeOutput($legend)));
./classes/FileUploader.php:161:        $img = array('id_image' => $image->id, 'position' => $image->position, 'cover' => $image->cover, 'name' => $this->getName(), 'legend' => $image->legend);
./classes/FileUploader.php:209:            $legends = Tools::getValue('legend');
./classes/FileUploader.php:210:            if (is_array($legends)) {
./classes/FileUploader.php:211:                foreach ($legends as $key => $legend) {
./classes/FileUploader.php:212:                    if (Validate::isGenericName($legend)) {
./classes/FileUploader.php:213:                        $image->legend[(int)$key] = $legend;
./classes/FileUploader.php:215:                        return array('error' => sprintf(Tools::displayError('Error on image caption: "%1s" is not a valid caption.'), Tools::safeOutput($legend)));
./classes/FileUploader.php:265:        $img = array('id_image' => $image->id, 'position' => $image->position, 'cover' => $image->cover, 'name' => $this->getName(), 'legend' => $image->legend);
./classes/Image.php:44:    public $legend;
./classes/Image.php:72:            'legend' =>    array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
./classes/Image.php:149:                                        SELECT image_shop.`id_image` id_image, il.`legend`
./classes/Manufacturer.php:346:                 pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`, image_shop.`id_image` id_image, il.`legend`, m.`name` AS manufacturer_name,
./classes/Pack.php:179:        $sql = 'SELECT p.*, product_shop.*, pl.*, image_shop.`id_image` id_image, il.`legend`, cl.`name` AS category_default, a.quantity AS pack_quantity, product_shop.`id_category_default`, a.id_product_pack, a.id_product_attribute_item
./classes/Pack.php:260:         SELECT p.*, product_shop.*, pl.*, image_shop.`id_image` id_image, il.`legend`, IFNULL(product_attribute_shop.id_product_attribute, 0) id_product_attribute
./classes/Product.php:2181:                     SELECT pai.`id_image`, pai.`id_product_attribute`, il.`legend`
./classes/Product.php:2208:                     SELECT pai.`id_image`, pai.`id_product_attribute`, il.`legend`
./classes/Product.php:2308:                     pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`, image_shop.`id_image` id_image, il.`legend`, m.`name` AS manufacturer_name,
./classes/Product.php:2445:                                             p.`ean13`, p.`upc`, image_shop.`id_image` id_image, il.`legend`,
./classes/Product.php:2559:                     pl.`name`, image_shop.`id_image` id_image, il.`legend`, m.`name` AS manufacturer_name,
./classes/Product.php:2709:    * Get product images and legends
./classes/Product.php:2711:    * @param int $id_lang Language id for multilingual legends
./classes/Product.php:2712:    * @return array Product images and legends
./classes/Product.php:2717:                     SELECT image_shop.`cover`, i.`id_image`, il.`legend`, i.`position`
./classes/Product.php:3568:                                     image_shop.`id_image` id_image, il.`legend`, m.`name` as manufacturer_name, cl.`name` AS category_default, IFNULL(product_attribute_shop.id_product_attribute, 0) id_product_attribute,
./classes/ProductSale.php:98:                                   image_shop.`id_image` id_image, il.`legend`,
./classes/ProductSale.php:157:    ** @return array keys : id_product, link_rewrite, name, id_image, legend, sales, ean13, upc, link
./classes/ProductSale.php:176:                  image_shop.`id_image` id_image, il.`legend`,
./classes/Search.php:316:                        image_shop.`id_image` id_image, il.`legend`, m.`name` manufacturer_name '.$score.',
./classes/Search.php:824:               
11 Октябрь 2016, 19:56:07
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
А старых модулях для категорий для картинки использовали legend в prestashop 1.6 заменили на cover.
Может у тебя модуль для старой версии?
12 Октябрь 2016, 17:11:01
Ответ #5
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
Миколас
Ну да, ставил тему вместе с Престой, потом обновлял.

Что предлагаешь? Везде исправлять? Переобъявить переменную?
12 Октябрь 2016, 17:19:09
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Только один выход, искать где используется "legend" и объявлять ее заранее.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Октябрь 2016, 17:20:26
Ответ #7
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
PrestaMan

А глобально объявить можно?
12 Октябрь 2016, 17:25:45
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Можно, только где будешь объявлять?
Если ее где то-то в хуке используют, то в этом хуке тоже нужно ее описать
global $legendтак и так искать.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Октябрь 2016, 17:37:29
Ответ #9
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
PrestaMan

Значит, объявить во всех функциях, где используется .....  :( верно?

Например, здесь
protected function setDateGraph($layers, $legend = false)
{  .....
}

Внутри этой функции объявить?
12 Октябрь 2016, 17:43:11
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Объявлять в одной, а в остальных указывать, что legend использутся глобальная, а не локальная. Я же говорю, что это не выход. Искать нужно файлы с этой переменной.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Октябрь 2016, 17:45:44
Ответ #11
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
Как раз файлы то найти не проблема, после нахождения что делать? Я имею в виду как объявлять то? В начале, в функциях или как?
12 Октябрь 2016, 17:53:41
Ответ #12
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
Кажись всё  :)

classes/module/ModuleGraph.php : 57
protected function setDateGraph($layers, $legend = false)
    {
                global $legend;

....................................

}


сохранил, ререзагрузил главную несколько раз - лог чистый.
13 Октябрь 2016, 11:27:59
Ответ #13
  • Фрилансер
  • *
  • Сообщений: 160
  • Репутация: +5/-0
  • BSDA Certification
    • Просмотр профиля
Установил протоколирование с параметром debug......

Сыпет ошибки такого же типа
Undefined index: product_picture_type ...............
Undefined index: legend ...
Trying to get property of non-object in /www/prestashop/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 138
Undefined index: item in /www/prestashop/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 169

Буду устранять по аналогии.