Павел Романов

Павел Романов

С нами с 03 марта 2014; Место в рейтинге пользователей: #43
Павел Романов
10 сентября 2019, 11:06
0
Ну а если &tpl через чанк прописать:
[[getImageList?
  &tvname=`resourcealbum`
  &tpl=`image-tpl`
  &limit=`1`
  &docid=`[[+id]]`
]]

И в нем (image-tpl)
[[+image]]
Павел Романов
09 сентября 2019, 16:08
0
Направить поле Изготовитель на vendor. В документации есть пример (второй параметр).
Павел Романов
09 сентября 2019, 15:54
+1
Тогда нужно либо в 1С их прописывать в одном поле, как-нибудь типа
Желтый#F3F425•Розовый#BE07C5•Красный#FF0000
и тогда:
<?php
if ($modx->event->name != 'mSyncOnProductImport') return;

$analogTitle = $properties["Аналог"];
$analog = $modx->getObject('modResource', array('pagetitle' => $analogTitle));
$analogId = $analog ? $analog->id : 0;

$colors = explode('•', $properties["Цвет маркера"]);
foreach($colors as $key => $color){
    $colorTV[$key]['MIGX_id'] = $key;
    $colorTV[$key]['colorname'] = explode('#',$color)[0]; 
    $colorTV[$key]['direct'] = $analogId;
    $colorTV[$key]['color'] = explode('#',$color)[1];
}
 
$colorTV = json_encode($colorTV);
$resource->setTVValue('scolor', $colorTV);

Либо обратиться в поддержку компонента по поводу множественных значений свойств.
Павел Романов
09 сентября 2019, 15:33
0
Это в XML, а я про переменную $properties[«Цвет маркера»] в плагине.
Там, если цветов несколько, что содержится? Только одно значение:
Желтый•#F3F425
Или как-то все перечисляются:
Желтый•#F3F425,розовый•#BE07C5
Павел Романов
09 сентября 2019, 15:16
0
Я об этом и написал. Что у Вас в $properties[«Цвет маркера»]? Как выглядит строка?
Павел Романов
09 сентября 2019, 15:00
+1
Как-то так:
<?php
if ($modx->event->name != 'mSyncOnProductImport') return;

$analogTitle = $properties["Аналог"];
$analog = $modx->getObject('modResource', array('pagetitle' => $analogTitle));
$analogId = $analog ? $analog->id : 0;
$colors = explode('•#', $properties["Цвет маркера"]);

foreach($colors as $key => $color){
    $colorTV[$key]['MIGX_id'] = $key;
    $colorTV[$key]['colorname'] = '***'; // данные из $color 
    $colorTV[$key]['direct'] = $analogId;
    $colorTV[$key]['color'] = '***'; // данные из $color
}
 
 $colorTV = json_encode($colorTV);
 $resource->setTVValue('scolor', $colorTV);

«Данные из $color» зависят от того, что у Вас в поле «Цвет маркера».
Павел Романов
06 сентября 2019, 17:41
+1
Попробуйте так:
<?php
$out = '';
if($input != ''){
    $arr = explode(',', $input);
    foreach($arr as $item){
        $items .= '<div class="product">'.$item.'</div>'; 
    }
    $out = '<div class="product-list">'.$items.'</div>';
}
return $out;
Павел Романов
06 сентября 2019, 17:17
+1
Запятую поставьте:
$arr = explode(',', $input);
Павел Романов
06 сентября 2019, 17:09
+1
Ну тогда выберите «Разделитель» и поставьте в кач-ве него запятую.
Сделайте сниппет:
<?php
$out = '';
$arr = explode(',', $input);
if(count($arr) > 0){
    foreach($arr as $item){
        $items .= '<div class="product">'.$item.'</div>'; 
    }
    $out = '<div class="product-list">'.$items.'</div>';
}
return $out;

Используйте этот сниппет как модификатор:
[[*checkboxTv:snippet]]
Павел Романов
06 сентября 2019, 16:37
0
Настройте параметры вывода:
Павел Романов
05 сентября 2019, 13:27
0
Можно передавать сниппету поля:
[[Snippet? &fields=`content,description,tv.tvname`]]

В сниппете:
<?php
$inarr = explode(',', $fields); 
foreach($inarr as $field){
    if(strpos($field, 'tv.') === false){
        $content = $modx->resource->get($field);
    }else{
        $content = $modx->resource->getTVValue(str_replace('tv.', '', $field));
    }
	$text[] = $content;
}

$str = implode('--separator--', $text);

$result = '.......'; // заменяем что надо

$resarr = explode('--separator--', $result);
foreach($resarr as $key => $val){
	$modx->setPlaceholder('new.'.$inarr[$key], $val);
}
return;

Выводите на страницу:
[[+new.content]]
[[+new.description]]
[[+new.tv.tvname]]
Павел Романов
05 сентября 2019, 12:54
0
Т. е. должна быть только одна замена из списка замен по всем полям, если их объединить.
Из Ваших предыдущих сообщений не очевидно, что замена должна срабатывать только один раз ))).

А так да — объединяйте все в один текст, делите, меняйте, потом пишите результат в плейсхолдеры и выводите на страницу.
Павел Романов
05 сентября 2019, 12:25
0
Да, честно говоря, непонятно )).

Этот вариант не подходит, так как в нем должно было бы замениться только два первых совпадения, а они встречаются в первом поле
В этом варианте заменятся все совпадения во всех полях. Модификатор вызывается по отдельности для каждого поля.

То есть если у Вас в поле description такой текст:
Lorem ipsum dolor слово1 sit amet, consectetur adipiscing слово2 elit.

А в поле content такой:
Lorem слово1 ipsum dolor sit amet, consectetur adipiscing слово2 elit слово3.

То в результате работы сниппета:
<?php
$arr1 = array(
    'слово1',
    'слово2', 
    'слово3'
);
$arr2 = array(
    'замена1', 
    'замена2', 
    'замена3'
);
return str_replace($arr1, $arr1, $input);

У Вас [[*description:snippet]] выведет:
Lorem ipsum dolor замена1 sit amet, consectetur adipiscing замена2 elit.

А [[*content:snippet]] выведет:
Lorem замена1 ipsum dolor sit amet, consectetur adipiscing замена2 elit замена3.
Павел Романов
05 сентября 2019, 11:36
0
Я предложил второй вариант в ответ на Ваш комментарий про разные поля и он имеет смысл, если для content один набор замен, а для description другой.

Если Вам все равно, в каком поле встретится слово, то это как раз первый вариант. Прописываете в нем замену 100 слов и при парсинге шаблона система их заменит там, где они встречаются.

Можно вообще не привязываться к полям, а сделать плагин замены на событие OnWebPagePrerender и тогда будет обрабатываться вообще весь код страницы перед выводом в браузер.
Павел Романов
05 сентября 2019, 11:12
0
Сделайте свой сниппет для каждого поля или используйте опции:
<?php
switch ($options){
    case 1:
    // логика замены для поля 1
    $out = '...';
    break;
    
    case 2:
    // логика замены для поля 2
    $out = '...';
    break;
}
return $out;

Вывод:
[[*content:snippet=`1`]]
[[*description:snippet=`2`]]
Павел Романов
05 сентября 2019, 10:57
0
Сделайте сниппет с логикой замены и используйте его в качестве модификатора.
Например, сниппет link:
<?php
// что меняем
$arr1 = array(
    '_ссылка1_',
    '_ссылка2_', 
    '_ссылка3_'
);
// на что меняем
$arr2 = array(
    '<a href="[[~1]]">ссылка1</a>', 
    '<a href="[[~2]]">ссылка2</a>', 
    '<a href="[[~3]]">ссылка3</a>'
);
return str_replace($arr1, $arr1, $input);

В шаблоне выводите:
[[*content:link]]
[[*description:link]]
Павел Романов
30 августа 2019, 14:35
0
Должно работать, вот к примеру: test.rpa-design.ru/formit.html
Все почти из документации:
[[!FormIt?
    &hooks=`email`
    &emailTpl=`MyEmailChunk`
    &emailTo=`*****`
    &clearFieldsOnSuccess=`0`
    &successMessage=`<p style="color:red">Форма отправлена!!!</p>`
    &validate=`nospam:blank,
      name:required,
      email:email:required,
      text:required`
]]

<h2>Contact Form</h2>
 
[[!+fi.validation_error_message:notempty=`<p>[[!+fi.validation_error_message]]</p>`]]
 
<form action="[[~[[*id]]]]" method="post" class="form">
    <input type="hidden" name="nospam" value="" />
 
    <label for="name">
        Name:
        <span class="error">[[!+fi.error.name]]</span>
    </label>
    <input type="text" name="name" id="name" value="[[!+fi.name]]" />
    <label for="email">
        Email:
        <span class="error">[[!+fi.error.email]]</span>
    </label>
    <input type="text" name="email" id="email" value="[[!+fi.email]]" />
    <label for="text">
        Message:
        <span class="error">[[!+fi.error.text]]</span>
    </label>
    <textarea name="text" id="text" cols="55" rows="7" value="[[!+fi.text]]">[[!+fi.text]]</textarea>
     <div class="form-buttons">
        <input type="submit" value="Send Contact Inquiry" />
    </div>
</form>

[[!+fi.successMessage]]
Павел Романов
30 августа 2019, 14:17
0
А в value у полей есть плейсхолдеры
[[!+fi.fieldname]]
?