Темы - Обновление ПО ССЫЛКЕ на PHP

Темы - Обновление ПО ССЫЛКЕ на PHP

15.11.2019 03:24:57 Просмотров 19 Источник

Я получаю ежедневный JSON с ценами, которые я должен обновить на веб-сайте. Я могу читать json с php правильно, но я понятия не имею, как обновить цену продуктов. Я попытался изменить БД напрямую, но я не получаю успеха. Цель состоит в том, чтобы найти каждый продукт, который имеет конкретную ссылку (обычно один продукт, но, возможно, есть некоторые дубликаты), а затем изменить цену. Я прочитал эти две данные из JSON, ссылку и цену. До сих пор я создал совершенно новый php-файл и пытаюсь:

include(dirname(__FILE__) . '/config/config.inc.php');
include(dirname(__FILE__) . '/init.php');
foreach ($json_datos as $articulo){
    $cod_articulo = $articulo["Cod_Articulo"]; //this comes from the previously read json
    $precio_articulo = $articulo["PVP"]; //this comes from the previously read json

    $query = "UPDATE `"._DB_PREFIX_."product` prod SET price=".$precio_articulo." WHERE prod.reference=".$cod_articulo.";";
    Db::getInstance()->Execute($query);
}

Этот код не дает никаких ошибок, ни каких-либо изменений.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php#comment104021712_58877041
Вы не должны пытаться работать “вокруг " такой системы в первую очередь, манипулируя материалом в базе данных напрямую. Это должно использовать собственные методы системы магазина, чтобы найти и затем обновить эти продукты.
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php#comment104021771_58877041
Я знаю это, но я считаю, что мне будет еще труднее попытаться понять и понять кишки Prestashop. На самом деле цель состоит в том, чтобы иметь возможность выполнять PHP каждые 24 часа, чтобы прочитать самый последний json и обновить цены.

Ответы - Темы - Обновление ПО ССЫЛКЕ на PHP / PrestaShop - Update price by reference on php

Является ответом!
Alexander Grosul

18.11.2019 11:27:03

Используйте объект Product для реализации своей цели.

foreach ($json_datos as $articulo) {
    $cod_articulo = $articulo["Cod_Articulo"];
    $precio_articulo = $articulo["PVP"];

    $product = new Product(Product::getIdByReference($cod_articulo));
    $product->price = $precio_articulo;
    $product->update();
}

этот путь гораздо безопаснее и стабильнее

UPD: для версий ниже 1.7.6 вам нужно определить свой собственный метод

include(dirname(__FILE__) . '/config/config.inc.php');

function getIdByReference($reference)
{
    if (empty($reference)) {
        return 0;
    }

    if (!Validate::isReference($reference)) {
        return 0;
    }

    $query = new DbQuery();
    $query->select('p.id_product');
    $query->from('product', 'p');
    $query->where('p.reference = \'' . pSQL($reference) . '\'');

    return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
}

foreach ($json_datos as $articulo) {
    $cod_articulo = $articulo["Cod_Articulo"];
    $precio_articulo = $articulo["PVP"];

    $product = new Product(getIdByReference($cod_articulo));
    $product->price = $precio_articulo;
    $product->update();
}

но в этом случае он немного теряет смысл. Но все же безопаснее обновить цену внутри объекта продукта

https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104119136_58910499
Я пытаюсь запустить это из "почтальона", чтобы увидеть, работает ли он, но я просто получаю ошибку 500. Я не знаю, происходит ли это, потому что я пытаюсь получить доступ к php из-за пределов сервера.
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104119329_58910499
Включите режим отладки и проверьте файлы журнала, чтобы получить отчет об ошибке
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104120428_58910499
Один вопрос. Этот файл создается исключительно с целью выполнения задания cron. Если это так, работает ли этот код, если он выполняется вне среды веб-сайта prestashop? Он помещается в веб-папку, но я на самом деле не понимаю, как этот код работает. (Мне нужно, чтобы он выполнялся каждые 24 часа).
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104122264_58910499
Вам нужно включить хотя бы эти файлы include(dirname( FILE ) . '/конфигурация/конфиг.инк.на PHP'); включить(каталог(файл) . '/инициализация.php'); чтобы получить доступ к вашей среде prestashop. Затем проверьте, является ли скрипт исполняемым и настройте свой cronjob для его запуска
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104122323_58910499
Но лучше всего было бы создать простой модуль, который выполнит эту работу за вас. Существует много информации, как построить его в интернете
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104123098_58910499
У меня есть эти два файла включены, но php выдает ошибку 500, с другой стороны, если я делаю стандартный запрос mysql, он работает успешно. Вот почему я спросил. У меня это так: include(dirname (FILE). '/конфигурация/конфиг.инк.на PHP'); включить(каталог(файл) . '/инициализация.php'); (с двойным подчеркиванием перед и после "FILE".)
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104123480_58910499
Вы можете проверить журналы?
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104123939_58910499
Я проверил его еще раз и он работает даже без инициализации.PHP-файл. Я просто поставил свой скрипт (тест.php) в корневой каталог и запустите его в URL myRootUrl/test.РНР
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104127100_58910499
Он бросает "попытка вызвать неопределенный метод с именем "getIdByReference" класса "Продукт". У меня : $продукт = новый продукт(продукт::getIdByReference($cod_articulo)); $продукта->цена = $precio_articulo; $продукта->обновления();
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104127132_58910499
Хорошо, какая версия Prestashop у вас есть?
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104127202_58910499
Я использую 1.7.4.2. Не так уж и стар, я полагаю.
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104127487_58910499
Теперь я понял, этот метод "getIdByReference" добавлен в версии 1.7.6. Так что в вашем случае это не сработает. Этот метод можно добавить непосредственно в сценарий перед определением $product. Я обновлю ответ
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104128498_58910499
Могу ли я создать этот метод в классе продукта и использовать его из любого места? (если да, пожалуйста, объясните, как, я не очень уверен в том, как работает Prestashop).
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104128991_58910499
В принципе, вы можете, но не забывайте об этом, если вы собираетесь обновить свое ядро до более низкой версии 1.7.6 (классы/продукт.PHP и сделать свой метод статический). Кроме того, вы можете переопределить класс продукта и добавить этот метод туда, создать продукт.php-файл в папке override / classes/, расширьте ProductCore в определении класса и поместите свой метод в новый класс. После этого не забудьте удалить var / cache/dev (или prod)/class_index.PHP и class_stub.PHP-файл. Таким образом, вы не должны беспокоиться об обновлениях
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104131964_58910499
Я думаю, это должно сработать. Я пытаюсь прочитать сейчас файл в Родительском каталоге с scandir, и с помощью "../../ папка", но по какой-то причине он не находит его. Это не связано с проблемой, хотя. Я благодарю вас за всю вашу помощь @Alexander Grosul
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104133058_58910499
На самом деле, он бросает эти ошибки: La propiedad Product->price no es válida в ObjectModel.php строка 954 в ObjectModelCore - >validateFields () в ObjectModel.php строка 272 в ObjectModelCore - >getFields () в ObjectModel.php строка 694 в ObjectModelCore- > update (false)в продукте.php строка 622 в ProductCore - >update () в TisaPrice.php строка 16
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104133110_58910499
Какой тип значения вы пытаетесь установить?
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104133155_58910499
справедливая цена. В таблицах он отображается как десятичное значение, я не знаю, нужно ли мне анализировать это значение, чтобы удвоить или что-то еще?
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104133492_58910499
Вероятно, вы получаете строковое значение, попробуйте поставить (float) перед ценой, такой как (float)$articulo["PVP"]. Или добавьте проверку раньше, например, если Validate:: isPrice ((float)$articulo ["PVP"]); затем зафиксируйте изменения
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104133717_58910499
Цены (поле PVP) похожи на "888,88". Я боюсь, что символ запятой не разбирается правильно, когда я делаю (float), он показывает только "888".
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104133842_58910499
Замените запятую, если вы уверены, что цена всегда будет в таком формате
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104134049_58910499
Ну, используется: (float)str_replace(",",".",$precio_articulo); становится этот огромный беспорядок: ссылка
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104134709_58910499
Но, так или иначе, у вас есть id_product = 0
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104134924_58910499
Я проверю завтра, как я ухожу сейчас. Буду держать вас в курсе. Спасибо за все!
https://stackoverflow.com/questions/58877041/prestashop-update-price-by-reference-on-php/58910499#comment104313037_58910499
Моя ошибка заключается в том, что я пытался обновить несуществующий код. Это работает. Большое спасибо!
Закрыть X