Кирилл Бакулин

Кирилл Бакулин

С нами с 09 ноября 2016; Место в рейтинге пользователей: #1468
Павел Романов
03 июля 2023, 10:15
2
+4
Чтобы убрать атрибуты и заодно удалить слеши у одиночных тегов можно сделать плагин на событие onWebPagePrerender )):

<?php
if($modx->resource->get('content_type') == 1){
    $arr1 = array('type="text/css"', 'type="text/javascript"',' />','/>');
    $arr2 = array('','','>','>');
    $output = &$modx->resource->_output;
    $output = str_replace($arr1,$arr2,$output);    
}
Сергей
06 декабря 2022, 15:37
1
0
Может кому пригодится.

<?php
if ($modx->event->name == 'mSyncOnProductOffers') {
    $remain = json_decode(json_encode($xml->Количество), TRUE);
    $remain = $remain['0'];
    $remain_temp = $resource->get('remain');
    if ($remain != $remain_temp && $remain_temp != '') {
        $resource->set('remain', $remain);
        $resource->save();
    }
}
Alexey
09 сентября 2022, 16:09
1
0
mSync Не снимает товары с публикации перед выгрузкой. Нужно написать плагин на событие mSyncOnBeforeImport, который это делает. Как-то так:

<?php
if ($modx->event->name == 'mSyncOnBeforeImport' && $mode == 'catalog') {
    $query = $modx->newQuery('modResource');
    $query->command('update');
    $query->where(array('class_key' => 'msProduct', 'published' => 1));
    $query->set(array(
        'published' => 0
    ));
    $query->prepare();
    $query->stmt->execute();
}
Svetlana S
10 октября 2020, 20:23
1
0
Хм, сейчас вспомню)

В файле core/components/msync/model/msync/msynccataloghandler.class.php на 1383 строчке добавила в событие mSyncOnPrepareProduct параметр — id товара, его там, вроде, не было:

$this->log("Вызвано событие mSyncOnPrepareProduct для товара с uuid={$productData['uuid']}", 1);
        $response = $this->msync->invokeEvent('mSyncOnPrepareProduct', array(
            'data' => $productData,
            'parent' => $categoryId,
            'properties' => $properties,
            'custom_id' => $productId,
        ));
Затем плагин переписала так:

$eventName = $modx->event->name;

if ($eventName == 'mSyncOnPrepareProduct') {
    
    if (!empty($data['images']) && !empty($custom_id)) {
        $id = (int) $custom_id;
        
        $images = $modx->getCollection('msProductFile', ['product_id' => $id]);
        
        if (!empty($images)) {
            foreach($images as $image) {
                $image->remove();
            }
        }
    }
}
Проверяем, есть ли в полученных данных новые картинки у товара, и, если есть хотя бы одна, удаляем старые. Править исходники плохо, но пока получилось только так) Так что при обновлении компонента придется вставлять строчку заново.

На сайте с 10 000 товаров все работает. Только, если много товаров, сайт лучше разворачивать на модхосте, с хорошим запасом свободного места)
Андрей
20 июля 2020, 10:12
1
0
Была такая же задача, создал в админке новый параметр

В параметре указываешь id категории для всех новых товаров.
В файле
mskladcataloghandler.class.php






Для обновления товара и чтобы он остался в категории в которую перенесли

vectorserver
14 апреля 2020, 19:23
6
+11
Так проще и быстрее, без обид друг)
Код сниппета ParseInsta:
<?php
//ParseInsta
$cacheKey = "insta_".md5($url);

$returnCache = $modx->cacheManager->get("$cacheKey");

if(!$returnCache){
    $doc = new DOMDocument();
    $doc->loadHTMLFile($url);
    $xpath = new DOMXpath($doc);
    $sharedData = $xpath->query("//html/body/script[1]")->item(0)->textContent;
    $str = $sharedData;
    $modx->cacheManager->set($cacheKey, $str, 7200*60);
    return $str;
}

return $returnCache;
И далее JSON обрабатываем через JS или конвертуть в массив и использовать в чанках
<script>
var instaphotos = [[ParseInsta? $url=`https://www.instagram.com/explore/tags/кофесос`]];
//bla bla bla
</script>
Николай
17 марта 2020, 12:26
1
+1
IDx это menuindex. menuindex товару ставится максимальный относительно других товаров этой категории, а не относительно всех товаров. То есть товары из разных категорий могут иметь один и тот же menuindex, а значит сортировка как в админке не получится. Можно или компонентом этим воспользоваться, чтобы расставлять сортировку в категориях индивидуально, либо расставить menuindex товарам глобально, например скриптом:

<?php

function updateMenuIndex($id) {
    global $menuindex, $modx;
    
    $childsIds = $modx->getChildIds($id,1,array('context' => 'web'));                   
    if(!count($childsIds)) return;
    
    $q = $modx->newQuery('modResource');
    $q->where( ['id:IN' => $childsIds] ); 
    $q->sortby('menuindex', 'ASC');
    
    $result = $modx->getIterator('modResource', $q);
    
    foreach($result as $key=>$res) {
        $menuindex++;

        $res->set('menuindex', $menuindex);
        $res->save();
        //echo "$menuindex - {$res->pagetitle} ({$res->id})<br>";
        
        updateMenuIndex($res->get('id'));
    }
}

updateMenuIndex(0);        // id родителя в параметре
return "menuindex обновлены у $menuindex ресурсов";

А потом отсортировать товары по menuindex.
Баха Волков
06 февраля 2020, 22:07
5
+12
Не не не, не делайте так, помните или почитайте о DRY. С парсером MODX все понятно, ей сложно помочь, но феном-то полноценный шаблонизатор:

{foreach ['receiver', 'phone', 'index', 'region', 'city', 'street', 'building', 'room', 'comment', 'customfield'] as $field}
    {if $address[$field]?}
        <tr>
            <td style="{$style.th};width: 200px; font-weight: 600;">{('ms2_frontend_' ~ $field) | lexicon}: </td>
            <td style="{$style.th}">{$address[$field]}</td>
        </tr>
    {/if}
{/foreach}

8 моих строчек против твоих 80-ти
Сергей
29 октября 2018, 23:12
1
0
Через .htaccess заработало это:
RewriteEngine On
RewriteRule ^(.*)\/$ $1 [R=301,L]
Володя
11 июля 2018, 11:28
1
0
Добрый день.
1- можно переопределить getReservedEventsCriteria, в нем прописать свою логику
пример
<?php
/** @var modX $modx */
/** @var array $scriptProperties */
/** @var UserEvents $UserEvents */
switch ($modx->event->name) {
    case 'OnMODXInit':
        $corePath = $modx->getOption("userevents_core_path", null,
            $modx->getOption("core_path", null, MODX_CORE_PATH) . "components/userevents/");
        $UserEvents = $modx->getService("userevents", "UserEvents", $corePath . "model/userevents/",
            array("core_path" => $corePath));
        if (!$UserEvents) {
            return "Could not load userevents class!";
        }
        $UserEvents->addExtension('event', 'getReservedEventsCriteria', function ($data = array()) use (&$modx, &$UserEvents) {
            $filter = isset($data["filter"]) ? $data["filter"] : array();
            $reserve = isset($data["reserve"]) ? $data["reserve"] : true;
            $id = isset($data["id"]) ? (int)$data["id"] : null;
            $resource = isset($data["resource"]) ? (int)$data["resource"] : null;
            $start = isset($data["start"]) ? $data["start"] : null;
            $end = isset($data["end"]) ? $data["end"] : null;
            if (!is_null($id)) {
                $filter["Event.id:!="] = $id;
            }
            if (!is_null($resource)) {
                $filter["Event.resource"] = $resource;
            }
            if (!is_null($reserve)) {
                $filter["Status.reserve"] = $reserve;
            }
            $c = $modx->newQuery("UserEvent");
            $c->setClassAlias("Event");
            $c->leftJoin("UserEventStatus", "Status");
            $c->where($filter);
            $c->andCondition("(IF(startdate > '$start', startdate, '$start')) < (IF(enddate < '$end', enddate, '$end')) ",
                null);
            $c->sortby("IF(startdate > '$start', startdate, '$start')", "ASC");
            
            // добавить логику
            return $c;
        });
        break;
}