Stan Ezersky

Stan Ezersky

С нами с 18 февраля 2014; Место в рейтинге пользователей: #29
Василий Наумкин
30 ноября 2015, 14:40
3
+1
Сниппеты MODX могут возвращать исключительно строки, так уже повелось. $modx->fromJSON не нужен, Fenom умеет сам это делать:
{set $result = json_decode($_modx->runSnippet('snippet'), 1)}

Можно еще вот так:
{var $resources = $_modx->getResources(
    ['published' => 1, 'deleted' => 0],
    ['sortby' => 'id', 'sortdir' => 'ASC', 'limit' => 50]
)}
{foreach $resources as $resource}
    {$_modx->getChunk('@INLINE <p>{$id} {$pagetitle}</p>', $resource)}
{/foreach}
Но это только для ресурсов.
Павел Гвоздь
02 ноября 2015, 11:01
1
+1
И если уж используешь Fenom, то зачем вызывать настройки стандартом [[++site_name]], когда можно так:
{$_modx->config.site_name}
?

Тем более условия вроде этого:
[[*content:default=`<div class="uk-alert uk-alert-large">Страница не заполнена!</div>`]]

Лучше уж так:
{$_modx->resource.content?: 'пусто'}
Андрей Копп
15 октября 2015, 20:07
2
0
Рабочий вариант плагина:

<?php
switch ($modx->event->name) {
    case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
        $miniShop2 = $modx->getService('minishop2','miniShop2',
        	MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
        if (!($miniShop2 instanceof miniShop2)) return '';
        
        // Инициализируем класс в текущий контекст
        $miniShop2->initialize($modx->context->key, $scriptProperties);
        $total_count = $miniShop2->cart->status()['total_count'];
        $tmp = $miniShop2->cart->get();
        if ($total_count > 499) { // если 5 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount5 = $product->get('discount5');
                	$opt = $realPrice*$discount5/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 99) { // если 10 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount4 = $product->get('discount4');
                	$opt = $realPrice*$discount4/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 29) { // если 30 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount3 = $product->get('discount3');
                	$opt = $realPrice*$discount3/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 9) { // если 100 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount2 = $product->get('discount2');
                	$opt = $realPrice*$discount2/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 4) { // если 500 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount1 = $product->get('discount1');
                	$opt = $realPrice*$discount1/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        else {
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$tmp[$key1]['price'] = $realPrice;
                }
            }
        }
        $miniShop2->cart->set($tmp);
        break;
}
Осталось теперь придумать как это всё менять на лету, на странице с товаром и в корзине при оформлении заказа, может кто-нибудь в курсе как дописать этот скрипт, чтобы считалось всё на лету?

<script type="text/javascript">
$('#msCart input[name="count"]').change(function(){
	var count = $(this).val(); 
	var singlePrice = parseInt($(this).closest('.tab_row').children(".tab_sum").text());

	$(this).closest('.tab_row').children(".tab_pr").children("span").html(count * singlePrice);
});
</script>
Василий Наумкин
18 мая 2015, 23:54
1
0
Включай фантазию!

[[+pagetitle]]	- {$pagetitle}
[[*pagetitle]]	- {$modx->resource->pagetitle}
[[%lexicon]]	- {$modx->lexicon('lexicon')}
[[~[[+id]]]]	- {$modx->makeUrl($id)}
Андрей
Андрей
01 марта 2015, 20:35
1
+3
Ну если не ошибаюсь, то так:

[[!getTickets?
&leftJoin=`{
		"View": {
			"class": "TicketView",
			"on": "Ticket.id = View.parent"
		}
	}`
&select=`{
		"Ticket": "*",
		"View": "COUNT(View.parent) as views"
	}`
&groupby=`Ticket.id`
&sortby=`views`
]]
Василий Наумкин
18 февраля 2015, 21:43
3
+1
Перейти в директорию сайта в консоли сервера, затем набрать:
mkdir ./Extras
cd ./Extras
git clone https://github.com/bezumkin/mSearch2.git
php ./mSearch2/_build/build.transport.php
Готовый пакет лежит в ./core/packages/.
Теперь нужно зайти в управление пакетами админки, поискать его там локально и установить.

Куда проще — я не знаю.
Наумов Алексей
12 февраля 2015, 14:14
3
0
[[!getTickets:default=`<p class="warning">У вас нет ни одного черновика.</p>`?
  &tpl=`blogs.Post.Draft.Row`
  &limit=`0`
  &parents=`0`
  &fastMode=`1`
  &showUnpublished=`1`
  &user=`[[+modx.user.id]]`
  &where=`{"published": 0}`
]]
Николай
13 октября 2014, 15:56
3
+1
Да, все больше чем элементарно.
Вариантов решения несколько. Какой будет лучше конкретно вам — решайте сами.
1. В лоб редактирование класса корзины. Находится он тут:
/core/components/minishop2/model/minishop2/mscarthandler.class.php
Интересовать вас будет функция add, и строчка
$price = $product->getPrice();
Работаете непосредственно с ней.

2. Расширить класс корзины, и манипулировать ценой в новом классе. Преимущество перед предыдущим способом в том, что после обновления ms2 все перезапишется, а тут нет. Но и сложнее реализация.
Информацию по этому ищите в поиске, я не могу точно вспомнить где об этом писал Василий.

3. Плагины. Вам нужно создать плагин, который на событие msOnBeforeAddToCart будет пересчитывать цену.
* Also you can modify $count and $options variables by add values to $this->modx->event->returnedValues
<?php
  if ($modx->event->name = 'msOnBeforeAddToCart') {
  $values = & $modx->event->returnedValues;
  $values['count'] = $count + 10;
  $values['options'] = array('size' => '99');
}
*
 * */
Пример взят из файла с классом корзины. Я лично использовал 1 способ, т.к делал для себя.
Денис Богдановский
04 октября 2014, 23:26
1
0
У меня была такая же ошибка. Решил следующим образом. Что бы понять на что конкретно идет ругань в логе сделайте следующее.

Нужно открыть файл modx.class.php (сайт\core\model\modx\modx.class.php)
Далее ищете строку:

} else {
        $this->log(modX::LOG_LEVEL_ERROR, '`' . $id . '` is not a valid integer and may not be passed to makeUrl()');
    }
    return $url;
}


Заменяете её вот на это. (на всякий случай бэкап файла сделайте modx.class.php)

} else {
        $this->log(modX::LOG_LEVEL_ERROR, '`' . $id . '` is not a valid integer and may not be passed to makeUrl()');
        /*** print the stack trace to the MODx log ***/
        try {
            throw new Exception('catch this...');
        }
        catch (Exception $e) {
            $this->log(modX::LOG_LEVEL_ERROR, $e->getTraceAsString());
        }
        /*********************************************/
    }
    return $url;
}
Сохраните файл и поюзайте сайт что бы спровоцировать ошибку, а потом откройте лог.

Там будет примерно вот что:

[2010-11-17 22:30:39] (ERROR @ /index.php) `[[+id]]` is not a valid integer and may not be passed to makeUrl()
[2010-11-17 22:30:39] (ERROR @ /index.php)
#0 <your_site_root>htdocs\core\model\modx\modparser.class.php(955): modX->makeUrl('[[+id]]', '', '', -1)
#1 <your_site_root>htdocs\core\model\modx\modparser.class.php(379): modLinkTag->process(NULL)
#2 <your_site_root>htdocs\core\model\modx\modparser.class.php(165): modParser->processTag(Array, false)
#3 <your_site_root>htdocs\core\model\modx\modchunk.class.php(93): modParser->processElementTags('[[$ysp.login_pa...', '<div class="ysp...', false, false, '[[', ']]', Array, 10)
#4 <your_site_root>htdocs\core\model\modx\modx.class.php(1558): modChunk->process(Array)
#5 <your_site_root>htdocs\core\components\login\model\login\login.class.php(165): modX->getChunk('ysp.login_panel...', Array)
#6 <your_site_root>htdocs\core\cache\elements\modsnippet\2.include.cache.php(289): Login->getChunk('ysp.login_panel...', Array, 'modChunk')
#7 <your_site_root>htdocs\core\model\modx\modscript.class.php(48): elements_modsnippet_2(Array)
#8 <your_site_root>htdocs\core\model\modx\modx.class.php(1528): modScript->process(Array)
#9 <your_site_root>htdocs\core\components\mycp\elements\ysplogin.snippet.php(12): modX->runSnippet('Login', Array)
#10 <your_site_root>htdocs\core\cache\elements\modsnippet\24.include.cache.php(7): include('...')
#11 <your_site_root>htdocs\core\model\modx\modscript.class.php(48): elements_modsnippet_24(Array)
#12 <your_site_root>htdocs\core\model\modx\modparser.class.php(416): modScript->process(NULL)
#13 <your_site_root>htdocs\core\model\modx\modparser.class.php(165): modParser->processTag(Array, true)
#14 <your_site_root>htdocs\core\model\modx\modresponse.class.php(63): modParser->processElementTags('', '<!--? *? * defa...', true, false, '[[', ']]', Array, 10)
#15 <your_site_root>htdocs\core\model\modx\modrequest.class.php(110): modResponse->outputContent(Array)
#16 <your_site_root>htdocs\core\model\modx\modx.class.php(815): modRequest->prepareResponse()
#17 <your_site_root>htdocs\core\model\modx\modx.class.php(852): modX->sendForward('1', Array)
#18 <your_site_root>htdocs\core\model\modx\modrequest.class.php(146): modX->sendErrorPage()
#19 <your_site_root>htdocs\core\model\modx\modrequest.class.php(88): modRequest->getResource('id', 'favicon.ico')
#20 <your_site_root>htdocs\core\model\modx\modx.class.php(1072): modRequest->handleRequest()
#21 <your_site_root>htdocs\index.php(93): modX->handleRequest()
#22 {main}
item #0 содержит некорректный вызов makeUrl(), а в item #3: показан чанк в котором нужно внести изменение, скорее всего заменить [[+id]] на [[*id]] или [[~[[+id]]]] заменить на [[~[[*id]]]].

Не забудьте откатить modx.class.php
Василий Наумкин
02 февраля 2014, 07:28
1
+1
<?php
include_once('class/class.youtubelist.php');

$video = new youtubelist('playlist');
$video->set_playlist ('вывод данных с TV');
$video->set_max(50);
$video->set_order('relevance');
$video->set_cachexml(false);
$video->set_cachelife(86400);
$video->set_xmlpath('./cache/');
$video->set_lang('en');
$video->set_start(1);
$video->set_time('all_time');
$video->set_descriptionlength(300);
$video->set_titlelength(75);

/** @var pdoTools $pdo */
$pdo = $modx->getService('pdoTools');
if (empty($tpl)) {$tpl = '@INLINE <li><p>[[+title]]</p><span class="time">[[+time]]</span><a class="videoThumb" href="http://www.youtube.com/watch?v=[[+videoid]]">[[+description]]</a></li>';}

$output = '';
if ($video->get_videos() != null) {
	foreach ($video->get_videos() as $video) {
		$output = $pdo->getChunk($tpl, $video);
	}
}
else {
	$output = '<li>Извините, нет видео</li>';
}

return $output;