Вы лучше собрите все правки и выложите готовый вариант.
чтобы другим не идти тропой поисков и не делать ошибок.
только опишите что он делает и елси он отличается от того что в этой теме то создайте новую тему.
Понял. Сорри. Пока делал, было не лень писать, а сейчас уже сделал и влом, но вот ниже, если коротко. Вы тогда удалите мои лишние дублирующие посты.
Была задача обновлять цены через экспорт/импорт. Вначале штатный не подходил из-за западноевропейской кодировки. А сторонние плагины не подошли, скорее всего, из-за несовместимости с версией РНР. В результате поправил родные скрипты импорта/экспорта, чтобы они работали с UTF8. Заменил колонку с датой на "старая цена". Импорт не заменяет цены, а добавляет товары по-новому. Т. е. подходит только для добавления новых товаров. Чтобы обновить цены у существующих товаров взял за основу модифицированный скрипт пользователя этого форума. Нужно с оф. сайта скачать плагин импорта в UTF8, а потом его заменить на поправленный скрипт. У того пользователя цены менялись по коду товара и только основная цена. Я поправил, что изменения вносятся по ID товара. Также кроме основной цены есть ещё старая цена.
Структура csv-файла для такого импорта такая:
product_id;old_price;price
1;0;500
2;0;900
3;1000;700
4;700;550
5;0;1100
Ниже скрипты, которые в моей версии сработали. Но нужно учитывать, что с обновлением ЖШ они могут не только не работать, но и что-то поломать. Поэтому лучше почитайте выше в моих постах логику простых действий, которую я делал, чтобы получить в штатном экспорте/импорте возможность работы с нашими буквами.
Файлы для замены:
/administrator/components/com_jshopping/importexport/simpleexport/simpleexport.php
<?php
/**
* @version 4.13.0 13.08.2013
* @author MAXXmarketing GmbH
* @package Jshopping
* [member=126442]copyright[/member] Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license GNU/GPL
*/
defined('_JEXEC') or die();
jimport('joomla.filesystem.folder');
class IeSimpleExport extends IeController{
function view(){
$app = JFactory::getApplication();
$jshopConfig = JSFactory::getConfig();
$ie_id = $this->ie_id;
$_importexport = JSFactory::getTable('ImportExport', 'jshop');
$_importexport->load($ie_id);
$name = $_importexport->get('name');
$ie_params_str = $_importexport->get('params');
$ie_params = parseParamsToArray($ie_params_str);
$files = JFolder::files($jshopConfig->importexport_path.$_importexport->get('alias'), '.csv');
$count = count($files);
JToolBarHelper::title(_JSHOP_EXPORT. ' "'.$name.'"', 'generic.png' );
JToolBarHelper::custom("backtolistie", "arrow-left", 'arrow-left', _JSHOP_BACK_TO.' "'._JSHOP_PANEL_IMPORT_EXPORT.'"', false );
JToolBarHelper::spacer();
JToolBarHelper::save("save", _JSHOP_EXPORT);
include(dirname(__FILE__)."/list_csv.php");
}
function save(){
$app = JFactory::getApplication();
include_once(JPATH_COMPONENT_SITE."/lib/csv.io.class.php");
$ie_id = $this->get('ie_id');
$_importexport = JSFactory::getTable('ImportExport', 'jshop');
$_importexport->load($ie_id);
$alias = $_importexport->get('alias');
$_importexport->set('endstart', time());
$params = $app->input->getVar("params");
if (is_array($params)){
$paramsstr = parseArrayToParams($params);
$_importexport->set('params', $paramsstr);
}
$_importexport->store();
$ie_params_str = $_importexport->get('params');
$ie_params = parseParamsToArray($ie_params_str);
$jshopConfig = JSFactory::getConfig();
$lang = JSFactory::getLang();
$db = JFactory::getDBO();
$query = "SELECT prod.product_id, prod.product_ean, prod.product_quantity, prod.product_old_price, prod.product_price, tax.tax_value as tax, prod.`".$lang->get('name')."` as name, prod.`".$lang->get('short_description')."` as short_description, prod.`".$lang->get('description')."` as description, cat.`".$lang->get('name')."` as cat_name
FROM `#__jshopping_products` AS prod
LEFT JOIN `#__jshopping_products_to_categories` AS categ USING (product_id)
LEFT JOIN `#__jshopping_categories` as cat on cat.category_id=categ.category_id
LEFT JOIN `#__jshopping_taxes` AS tax ON tax.tax_id = prod.product_tax_id
GROUP BY prod.product_id";
$db->setQuery($query);
$products = $db->loadObjectList();
$data = array();
$head = array("product_id","ean","qty","old_price","price","tax","category","name","short_description","description");
$data[] = $head;
foreach($products as $prod){
$row = array();
$row[] = $prod->product_id;
$row[] = $prod->product_ean;
$row[] = $prod->product_quantity;
// $row[] = $prod->product_old_price;
$row[] = str_replace(".", ",", $prod->product_old_price);
// $row[] = $prod->product_price;
$row[] = str_replace(".", ",", $prod->product_price);
$row[] = $prod->tax;
$row[] = $prod->cat_name;
$row[] = $prod->name;
$row[] = $prod->short_description;
$row[] = $prod->description;
$data[] = $row;
}
$filename = $jshopConfig->importexport_path.$alias."/".$ie_params['filename'].".csv";
$csv = new csv();
$csv->write($filename, $data);
if (!$app->input->getInt("noredirect")){
$app->redirect("index.php?option=com_jshopping&controller=importexport&task=view&ie_id=".$ie_id, _JSHOP_COMPLETED);
}
}
function filedelete(){
$app = JFactory::getApplication();
$jshopConfig = JSFactory::getConfig();
$ie_id = $app->input->getInt("ie_id");
$_importexport = JSFactory::getTable('ImportExport', 'jshop');
$_importexport->load($ie_id);
$alias = $_importexport->get('alias');
$file = $app->input->getVar("file");
$filename = $jshopConfig->importexport_path.$alias."/".$file;
@unlink($filename);
$app->redirect("index.php?option=com_jshopping&controller=importexport&task=view&ie_id=".$ie_id);
}
}
/administrator/components/com_jshopping/importexport/simpleexport/simpleimport.php
<?php
/**
* @version 4.13.0 13.08.2013
* @author MAXXmarketing GmbH
* @package Jshopping
* [member=126442]copyright[/member] Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license GNU/GPL
*/
defined('_JEXEC') or die();
jimport('joomla.filesystem.folder');
class IeSimpleImport extends IeController{
function view(){
$app = JFactory::getApplication();
$jshopConfig = JSFactory::getConfig();
$ie_id = $this->ie_id;
$_importexport = JSFactory::getTable('ImportExport', 'jshop');
$_importexport->load($ie_id);
$name = $_importexport->get('name');
JToolBarHelper::title(_JSHOP_IMPORT. ' "'.$name.'"', 'generic.png' );
JToolBarHelper::custom("backtolistie", "arrow-left", 'arrow-left', _JSHOP_BACK_TO.' "'._JSHOP_PANEL_IMPORT_EXPORT.'"', false );
JToolBarHelper::spacer();
JToolBarHelper::save("save", _JSHOP_IMPORT);
include(dirname(__FILE__)."/form.php");
}
function save(){
$app = JFactory::getApplication();
$jshopConfig = JSFactory::getConfig();
require_once(JPATH_COMPONENT_SITE.'/lib/uploadfile.class.php');
require_once(JPATH_COMPONENT_SITE."/lib/csv.io.class.php");
$ie_id = $app->input->getInt("ie_id");
if (!$ie_id) $ie_id = $this->get('ie_id');
$lang = JSFactory::getLang();
$db = JFactory::getDBO();
$_importexport = JSFactory::getTable('ImportExport', 'jshop');
$_importexport->load($ie_id);
$alias = $_importexport->get('alias');
$_importexport->set('endstart', time());
$_importexport->store();
//get list tax
$query = "SELECT tax_id, tax_value FROM `#__jshopping_taxes`";
$db->setQuery($query);
$rows = $db->loadObjectList();
$listTax = array();
foreach($rows as $row){
$listTax[intval($row->tax_value)] = $row->tax_id;
}
//get list category
$query = "SELECT category_id as id, `".$lang->get("name")."` as name FROM `#__jshopping_categories`";
$db->setQuery($query);
$rows = $db->loadObjectList();
$listCat = array();
foreach($rows as $row){
$listCat[$row->name] = $row->id;
}
$_products = JSFactory::getModel('products', 'JshoppingModel');
$dir = $jshopConfig->importexport_path.$alias."/";
$upload = new UploadFile($_FILES['file']);
$upload->setAllowFile(array('csv'));
$upload->setDir($dir);
if ($upload->upload()){
$filename = $dir."/".$upload->getName();
@chmod($filename, 0777);
$csv = new csv();
$data = $csv->read($filename);
if (is_array($data)){
foreach($data as $k=>$row){
if (count($row)<2 || $k==0) continue;
$tax_value = intval($row[5]);
if (!isset($listTax[$tax_value])){
$tax = JSFactory::getTable('tax', 'jshop');
$tax->set('tax_name', $tax_value);
$tax->set('tax_value', $tax_value);
$tax->store();
$listTax[$tax_value] = $tax->get("tax_id");
}
$category_name = $row['6'];
if (!isset($listCat[$category_name]) && $category_name!=""){
$cat = JSFactory::getTable("category","jshop");
$query = "SELECT max(ordering) FROM `#__jshopping_categories`";
$db->setQuery($query);
$ordering = $db->loadResult() + 1;
$cat->set($lang->get("name"), $category_name);
$cat->set("products_page", $jshopConfig->count_products_to_page);
$cat->set("products_row", $jshopConfig->count_products_to_row);
$cat->set("category_publish", 0);
$cat->set("ordering", $ordering);
$cat->store();
$listCat[$category_name] = $cat->get("category_id");
}
$product = JSFactory::getTable('product', 'jshop');
$product->set("product_ean", $row[1]);
$product->set("product_quantity", $row[2]);
// $product->set("product_old_price", $row[3]);
$product->set("product_old_price", str_replace(",", ".", $row[3]));
// $product->set("product_price", $row[4]);
$product->set("product_price", str_replace(",", ".", $row[4]));
// $product->set("min_price", $row[4]);
$product->set("min_price", str_replace(",", ".", $row[4]));
$product->set("product_tax_id", $listTax[$tax_value]);
$product->set("currency_id", $jshopConfig->mainCurrency);
$product->set($lang->get("name"), $row[7]);
$product->set($lang->get("short_description"), $row[8]);
$product->set($lang->get("description"), $row[9]);
$product->store();
$product_id = $product->get("product_id");
$category_id = $listCat[$category_name];
if ($category_name!="" && $category_id){
$_products->setCategoryToProduct($product_id, array($category_id));
}
unset($product);
}
}
@unlink($filename);
}else{
JError::raiseWarning("", _JSHOP_ERROR_UPLOADING);
}
if (!$app->input->getInt("noredirect")){
$app->redirect("index.php?option=com_jshopping&controller=importexport&task=view&ie_id=".$ie_id, _JSHOP_COMPLETED);
}
}
}
/administrator/components/com_jshopping/importexport/simpleimportutf8/simpleimportutf8.php
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.filesystem.folder');
class IeSimpleImportUtf8 extends IeController{
function view(){
$jshopConfig = &JSFactory::getConfig();
$ie_id = JRequest::getInt("ie_id");
$_importexport = &JTable::getInstance('ImportExport', 'jshop');
$_importexport->load($ie_id);
$name = $_importexport->get('name');
JToolBarHelper::title(_JSHOP_IMPORT. ' "'.$name.'"', 'generic.png' );
JToolBarHelper::custom("backtolistie", "back", 'browser.png', _JSHOP_BACK_TO.' "'._JSHOP_PANEL_IMPORT_EXPORT.'"', false );
JToolBarHelper::spacer();
JToolBarHelper::save("save", _JSHOP_IMPORT);
include(dirname(__FILE__)."/form.php");
}
function save(){
$mainframe =& JFactory::getApplication();
$jshopConfig = &JSFactory::getConfig();
require_once(JPATH_COMPONENT_SITE.'/lib/uploadfile.class.php');
require_once(JPATH_COMPONENT_SITE."/lib/csv.io.class.php");
$ie_id = JRequest::getInt("ie_id");
if (!$ie_id) $ie_id = $this->get('ie_id');
$lang = &JSFactory::getLang();
$db = &JFactory::getDBO();
$_importexport = &JTable::getInstance('ImportExport', 'jshop');
$_importexport->load($ie_id);
$alias = $_importexport->get('alias');
$_importexport->set('endstart', time());
$_importexport->store();
//get list tax
$query = "SELECT tax_id, tax_value FROM `#__jshopping_taxes`";
$db->setQuery($query);
$rows = $db->loadObjectList();
$listTax = array();
foreach($rows as $row){
$listTax[intval($row->tax_value)] = $row->tax_id;
}
//
//get list category
$query = "SELECT category_id as id, `".$lang->get("name")."` as name FROM `#__jshopping_categories`";
$db->setQuery($query);
$rows = $db->loadObjectList();
$listCat = array();
foreach($rows as $row){
$listCat[$row->name] = $row->id;
}
//
$dir = $jshopConfig->importexport_path.$alias."/";
$upload = new UploadFile($_FILES['file']);
$upload->setAllowFile(array('csv'));
$upload->setDir($dir);
if ($upload->upload()){
$filename = $dir."/".$upload->getName();
@chmod($filename, 0777);
$csv = new csv();
$data = $csv->read($filename);
if (is_array($data)){
$i = 1;
$Dubl = 1;
foreach($data as $k=>$row){
if (count($row)<3 || $k==0) continue;
// Присваиваем артикул и цену в читабельную переменную
$product_id = $row[0];
$old_price = str_replace(",", ".", $row[1]);
$price = str_replace(",", ".", $row[2]);
// Проверка Есть ли такая запись
$query = ' SELECT product_price '.
' FROM `#__jshopping_products` '.
' WHERE product_id = "'. $product_id .'"';
$db->setQuery($query);
// Возвращаем существующую запись
$know = $db->loadResult();
if ($know) {
$db->setQuery(' UPDATE `#__jshopping_products` '.
' SET product_old_price = "'. $old_price .
'" , product_price = "'. $price .
'" , min_price = "'. $price .
'" WHERE product_id = "'. $product_id .'"');
$db->query();
$db->stderr();
$Dubl++;
} else {
echo $i++;
echo " - ".$product_id."<br />";
}
}
echo $Dubl." - число обновенных записей.";
}
}else{
JError::raiseWarning("", _JSHOP_ERROR_UPLOADING);
}
/* if (!JRequest::getInt("noredirect")){
$mainframe->redirect("index.php?option=com_jshopping&controller=importexport&task=view&ie_id=".$ie_id, _JSHOP_COMPLETED);
}
*/
}
}
?>
Из бонусов, которые в то же время являются нюансами. Во всех оригинальных файлах изначально в ценах все десятичные числа идут через точку, а не запятую, как мы привыкли. А это потом при умножении цен создаёт лишнее телодвижение, которое клиентам лишний раз сложно объяснять. Я уже молчу, что если клиенту нужно только добавить товары, например, после экспорта из 1С. В общем, в моих скриптах экспорт делает замену точки на запятую, а импорты делают наоборот. Тем самым для нашей локали проблем не должно быть, но нужно учитывать этот нюанс, если вдруг случайно у клиента будет англоязычная локализация ОС.