За последние 24 часа нас посетили 19112 программистов и 1639 роботов. Сейчас ищут 945 программистов ...

Undefined index (или ищу единомышленников по книге "PHP и MySQL. Создание интернет-магазина").

Тема в разделе "PHP для новичков", создана пользователем Росс, 1 дек 2016.

  1. Росс

    Росс Новичок

    С нами с:
    1 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    Всем привет!

    Разбираю код по книге К. Дари и Э. Баланеску "PHP и MySQL. Создание интернет-магазина".
    Книга 2011 года, в ней использовался шаблонизатор Smarty версии 2.6.8, сейчас же я использую последнюю стабильную версию Smarty 3.

    Вот кусок кода:

    Код (Text):
    1. <p class="attributes">
    2.  
    3. {* Parse the list of attributes and attribute values *}
    4.  
    5. {section name=k loop=$obj->mProduct.attributes}
    6.  
    7.     {* Generate a new select tag? *}
    8.     {if $smarty.section.k.first || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_prev].attribute_name}
    9.     {$obj->mProduct.attributes[k].attribute_name}:
    10.         <select name="attr_{$obj->mProduct.attributes[k].attribute_name}">
    11.     {/if}
    12.  
    13.     {* Generate a new option tag *}
    14.     <option value="{$obj->mProduct.attributes[k].attribute_value}">
    15.     {$obj->mProduct.attributes[k].attribute_value}
    16.     </option>
    17.  
    18.     {* Close the select tag? *}
    19.     {if $smarty.section.k.last || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_next].attribute_name}
    20.         </select>
    21.     {/if}
    22.  
    23. {/section}
    24.  
    25. </p>
    Не могу понять, как победить вот эту ошибку:

    Код (Text):
    1. ERRNO: 8
    2. TEXT: Undefined index:
    3. LOCATION: C:\xampp\htdocs\fenix\presentation\templates_c\4441ba2da6e03a1045ad05bbf409fa04cdd300ed_0.file.product.tpl.php, line 114, at December 1, 2016, 9:07 am
    4. Showing backtrace:
    5. call_user_func(Array[2], "8", "Undefined index: ", "C:\xampp\htdocs\fenix\presentation\templates_c\4441ba2da6e03a104...", "114", Array[10]) # line 1480, file: C:\xampp\htdocs\fenix\libs\smarty\Smarty.class.php
    6. Smarty.mutingErrorHandler("8", "Undefined index: ", "C:\xampp\htdocs\fenix\presentation\templates_c\4441ba2da6e03a104...", "114", Array[10]) # line  114, file: C:\xampp\htdocs\fenix\presentation\templates_c\4441ba2da6e03a1045ad05bbf409fa04cdd300ed_0.file.product.tpl.php
    7. content_583fda4bcf3519_85244636(Object: Smarty_Internal_Template) # line  128, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_resource_base.php
    8. Smarty_Template_Resource_Base.getRenderedTemplateCode(Object: Smarty_Internal_Template) # line  170, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_compiled.php
    9. Smarty_Template_Compiled.render(Object: Smarty_Internal_Template) # line  184, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_template.php
    10. Smarty_Internal_Template.render() # line  350, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_template.php
    11. Smarty_Internal_Template._subTemplateRender("product.tpl", null, null, "0", "3600", Array[0], "0", true) # line   59, file: C:\xampp\htdocs\fenix\presentation\templates_c\e28d902e3fb52a102955f03211adf511349e16e1_0.file.store_front.tpl.php
    12. content_583fcac1054d77_77959112(Object: Smarty_Internal_Template) # line  128, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_resource_base.php
    13. Smarty_Template_Resource_Base.getRenderedTemplateCode(Object: Smarty_Internal_Template) # line  170, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_compiled.php
    14. Smarty_Template_Compiled.render(Object: Smarty_Internal_Template) # line  184, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_template.php
    15. Smarty_Internal_Template.render(false, "1") # line  199, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_templatebase.php
    16. Smarty_Internal_TemplateBase._execute("store_front.tpl", null, null, null, "1") # line  114, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_templatebase.php
    17. Smarty_Internal_TemplateBase.display("store_front.tpl") # line   71, file: C:\xampp\htdocs\fenix\index.php
    Ругаться начинает на первое же условие.

    Иными словами, есть таблица в БД, в которой хранятся атрибуты товара - цвет и размер. Эти атрибуты нужно вывести на странице так, чтобы каждый был в своем выпадающем списке (элементе <select>).

    Проверка показала, что php-обработчик (файл product.php) корректно вытаскивает эти данные из БД и передает их дальше в шаблон (файл product.tpl). Дальше у меня ступор.

    Также я сравнивал изменения между синтаксисом Smarty 2 и Smarty 3 - критичного вроде ничего нет, что ломало бы этот кусок кода.

    Есть кто сталкивался с этой книгой? Может там опечатка, может еще что.
    С авторами связаться пока не получается.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Постепенно убирай условия, найди какое конкретно вызывает ошибку
     
  3. Росс

    Росс Новичок

    С нами с:
    1 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    Ошибка вываливается при любой из этих строк:

    Код (Text):
    1.  
    2. {if $smarty.section.k.first || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_prev].attribute_name}
    Код (Text):
    1.  
    2. {if $smarty.section.k.last || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_last].attribute_name}
    Код приведен таким, каким он был в оригинале.
    Может еще кто сталкивался с этой книгой?
     
  4. Росс

    Росс Новичок

    С нами с:
    1 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    Похоже, нашел как решить проблему.

    Дело в том, что ругань была на вот это:
    Код (Text):
    1. $obj->mProduct.attributes[k.index_prev].attribute_name
    Код (Text):
    1. $obj->mProduct.attributes[k.index_next].attribute_name
    т.е., смартиевские index_prev и index_next указывали на несуществующие индексы. Оно и логично - перед первым элементом массива и после последнего - индексы не определены.

    Отследил это случайно, вставив перед кодом, который вызывал ошибку следующий кусок:
    Код (Text):
    1. {section name=k loop=$obj->mProduct.attributes}
    2. {$smarty.section.k.index_prev}
    3. {$smarty.section.k.index_next}
    4. {/section}
    Т.е., я так понимаю, тот же массив индексировался в этом предварительном цикле, и ошибка ушла от этого?
    Теперь проблема - заменить этот кусок с тестовым циклом на что-то более логичное, например условие или функцию)))
    Или проблема все-таки более банальна и я не вижу очевидного решения? :)