Громов Антон

Громов Антон

С нами с 20 июня 2015; Место в рейтинге пользователей: #421
Андрей
25 января 2018, 16:38
1
0
Для extract можно взять функцию из simpleSearch и сделать сниппет

<?php

$search = $modx->getOption('search', $scriptProperties, $_GET['search']);
$text = (isset($input)) ? $input : $modx->getOption('text', $scriptProperties, '');
$length = (isset($options)) ? $options : $modx->getOption('length', $scriptProperties, 200);
$ellipsis = $modx->getOption('ellipsis', $scriptProperties, '...');

if (empty($search) || empty($text)) {
  return $text;
}

if (!function_exists('createExtract')) {
  function createExtract($text, $length = 200, $search = '', $ellipsis = '...') {
    global $modx;

    $text = strip_tags($text);
    $text = preg_replace('/(\[\[\+.*?\]\])/i', '', $text);
    $text = $modx->stripTags($text);
    $text = trim(preg_replace('/\s+/u', ' ', $text));

    if (empty($text)) return '';

    $useMb = $modx->getOption('use_multibyte',null,false) && function_exists('mb_strlen');
    $encoding = $modx->getOption('modx_charset',null,'UTF-8');

    $trimChars = "\t\r\n -_()!~?=+/*\\,.:;\"'[]{}`&";

    if ($useMb) {
      $wordPos = mb_strpos(mb_strtolower($text,$encoding), mb_strtolower($search,$encoding),null,$encoding);
      $halfSide = intval($wordPos - $length / 2 + mb_strlen($search, $encoding) / 2);
      if ($halfSide > 0) {
        $halfText = mb_substr($text, 0, $halfSide, $encoding);
        $pos_start = max(mb_strrpos($halfText, ' ', 0, $encoding), mb_strrpos($halfText, '.', 0, $encoding));
        if (!$pos_start) {
          $pos_start = 0;
        }
      } else {
        $pos_start = 0;
      }
      if ($wordPos && $halfSide > 0) {
        $l = $pos_start + $length - 1;
        $realLength = mb_strlen($text,$encoding);
        if ($l > $realLength) { $l = $realLength; }
        $pos_end = min(mb_strpos($text, ' ',$l, $encoding), mb_strpos($text, '.', $l, $encoding)) - $pos_start;
        if (!$pos_end || $pos_end <= 0) {
          $extract = $ellipsis . ltrim(mb_substr($text, $pos_start, mb_strlen($text, $encoding), $encoding), $trimChars);
        } else {
          $extract = $ellipsis . trim(mb_substr($text, $pos_start, $pos_end, $encoding), $trimChars) . $ellipsis;
        }
      } else {
        $l = $length - 1;
        $trueLength = mb_strlen($text,$encoding);
        if ($l > $trueLength) $l = $trueLength;
        $pos_end = min(mb_strpos($text, ' ',$l, $encoding), mb_strpos($text, '.', $l, $encoding));
        if ($pos_end) {
          $extract = rtrim(mb_substr($text, 0, $pos_end, $encoding), $trimChars) . $ellipsis;
        } else {
          $extract = $text;
        }
      }
    } else {
      $wordPos = strpos(strtolower($text), strtolower($search));
      $halfSide = intval($wordPos - $length / 2 + strlen($search) / 2);
      if ($halfSide > 0) {
        $halfText = substr($text, 0, $halfSide);
        $pos_start = max(strrpos($halfText, ' '), strrpos($halfText, '.'));
        if (!$pos_start) {
          $pos_start = 0;
        }
      } else {
        $pos_start = 0;
      }
      if ($wordPos && $halfSide > 0) {
        $l = $pos_start + $length - 1;
        $realLength = strlen($text);
        if ($l > $realLength) { $l = $realLength; }
        $pos_end = min(strpos($text, ' ', $l), strpos($text, '.', $l)) - $pos_start;
        if (!$pos_end || $pos_end <= 0) {
          $extract = $ellipsis . ltrim(substr($text, $pos_start), $trimChars);
        } else {
          $extract = $ellipsis . trim(substr($text, $pos_start, $pos_end), $trimChars) . $ellipsis;
        }
      } else {
        $pos_end = min(strpos($text, ' ', $length - 1), strpos($text, '.', $length - 1));
        if ($pos_end) {
          $extract = rtrim(substr($text, 0, $pos_end), $trimChars) . $ellipsis;
        } else {
          $extract = $text;
        }
      }
    }

    return $extract;
  }
}

$extract = createExtract($text, $length, $search, $ellipsis);
$extract = strip_tags(preg_replace("#\<!--(.*?)--\>#siu",'',$extract));
$extract = preg_replace("#\[\[(.*?)\]\]#siu",'',$extract);
$extract = str_replace(array('[[',']]'),'',$extract);

$output = preg_replace("/$search/iu", "<span class=\"extract\">$0</span>", $extract);

return $output;

Использовать можно как сниппет или модификатор
// модификатор если есть $_GET['search']
{$content | extract : 100}

// сниппет
{'extract' | snippet : [
	'text' => $content,
	'search' => $.get.search,
	'length' => 200,
	'ellipsis' => '...'
]}

//минимальный вызов если есть $_GET['search']
{'extract' | snippet : [
	'text' => $content
]}

По-умолчанию ищет параметр $_GET['search'], если нет параметра, то ищет опцию search, иначе возвращает текст.

Найденное выражение оборачивает в span с классом extract.
Андрей
24 января 2018, 12:15
5
0
Если там ничего мудреного нету, то подключить в них pdoTools и заменить все вызовы чанков через него:

//подключаем в начале сниппета
$pdo = $modx->getSetvice('pdoFetch');

//далее везде в сниппете заменить
$modx->getChunk

// на обработку через pdoTools
$pdo->getChunk

Так же можно сделать простейший поиск через pdoPage

{'!pdoPage' | snippet : [
  'parents' => 0,
  'includeContent' => 1,
  'context' => $_modx->context.key,

  'where' => [
    [
      'context_key' => $_modx->context.key
    ],
    [
      'AND:pagetitle:LIKE' => '%'~ $.get.search | escape ~'%',
      'OR:introtext:LIKE' => '%'~ $.get.search | escape ~'%',
      'OR:content:LIKE' => '%'~ $.get.search | escape ~'%'
    ]
  ] | toJSON,

  'tpl' => ''
]}
Денис
22 ноября 2017, 19:47
2
+1
ТВ поля подключаются после join, так что придется подтянуть всю цепочку вручную:

$projects = $modx->runSnippet('pdoResources',array(
	'parents' => 4,
	'includeTVs' => 'projectCat',
	'loadModels' => 'projects',
	'leftJoin' => '{
		"TvFieldResource" : {
			"class" : "modTemplateVarResource", 
			"on" : "TvFieldResource.contentid = modResource.id" //Связываем тв поле с значением по полю id ресурса
		},
		"TvField" : {
			"class": "modTemplateVar",
			"on": "TvField.id = TvFieldResource.tmplvarid AND TvField.name = \"projectCat\"" //Это связь для тв поля по по имени, хотя можно его и не использовать, а указать в TvFieldResource сразу значение tmplvarid(id тв поля)
		},
		"ProjCats" : {
			"class" : "categories", 
			"on" : "TvFieldResource.value = ProjCats.id" //связываем значение тв поля с вашим классом
		}
	}',
	'select' => '{
		"modResource": "*", //подтягиваем поля ресурса
		"ProjCats": "ProjCats.id as category_id, ProjCats.name as category_name" //и поля вашего класса, создав им псевдонимы category_id и category_name
	}',
    'return' => 'json',
    'showLog' => 1
));

Не проверял, но должно работать.
Dolce
16 октября 2017, 10:33
5
+2
Точно, не удалил лишений код — как следствие и скопировал не то. Вот для селектов:
$(document).ready(function() {
                               
                    $(document).on('change', '#mse2_sort', function() {
                        var selected = $(this).find('option:selected');
                        var sort = selected.data('sort');
                        sort += mse2Config.method_delimeter + selected.val();
                        mse2Config.sort =  sort;
                        mSearch2.submit();
                    });

   });
Николай Савин
20 июня 2017, 15:11
1
+1
Я делаю так:
Классический формат
[[msProducts?
                      &showLog=`1`
                      &tpl=``
                      &resources=`18`
                      &leftJoin=`{
                        "Image_1": {
                            "class": "msProductFile",
                            "alias" : "Image_1",
                            "on": "Image_1.product_id = msProduct.id  AND Image_1.rank = 1 AND path LIKE '%/small/%'"
                        },
                        "Image_2": {
                            "class": "msProductFile",
                            "alias" : "Image_2",
                            "on": "Image_2.product_id = msProduct.id  AND Image_2.parent = 0 AND Image_2.rank = 2"
                        },
                        "Image_3": {
                            "class": "msProductFile",
                            "alias" : "Image_3",
                            "on": "Image_3.product_id = msProduct.id  AND Image_3.parent = 0 AND Image_3.rank = 3"
                        }
                    }`

                     &select=`{
                        "Image_1": "Image_1.url as Image_1",
                        "Image_2": "Image_2.url as Image_2",
                        "Image_3": "Image_3.url as Image_3"
                    }`

                    &groupby=`
                    {
                        "Image_1": "Image_1.url",
                        "Image_2": "Image_2.url",
                        "Image_3": "Image_3.url"
                    }
                    `
                  ]]
fenom
{'!msProducts' | snippet: [
                                'limit' => 6,
                                'tpl' => 'tpl.catalog.line.front',
                                'includeThumbs' => '300x300',
                                'includeTVs' => 'short_intro',
                                'parents' => 23,
                                'where' => '{"Data.favorite" : 1}',
                                'leftJoin' => [
                                  "300x300_2" => [
                                    "class" => "msProductFile",
                                    "alias" => "300x300_2",
                                    "on" => "300x300_2.product_id = msProduct.id  AND 300x300_2.rank = 1 AND 300x300_2.path LIKE '%/300x300/%'"
                                  ],
                                  "300x300_3" => [
                                    "class" => "msProductFile",
                                    "alias" => "300x300_3",
                                    "on" => "300x300_3.product_id = msProduct.id  AND 300x300_3.rank = 2 AND 300x300_3.path LIKE '%/300x300/%'"
                                  ]
                                ],
                                       'select' => ["300x300_2" => "300x300_2.url as 300x300_2", "300x300_3" => "300x300_3.url as 300x300_3"],
                               'groupby' => ["300x300_2" => "300x300_2.url", "300x300_3" => "300x300_3.url"],
                                ]}

Это готовые рабочие примеры, взятые прямо с проектов, вам конечно нужно их немного под себя переписать, но надеюсь логика понятна. Для каждой дополнительной картинки прописываете свой left join, select, groupby
Dmitry Rodionov
09 февраля 2017, 22:36
4
0
Прошу прощения за некромантию, но может кому-то пригодится решение без модификации сниппета, на вышеуказанном примере, без использования leftJoin:
&optionFilters=`{
	"ps_target:!=":"",
	"ps_type:!=":""
}`
&where=`["
	(ps_target.value='Витрины и мебель' OR ps_target.value='Ландшафт' OR ps_target.value='Автомойки') AND 
	(ps_type.value='Модульный' OR ps_type.value='Ландшафтный' OR ps_type.value='Карданный')
"]`
по сути optionFilters подключает нужные таблицы и дает не противоречащие условия, а все остальное прописывает внутри where