Евгений Шеронов

Евгений Шеронов

С нами с 20 мая 2015; Место в рейтинге пользователей: #30
Илья Уткин
17 марта 2017, 21:46
3
+2
Если в браузере скрипт отрабатывает нормально, а проблема только в том, чтобы запустить скрипт из консоли, можно поставить дополнение Console и написать для него скрипт для пошагового импорта. Типа такого:

<?php
if (!isset($_SESSION['Console']['galgen'])) {
    $_SESSION['Console']['galgen'] = array(
        'resource' => 0,
        'gallery' => 0
    );
}
$offsets = $_SESSION['Console']['galgen'];
$q = $modx->newQuery('modResource', array('parent' => 0));
$total = $modx->getCount('modResource', $q);
if ($total <= $offsets['resource']) {
    print '<p>Completed</p>';
    $_SESSION['Console']['completed'] = true;
    unset($_SESSION['Console']['galgen']);
    return;
}
$q->limit(1, $offsets['resource']);
$resources = $modx->getCollection('modResource', $q);
foreach ($resources as $resource) {
    print "<p>Processing resource <b>".$resource->get('pagetitle')."</b></p>";
    $catalog = scandir($modx->getOption('base_path') . 'assets/images/resources/' .
                       $resource->get('id'));
    if (count($catalog) <= $offsets['gallery']) {
        $offsets['resource']++;
        $offsets['gallery'] = 0;
    }
    if ($catalog[$offsets['gallery']] != '.' && $catalog[$offsets['gallery']] != '..'
        && !is_dir($modx->getOption('base_path') . 'assets/images/resources/' .
        $resource->get('id') . '/' .  $catalog[$offsets['gallery']])) {
        $res = $modx->runProcessor('gallery/upload', array(
            'file' => $modx->getOption('base_path') . 'assets/images/resources/' .
                      $resource->get('id') . '/' . $catalog[$offsets['gallery']],
            'id' => $resource->get('id')
          ), array(
            'processors_path' => MODX_CORE_PATH . 'components/ms2gallery/processors/mgr/'
          )
        );
        if ($res->isError()) {
            $error = $res->getAllErrors();
            $error['file'] = 'assets/images/resources/' . $resource->get('id') .
                      '/' . $catalog[$offsets['gallery']];
            print_r($error);
        } else {
            print_r($res->getObject());
        }
    } else {
        print '<p>Skip folder <b>' . $catalog[$offsets['gallery']] . '</b></p>';
    }
    $offsets['gallery']++;
    $sucsess = round($offsets['gallery'] / count($catalog), 2) * 100;
    for ($i=0; $i<=100; $i++) {
        if ($i <= $sucsess) {
            print '=';
        } else {
            print '_';
        }
    }
    print '<p>' . $sucsess.'% (remains: '.(count($catalog) - $offsets['gallery']).')</p>';
}
$_SESSION['Console']['completed'] = false;
$_SESSION['Console']['galgen'] = $offsets;
return;
Володя
16 марта 2017, 14:42
1
+1
расчет цены продукта указать параметр pointId 1
[[!AjaxSnippet?
      &snippet=`msPointsIssue.product.cost`
      &delivery=`68`
      &pointId=`1`
      &as_target=`.mspointsissue-product-cost`
]]
корзина указать параметр pointLocation
[[!msPointsIssue.Order?
&elements=`msOrder`
&tpl=`msAll.order`
&pointLocation=`1`
]]
Володя
13 марта 2017, 10:38
2
+1
решение на скорую руку


s6200.h3.modhost.pro/katalog/11991.html
$(document).on('msoptionsprice_product_action', function (e, action, form, r) {

	if (action == 'modification/get' && r.success && r.data) {
        var m = r.data.modification || {};
    	var o = r.data.options || {};
    	
    	if (m.id) {
    	    return;
    	}
    	
    	var set = false;
    	
    	$('.msoptionsprice-modifications').find('.ms2_product').each(function () {
    	
    	    var hidden = true;
    	    var w = $(this);
    	    var f = w.find('form');
    	    
    	    for (key in o) {
				if (f.find('input[name="options['+key+']"][value="' + o[key] + '"]').length) {
    	            hidden = false;
    	        }
			}
			
			if (hidden) {
			    w.hide(); 
			}
			else {
			    w.show(); 
			}
			
			w.removeClass('active');
			
		}).each(function () {
		    var w = $(this);
    	    var f = w.find('form');
    	     
			if (!set && w.is(":visible")) {
		        set = true;
		        
		        w.addClass('active');
		        msOptionsPrice.Product.action('modification/get', f[0]);
		    }
		   
		});
	
    }
});

$(document).on('click', '.msoptionsprice-modifications div.ms2_product', function () {
  
    var w = $(this);
    var f = w.find('form');
    	    
    w.parent().find('.ms2_product.active').removeClass('active');
   
    w.addClass('active'); 
    msOptionsPrice.Product.action('modification/get', f[0]);
    
});

</script>

<style>
.msoptionsprice-modifications .ms2_product {
    cursor: pointer;
}

.msoptionsprice-modifications .ms2_product.active {
    border: 3px solid #559ed1;
}
</style>
but1head
23 января 2017, 23:25
5
+5
Мини пост про node.js, не много оффтоп.
Есть у меня один проект, где планировалось вывести на карте 50к точек, много всяких карт перебрал и тд, все было долговато (около 2х секунд, т.к. файл точек весит около 10мб). Потом подумал зачем отдавать все это дело клиенту, решил написать сервер на ноде для «порционной» выгрузки в пределах видимости. Вот что получилось:
s8276.h7.modhost.pro/demo/ на карте размещен кластер на 1.000.000 точек (вес файла 135мб), даже с телефона отрабатывает моментально. Выложил все исходники на github.com/but1head/supercluster-nodejs, может кому-нибудь пригодится.
Anton
13 января 2017, 23:26
1
0
Мне сделали. Для решения проблемы нужно в файле .htaccess в корне сайта прописать в самом начале такую вот директиву:
php_value opcache.revalidate_freq 0
После обновить кеш на сайте несколько раз. И ошибки больше не будет. У меня больше нет.
Leo
Leo
16 декабря 2016, 13:38
3
0
рабочий вариант, проверено

<?php
define('MODX_API_MODE', true);
require 'index.php';		// Если файл лежит не в корне - здесь нужно указать верный путь
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

if (!isset($parents)) {$parents = 0;}		// Можно указать список категорий для поиска товаров
if (!isset($resources)) {$resources = '';}	// Можно указать конкретный список товаров

$pdo = $modx->getService('pdoFetch');
$condition = array('parents' => $parents);
$files = $pdo->getCollection('msProduct',
	array(
		'msProduct.class_key' => 'msProduct',
	),
	array(
		'class' => 'msProduct',
		'parents' => $parents,
		'resources' => $resources,
		'innerJoin' => array(
			'msProductFile' => array(
				'alias' => 'msProductFile',
				'on' => array(
					'msProduct.id = msProductFile.product_id',
					'msProductFile.parent' => 0,
					'msProductFile.type' => 'image',
				)
			)
		),
		'select' => array(
			'msProductFile' => 'all'
		),
		'sortby' => 'msProduct.id'
	)
);

echo '<pre>';
echo $pdo->getTime();
foreach ($files as $row) {
	$file = $modx->newObject('msProductFile');	
	$file->fromArray($row, '', true, true);
	
	$children = $file->getMany('Children');
	foreach ($children as $child) {
		$child->remove();
	}
	$file->generateThumbnails();
	
	// Обновляем thumb и image товара
	if ($product = $file->getOne('Product')) {
		$product->updateProductImage();
	}
}

echo microtime(true) - $modx->startTime;
Воеводский Михаил
26 ноября 2016, 09:15
4
+3
2) Это ошибка MS2 при сохранении свойств доставки. Когда-то столкнулся, но PR не подготовил, причин уже не помню. Надеюсь, Василий добавит исправление в MS2.

В файлах /core/components/minishop2/processors/mgr/settings/delivery/create.class.php и /core/components/minishop2/processors/mgr/settings/delivery/update.class.php блок
foreach ($prices as $field) {
            if ($tmp = $this->getProperty($field)) {
                $tmp = preg_replace(array('#[^0-9%\-,\.]#', '#,#'), array('', '.'), $tmp);
                if (strpos($tmp, '%') !== false) {
                    $tmp = str_replace('%', '', $tmp) . '%';
                }
                if (strpos($tmp, '-') !== false) {
                    $tmp = str_replace('-', '', $tmp) * -1;
                }
                if (empty($tmp)) {
                    $tmp = 0;
                }
                $this->setProperty($field, $tmp);
            }
        }
необходимо заменить на следующий:
foreach ($prices as $field) {
            if ($tmp = $this->getProperty($field)) {
                $isPercent = false;
                $tmp = preg_replace(array('#[^0-9%\-,\.]#', '#,#'), array('', '.'), $tmp);
                if (strpos($tmp, '%') !== false) {
                    $tmp = str_replace('%', '', $tmp) . '%';
                    $isPercent = true;
                }
                if (strpos($tmp, '-') !== false) {
                    $tmp = str_replace('-', '', $tmp) * -1;
                    if ($isPercent) {
                        $tmp .= '%';
                    }
                }
                if (empty($tmp)) {
                    $tmp = 0;
                }
                $this->setProperty($field, $tmp);
            }
        }
После этого минусовой процент начнет правильно сохраняться, а обработка такого значения в остальных местах происходит корректно.
Василий Наумкин
07 ноября 2016, 11:09
2
+2
Все нормальные дополнения будут работать без проблем с любым префиксом и папками, ибо они получается из системных настроек и констант.

Проблемы могут быть только с собственными сниппетами, которые хардкодят префикс вот так
$res = $modx->query("SELECT * FROM modx_users WHERE...");
вместо
$res = $modx->query("SELECT * FROM {$modx->config['table_prefix']}_users WHERE...");
или даже
$res = $modx->query("SELECT * FROM {$modx->getTableName('modUser')} WHERE...");
это если есть xPDO модель для этой таблицы
Сергей Шлоков
30 сентября 2016, 09:14
1
+1
Так и есть. MODx.load() просто создает JS компонент. Его нужно отрисовать — show() или render(). Поэтому и не подключается, указанных полей в разметке ещё нет.
Добавь в свой компонент этот код (после items)
listeners: {
	render: function () {
		MODx.loadRTE("regulations"); // id поля 
		MODx.loadRTE("info"); // id поля 
	}
}
Думаю, всё заведётся.
Сергей Шлоков
30 сентября 2016, 09:01
1
+1
Я думаю, причина в том, что на момент подключения MODx.loadRTE() нет ещё этих полей. Подключать не к чему. Нужно повесить подключение на событие render твоего компонента.
Для эксперимента попробуй подключить через setTimeout
Ext.onReady(function() {
	MODx.load({ xtype: "xtype-страницы компонента"});
	setTimeout(function(){
	      MODx.loadRTE("regulations"); // id поля 
	      MODx.loadRTE("info"); // id поля 
	},5000); // Сработает через 5 секунд
});