Сегодня утром работал над сайтом клиента, потому что он заметил что-то странное на своем сайте:
Сайт работает на платформе электронной коммерции PrestaShop. Это недавно созданный сайт последней версии — 1.7 — с контентом, импортированным с исходного сайта, созданного на PS 1.6. В него был добавлен модуль «Образцы товаров», и все прошло так гладко, как и ожидалось (я исправляю вещи на этом новом сайте с декабря).
Первое, что я проверил, это настройки модуля. Я нигде не мог найти очевидной опции для изменения текста, поэтому взглянул на код.
PrestaShop использует язык шаблонов Smarty с поддержкой PHP. Он существовал всегда и, как правило, работает довольно хорошо, если вы знаете о некоторых его нюансах. Я ожидал худшего, но не ожидал этого:
Грубо переведенный в псевдокод/действительный Python:
if sample_price == 0:
print(f"Free Sample {sample_price}")
else: # If there is a sample price.
print("Add Sample")
Конечно, обязательно напечатайте «Бесплатный образец», когда цена образца равна 0. Это имеет смысл. Итак, почему это:
- Только предполагается печатать цену, когда она от
eq
ual до0
, и - на самом деле печатаете «БЕСПЛАТНЫЙ ОБРАЗЕЦ £0,50»?
Здесь происходят две вещи. Чтобы скрыть первое, я думаю, что где-то в строках разработчик перепутал, где должна идти строка {productsample->price...
, и поместил ее не в то место. Конечно, это должно быть после <br>
в части else.
С последним стало интереснее. Это могло работать по-другому в PrestaShop 1.6, но в 1.7 (или в этой версии модуля) $productsample->price
не является числом.
Что?! Да, меня это тоже достало. Наивно я ожидал, что он, возможно, преобразовывал 0.50
в целое число и округлял в меньшую сторону, так как он сравнивал с 0
, а не с 0.0
— целым числом, а не с плавающей запятой. Может быть, это сработало бы, если бы я изменил его на 0.0
, заставив его правильно сравнивать числа. Неа.
Коллега что-то упомянул, когда я указал на это. Это ни с чем не сравнивает 0.50
. Это сравнение "£0.50"
с 0
. В приведенном выше коде нет £. $productsample->price
— это строка, а не число. Это все равно должно возвращать False, верно? Возможно, ошибка при попытке сравнить строку и число.
Конечно, нет. Где-то (я действительно не могу заморачиваться с PHP/Smarty настолько, чтобы исследовать, почему и как) он преобразует строку £0.50
в 0
, потому что это не число, поэтому, естественно, 0 подойдет. Не будет. В конечном итоге он спрашивал, если 0 == 0
, что он и делает, а затем распечатывал эти 0
как 0,50 фунта стерлингов, когда доходил до стадии рендеринга.
У меня были проблемы поважнее, чем попытки исправить это должным образом, поэтому я изменил код шаблона модуля, чтобы он всегда отображал SAMPLE {productsample->price}
— он будет работать независимо от цены, и мне не нужно выяснять, где он хранит номер версии цены. Что еще более важно, клиент доволен этим.
Первоначально опубликовано на https://blog.jwdt.co.uk 11 января 2020 г.