Андрей

Андрей

С нами с 28 февраля 2013; Место в рейтинге пользователей: #140
Андрей
18 июля 2018, 16:35
0
В компоненте есть настройка ms2ym_snippets, во-первых нет документации для нее, но это ладно. Во-вторых в коде есть кусок для обработки этой настройки:

foreach ($this->ymlConfig->snippets as $snippet => $params) {
    $yml .= $this->runSnippet($snippet, $params, $v) . "\n";
}

Как получить третий параметр $v в сниппете, ведь runSnippet принимает только 2 параметра?

Пока что поправил исходник так
foreach ($this->ymlConfig->snippets as $snippet => $params) {
    $params = array_merge($params, $v);
    $yml .= $this->runSnippet($snippet, $params, $v) . "\n";
}
Андрей
12 июля 2018, 09:38
+1
Для этого есть параметр returnIds, который возвращает массив id
Андрей
04 июля 2018, 12:00
+1
Добавлял поля по инструкции, наткнулся на ошибку, сохранялось только последнее поле, оказалось что приведенная структура массива для файла msOrderAddress.inc.php не совсем верна:

Вот так все работает:
return array(
  'fields' => array(
    'field_name_1' => NULL,
    'field_name_2' => NULL,
  ),
  'fieldMeta' => array(
    'field_name_1' => array (
      'dbtype' => 'varchar',
      'precision' => '255',
      'phptype' => 'string',
      'null' => true,
    ),
    'field_name_2' => array (
      'dbtype' => 'varchar',
      'precision' => '255',
      'phptype' => 'string',
      'null' => true,
    )
  )
);
Андрей
14 мая 2018, 11:40
+1
Удивительно как оно вообще работает, вы уж пишите на каком-нибудь одном синтаксисе.

// fenom
{if (29 | resource : 'published') == 1}
	{'Sales' | chunk}
{else}
	{'SalesOff' | chunk}
{/if}

// стандартный modx
[[pdoField:is=`1`:then=`[[$Sales]]`:else=`[[$SalesOff]]`? &id=`29` &field=`published`]]
Андрей
08 мая 2018, 10:56
0
А если так
{($_modx->getPlaceholder('vendor.resource') | resource : 'vendor-dostavka') | truncate : 100 : '...'}
Андрей
06 марта 2018, 09:26
0
В $data будут все поля ресурса, все его тв со значениями и именами

$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'TVR', 'TVR.contentid = modResource.id');
$q->leftJoin('modTemplateVar', 'TV', 'TV.id = TVR.tmplvarid');
$q->where([
 'modResource.parent' => 30
]);
$q->select([
 'modResource.*',
 'TVR.*',
 'TV.*'
]);

if ($q->prepare() && $q->stmt->execute()) {
  $data = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}

print_r($data);

Обратите внимание, что если у ресурса есть tv со значением по-умолчанию и оно не заполнено, либо установлено значение по-умолчанию, в выборке его не будет, т.к. MODX не создает записей modTemplateVarResource в базе для значений по-умолчанию.
Андрей
26 февраля 2018, 08:42
0
Просто проверить существует уже функция или нет

if (!function_exists('func_name')) {
	function func_name() {
		...
	}
}
Андрей
04 февраля 2018, 09:49
0
Попробуйте вместо pdoPage указать pdoResources, возможно конфликтуют 2 pdoPage.
Андрей
01 февраля 2018, 09:40
0
Метод filterPathSegment есть, а модификатора нет, может его и добавят в следующей версии.
Андрей
01 февраля 2018, 09:03
+1
Сделайте сниппет и используйте как модификатор

return $modx->filterPathSegment($input);
Андрей
26 января 2018, 10:07
+2
Может почта и ключ в репозитории у вас не от того домена?
Андрей
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.
Андрей
25 января 2018, 10:15
0
Ну вопрос то был про поддержку синтаксиса сниппетом, от того что вызов написать в синтаксисе fenom сниппет не начнет его поддерживать.
Андрей
25 января 2018, 08:36
0
Пробовал на последнем проекте, не работает в чанке fenom синтаксис.
Андрей
25 января 2018, 08:33
+1
Пишете функцию в которой проверяете наличие pdoTools, с помощью этой функции потом уже обрабатываете чанки.

Из formit пример
function getChunk($name,$properties = array()) {
        if (class_exists('pdoTools') && $pdo = $this->modx->getService('pdoTools')) {
            return $pdo->getChunk($name, $properties);
        }

	...
}
Андрей
25 января 2018, 08:26
+1
image формируется сниппетом GalleryAlbums, так что вам нужно просто указать в шаблоне
<img src="/assets/gallery/[[+cover_filename]]">

Если нужен какой-то определенный альбом используйте where
&where=`{"galAlbum.parent" : "1"}`
&where=`{"galAlbum.id" : "1"}`
Андрей
24 января 2018, 20:11
+1
Если не используется fenom на страницах, то синтаксис обычный должен быть

[[!pdoPage?
	&loadModels=`gallery`
	&class=`galAlbum`
	&select=`{"galAlbum":"*"}`
	&sortby=`id`
	&tpl=`@INLINE [[+name]]`
]]

Так же можете добавить параметр &showLog=`1` и посмотреть почему не работает.
Андрей
24 января 2018, 20:08
0
Ну если не установлен, то стандартный синтаксис и simpleSearch. Написали выше, что весь сайт на fenom.