Всем привет! Разбираю код по книге К. Дари и Э. Баланеску "PHP и MySQL. Создание интернет-магазина". Книга 2011 года, в ней использовался шаблонизатор Smarty версии 2.6.8, сейчас же я использую последнюю стабильную версию Smarty 3. Вот кусок кода: Код (Text): <p class="attributes"> {* Parse the list of attributes and attribute values *} {section name=k loop=$obj->mProduct.attributes} {* Generate a new select tag? *} {if $smarty.section.k.first || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_prev].attribute_name} {$obj->mProduct.attributes[k].attribute_name}: <select name="attr_{$obj->mProduct.attributes[k].attribute_name}"> {/if} {* Generate a new option tag *} <option value="{$obj->mProduct.attributes[k].attribute_value}"> {$obj->mProduct.attributes[k].attribute_value} </option> {* Close the select tag? *} {if $smarty.section.k.last || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_next].attribute_name} </select> {/if} {/section} </p> Не могу понять, как победить вот эту ошибку: Код (Text): ERRNO: 8 TEXT: Undefined index: LOCATION: C:\xampp\htdocs\fenix\presentation\templates_c\4441ba2da6e03a1045ad05bbf409fa04cdd300ed_0.file.product.tpl.php, line 114, at December 1, 2016, 9:07 am Showing backtrace: 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 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 content_583fda4bcf3519_85244636(Object: Smarty_Internal_Template) # line 128, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_resource_base.php Smarty_Template_Resource_Base.getRenderedTemplateCode(Object: Smarty_Internal_Template) # line 170, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_compiled.php Smarty_Template_Compiled.render(Object: Smarty_Internal_Template) # line 184, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_template.php Smarty_Internal_Template.render() # line 350, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_template.php 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 content_583fcac1054d77_77959112(Object: Smarty_Internal_Template) # line 128, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_resource_base.php Smarty_Template_Resource_Base.getRenderedTemplateCode(Object: Smarty_Internal_Template) # line 170, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_template_compiled.php Smarty_Template_Compiled.render(Object: Smarty_Internal_Template) # line 184, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_template.php Smarty_Internal_Template.render(false, "1") # line 199, file: C:\xampp\htdocs\fenix\libs\smarty\sysplugins\smarty_internal_templatebase.php 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 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 - критичного вроде ничего нет, что ломало бы этот кусок кода. Есть кто сталкивался с этой книгой? Может там опечатка, может еще что. С авторами связаться пока не получается.
Ошибка вываливается при любой из этих строк: Код (Text): {if $smarty.section.k.first || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_prev].attribute_name} Код (Text): {if $smarty.section.k.last || $obj->mProduct.attributes[k].attribute_name !== $obj->mProduct.attributes[k.index_last].attribute_name} Код приведен таким, каким он был в оригинале. Может еще кто сталкивался с этой книгой?
Похоже, нашел как решить проблему. Дело в том, что ругань была на вот это: Код (Text): $obj->mProduct.attributes[k.index_prev].attribute_name Код (Text): $obj->mProduct.attributes[k.index_next].attribute_name т.е., смартиевские index_prev и index_next указывали на несуществующие индексы. Оно и логично - перед первым элементом массива и после последнего - индексы не определены. Отследил это случайно, вставив перед кодом, который вызывал ошибку следующий кусок: Код (Text): {section name=k loop=$obj->mProduct.attributes} {$smarty.section.k.index_prev} {$smarty.section.k.index_next} {/section} Т.е., я так понимаю, тот же массив индексировался в этом предварительном цикле, и ошибка ушла от этого? Теперь проблема - заменить этот кусок с тестовым циклом на что-то более логичное, например условие или функцию))) Или проблема все-таки более банальна и я не вижу очевидного решения?