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

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

С нами с 03 марта 2014; Место в рейтинге пользователей: #70
Павел Романов
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']);
Павел Романов
28 февраля 2024, 11:18
0
Есть системная настройка mse2_index_fields, где можно указать что индексировать.
Попробуйте оставить там только pagetitle:5 и переиндексируйте.
Павел Романов
20 февраля 2024, 12:07
0
Либо добавьте свой пакет в системную настройку extension_packages, либо используйте параметр loadModels.
И если в базе нет поля publishedon, то укажите сортировку по существующему полю:

{'pdoResources' | snippet : [
    'loadModels' => 'название пакета',
    'class' => 'Cities',
    'sortby' => '{ "id":"DESC" }'
]}
Павел Романов
15 февраля 2024, 14:25
+1
Да, естественно. Можно добавить в скрипт:
<?php
$tvid = 123; // ID TV-шки
$vendor = 'Производитель' // Название производителя
$template = 6; // ID шаблона товара

if(!function_exists('removeDirectory')){
    function removeDirectory($dir){
        if ($objs = glob($dir."/*")) {
            foreach($objs as $obj) {
                is_dir($obj) ? removeDirectory($obj) : unlink($obj);
            }
        }
        rmdir($dir);
    }    
}

$sql = "SELECT * FROM {$modx->getTableName('modTemplateVarResource')} WHERE tmplvarid = {$tvid}"; 
$q = $modx->prepare($sql);
$q->execute();
$tvs = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($tvs as $tv) {
    if($tv['value'] != $vendor) continue; // если название не то, пропускаем
    if(!$resource = $modx->getObject('modResource', array('id' => $tv['contentid'], 'template' => $template)) continue; // если нет ресурса с таким ID и шаблоном, пропускаем
    $dir = MODX_ASSETS_PATH.'images/products/'.$tv['contentid'].'/';
    removeDirectory($dir);    
    $resource->remove(); // удаляем ресурс
}
Павел Романов
15 февраля 2024, 12:20
0
Все ID и классы оберток присутствуют?
По умолчанию должно быть так:
<div id="pdopage">
    <div class="rows">
        [[!pdoPage?
            /// параметры
        ]]
    </div>
    [[!+page.nav]]
</div>
Павел Романов
15 февраля 2024, 12:09
1
0
Что-то типа этого (бэкап базы только сделайте):
<?php
$tvid = 123; // ID TV-шки
$vendor = 'Производитель' // Название производителя
$template = 6; // ID шаблона товара

$sql = "SELECT * FROM {$modx->getTableName('modTemplateVarResource')} WHERE tmplvarid = {$tvid}"; 
$q = $modx->prepare($sql);
$q->execute();
$tvs = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($tvs as $tv) {
	if($tv['value'] != $vendor) continue; // если название не то, пропускаем
   	if(!$resource = $modx->getObject('modResource', array('id' => $tv['contentid'], 'template' => $template)) continue; // если нет ресурса с таким ID и шаблоном, пропускаем
	$resource->remove(); // удаляем ресурс
}