Перенос товаров из одной подкатегории в другую

Статус
В этой теме нельзя размещать новые ответы.

shkiper

Полезный
Регистрация
16 Ноя 2008
Сообщения
303
Реакции
19
Собственно столкнулся с проблемой, не могу перенести группу товаров из одной подкатегории в другую.
В файле цсв, товары которые хочу перенести, вручную перенёс в другую подкатегорию (каждый товар имеет свой артикул), загружаю фаил, в шоп, но доп подкатегория создаётся, а товары остаются как и были, в своих категориях, а в новой пусто. (задавал обновлять и по артиклу и по наименованию)
Какие есть соображения по этому поводу?
Сносить базу и заливать по новому не хочется, пострадает индексация.
 
для импорта надо удалить товары.
если немного - вручную в окне редактирования товара выбрать новую под/категории.
 
если удалить, то при загрузке будет новый id товара со старым артиклом:(
переносить вручную 400 шт. довига, но чувствую единственный вариант.
Думал может чё делаю не так, на локалке часа 2 вариантами игрался :D
 
Если id товара в каком-то диапазоне по порядку я бы попробовал переместить через sql - запрос в PHPMyAdmin
 
400 товаров ручками - это быстрее чем тут ждать ответа.
 
а если весь товар в корень перекинуть, а потом уже оттуда в нужный раздел переместить? Так пробовали.
 
PHP:
<?php 
	include("./cfg/connect.inc.php");
	$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die("Could not connect : " . mysql_error());
	print "Connected successfully";
	print "<br/>";
	mysql_select_db(DB_NAME) or die("Could not select database");
	$now = 80; //  ID исходной категории
	$cel = 84; //  ID целевой категории
	$str = 'Наклейки'; // объединяющее группу товаров слово
	$q = "UPDATE SS_products SET categoryID=".$cel." WHERE categoryID=".$now." AND description REGEXP '".$str."'";
	mysql_query($q) or die("Query failed : " . mysql_error());
	print "Good work! All done..!"; 
	mysql_free_result($result);
	mysql_close($conn); 
?>
Сохраняем в (например) zapros.php, закидываем на сервак в корень, пишем в строке браузера: _http://www.site.com/zapros.php (_ убрать)
Не забываем бекапить БД "на случай"..!
 
Реально тупо и долго получается переносить большое количество товара из одной категории в другую, особенно если была удалена какая либо категория и товар оказался в корневой категории.
Можно сделать дополнительную опцию в админке (в данном случае SSP 1.24:(
Открываем файл ./templates/backend/catalog_products_categories.tpl.html
Перед строкой <td width=1%>{$smarty.const.ADMIN_PRODUCT_ENABLED}</td> (у меня по умолчанию 214 строка, у вас может быть другая) вставляем код:
PHP:
<td>
                    {$smarty.const.ADMIN_CATEGORY_CHANGE}<br>
                    <select name="select_change_category" {php}
    if (CONF_FULLY_EXPAND_CATEGORIES_IN_ADMIN_MODE == 0) // update list
        echo "onChange=\"window.location='products.php?productID=".$_GET["productID"]."&change_category='+document.MainForm.categoryID.value;\"";
{/php}>
{php}
    if (CONF_FULLY_EXPAND_CATEGORIES_IN_ADMIN_MODE == 1) echo "<option value=\"1\">".ADMIN_CATEGORY_ROOT."</option>";
    //show categories select element
    $core_category = (isset($_GET["change_category"])) ? (int)$_GET["change_category"] : $product["categoryID"] ;
    if (CONF_FULLY_EXPAND_CATEGORIES_IN_ADMIN_MODE == 0)
        $cats = catGetCategoryCompactCList($core_category);
    else
        $cats = catGetCategoryCList();
    for ($i=0; $i<count($cats); $i++)
    {
        echo "<option value=\"".$cats[$i]["categoryID"]."\"";
        if ($core_category == $cats[$i]["categoryID"]) //select category
            echo " selected";
        echo ">";
        for ($j=0;$j<$cats[$i]["level"];$j++) echo "&nbsp;&nbsp;";
        echo $cats[$i]["name"];
        echo "</option>";
    }
{/php}
</select>
                <input type=submit value='Изменить' name='button_change_category'>
                </td>
далее находим строки
{section name=i loop=$products}
<tr bgcolor=#FFFFE2>
у меня они под номером (401, 402, 403)
и после них вставляем код:
PHP:
<td align="center">
                    <!--<input type=hidden name=productID value={*$products[i].productID*}>-->
                    <input type=hidden name=hidden_change_categories_{$products[i].productID} 
                        {if $products[i].enabled}value='1'{else}value='0'{/if}
                    >
                    <input type=checkbox name=checkbo_change_categories_{$products[i].productID} 
                        {*{if $products[i].enabled}checked{/if}*}
                        onclick='JavaScript:CheckBoxChangeCategories_{$products[i].productID}()'
                        >
                    <script language='JavaScript'>
                        function CheckBoxChangeCategories_{$products[i].productID}()
                        {literal}
                        {
                        {/literal}
                            if ( document.form.checkbo_change_categories_{$products[i].productID}.checked )
                                document.form.hidden_change_categories_{$products[i].productID}.value = '1';
                            else
                                document.form.hidden_change_categories_{$products[i].productID}.value = '0';
                        {literal}
                        }
                        {/literal}
                    </script>
                </td>
Сохраняем этот файл и закрываем его.
Открываем файл admin.php и в самом конце файла перед строками:
//show Smarty output
$smarty->display("backend/index.tpl.html");
вставляем следующий код:
PHP:
// change category
    if ( isset($_POST["button_change_category"]) )
    {
        $data = ScanPostVariableWithId( array( "hidden_change_categories", "select_change_category", "checkbo_change_categories" ) );
            foreach( $data as $key => $val )
            {
                if ( $val["checkbo_change_categories"] == 'on' )
                {
                $cat_change = $_POST["select_change_category"];
                $s = "UPDATE ".PRODUCTS_TABLE." SET categoryID='".$cat_change."' where productID='".$key."'";
                db_query($s) or die (db_error());
                }
            }
        Redirect("admin.php?dpt=catalog&sub=products_categories&categoryID=".$_POST['categoryID']."&expandCat=".$_POST['categoryID']);
    }
Сохраняем этот файл и закрываем его.
Открываем файл ./languages/russian.php находим строку
//different admin strings
и добавляем после нее такую строку:
define('ADMIN_CATEGORY_CHANGE', 'Изменить родительскую категорию:');
сохраняем и закрываем файл.
Как использовать:
открываете категорию из которой будете переносить товар
выбираете в выпадающем списке с именем "Изменить родительскую категорию:" категорию в которую будете переносить товар
отмечаете находящиеся под выпадающем списком чекбоксы товаров которые будете переносить и нажимаете на кнопку "Изменить" которая находится сразу под выпадающим списком категорий.
Не забываем делать бекап!
P.S. Критика приветствуется ))
 
Реально тупо и долго получается переносить большое количество товара из одной категории в другую
отмечаете находящиеся под выпадающем списком чекбоксы товаров которые будете переносить
1000 товаров...?
Да даже 100 - уже поди покликай...!
Данная ситуация (перенос) единоразовая.. Ну пусть 2 - 3 раза. И смысла дотачивать мод нету!
ИМХО - моим вышеописанным скриптом можно всё сделать за 30 секунд. Как в общем-то всё и делаю..
Недавно понадобилось очистить описания товара от ненужной инфы (наважно от чего, допустим от цвета: color:#FFA500).
Прописал в скрипт нужное, залил, выполнил. Всё! Пример скрипта ниже:
PHP:
<?php 
	include("./cfg/connect.inc.php");
	$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die("Could not connect : " . mysql_error());
	print "Connected successfully";
	print "<br/>";
	$ii = 1;
	mysql_select_db(DB_NAME)  or die("Could not select database");
	$repl = 'color:#2C618F'; // что будем удалять
	$q1 = "SELECT productID, description, name FROM SS_products WHERE description REGEXP '".$repl."'";
	$r1 = mysql_query($q1) or die("Query failed : " . mysql_error());
	while ($line = mysql_fetch_array($r1)) 
	{
		$out = str_replace($repl,'',$line[1]); // удяляем
		echo $ii; // выводим номер операции в цикле
		print " <=> ";
		echo $line[0]; // выводим productID товара
		print " <=> ";
		echo $line[2]; // выводим наименование товара
		print "<br/>";
		$q = "UPDATE  SS_products SET description='".$out."' WHERE productID=".$line[0];
		mysql_query($q) or die("Query failed : " . mysql_error()); // обновляем БД
		$ii++;
	}
	mysql_free_result($result); // чистим результат
	mysql_close($conn); // закрываем соединение
?>
Пример работы скрипта:
script.png
 
1000 товаров...?
Да даже 100 - уже поди покликай...!
да действительно долго, согласен, но не всегда можно найти "объединяющее группу товаров слово", да и не всякий администратор магаза в код полезет...
Данная ситуация (перенос) единоразовая.. Ну пусть 2 - 3 раза. И смысла дотачивать мод нету!
его ИМХО дотачивать особо не нужно, единственное, можно добавить чекбокс "Отметить все", чтобы при такой ситуации, когда подавляющее большинство товара должно быть перенесено, просто снять галочки с остающегося меньшинства.
P.S. а ваш скрипт порой незаменим, бывает, что приходится массово удалять из описания товаров что либо, может его стоит в админку интегрировать?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху