Александр Иващенко

Александр Иващенко

С нами с 04 декабря 2012; Место в рейтинге пользователей: #522
Александр Иващенко
23 февраля 2018, 23:40
+1
В общем сделал свой рабочий плагин:
Если будут советы по его улучшению то милости просим.
<?php

switch ($modx->event->name) {

    case 'mSyncAfterImport':
        $resources = $modx->getCollection('msProduct'); // достаю все товары
        $output = '<p>Всего ресурсов: '.count($resources).'</p>';
        print $output;
        $count_not_ready = 0;
        $ress = 0;
        $output_count = 0;
        $stack = array();
        foreach ($resources as $k => $res) {  // прохожу по всем товарам
            $array = $res->getTVValue('12'); // достаю значение дополнительного поля
            $response = json_decode($array, true); // записываю дополнительное поле в массв
            $ids = $res->get('id');
            if ($response){
                $output_count = 0;
                foreach ($response as $element) { // прохожу по полям дополнительного поля
                    if ($element['count'] > 0) { // проверяю если количество больше 0
                        $output_count = 1;
                        $ress++;
                    }
                }
                if($output_count != 1){
                    $res->set('published', 0);
                    $res->save();
                    $output_count = 0;
                }
            }
            else{
                // снять ресурс с публикации
                $count_not_ready++;
                $res->set('published',0);
                $res->save();
            }
        }
    break;

}
Александр Иващенко
23 февраля 2018, 22:41
+1
Грубо говоря вот весь мой код:
в котором я разбираю это TV
[{"color":"Черный","size":"M","barCode":"2000023492996","count":0},
{"color":"Черный","size":"L","barCode":"2000023493993","count":4},
{"color":"Черный","size":"XL","barCode":"2000023494990","count":3},
{"color":"Черный","size":"XXL","barCode":"2000023495997","count":1},
{"color":"Белый","size":"M","barCode":"2000023488999","count":1},
{"color":"Белый","size":"L","barCode":"2000023489996","count":2},
{"color":"Белый","size":"XL","barCode":"2000023490992","count":4},]
И в зависимости от значения count я определяю опубликовывать ли весь ресурс (товар minishop2) на сайте или нет. Т.е. если хотя бы у одного цвета товара есть count > 0 то я публикую этот товар на сайте. Если нет то снимаю с публикации.

<?php
$resources = $modx->getCollection('msProduct'); // достаю все товары
$output = '<p>Всего ресурсов: '.count($resources).'</p>';
print $output;
$count_not_ready = 0;
$ress = 0;
$output_count = 0;
$stack = array();

foreach ($resources as $k => $res) {  // прохожу по всем товарам
    $ress++;
    $array = $res->getTVValue('12'); // достаю значение дополнительного поля
    $response = json_decode($array, true); // записываю дополнительное поле в массв
    $ids = $res->get('id');
    if ($response){
        foreach ($response as $element) { // прохожу по полям дополнительного поля
            if ($element['count'] > 0) { // проверяю если количество больше 0
                $output_count++;
                array_push($stack, $ids); // записать все id элементов у которых count > 0
            }
        }
    }
    else{
        // снять ресурс с публикации
        $count_not_ready++;
        $res->set('published',0);
        $res->save();
    }
  //$output .= '<p>['.$k.'] => '.count($resources).'</p>';
}

$unarr = array_unique($stack);

echo '<p>Всего обработано count: '.$output_count.'</p>';
echo '<p>Всего обработано: '.$ress.'</p>';
echo '<p>Всего снято с публикации: '.$count_not_ready.'</p>';
echo '<p>Всего элементов в массиве: '.count($unarr).'</p>';

unset($output_count);

$resources2 = $modx->getCollection('msProduct');

foreach ($resources2 as $k => $res_n){
    $ids = $res_n->get('id');
    echo $ids;
}
Все это я повешу на событие mSyncAfterImport

я понимаю, что код не изящный но это мой первый сниппет который я делаю сам и был бы рад Вашей помощи
Александр Иващенко
21 февраля 2018, 17:07
0
написал такой сниппет:
<?php

$array = $modx->resource->getTVValue('12'); // получаю tv с которым работаю
$response = json_decode($array, true);  //декодирую json

switch ($myparam) {
    case "size" :
        foreach ($response as $element) {
            if ($element['count'] > 0) {
                echo "<label class=\"barCode_" . $element['barCode'] . "\">
                    <span>" . $element['size'] . "</span>
                    <input type=\"radio\" name=\"options[size]\" value=\"" . $element['size'] . "\">
                </label>";
            }
            else{
                echo "<label class=\"barCode_" . $element['barCode'] . "\">
                    <span>" . $element['size'] . "</span>
                    <input type=\"radio\" name=\"options[size]\" value=\"" . $element['size'] . "\" disabled=\"disabled\">
                </label>";
            }
        }
    break;
    
    case "pcode" :
        foreach ($response as $element) {
            echo "<span class=\"barCode_" . $element['barCode'] . "\">" . $element['barCode'] . " </span>";
        }
    break;
    case "pcodetrim" :
        foreach ($response as $element) {
            echo "<span class=\"barCode_" . substr($element['barCode'], 8) . "\">" . substr($element['barCode'], 8) . " </span>";
        }
    break;
}
Как мне его передетать так, что бы для каждого $element['size'] выводились свои $element['barCode']
вывожу сниппет так в 2х местах:
[[count_snip_size? &myparam=`size`]] — размер
[[count_snip_size? &myparam=`pcode`]] — штрихкод

это лучше через js делать или на php в сниппете реализовывается?

вот страница где я вывожу этот сниппет
Там где размеры — мои размеры
И в описании там есть ширихкод

т.е. к каждому размеру выводить свой штрихкод я хочу. Подскажите пожалуйста как дальше делать
Александр Иващенко
21 февраля 2018, 14:55
0
из всего сниппета я только написал:
<?php
$array = $modx->resource->getTVValue('12'); // id моего TV
echo json_encode($array);
и мне вывело:
[{\"color\":null,\"size\":\"L\",\"barCode\":\"5600008931013\",\"count\":6},
{\"color\":null,\"size\":\"M\",\"barCode\":\"5600008930016\",\"count\":6},
{\"color\":null,\"size\":\"S\",\"barCode\":\"5600008929010\",\"count\":10},
{\"color\":null,\"size\":\"XL\",\"barCode\":\"5600008932010\",\"count\":7}]"
Александр Иващенко
19 декабря 2012, 00:59
0
Спасибо за ваши подсказки. Справился :)
вот код
<?php
$catalog_root_id = 3;
$depth = 5;

if (!$modx->hasPermission('edit_document'))
    return $modx->error->failure($modx->lexicon('access_denied'));

$miniShop = $modx->getService('minishop','miniShop',$modx->getOption('core_path').'components/minishop/model/minishop/',array());
if (!($miniShop instanceof miniShop))
    return 'Class not found!';

echo '<pre>';

$ids = $modx->getChildIds($catalog_root_id, $depth);
$docs = $modx->getCollection('modResource', array(
    'id:IN' => $ids
    ,'alias:!=' => 'f'
    ,'isfolder' => 0
));
echo "<p>Количество найденных товаров: " . count($docs) . " шт.<p>";
foreach($docs as $res) {
    if (!$good = $modx->getObject('ModGoods', array('gid' => $res->get('id')))) {
        $good = $modx->newObject('ModGoods');
    }
    $good->set('gid', $res->get('id'));
    $good->set('wid', 1);
    $good->set('price', floatval($res->getTVValue('tovarPrice')));
    $result = $good->save();
    echo $result
        ? "<p style=\"color:green\"><b>{$res->get('id')}</b> успешно обновлена цена товара с TV значения</p>"
        : "<p style=\"color:red\"><b>{$res->get('id')}</b> не удалось импортировать цену с TV значения</p>";
}

die;
Александр Иващенко
18 декабря 2012, 17:56
0
апдейт не работает

$response = $modx->runProcessor('mgr/goods/update', $arr,
		array('processors_path' => MODX_CORE_PATH.'components/minishop/processors/')
	);
Александр Иващенко
18 декабря 2012, 16:56
0
тогда тут $arr не подходит что ли так как там gid и нужно idуказывать?
$response = $modx->runProcessor('mgr/goods/update', $arr,
		array('processors_path' => MODX_CORE_PATH.'components/minishop/processors/')
	);
как то так? ->
$response = $modx->runProcessor('mgr/goods/update',
	array('id'=>$res->get('id'), 'price'=>$price, 'wid'=>1),
	array('processors_path' => MODX_CORE_PATH.'components/minishop/processors/')
);
Александр Иващенко
18 декабря 2012, 09:52
0
или нет… не сохраняет значения
в массив выводит
Array ( [gid] => 294 [wid] => 1 [price] => 9990 )
а
$response = $modx->runProcessor('mgr/goods/update', $arr,
		array('processors_path' => MODX_CORE_PATH.'components/minishop/processors/')
	);
не добивает
Александр Иващенко
18 декабря 2012, 09:49
0
я лопух :)
все есть. все отлично!
Александр Иващенко
18 декабря 2012, 09:42
0
точнее может ModGoods а не modResource?
Александр Иващенко
18 декабря 2012, 08:55
0
Вопрос заключается в том как правильно взять значение из TV и впихнуть его в переменную или массив
так не катит
$prArray["tv.tovarPrice"];
еще было пару функций которые я использовал:

$tvAr = $modx->getTemplateVar('TV_NAME')
не проканало
и еще пару вариантов
Александр Иващенко
18 декабря 2012, 08:51
0
$res      = $product->set('price', $price);
вот так цену буду менять… но это в теории на практике не работает вся конструкция
Александр Иващенко
18 декабря 2012, 08:50
0
для начала хочу взять
товар с id 294
$product = $miniShop->getProduct(294,1,2);
потом запихнуть его в массив
потом взять и в архив запихнуть tv.tovarPrice
по идее как то так: $prArray[«tv.tovarPrice»];
после сделать замену цены таким макаром

$response = $modx->runProcessor('mgr/goods/update',
array('id'=>$id, 'price'=>$price, 'wid'=>1),
array('processors_path' => MODX_CORE_PATH.'components/minishop/processors/')
);

как то так…
Александр Иващенко
18 декабря 2012, 08:47
0
ну я хочу взять значение цены из TV [«tv.tovarPrice»]
и запихать его в $product price
но из-за плохого понимания дела у еня не получается. мануала начитался — практики мало, путаюсь что куда нужно
Александр Иващенко
18 декабря 2012, 04:16
0
Просто где то тут налажал и не могу найти где
if (!$modx->hasPermission('edit_document')) {
    return $modx->error->failure($modx->lexicon('access_denied'));
}

$miniShop = $modx->getService('minishop','miniShop',$modx->getOption('core_path').'components/minishop/model/minishop/',array());
if (!($miniShop instanceof miniShop)) return 'Class not found!';

//$product  = $modx->miniShop->getProduct(294,1,2);
$product  = $modx->getObject('ModGoods', array('gid'=>294, 'wid'=>1));
//$prArray  = $product->toArray();
var_dump($product);
die;
$price    = $prArray["tv.tovarPrice"];
$id       = $prArray["id"];
$res      = $product->set('price', $price);

/*$response = $modx->runProcessor('mgr/goods/update',
	array('id'=>$id, 'price'=>$price, 'wid'=>1),
	array('processors_path' => MODX_CORE_PATH.'components/minishop/processors/')
);*/

if ($res/*$response->isError()*/) {
	echo "<p style=\"color:red\"><b>$id</b> не удалось импортировать цену с TV значения</p>";
} else {
	echo "<p style=\"color:green\"><b>$id</b> успешно обновлена цена товара с TV значения</p>";
}

die;