Vladimir

Vladimir

С нами с 25 июня 2021; Место в рейтинге пользователей: #285

Как добавить допустим класс тегу(html тегу), допустим к элементу [[*pagetitle]] при парсинге?

Хочу добавить класс каждому тегу который выставлен на страницу допустим
<div class="pr">[[*pagetitle]]</div>
добавить класс так
<div class="pr pagetitle_parsed">[[*pagetitle]]</div>
Пробовал так
<?php
switch ($modx->event->name) {
    case 'OnParseDocument':
        if($modx->user->isMember('Administrator')){
            $content = $modx->documentOutput;
            $tags = array();
            $collected = $modx->parser->collectElementTags($content, $tags, '[[', ']]', array('*'));
            // $modx->log(1, var_dump($tags));
            foreach($tags as $tag){
                $modx->log(1, var_dump($tag));
                break;
            }
            // $modx->log(1, var_dump($collected));
            
        }
        break;
Но даже не могу увидеть что за тег, имя и тд, мне просто выводится цифра 26
Vladimir
22 июля 2022, 12:33
modx.pro
487
0

Как получить html через пост запрос на плагин?

Хочу получить html шаблона по клику допустим, сделал плагин поставил обработчик OnHandleRequest
Проверяю на пост и так далее, есть так же метод получения контента из шаблона, но как вернуть его? return не работает, echo и die() тоже, либо ошибка либо какой-то бред.

Контент получаю так
$retrivedObject->getContent();
— Контент правильный проверял.

Возвращаю ответ от функции выше так
return json_encode(array('status' => true, 'msg' => "Succesfuly retrieved data from '{$objectName}' with search params as '{$searchParams}'", 'result' => $result), JSON_UNESCAPED_UNICODE);
Где $result это просто список.
Vladimir
19 июля 2022, 14:16
modx.pro
828
0

Как создать скидку для товаров с опред брендом в msDiscount ?

Есть список брендов, бред указан в опциях товара, как сделать именно для них скидку через msDiscount?

Код ниже уже готовый, вопрос решён. Нужно будет вам создать ваши бренды в группе ресурсов обязательно указать все контексты, затем записать их в словарь как ниже, и всё это запустить в пакете под названием «Консоль»

При условии что у вас бренд как у меня находится в опции товара, если нет то код ниже нужно будет переделать а именно первую часть с поиском опции.

<?php

$brensList = array('NOMAD','Dominator','АкТех','Kainar');

$q=$modx->newQuery('msProductOption', array('key:=' => 'brand', 'value:IN' => $brensList));

$q->prepare();
$q->stmt->execute();
$res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);

$brendsGroups = array(
    'NOMAD' => 79,
    'Dominator' => 80,
    'АкТех' => 81,
    'Kainar' => 82
);

$productWithoutGroup = 103; // Айди группы ресурсов что нет в списке выше.

foreach ($res as $k => $v) {

    $currentProductBrand = $v['msProductOption_value'];
    $docId = $v['msProductOption_product_id'];
    $newGroup = $brendsGroups[$currentProductBrand];
    if(!$newGroup){
        $newGroup = $productWithoutGroup;
    }
    $resource = $modx->getObject('modResource', $docId);
    if($resource){
        if(!$resource->isMember($newGroup)){
            $resource->joinGroup($newGroup);
        }
    }    

}
Vladimir
04 июля 2022, 13:57
modx.pro
871
0

Как вывести цену со скидкой в карточке товара msDiscount ?

msDiscount выводит в каталоге, корзине всё норм, но в карточке товара не выводит, в доках не нашёл как вывести цену со скидкой в карточке товара

Код ниже уже готовый, проверенный, работает отлично по группам, по скидкам и так далее, выводит именно цену товара, а не саму скидку, для вывода самой скидкой нужно воспользоваться тем что написано в доках

<?php
/** @var msDiscount $msDiscount */
/** @var msDiscount $price */
/** @var pdoTools $pdoTools */

if(empty($price)){
    return '';
}
$pdoTools = $modx->getService('pdoTools');
$msDiscount = $modx->getService('msDiscount');
$date = $pdoTools->getStore('msd_date');
$usergroups = array_keys($msDiscount->getUserGroups($modx->user->id));
$sales = !empty($date)
	? $msDiscount->getSales($date, true)
	: $msDiscount->getSales();
if (empty($sale)) {
	$sale = $pdoTools->getStore('msd_sale');
}
if (!empty($sale)) {
	$tmp = array_map('trim', explode(',', $sale));
	foreach ($sales as $id => $sale) {
		if (!in_array($id, $tmp)) {
			unset($sales[$id]);
		}
	}
}
if (!empty($row) && is_array($row)) {
	$mode = 'prepare';
	if (!empty($row['id'])) {
		$id = $row['id'];
	}
}
else {
	$mode = 'standalone';
	if (!empty($frontend_css)) {
		$frontend_css = str_replace('[[+assetsUrl]]', $msDiscount->config['assetsUrl'], $frontend_css);
		$modx->regClientCSS($frontend_css);
	}
	if (!empty($frontend_js)) {
		$frontend_js = str_replace('[[+assetsUrl]]', $msDiscount->config['assetsUrl'], $frontend_js);
		$modx->regClientScript($frontend_js);
	}
	if (empty($id)) {
		$id = $modx->resource->id;
	}
}

$remains = $discount = 0;
if (!empty($id) && !empty($sales)) {
	foreach ($sales as $sale) {
		// Check user groups
		if (!empty($sale['users'])) {
			$required = array();
			foreach ($sale['users'] as $gid => $type) {
				if ($type == 'out' && in_array($gid, $usergroups)) {
					unset($sales[$idx]);
					continue(2);
				}
				if ($type == 'in') {
					$required[] = $gid;
				}
			}
			if (!empty($required) && !array_intersect($required, $usergroups)) {
				unset($sales[$idx]);
				continue;
			}
		}
		// Check product groups
		if (!empty($sale['products'])) {
			$groups_in = $groups_out = array();
			foreach ($sale['products'] as $gid => $type) {
				if ($type == 'out') {
					$groups_out[] = $gid;
					unset($sale['products'][$gid]);
				}
				else {
					$groups_in[] = $gid;
				}
			}
		}

		if (!empty($groups_out) || !empty($groups_in)) {
			$ids = $modx->getParentIds($id);
			$ids[] = $id;

			$q = $modx->newQuery('msCategoryMember', array('product_id' => $id));
			$q->select('category_id');
			$tstart = microtime(true);
			if ($q->prepare() && $q->stmt->execute()) {
				$modx->queryTime += microtime(true) - $tstart;
				$modx->executedQueries++;
				if ($tmp = $q->stmt->fetchAll(PDO::FETCH_COLUMN)) {
					$ids = array_merge($ids, $tmp);
				}
			}
			$ids = array_unique($ids);
			$where = count($ids) > 1
				? array('document:IN' => $ids)
				: array('document' => $ids[0]);

			$q = $modx->newQuery('modResourceGroupResource', $where);
			$q->select('document_group');
			$tstart = microtime(true);
			if ($q->prepare() && $q->stmt->execute()) {
				$modx->queryTime += microtime(true) - $tstart;
				$modx->executedQueries++;
				$groups = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
				if (!empty($groups_out) && array_intersect($groups_out, $groups)) {
					continue;
				}
				elseif (!empty($groups_in) && !array_intersect($groups_in, $groups)) {
					continue;
				}
			}
		}

		// Product match
		$tmp_remains = ($sale['ends'] != '0000-00-00 00:00:00')
			? strtotime($sale['ends']) - time()
			: 0;
		if (strpos($sale['discount'], '%') !== false && (empty($discount) || strpos($discount, '%') !== false)) {
			if ($sale['discount'] > $discount) {
				$discount = $sale['discount'];
				$remains = $tmp_remains;
			}
		}
		elseif (is_numeric($sale['discount']) && is_numeric($discount)) {
			if ($sale['discount'] > $discount) {
				$discount = $sale['discount'];
				$remains = $tmp_remains;
			}
		}
		else {
			$discount = $sale['discount'];
			$remains = $tmp_remains;
		}
	}
}


if($discount && $remains){
    return (((int)$price * (100 - (int)$discount )/100));
}

return '';
Vladimir
23 июня 2022, 11:58
modx.pro
919
0

Как зарегистрировать js скрипт при рендере страницы?

Пытался так, но как я понял это работает для снипетов, но сниппет не подходит, нужно именно подключить js при загрузке страницы.

switch ($modx->event->name) {
    case 'OnWebPagePrerender':
        
        //$modx->regClientScript('assets/somefile.js');                
        &$modx->regClientScript('assets/somefile.js');

        break;
    }
Или придётся делать через OnWebPagePrerender

и модифицировать Html
$txt = &$modx->resource->_output;
Vladimir
21 мая 2022, 12:15
modx.pro
476
0

Как получить контент страницы перед рендером всех тегов и вызовов?

Как получить страницу с тегами в таком состоянии [[*id]] перед рендером?, чтобы что-то заменить.
Пробовал так, но никак не могу понять как получить весь контент страницы

switch ($modx->event->name) {
    case 'OnWebPageInit':
        $output = get_class_methods($modx);
        $modx->log(1, print_r($output), 'HTML');
        break;
}

И так
$output = &$modx->resource
&$modx->resource->_output;
Vladimir
15 мая 2022, 20:07
modx.pro
933
0

Как оптимизировать все картинки на сайте разом?

У меня есть плагин который с помощью phpthumb оптимизирует при загрузке, его ведь можно превратить чтобы он оптимизировал все картинки по запуску, как получить список все картинок что используются на сайте?
<?php
$fullPath = $source->getBases() ['pathAbsolute'] . $directory;
foreach ($files as $file)
{

    if (strripos($file['type'], 'image') === false || $file['type'] == 'image/svg+xml')
    {
        return;
    }

    $name = $file['name'];
    $pathToImage = $fullPath . $name;

    if (exif_imagetype($pathToImage) == IMAGETYPE_JPEG)
    {

        $params = array(
            'w' => 1920,
            'f' => 'jpeg',
            'q' => 80,
        );

    }
    elseif (exif_imagetype($pathToImage) == IMAGETYPE_PNG)
    {

        $params = array(
            'w' => 1920,
            'f' => 'png',
            'q' => 80,
        );

    }
    elseif (exif_imagetype($pathToImage) == IMAGETYPE_GIF)
    {
        return;
    }

    $phpThumb = $modx->getService('modphpthumb', 'modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array());
    $phpThumb->setSourceFilename($pathToImage);

    foreach ($params as $k => $v)
    {
        $phpThumb->setParameter($k, $v);
    }

    if ($phpThumb->GenerateThumbnail())
    {
        if (!$phpThumb->renderToFile($pathToImage))
        {
            $modx->log(1, 'Ошибка сохранения изображения в [' . $pathToImage . ']');
        }
    }
    else
    {
        $modx->log(1, print_r($phpThumb->debugmessages, 1));
    }

}
Vladimir
02 мая 2022, 09:28
modx.pro
1 207
0

Как получить контент шаблона?

Как получить контент шаблона? Желательно через api modx'a, или придётся через sql?
Vladimir
29 апреля 2022, 07:42
modx.pro
451
0

Как запустить скрипт php через simpleQueue?

Вообще непонятно, документация как всегда легкая напоминалка для разраба.

Так же пытался выполнить
$sq = $modx->getService('simplequeue');
как указано в доках, выдаёт ошибку что не может загрузить.
Could not load class: simplequeue from simplequeue.

Problem getting service simplequeue, instance of class simplequeue, from path
Vladimir
22 марта 2022, 19:36
modx.pro
509
0

Не выводится своё значения из из своего словаря, как исправить?

Создал папку в core/components/sitetranslation/lexicon/ru/default.inc.php
папка «компонент» sitetranslation содержит только папку lexicon а в ней только папка ru а в ней только 1 файл default.inc.php
с таким значением
<?php

$files = scandir(dirname(__FILE__));
foreach ($files as $file) {
    if (strpos($file, 'msp.') === 0) {
        @include_once($file);
    }
}
$_lang['sts_modal_form_title'] = 'Хотите получить доступ? Заполните анкету';
Затем создал пространство имён в modx, в словаре всё появилось могу делать записи, те записи что делаю в файлах на хосте там отображаются, но при попытке вывести не выводит.
{'sts_modal_form_title' | lexicon}
Получаю просто sts_modal_form_title без перевода

cultureKey такой же как и название папки ru контекст web.
Vladimir
16 марта 2022, 08:45
modx.pro
446
0