Jump to content

Ищу скрипт для обновления цен и остатка товара в магазине


Recommended Posts

Всем привет! Ищу скрипт для обновления цен и остатков товара в магазине. В 2х словах.. у меня офф магазин, где установлена 1с. Задача обновлять остатки товара в интернет магазине и за одно цены.

Т.е предположим я сделал експорт из 1с данных в файл формата CSV или xls. Нужно чтобы скрипт, по штрих-коду искал товар в базе интернет-магазина и если находил то менял остаток и цену.

 

Есть ли такие скрипты в природе? Или может кто готов написать такое за деньги ? Может есть люди кому нужно тоже самое ? )

Link to comment
Share on other sites

Такой скрипт не сложно написать если файл в формате csv. Сколько всего товаров в магазине ?

Могу сделать такой скрипт, пишите в личку.

 

 

Написал..

Link to comment
Share on other sites

Написал скрипт, положить его надо в папку админ-панели, файл csv нужно заполнять так | ean13 | количество | цена |

Расчитан скрипт на то что файл в кодировке windows-1251 (в таком формате сохраняет файл эксель - "csv - разделеные точкой с запятой")

<?php
define('PS_ADMIN_DIR', getcwd());
include(PS_ADMIN_DIR.'/../config/config.inc.php');
include(PS_ADMIN_DIR.'/functions.php');
include(PS_ADMIN_DIR.'/header.inc.php');
echo '<div style="text-align:left;">';

// Проверяем загружен ли файл
if(is_uploaded_file($_FILES["filename"]["tmp_name"])){
   // Если файл загружен успешно, перемещаем его из временной директории в конечную
   move_uploaded_file($_FILES["filename"]["tmp_name"], "".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]);
$file_path="".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]."";

// Меняем кодировку файла с windows-1251 на utf-8
$file=file_get_contents("".$file_path."");
$file=iconv("windows-1251", "utf-8",$file);
file_put_contents("".$file_path."",$file);



//меняем локаль на хостинге
if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8'); if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');
if (($handle_f = fopen($file_path, "r")) !== FALSE)
{ 
 //начинаем цикл чтения csv
 while (($data_f = fgetcsv($handle_f,99999,";"))!== FALSE) { 

  //ищем товар по ean13 
  $sql="SELECT id_product FROM ps_product WHERE ean13 = '".$data_f[0]."'";
  $id_product = Db::getInstance()->getValue($sql,0);  

  //если такой товар есть, обновляем количество и цену
  if ($id_product){	 
   $sql=mysql_query("UPDATE `ps_product` SET `quantity` ='".$data_f[1]."' , `price` = '".$data_f[2]."' WHERE `id_product`='".$id_product."' LIMIT 1");
   echo "<p style='color:green'>товар с штрихкодом <b>".$data_f[0]."</b> обновлен</p>";
  }
  else{
   echo "<p style='color:red  '>товар с штрихкодом <b>".$data_f[0]."</b> не найден</p>";
  }
 }
 echo "<b>Обновление завершено</b>";  

}
else{
 echo "Невозможно открыть загруженый файл";
}
}
else{
echo '
<h2>Обновления цены и количества:</h2>
<form action="'.$_SERVER["PHP_SELF"].'" method="post" enctype="multipart/form-data">
  <input type="file" name="filename"><br>
  <input type="submit" value="Загрузить"><br>
</form>
';
}

echo '</div>';
include(PS_ADMIN_DIR.'/footer.inc.php');
?>

  • Like 3
Link to comment
Share on other sites

//ищем товар по ean13

...

//если такой товар есть, обновляем количество и цену

Проще сразу обновлять по ean без его поиска

 

А если указан не существующий ean ? mysql вернет ошибку, лучше уж так как я написал.

Link to comment
Share on other sites

Ошибки никакой не будет. Будет обновлено 0 строк. При этом в 2 раза меньше запросов выполнено.

Для определения обновлен или нет товар использовать Affected_Rows

  • Like 1
Link to comment
Share on other sites

  • 4 weeks later...

Такой вопрос, сохраняю код в файл up.php.. закачиваю в папку с админкой и запускаю в браузере.. сайт/админ/up.php

у меня открывается форма логина в админку, после ввода логин и пароля, открывается урезаная админка, точнее только её верхняя часть.. кто может подсказать в чем может быть проблема ?

Link to comment
Share on other sites

Вообщем проблема в моих скриптах престашопа, у меня стоит версия _1.3.5.0 и при запуске этого скрипта почему-то на страницу админки не вставляется форма запроса файла.. Я установил версию 1.4 на другой домен и с ней скрипт работает.. Вопрос, что нужно справить чтобы скрипт заработал на версии 1.3.5.0 . ?

Link to comment
Share on other sites

Поковырялся сам в коде, закоментировал // include(PS_ADMIN_DIR.'/header.inc.php'); после чего страница загрузилась с возможностью выбора и загрузки файла для начала обновления (думаю отсутствие данной строчки include(PS_ADMIN_DIR.'/header.inc.php' не скажется на работоспособности скрипта ? ) Но вот после добавления файла у меня пишет - Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8) .. это надо смотреть в настройках Хостинга ? Всем сори, что пишу тут глупые вопросы, уже наверно поднадоел тут всем )

Link to comment
Share on other sites

Вообщем разобрался с локалиями.. для моего хоста, в скрипте нужно было заменить локали на ru_RU.UTF-8 и en_US.UTF-8 это если вдруг у кого возникнит такая же проблема. А так скрипт работает. Все вроде хорошо. Еще раз большое спасибо автору.

Link to comment
Share on other sites

  • 2 weeks later...
Вообщем разобрался с локалиями.. для моего хоста, в скрипте нужно было заменить локали на ru_RU.UTF-8 и en_US.UTF-8 это если вдруг у кого возникнит такая же проблема. А так скрипт работает. Все вроде хорошо. Еще раз большое спасибо автору.

Поясните подробнее, как заменить локали?

Link to comment
Share on other sites

Поясните подробнее, как заменить локали?

Автор по этому поводу написал:

попробуйте просто удалить строку if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8'); if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8');

 

Заработало теперь. Написал на тот случай, если кому нужно будет.

Link to comment
Share on other sites

  • 2 weeks later...

Поясните подробнее, как заменить локали?

 

 

просто в коде скрипта тут - if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8'); if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8');

 

заменить ru_RU.utf8 на ru_RU.UTF-8 и en_US.utf8 на en_US.UTF-8

 

ну просто синтаксис названий локалий, думаю как они называются на конкретном хосте можно уточнять у хостера

 

..

 

 

а по поводу как поменять штих-код на актикул даже не знаю.. думаю нужно изменить тут

 

 

//ищем товар по ean13

$sql="SELECT id_product FROM ps_product WHERE ean13 = '".$data_f[0]."'";

$id_product = Db::getInstance()->getValue($sql,0);

 

 

 

 

конктетно поменять тут ean13 = '".$data_f[0]."'" это ean13 на то как называеться поле артикула в базе данных .. но лучше еще раз спросить автора скрипта )

Link to comment
Share on other sites

  • 4 weeks later...

что-то у меня не работает, пишет что "Невозможно открыть загруженый файл", права стоят все 777 на директории, кодировки разные пробовал, ни на 1.4.3 ни на 1.4.5 не хочет почему-то :(

 

что посоветуете попробовать еще, чтобы заработал он))

Link to comment
Share on other sites

решил проблему. вкл отображение ошибок, и там увидел что путь к директории /upload куда скрипт записывает файл не совсем тот что нужен, т.к. преста стоит не в корне сервера. создал директорию руками, дал права на запись, и все Ок.

 

Спасибо автору за скрипт!

Link to comment
Share on other sites

  • 1 month later...

Сделал обновление по атрибуту в комбинации товара(для тех кто не шарит в mysql), а вообще спасибо огромное за первоначальный скрип, респект и уважуха)

 

<?php
define('PS_ADMIN_DIR', getcwd());
include(PS_ADMIN_DIR.'/../config/config.inc.php');
include(PS_ADMIN_DIR.'/functions.php');
include(PS_ADMIN_DIR.'/header.inc.php');
echo '<div style="text-align:left;">';

// Проверяем загружен ли файл
if(is_uploaded_file($_FILES["filename"]["tmp_name"])){
// Если файл загружен успешно, перемещаем его из временной директории в конечную
move_uploaded_file($_FILES["filename"]["tmp_name"], "".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]);
$file_path="".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]."";

// Меняем кодировку файла с windows-1251 на utf-8
$file=file_get_contents("".$file_path."");
$file=iconv("windows-1251", "utf-8",$file);
file_put_contents("".$file_path."",$file);



//меняем локаль на хостинге
if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8'); if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');
if (($handle_f = fopen($file_path, "r")) !== FALSE)
{
 //начинаем цикл чтения csv
 while (($data_f = fgetcsv($handle_f,99999,";"))!== FALSE) {

  //ищем товар по reference

  $sql="SELECT id_product_attribute FROM ps_product_attribute WHERE reference = '".$data_f[0]."'";
  $id_product_attribute = Db::getInstance()->getValue($sql,0);  

  //если такой товар есть, обновляем количество и цену
  if ($id_product_attribute){	
$sql=mysql_query("UPDATE `ps_product_attribute` SET `quantity` ='".$data_f[1]."' , `price` = '".$data_f[2]."' WHERE `id_product_attribute`='".$id_product_attribute."' LIMIT 1");
echo "<p style='color:green'>товар с артикулом <b>".$data_f[0]."</b>  c кол-вом<b>".$data_f[1]."</b>  c ценой<b>".$data_f[2]."</b>обновлен</p>";
  }
  else{
echo "<p style='color:red  '>товар с артикулом <b>".$data_f[0]."</b> не найден</p>";
  }
 }
 echo "<b>Обновление завершено</b>";  

}
else{
 echo "Невозможно открыть загруженый файл";
}
}
else{
echo '
<h2>Обновления цены и количества товара по артикулу, при помощи файла csv:</h2>
<form action="'.$_SERVER["PHP_SELF"].'" method="post" enctype="multipart/form-data">
	  <input type="file" name="filename"><br><br>
	  <input type="submit" value="Загрузить"><br>
</form>
<p>Заполнять файл прайса в таком виде, разделитель точка с запятой ; </p>
<p>Либо сохранить прайс в формате csv</p>
<p><table border=1><tr><td>артикул</td><td>количество</td><td>цена</td></tr></table></p>
';
}

echo '</div>';
include(PS_ADMIN_DIR.'/footer.inc.php');
?>

  • Like 2
Link to comment
Share on other sites

  • 1 month later...

Сделал обновление по атрибуту в комбинации товара(для тех кто не шарит в mysql), а вообще спасибо огромное за первоначальный скрип, респект и уважуха)

 

 

Привет, а реально сделать следующее:

 

Скрипт ищет артикул товара, обновлет цену и количество, а если находит атрибу, то обновлетя колчиество в атрибуте, а не в основной карточке товара?

Link to comment
Share on other sites

  • 2 years later...

Может кто то уже обновился до PrestaShop™ 1.5.6.0 и может поделиться рабочим скриптом по обновлению цены и количества.

Добавление не нужно ибо хочу обновляться из прайса поставщика, а там не все нужно добавлять.

Заранее спасибо!

Edited by [email protected] (see edit history)
Link to comment
Share on other sites

Может кто то уже обновился до PrestaShop™ 1.5.6.0 и может поделиться рабочим скриптом по обновлению цены и количества.

Добавление не нужно ибо хочу обновляться из прайса поставщика, а там не все нужно добавлять.

Заранее спасибо!

_________________________________________

У меня получился такой скрип, но он почему то не работае. Вернее в БД цены поменялись, а вот в магазине нет. Кеш чистил. Что может быть подскажите. Я это скрипт никуда не внедрял. Просто запускаю отдельно.

www.moymagazin.com/admin/update.php

__________________________________________________

<?php

define('PS_ADMIN_DIR', getcwd());

include(PS_ADMIN_DIR.'/../config/config.inc.php');

include(PS_ADMIN_DIR.'/functions.php');

include(PS_ADMIN_DIR.'/header.inc.php');

echo '<div style="text-align:left;">';

 

// Подключение к Базе данных!

$link=mysql_connect('localhost','пользователь','Пароль') or die(mysql_error());

mysql_select_db('база данных');

 

 

//

if (!$link) {

die('Ошибка соединения: ' . mysql_error());

}

echo "<p style='color:green'> Успешно соеденились <b>";

//mysql_close($link);

//echo 'Соединение закрыто';

 

 

 

 

// Проверяем загружен ли файл

if(is_uploaded_file($_FILES["filename"]["tmp_name"])){

// Если файл загружен успешно, перемещаем его из временной директории в конечную

move_uploaded_file($_FILES["filename"]["tmp_name"], "".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]);

$file_path="".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]."";

 

// Меняем кодировку файла с windows-1251 на utf-8

$file=file_get_contents("".$file_path."");

$file=iconv("windows-1251", "utf-8",$file);

file_put_contents("".$file_path."",$file);

 

 

 

//меняем локаль на хостинге

if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8'); if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');

if (($handle_f = fopen($file_path, "r")) !== FALSE)

{

 

//начинаем цикл чтения csv

while (($data_f = fgetcsv($handle_f,99999,";"))!== FALSE) {

 

 

//ищем товар по артикулу

$sql="SELECT id_product FROM ps_product WHERE supplier_reference = '".$data_f[0]."'";

$id_product = Db::getInstance()->getValue($sql,0);

 

 

//если такой товар есть, обновляем количество и цену

if ($id_product){

$sql=mysql_query("UPDATE `ps_product` SET `quantity` ='".$data_f[1]."' , `price` = '".$data_f[2]."' WHERE `id_product`='".$id_product."' LIMIT 1");

echo "<p style='color:green'>товар id=".$id_product. " с артикулом <b>".$data_f[0]."</b> обновлен</p>";

}

// Закометировать нижний блок чтоб не выводить отсутствие товара

/* else{

echo "<p style='color:red '>товар с артикулом <b>".$data_f[0]."</b> не найден</p>";

} */

}

echo "<b>Обновление завершено</b>";

 

}

else{

echo "Невозможно открыть загруженый файл";

}

}

else{

echo '

<h2>Обновления цены и количества:</h2>

<form action="'.$_SERVER["PHP_SELF"].'" method="post" enctype="multipart/form-data">

<input type="file" name="filename"><br>

<input type="submit" value="Загрузить"><br>

</form>

';

}

 

echo '</div>';

include(PS_ADMIN_DIR.'/footer.inc.php');

?>

Link to comment
Share on other sites

недостаточно обновить только в ps_product,

надо ещё в ps_product_attribute и ps_product_shop[/size]

В атрибутах вообще пусто, а вот ps_product_shop действтельно цена старая.  Может подскажете как код будет выгледеть.  Или куда чего дописать. Так как я не очень силен. Собираю по крупицам.  И не лишнее ли у меня подключение к базе данных. Я его сам в инете нашел и добавил так как подумал что данные попросту не записываются в БД!

Заранее спасибо!

Link to comment
Share on other sites

Выше тебе пример указан же.

В том примере для артикулов, а не по по артикулам. Там обновляется совершенно другая таблица. А здесь есть необходимость не в той таблице, а еще что немаловажно в двух таблицах одновременно.

И так как у меня обновляется из отдельного файла не из админки, то может кто-то интегрировал это уже в саму админ панель.

Edited by [email protected] (see edit history)
Link to comment
Share on other sites

Ну вообще то что ты хочешь сделать требует определенных навыков, готовый скрипт тебе ни кто не напишет за просто так.

 

Ты можешь перевести свои артикула в ID, примерно таким кодом:

 

$articles = 'demo_1', 'demo_2', 'demo_3', 'demo_4', 'demo_5', 'demo_6', 'demo_7';
$ids = "select `id_product` from `ps_product` where `reference` in ('.$articles.')";

Код примерный, в скрипте он будет немного по другому выглядеть, к тому же если у тебя названия артикулов не в кавычках тебе придется обернуть их в кавычки по средствам php..

 

Далее тебе необходимо сопоставить ID товаров с ценой из файла и сделать update при поиске по ID товара в нужных тебе таблицах.

Link to comment
Share on other sites

Ну вообще то что ты хочешь сделать требует определенных навыков, готовый скрипт тебе ни кто не напишет за просто так.

 

Ты можешь перевести свои артикула в ID, примерно таким кодом:

 

 

$articles = 'demo_1', 'demo_2', 'demo_3', 'demo_4', 'demo_5', 'demo_6', 'demo_7';
$ids = "select `id_product` from `ps_product` where `reference` in ('.$articles.')";

Код примерный, в скрипте он будет немного по другому выглядеть, к тому же если у тебя названия артикулов не в кавычках тебе придется обернуть их в кавычки по средствам php..

 

Далее тебе необходимо сопоставить ID товаров с ценой из файла и сделать update при поиске по ID товара в нужных тебе таблицах.

 

Может так оно и правильней, но в итоге все обошлось просто добавлением одной строчки по аналогии с спредыдущим обновлением. 

Ну а по поводу "за просто так" или " не за просто так". НЕ все такие меркантильные.

 

И так что у МЕНЯ ПОЛУЧИЛОСЬ :

 

Привожу его ниже (не забываем поменять данные по Базе данных на свои)

__________________________________________

 

<?php

define('PS_ADMIN_DIR', getcwd());

include(PS_ADMIN_DIR.'/../config/config.inc.php');

include(PS_ADMIN_DIR.'/functions.php');

include(PS_ADMIN_DIR.'/header.inc.php');

echo '<div style="text-align:left;">';

 

// Подключение к Базе данных!

$link=mysql_connect('Расположение БД (например: localhost)','Польователь БД','Пароль к ДБ') or die(mysql_error());

mysql_select_db('название БД');

 

if (!$link) {

    die('Ошибка соединения: ' . mysql_error());

}

echo "<p style='color:green'> Успешно соеденились <b>";

//mysql_close($link);

//echo 'Соединение закрыто';

 

// Проверяем загружен ли файл

if(is_uploaded_file($_FILES["filename"]["tmp_name"])){

    // Если файл загружен успешно, перемещаем его из временной директории в конечную

    move_uploaded_file($_FILES["filename"]["tmp_name"], "".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]);

$file_path="".$_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["filename"]["name"]."";

 

// Меняем кодировку файла с windows-1251 на utf-8

$file=file_get_contents("".$file_path."");

$file=iconv("windows-1251", "utf-8",$file);

file_put_contents("".$file_path."",$file);

 

//меняем локаль на хостинге

if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8'); if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');

if (($handle_f = fopen($file_path, "r")) !== FALSE)

{

 

//начинаем цикл чтения csv

  while (($data_f = fgetcsv($handle_f,99999,";"))!== FALSE) {

 

 

   //ищем товар по артикулу

   $sql="SELECT id_product FROM ps_product WHERE supplier_reference = '".$data_f[0]."'";

   $id_product = Db::getInstance()->getValue($sql,0);  

 

 

   //если такой товар есть, обновляем количество и цену

   if ($id_product){    

    $sql=mysql_query("UPDATE `ps_product`, `ps_product_shop` SET `ps_product.quantity` ='".$data_f[1]."' , `ps_product.price` = '".$data_f[2]."' , ps_product_shop.price` = '".$data_f[2]."' WHERE `id_product`='".$id_product."' LIMIT 1");

    $sql=mysql_query("UPDATE `ps_product_shop` SET `price` = '".$data_f[2]."' WHERE `id_product`='".$id_product."' LIMIT 1"); // Второй update

    echo "<p style='color:green'>товар id=" .$id_product. " с артикулом <b>".$data_f[0]."</b> обновлен</p>";

 

   }

// Закометировал нижний блок чтоб не выводить отсутствие товара, оно мне не нужно

  /* else{

       echo "<p style='color:red  '>товар с артикулом <b>".$data_f[0]."</b> не найден</p>";

         } */

  }

  echo "<b>Обновление завершено</b>";  

   

}

else{

  echo "Невозможно открыть загруженый файл";

}

}

else{

echo '

<h2>Обновления цены и количества:</h2>

<form action="'.$_SERVER["PHP_SELF"].'" method="post" enctype="multipart/form-data">

      <input type="file" name="filename"><br>

      <input type="submit" value="Загрузить"><br>

</form>

';

}

 

?>

 

------------------------------------------------------------------------------------

Link to comment
Share on other sites

×
×
  • Create New...