Комментарии 8
Статье лайк, но хорошим тоном считается давать расшифровки всех встречающихся аббревиатур, я про РРЦ: присутствует на КДПВ (Картинка Для Привлечения Внимания =)) ) и в тексте. Не все пользователи Хабра погружены в продажную тему...
Я тоже поставил лайк, и в целом понимаю, что эти придирки не совсем в тему, поскольку статья в основном про другое. Но все же она размещена в хабе РНР, а от единственного фрагмента кода на этом языке просто кровь из глаз.
Опять же, я понимаю, что вины автора нет, все мы ищем решение в интернете, и находим не правильное, а то, которое гуголь счел самым авторитетным сиречь как можно более древним, в идеале — из прошлого века. Но просто на будущее:
- Самым примечательным, конечно, является блок preg_replace.
- регулярки для простых строковых замен — это чересчур. Тем более аж две на одну и ту же строку. Не говоря уже о том, что замены HTML сущностей в РНР есть специальные функции, которые делают все сами.
- смысл операции
$offer->name = preg_replace('/ /', ' ', $offer->name);
от меня ускользает :) Наверное, имелось в виду$offer->name = preg_replace('/ +/', ' ', $offer->name);
? preg_replace('/\+\d*/', '', $offer->stock_msk)
тоже выглядит довольно странно. Оно действительно делает именно то, что задумано?
- Странное отношение к обработке ошибок. Общие ошибки РНР включаем не почему-то не сразу, а в середине кода. Курл на ошибки вообще не проверяем, как и simplexml, заодно отключив ему возможность сообщать об ошибках самостоятельно. В итоге непонятно, хотим мы видеть ошибки, или нет? По идее, программист, который отключает генерацию ошибок, стреляет себе сразу в обе ноги.
- Курл для простого запроса использовать нет смысла, практически любая функция в РНР умеет работать с НТТР напрямую. Весь этот многострочник заменяется на
copy('https://site.com/price.xml', "price.xml");
. Подделывать юзер агент я не вижу смысла. Даже наоборот это будет выглядеть подозрительно — XML браузерами не скачивают. - В РНР есть такая крутая вещь, как двойные кавычки :) (не говоря уже про heredoc, который здесь подойдет даже лучше, но не будем перегружать)
- Совсем уж мелочь, но использовать буферизацию вывода для собирания строки как-то странно.
Как минимум, я бы переписал так
<?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.
? думаю все кто работает с сайтами по продажам встречали такие задачи.
P.S. вспоминается молодость
А зачем мучить Яндекс для определения релевантности страницы? Разве нет более оптимального решения?
Для быстрого сведения товаров с прайсами поставщиков. При первоначальной работе с товарами не было нормальной связки с прайсами поставщиков. Артикулы не совпадали. Можно было сделать связку по названию товара, но они изменялись для поисковой оптимизации. Так что просто ВПР и Эксель тут не подходит :)
Не ну круто, а как теперь к этой всей суете прицепить анализ наличия складских остатков?
ЦУЦ — или как свести 15 тысяч товаров от разных поставщиков на коленке