Павел Романов

Павел Романов

С нами с 03 марта 2014; Место в рейтинге пользователей: #43
Павел Романов
Вчера в 22:42
0
Это у Вас что-то не так ).
Смотрите логи сервера.
Павел Романов
Вчера в 22:41
0
Так в них и выводите. В $category будет ID не родителя, а категории первого уровня.
То есть если у Вас так:…
  • Ракеты (1)
    • Подкатегория 1 (2)
      • Товар 1 (3)
      • Товар 2 (4)
      • Товар 3 (5)
      • Подкатегория 2 (6)
        • Товар 4 (7)
        • Товар 5 (8)

… то для всех подкатегорий и товаров $category будет 1 (ID Ракеты) вне зависимости от вложенности.
Павел Романов
Вчера в 10:40
0
Для получения id верхней категории можно использовать pdoField, а дальше разводить. Если Ракеты, Арбузы, Магия находятся в корне (уровень указывается в topLevel), то так:
{var $category = 'pdoField' | snippet : ['topLevel' => 1, 'field' => 'id']}
{$category == 1}
    {include 'arbuzi'}
{elseif $category == 25}
    {include 'raketi'}
{elseif $category == 100}
    {include 'magic'}
{else}
{/if}
Павел Романов
13 января 2025, 12:49
1
+2
Сниппет можно сократить до такого ):
<?php
$out = [];
$table = $modx->getOption('table_prefix').'msop_colors';
if($query = $modx->query("SELECT color, pattern FROM {$table} WHERE value = '{$color}'")){
    $out = $query->fetch(PDO::FETCH_ASSOC);
}
return $out;
Павел Романов
05 ноября 2024, 17:51
1
0
Можно такой сниппет сделать и запускать через CronManager:
<?php
$sql = "SELECT id FROM {$modx->getTableName('modResource')} WHERE deleted = 0 AND published = 1";
$q = $modx->prepare($sql);
$q->execute();
$resources = $q->fetchAll(PDO::FETCH_ASSOC);
foreach ($resources as $resource) {
    $response = $modx->runProcessor('mgr/index/update', array('id' =>$resource['id']), array('processors_path' => MODX_CORE_PATH . 'components/msearch2/processors/'));
    if ($response->isError()) {
        $modx->log(modX::LOG_LEVEL_ERROR, print_r($response->getAllErrors(), true));
    }
}
Павел Романов
19 октября 2024, 13:05
0
Столкнулся с такой же проблемой.
Хоть и много воды утекло, попробуйте в файле core/model/modx/processors/security/message/getlist.class.php на 51 строке прописать не RecipientProfile.id, а RecipientProfile.internalKey:

$c->innerJoin('modUserProfile', 'RecipientProfile', 'RecipientProfile.internalKey = modUserMessage.recipient');
Павел Романов
27 июля 2024, 18:46
+1
Добавлю пять копеек )
Если указать $_SERVER['DOCUMENT_ROOT'], то, к примеру, скрипты, использующие подключение API MODX не будут работать, если они запускаются по CRON.
Павел Романов
25 июля 2024, 17:03
1
+1
В настройках TV вкладка «Параметры ввода», тип ввода «Ace»
Павел Романов
15 июля 2024, 13:19
0
Не за что )
По Evo, боюсь, не подскажу.
Павел Романов
28 мая 2024, 12:22
2
+2
Сделайте сниппет getTags:
<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->get('id'));
$table = $modx->getOption('table_prefix').'ms2_products';
if($query = $modx->query("SELECT * FROM {$table} WHERE id = {$id}")){
	$prod = $query->fetch(PDO::FETCH_ASSOC);
	$tags = json_decode($prod['tags'], 1);
	foreach($tags as $tag){
	    $out .= $modx->getChunk($tpl, array('tag' =>  $tag));
	}
}
return $out;

Вызывайте:
[[getTags? &tpl=`tag_tpl`]]

Если не на странице товара, указывайте &id:
[[getTags? &id=`[[+id]]` &tpl=`tag_tpl`]]

Чанк tag_tpl:
<a href="/search/?[[+tag]]" class="some-class">[[+tag]]</a>
Павел Романов
04 мая 2024, 13:27
2
+3
Так вроде, пошустрее будет ):
$sql = "
    SELECT tvr.value, tv.caption
    FROM {$modx->getTableName('modTemplateVarResource')} tvr
    LEFT JOIN {$modx->getTableName('modTemplateVar')} tv
    ON tv.id = tvr.tmplvarid 
    WHERE tvr.contentid = {$id} AND tv.category = {$category}
";
$q = $modx->prepare($sql);
$q->execute();
$resources = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($resources as $resource){
    $out .= $modx->getChunk($tpl, $resource);
}
return $out;

В чанке [[+caption]] и [[+value]]:
<div class="item-parent">
    <div class="row">
        <div class="col-9 pr-0">
            <span class="caption">[[+caption]]:</span>
            <div class="item-bg" data-rating="[[+value]]"></div>
        </div>
        <div class="col-3">
            <span class="rating">[[+value]]/10</span>
        </div>
    </div>
</div>

Кстати, верный ID категории можно узнать в Элементы » Категории.
Павел Романов
29 апреля 2024, 12:40
+1
Если $data — массив с номером, товарами и датой, можно так:
<?php
$pdo = $modx->getService('pdoTools');
$data['count_products'] = count($data['products']);
return $pdo->getChunk('pdfHtmlTemplate', $data);

В чанке pdfHtmlTemplate:
{$num}
{$date}
{$products}
{$count_products}
Павел Романов
24 апреля 2024, 13:08
+1
Да, плагин не нужен.
Кстати, кроме aftersave, которое срабатывает после сохранения, есть еще beforecave и validate
Павел Романов
24 апреля 2024, 11:00
+1
В конфигурации можно указать сниппет-хук:


Данные доступны в $_POST.
Павел Романов
10 апреля 2024, 17:36
0
Это да, но при следующем обновлении miniShop2 этот файл перепишется и изменения пропадут.
С плагином так не случится.
Павел Романов
10 апреля 2024, 11:13
1
0
Добавьте поле в таблицу (например, new_field) и сделайте плагин на событие OnMODXInit
<?php
$modx->loadClass('msProduct');
$modx->map['msProduct']['fields']['new_field'] = '';
$modx->map['msProduct']['fieldMeta']['new_field'] = array(
    'dbtype' => 'varchar',
    'phptype' => 'string',
    'precision' => '190',
    'null' => false,
    'default' => '',
);

Естественно, тип данных может быть разным.
Примеры полей можно посмотреть в файле core/components/minishop2/model/minishop2/mysql/msproduct.map.inc.php
Павел Романов
04 апреля 2024, 12:02
2
0
Можно пойти другим путем:
@EVAL 
$gp = $modx->runSnippet('grandparent');
return $modx->runSnippet('pdoResources',array(
    'parents' => $gp,
    'templates' => 4,
    'limit' => 0,
    'tpl' => '@INLINE [[+pagetitle]] ([[+id]])==[[+id]]',
    'outputSeparator' => '||'
));
Павел Романов
20 марта 2024, 20:08
1
+2
Они шлют прямыми запросами на assets/components/ajaxform/action.php.
Сделайте сниппет chkbot:
<?php
$_SESSION['afchk'] = 1;
return true;

Добавьте его в &preHooks:
[[!AjaxForm?
&preHooks=`chkbot`
&hooks=`spam,email`
...
]]

А в файле assets/components/ajaxform/action.php на 23 строке добавьте:
if($_SESSION['afchk'] != 1){
    echo  $AjaxForm->success('Сообщение успешно отправлено.');
    die();
}
unset($_SESSION['afchk']);