Всего 123 803 комментария

Егор
28 мая 2024, 14:10
0
Там это отдельное поле «Теги» (список автодополнение).
В том то и дело, что все используют какие-то свистелки и… к тегам, а обычный, классический способ для zoomx нигде не написан. Я написал автору дополнения, вряд ли он ответит, конечно, но вдруг.
На счет коммерческого предложения, спасибо, откажусь. Потому что во-первых, нищеброд, а во-вторых, делаю не коммерческий сайт для себя, типа как хобби о рыбалке. Спасибо за ваш ответ!
Алексей
28 мая 2024, 13:57
+1
Добрый день.
Делал вот на этом сайте АнтикМагаз. Там называются метки товаров. Там это отдельное поле «Теги» (список автодополнение). Если надо, напишу как.
Вот здесь описывал Облако тегов для miniShop2
Илья
28 мая 2024, 13:56
0
Посмотрите пожалуйста:
Не могу разобраться, ругается на синтаксис. У меня сайт на fenom. В стандартной транскрипции работает, а в fenom выдаёт ошибку. Всё перепробовал, в глазах рzбит.

Работает:

[[!ms2GalleryResources?
    &tpl=`proekt-item-portfolio`
    &parents=`394`
    &limit=`6`
    &where=`["1 = 1 AND FIND_IN_SET('[[*portfolio_item]]', replace(portfolio_item, '||', ','))"]`
    &includeThumbs=`medium`
    &includeTVs=`portfolio_item`
    &depth=`0`
    &showLog=`1`
]]

Не работает:

{'!ms2GalleryResources' | snippet : [
    'tpl' => 'proekt-item-portfolio'
    'parents' => '394'
    'limit' => '6'
    'where' => ["1 = 1 AND FIND_IN_SET("~$_modx->resource.portfolio_item~", replace(portfolio_item, '||', ','))"],
    'includeThumbs' => 'medium'
    'includeTVList' => 'portfolio_item'
    'depth' => '0'
    'showLog' => '1'
]}
showLog:
0.0000520: Loaded model "ms2gallery" from "/core/components/ms2gallery/model/"
0.0000269: pdoTools loaded
0.0000110: xPDO query object created
0.0002151: Included list of tvs: portfolio_item
0.0000780: leftJoined msResourceFile as medium
0.0000532: leftJoined modTemplateVarResource as TVportfolio_item
0.0000861: Added selection of modResource: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000072: Added selection of msResourceFile: `url` as `medium`,`name` as `medium.name`,`description` as `medium.description`,`createdon` as `medium.createdon`,`createdby` as `medium.createdby`,`properties` as `medium.properties`,`alt` as `medium.alt`,`add` as `medium.add`
0.0000041: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `tv.portfolio_item`
0.0000072: Replaced TV conditions
0.0004930: Processed additional conditions
0.0005889: Added where condition: 0=1 = 1 AND FIND_IN_SET(Блок-контейнеры, replace(`TVportfolio_item`.`value`, '||', ',')), modResource.parent:IN(394), modResource.published=1, modResource.deleted=0
0.0000019: Replaced TV conditions
0.0000300: Sorted by modResource.publishedon, DESC
0.0000010: Limited to 6, offset 0
0.0001161: SQL prepared "SELECT `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`alias_visible`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, `medium`.`url` as `medium`, `medium`.`name` as `medium.name`, `medium`.`description` as `medium.description`, `medium`.`createdon` as `medium.createdon`, `medium`.`createdby` as `medium.createdby`, `medium`.`properties` as `medium.properties`, `medium`.`alt` as `medium.alt`, `medium`.`add` as `medium.add`, IFNULL(`TVportfolio_item`.`value`, '') AS `tv.portfolio_item` FROM `kfsz8k4f2Ra7_site_content` AS `modResource` LEFT JOIN `kfsz8k4f2Ra7_ms2_resource_files` `medium` ON `medium`.`resource_id` = `modResource`.`id` AND `medium`.`parent` != 0 AND `medium`.`path` LIKE '%/medium/%' AND `medium`.`active` = 1 AND `medium`.`rank` = 0 LEFT JOIN `kfsz8k4f2Ra7_site_tmplvar_contentvalues` `TVportfolio_item` ON `TVportfolio_item`.`contentid` = `modResource`.`id` AND `TVportfolio_item`.`tmplvarid` = 19 WHERE  ( 1 = 1 AND FIND_IN_SET(Блок-контейнеры, replace(`TVportfolio_item`.`value`, '||', ',')) AND `modResource`.`parent` IN (394) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 )  ORDER BY modResource.publishedon DESC LIMIT 6 "
0.0002279: Could not process query, error #1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Блок-контейнеры, replace(`TVportfolio_item`.`value`, '||', ',')) AND `modResource`.`pa' at line 1
0.0015500: Total time
2 097 152: Memory usage
Сергей
28 мая 2024, 13:22
0
Может кто сталкивался с подобной проблемой, у меня не создаются блоки на главной странице, на внутренних работает все прекрасно.
Ошибка при заходе на страницу: assets/components/pageblocks/connector.php 500 (Internal Server Error) ext-base.js 21

Изначально вроде работало, сейчас не могу понять в чем причина.

И это еще как-то связанно с типом ресурса, если выбрать не Документ а статический ресурс, то ошибка пропадает.
Егор
28 мая 2024, 12:47
0
Спасибо больше! На fenom, наверное, будет работать. На zoomx не работает. Пути проверил, файлы все загрузил. Это трудная дорога…
Павел Романов
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>
Алексей Смирнов
28 мая 2024, 10:31
+1
да в этом случае необходимо воспользоваться информацией которая тут: ссылка на многотекстаиполезного #23005
Илья
28 мая 2024, 10:19
0
Спасибо! Этот вариант работает.

т.е. там нет двух или трех id через запятую
Да, может быть несколько ID. Подскажите, в этом случае только через FIND_IN_SET?
Баир
28 мая 2024, 03:49
0
Можете помочь с поиском утечки? Я просто даже не знаю, что делать. Руководство требует разобраться, а я ничего не могу сделать(
Егор
28 мая 2024, 02:09
0
Да, спасибо! Оно.
Нужно было создать файл «modifier.field.php» и положить его в папку:
«core/components/zoomx/smarty/plugins/» и все заработало.

Содержимое файла «modifier.field.php»:
<?php
/*
 * Smarty plugin
 * -------------------------------------------------------------
 * Файл:    modifier.field.php
 * Тип:     modifier
 * Имя:     field
 * Назначение:  Get a field of the specified resource.
 * -------------------------------------------------------------
 */
function smarty_modifier_field($id, $field)
{
    global $modx;

    $id = (int)$id;
    if ($id && $resource = $modx->getObject('modResource', ['id' => $id])) {
        return $resource->{$field};
    }

    return null;
}

или

<?php
// Плагин
// Событие OnModxInit

if ($modx->context->key !== 'mgr') {
    function fieldModifier($id, $field)
    {
        global $modx;
    
        $id = (int)$id;
        if ($id && $resource = $modx->getObject('modResource', ['id' => $id])) {
            return $resource->{$field};
        }
    
        return null;
    }

    // Регистрируем функцию модификатора
    $smarty = parserx();
    $smarty->registerPlugin("modifier","field", "fieldModifier");
}

(продублирую на всякий случай)

{5|field:"pagetitle"}
// Можно вернуть дефолтное значение
{5|field:"pagetitle"|default:"Ресурс не найден!"}
svvtx
28 мая 2024, 00:51
+1
{$parent_id = 'parent'|resource} //Получаем id родителя
{$grand_parent_id = $parent_id|field:'parent'} //Получаем id дедушки
{$grand_parent_id|field:'pagetitle'} //выводим заголовок
Не тестил, но должно работать.
Как добавить модификатор field modzone.ru/blog/2020/12/19/zoomx-creating-smarty-plugins/
Перед и после | в смарти нельзя ставить пробелы.
Алексей Смирнов
27 мая 2024, 23:13
+1
Вы мешаете синтаксис фенома и phx MODX.
Запишите все на феноме для начала:
{var $output = 'ms2GalleryResources' | snippet: [
    'tpl' => 'proekt-item-portfolio',
    'parents' => '394',
    'where' => '{ "connection:=":"'~$_modx->resource.connection~'","connection:!=":"1"}',
    'limit' => '6',
    'includeThumbs' => 'medium',
    'includeTVList' => 'days, connection, video',
    'depth' => '0',
    'showLog' => '1'
]}
{if $output}
<h3 class="text-center">{$_modx->resource.connection} в наличии</h3>
<div class="row flex-content-center">
{$output}
</div>
{/if}
и если не сработает можно двигаться дальше.
например у вас гарантированно в ТВ поле connection Находится один id? те там нет двух или трех id через запятую?
Артур Шевченко
27 мая 2024, 18:33
+1
Скорее всего нужно использовать FIND_IN_SET
Артур Шевченко
27 мая 2024, 18:26
+1
Оперативной памяти серверу не хватает. Надо искать утечку. Скорее всего где-то есть самописный сниппет, который получает из БД много объектов.
Андрей
27 мая 2024, 15:45
0
@Илья Уткин В дополнение к правкам плагина.

Вчера лег СДЭК, его апи не работает.

У клиента сайт на Modx 2.8.3 + miniShop2 3.0.7 + ms_CDEK2 2.1.2 + CDEKIntegrate 1.1.10

После того как легло API СДЭКА клиентский сайт начал выдавать 500 ошибку при попытке просмотра заказов в админке и оформление заказов на фронте.

Пришлось деинсталировать плагин, чтобы магазин заработал.

По логам вот так

[27-May-2024 15:16:52 Europe/Moscow] PHP Fatal error: Uncaught CdekSDK2\Exceptions\RequestException: Idle timeout reached for «api.cdek.ru/v2/oauth/token». in /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php:246
Stack trace:
#0 /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php(192): CdekSDK2\Http\Api->request('POST', 'https://api.cde...', Array)
#1 /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php(149): CdekSDK2\Http\Api->post('/oauth/token', Array)
#2 /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Client.php(210): CdekSDK2\Http\Api->authorize()
#3 /home/.../public_html/core/components/cdekintegrate/model/cdekintegrate.class.php(82): CdekSDK2\Client->authorize()
#4 /home/.../public_html/core/xpdo/xpdo.class.php(1235): cdekIntegrate->__construct(Object(modX), Array)
#5 /home/.../public_html/core/cache/includes/elements/modplugin/39.include.cache.php(5): xPDO->getService('cdekIntegrate', 'cdekIntegrate', '/home/f/f4udest...', Array)
#6 /home/.../public_html/core/model/modx/modscript.class.php(76): include('/home/f/f4udest...')
#7 /home/.../public_html/core/model/modx/modx.class.php(1674): modScript->process(NULL)
#8 /home/.../public_html/core/components/minishop2/model/minishop2/minishop2.class.php(1045): modX->invokeEvent('msOnCreateOrder', Array)
#9 /home/.../public_html/core/components/minishop2/handlers/msorderhandler.class.php(432): miniShop2->invokeEvent('msOnCreateOrder', Array)
#10 /home/.../public_html/core/components/minishop2/model/minishop2/minishop2.class.php(207): msOrderHandler->submit(Array)
#11 /home/.../public_html/core/cache/includes/elements/modplugin/22.include.cache.php(20): miniShop2->handleRequest('order/submit', Array)
#12 /home/.../public_html/core/model/modx/modscript.class.php(76): include('/home/f/f4udest...')
#13 /home/.../public_html/core/model/modx/modx.class.php(1674): modScript->process(NULL)
#14 /home/.../public_html/core/model/modx/modrequest.class.php(70): modX->invokeEvent('OnHandleRequest')
#15 /home/.../public_html/core/model/modx/modx.class.php(1461): modRequest->handleRequest()
#16 /home/.../public_html/index.php(54): modX->handleRequest()
#17 /home/.../public_html/assets/components/minishop2/action.php(12): require('/home/f/f4udest...')
#18 {main}
thrown in /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php on line 246

Хорошо бы добавить проверку на доступность API СДЭКА, чтобы сайты не падали.

А так плагин очень нужный и экономит много времени менеджеру.
Giant Dad
27 мая 2024, 15:29
0
Прошу прощения, оказалось mspTinkoff криво установился и не отрабатывал при оформлении заказа. Всё работает, спасибо
Кровельный
27 мая 2024, 14:06
0
А вот этот код, передаёт нормально через конфиг:
<?php
class msCartCustomHandler extends msCartHandler {
    /**
    * msCartCustomHandler constructor.
    *
    * @param miniShop2 $ms2
    * @param array $config
    */
    public function __construct(miniShop2 $ms2, array $config = array())
    {
        $this->ms2 = $ms2;
        $this->modx = $ms2->modx;

        $cityFields = $this->modx->getService('cityfields','cityFields', $this->modx->getOption('cityfields.core_path', null, $this->modx->getOption('core_path').'components/cityfields/').'model/cityfields/');
        if ($cityFields instanceof cityFields) {
            if (!empty($cityFields->currentCityId)) {
                $currentCityId = $cityFields->currentCityId;
            }
            
        }
        $this->config = array_merge(array(
            'currentCityId' => $currentCityId,
            'cart' => & $_SESSION['minishop2']['cart'],
            'max_count' => $this->modx->getOption('ms2_cart_max_count', null, 1000, true),
            'allow_deleted' => false,
            'allow_unpublished' => false,
        ), $config);

        $this->cart = &$this->config['cart'];
        $this->modx->lexicon->load('minishop2:cart');

        if (empty($this->cart) || !is_array($this->cart)) {
            $this->cart = array();
        }
    }
    
   /**
     * @param array $data
     *
     * @return array
     */
    public function status($data = array())
    {
        $status = [
            'total_count' => 0,
            'total_cost' => 0,
            'total_weight' => 0,
            'total_discount' => 0,
            'total_positions' => count($this->cart),
        ];
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
                $status['total_discount'] += $item['discount_price'] * $item['count'];
            }
        }

        $status = array_merge($data, $status);

        $response = $this->ms2->invokeEvent('msOnGetStatusCart', [
            'status' => $status,
            'cart' => $this,
        ]);
        if ($response['success']) {
            $status = $response['data']['status'];
        }
        $this->modx->log(1, print_r($this->config['currentCityId'], 1));

        return $status;
    }
}
?>
Вячеслав
27 мая 2024, 13:22
0
@Илья Уткин Подскажите пожалуйста будет обновление АПИ до 3 версии или нет????