Сегодня утром работал над сайтом клиента, потому что он заметил что-то странное на своем сайте:

Сайт работает на платформе электронной коммерции 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. Это имеет смысл. Итак, почему это:

  1. Только предполагается печатать цену, когда она от equal до 0, и
  2. на самом деле печатаете «БЕСПЛАТНЫЙ ОБРАЗЕЦ £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 г.