Как стать автором
Обновить

ЦУЦ — или как свести 15 тысяч товаров от разных поставщиков на коленке

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2.4K
Всего голосов 8: ↑8 и ↓0+8
Комментарии8

Комментарии 8

Статье лайк, но хорошим тоном считается давать расшифровки всех встречающихся аббревиатур, я про РРЦ: присутствует на КДПВ (Картинка Для Привлечения Внимания =)) ) и в тексте. Не все пользователи Хабра погружены в продажную тему...

Спасибо, учту в следующий раз!

Я тоже поставил лайк, и в целом понимаю, что эти придирки не совсем в тему, поскольку статья в основном про другое. Но все же она размещена в хабе РНР, а от единственного фрагмента кода на этом языке просто кровь из глаз.
Опять же, я понимаю, что вины автора нет, все мы ищем решение в интернете, и находим не правильное, а то, которое гуголь счел самым авторитетным сиречь как можно более древним, в идеале — из прошлого века. Но просто на будущее:


  1. Самым примечательным, конечно, является блок preg_replace.
    • регулярки для простых строковых замен — это чересчур. Тем более аж две на одну и ту же строку. Не говоря уже о том, что замены HTML сущностей в РНР есть специальные функции, которые делают все сами.
    • смысл операции $offer->name = preg_replace('/ /', ' ', $offer->name); от меня ускользает :) Наверное, имелось в виду $offer->name = preg_replace('/ +/', ' ', $offer->name);?
    • preg_replace('/\+\d*/', '', $offer->stock_msk) тоже выглядит довольно странно. Оно действительно делает именно то, что задумано?
  2. Странное отношение к обработке ошибок. Общие ошибки РНР включаем не почему-то не сразу, а в середине кода. Курл на ошибки вообще не проверяем, как и simplexml, заодно отключив ему возможность сообщать об ошибках самостоятельно. В итоге непонятно, хотим мы видеть ошибки, или нет? По идее, программист, который отключает генерацию ошибок, стреляет себе сразу в обе ноги.
  3. Курл для простого запроса использовать нет смысла, практически любая функция в РНР умеет работать с НТТР напрямую. Весь этот многострочник заменяется на copy('https://site.com/price.xml', "price.xml");. Подделывать юзер агент я не вижу смысла. Даже наоборот это будет выглядеть подозрительно — XML браузерами не скачивают.
  4. В РНР есть такая крутая вещь, как двойные кавычки :) (не говоря уже про heredoc, который здесь подойдет даже лучше, но не будем перегружать)
  5. Совсем уж мелочь, но использовать буферизацию вывода для собирания строки как-то странно.

Как минимум, я бы переписал так


<?php
error_reporting(E_ALL);
ini_set('display_errors', 'on');

$url = 'https://site.com/price.xml';
$xml = simplexml_load_file($url);

$out = '<?xml version="1.0" encoding="UTF-8"?>';
$out .= "\n<price>";
foreach ($xml->offers->offer as $offer) {
    $offer->name = htmlspecialchars($offer->name);
    $offer->stock_msk = preg_replace('/\+\d*/', '0', $offer->stock_msk);
    $offer->stock_msk = (int)$offer->stock_msk + (int) $offer->stock_msk_shops;
    $out .= "
<offer>
    <sku>$offer->code</sku>
    <name>$offer->name</name>
    <stock>$offer->stock_msk</stock>
    <price>$offer->retail_price</price>
</offer>";
}
$out .= "\n</price>\n";
file_put_contents('price_new.xml', $out);

хотя по-хорошему, генерацию XML стоит делать не вручную, а тем же smilexml.

Прошу прощения за кровь из глаз! Безумно благодарен за пояснения и разбор кода. Почерпнул для себя новую информацию! Буду стараться сильнее вникать в PHP.

? думаю все кто работает с сайтами по продажам встречали такие задачи.

P.S. вспоминается молодость

А зачем мучить Яндекс для определения релевантности страницы? Разве нет более оптимального решения?

Для быстрого сведения товаров с прайсами поставщиков. При первоначальной работе с товарами не было нормальной связки с прайсами поставщиков. Артикулы не совпадали. Можно было сделать связку по названию товара, но они изменялись для поисковой оптимизации. Так что просто ВПР и Эксель тут не подходит :)

Не ну круто, а как теперь к этой всей суете прицепить анализ наличия складских остатков?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории