2013-05-08 2 views
0

У меня есть следующая проблема: мне нужно использовать условие {IF} {/ IF} со многими переменными, но весь сайт просто пуст, когда я помещаю код:Smarty - Слишком много условий внутри {IF} {/ IF}

{if $product.id_category_default == 6 || $product.id_category_default == 9 || $product.id_category_default == 10 || $product.id_category_default == 11 || $product.id_category_default == 12 || $product.id_category_default == 13 || $product.id_category_default == 14 || $product.id_category_default == 8 || $product.id_category_default == 60 || $product.id_category_default == 35 || $product.id_category_default == 36 || $product.id_category_default == 37 || $product.id_category_default == 38 || $product.id_category_default == 39 || $product.id_category_default == 40 || $product.id_category_default == 41 || $product.id_category_default == 93 || $product.id_category_default == 31 || $product.id_category_default == 32 || $product.id_category_default == 33 || $product.id_category_default == 34 || $product.id_category_default == 94 || $product.id_category_default == 53 || $product.id_category_default == 54 || $product.id_category_default == 55 || $product.id_category_default == 56 || $product.id_category_default == 57 || $product.id_category_default == 58 || $product.id_category_default == 59 || $product.id_category_default == 95 || $product.id_category_default == 19 || $product.id_category_default == 20 || $product.id_category_default == 24 || $product.id_category_default == 21 || $product.id_category_default == 22 || $product.id_category_default == 23 || $product.id_category_default == 27 || $product.id_category_default == 28 || $product.id_category_default == 29 || $product.id_category_default == 30 || $product.id_category_default == 96 || $product.id_category_default == 97 || $product.id_category_default == 98 || $product.id_category_default == 99 || $product.id_category_default == 100 || $product.id_category_default == 51 || $product.id_category_default == 50 || $product.id_category_default == 52 || $product.id_category_default == 49 || $product.id_category_default == 101 || $product.id_category_default == 102}gardena{/if} 
{if $product.id_category_default == 7 || $product.id_category_default == 15 || $product.id_category_default == 16 || $product.id_category_default == 17 || $product.id_category_default == 18 || $product.id_category_default == 61 || $product.id_category_default == 62 || $product.id_category_default == 63 || $product.id_category_default == 64 || $product.id_category_default == 65 || $product.id_category_default == 66 || $product.id_category_default == 67 || $product.id_category_default == 68 || $product.id_category_default == 69 || $product.id_category_default == 70 || $product.id_category_default == 71 || $product.id_category_default == 72 || $product.id_category_default == 73 || $product.id_category_default == 74 || $product.id_category_default == 75 || $product.id_category_default == 76 || $product.id_category_default == 77 || $product.id_category_default == 78 || $product.id_category_default == 79 || $product.id_category_default == 80 || $product.id_category_default == 81 || $product.id_category_default == 82 || $product.id_category_default == 83 || $product.id_category_default == 84 || $product.id_category_default == 85 || $product.id_category_default == 86 || $product.id_category_default == 87 || $product.id_category_default == 88 || $product.id_category_default == 89 || $product.id_category_default == 90 || $product.id_category_default == 91 || $product.id_category_default == 92}beam{/if} 

Может ли это быть вызвано слишком большим количеством переменных? Или, может быть, есть способ сократить этот код?

+0

попробуйте OR вместо || и посмотрите, поможет ли это –

+1

Если проверки 'if' основаны на случайном списке, вы не можете его сократить. Только небольшие изменения, такие как if $ product.id_category_default> 9 || $ Product.id_category_default <14'. –

+1

многие из этих чисел являются последовательными. вместо того, чтобы тестировать '3,4,5,6,7', почему бы не' if (x> = 3) && (x <= 7) 'уменьшить количество тестов? –

ответ

1

Это лучше ИМХО, чтобы переместить логику в контроллер и построить displayproducts массив там, и просто использовать

{if $displayproducts.gardena}gardena{/if} 

Smarty шаблоны предназначены для чтения с помощью веб-дизайнера иногда ..

-1

Использование массив

$validValues = array("6", "7", "9", "15"); 
if(in_array($product.id_category_default, $validValues)) 
{ 
    // Do somthing 
} 
+0

Это умный не PHP – RMcLeod

+0

@RMcLeod php где smarty получает свои переменные. этот способ на самом деле был бы лучше, потому что вы отправляете меньше условий для smarty, и вы сначала тестируете меньше условий. –

+0

@JeffHawthorne. Я полностью это понимаю, но выше не будет работать в файле .tpl, если он не будет завернут в ' {php} ', который затем побеждает цель smarty, ответ by @Adder лучше – RMcLeod

0

Даже если это не вызывает ошибку, и независимо от того, является ли он в контроллере или представлении, длинный список «магических чисел», как это должно IMMED в то же время плохой «запах кода». Любой, кто читает код (включая вас!), Не будет знать, откуда этот список или что он на самом деле означает, когда добавлять или удалять элементы из него, где еще в коде необходимо синхронизировать и т. Д.

Вам нужно спросить себя, что на самом деле означает этот список идентификаторов, и почему эти конкретные категории действуют таким образом - у них, по-видимому, есть какое-то общее свойство, которому следует дать описательное имя, независимо от того, какой эффект он имеет на лицевой стороне.

Если id_category_default ссылается на некоторый идентификатор в таблице базы данных, добавьте столбец в эту таблицу (например, is_gardena) и извлеките это вместе с данными элемента. Затем вы можете иметь простой оператор if в коде Smarty, например {if $product.category_is_gardena} ... {/if}.

Если это не возможно в вашей заявке, вы должны , по крайней мере, захватить эту логику в единую, хорошо обозначенную и прокомментированную функцию, содержащую массив соответствующих идентификаторов и объяснение того, к чему они относятся. Затем вы можете зарегистрировать это как модификатор Smarty и использовать что-то вроде {if $product.id_category_default|is_gardena_category} ... {/if}.

Смежные вопросы