Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
gg-
gg-
29 ноября 2016, 17:24
1
+1
В общем решение оказывается на поверхности.

Переменная передается в расширенный шаблон, но закинуть ее в условие не получается. В итоге блок с переменными ставим в каждый шаблон. Меняем его по желанию. И условия начинают работать.

{extends 'template:Base'}
{block 'vars'}
  {var $city = '[[#COOKIE.city]]'}
{/block}
Володя
29 ноября 2016, 14:03
1
0
вы выводите ресурс, значит и нужно проверять есть ли такой в наличии.
if (!$modx->getCount('modResource', array('alias'=>$alias))) {
	$modx->sendErrorPage();
}
Марат Марабар
27 ноября 2016, 17:37
2
+1
Полученный чанк при ajax-запросе нужно распарсить, допустим в своём классе это можно сделать так:
private function getParserTag($content)
{
    $maxIterations = (integer) $this->modx->getOption('parser_max_iterations', null, 10);
    $this->modx->getParser()->processElementTags('', $content, false, false, '[[', ']]', array(), $maxIterations);
    $this->modx->getParser()->processElementTags('', $content, true, true, '[[', ']]', array(), $maxIterations);
        
    return $content;
}
Дмитрий
27 ноября 2016, 17:36
3
0
Пример ajax.php, который использую в последних проектах.
Работает исправно, все парсится и работает.
<?php

define('MODX_API_MODE', true);
require 'index.php';
//подключаем pdoTools
$pdo = $modx->getService('pdoTools');
// Откликаться будет ТОЛЬКО на ajax запросы
if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
    return;
}
// Сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
// Если в массиве POST нет действия - выход
if (!empty($_POST['action'])) {
    switch ($_POST['action']) {
        case 'snippetName':
            $tvs = $_POST['tvs'];
            if (!empty($tvs)) {
                $res = $pdo->runSnippet('@FILE snippets/snippetName.php', array('tvs' => $tvs));
            }
            if (empty($res)) {
                $res = 'Подходящих записей не найдено. Попробуйте упростить параметры поиска';
            }
            break;
    }
} else {
    return;
}
if (!empty($res)) {
    die($res);
}
Воеводский Михаил
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);
            }
        }
После этого минусовой процент начнет правильно сохраняться, а обработка такого значения в остальных местах происходит корректно.
Володя
14 ноября 2016, 23:10
4
+3
так я не предлагаю вам делать выборки по 5 ресурсов. Подберите то кол-во который ваш хостинг нормально обработает, например по 5000 шт. Указываете в роботс главный файл который выглядит примерно так

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://site.ru/sitemap1</loc>
</sitemap>
<sitemap>
<loc>http://site.ru/sitemap2</loc>
</sitemap>
<sitemap>
<loc>http://site.ru/sitemap3</loc>
</sitemap>
</sitemapindex>
в каждом из них вызов pdoSitemap.
вроде ничего сложного?
Василий Наумкин
12 ноября 2016, 10:27
4
+9
Покопался в исходниках и написал пока такой фикс xPDO::getCriteria():
public function getCriteria($className, $type = null, $cacheFlag = true)
{
    $c = $this->newQuery($className);
    $c->cacheFlag = $cacheFlag;
    if (!empty($type)) {
        if ($type instanceof xPDOCriteria) {
            $c->wrap($type);
        } elseif (is_array($type)) {
            $tmp = array();
            array_walk_recursive($type, function ($v, $k) use (&$tmp) {
                if (!is_numeric($k)) {
                    $tmp[$k] = $v;
                }
            });
            if (count($tmp)) {
                $c->where($tmp);
            }
        } elseif (is_scalar($type)) {
            if ($pk = $this->getPK($className)) {
                $c->where(array($pk => $type));
            }
        } else {
            $c->where($type);
        }
    }

    return $c;
}
Это запрещает все запросы на получения объекта xPDO произвольным SQL запросом. Можно использовать либо первичные ключи, либо массивы с прописанными ключами, которые будут проверены при запросе.

По моим тестам работает хорошо, желающие могут проверить на себе — это файл core/xpdo/xpdo.class.php. Предложил код автору xPDO, буду ждать ответа.
Андрей
31 октября 2016, 23:58
3
+2
Массив только лучше задавать так:
{set $a = ["5","8","9"]}
                     
{if $_modx->resource.parent in list $a}

.....

{/if}
Роман Воропаев (Volk)
19 октября 2016, 10:20
2
+1
Да, у меня точно так же, нужно просто перегенерировать превью.
Кстати все возможные ключи для массива и их значения, чтоб было понятно, что можно получить, можете глянуть, добавив в чанк следующий код:
{foreach $_pls as $key => $value}
	<p>{$key} => {$value}</p>
{/foreach}