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

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

Был в сети 30 июля 2026, 15:23
Заказы принимаю
Тогда нужно либо в 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);

Либо обратиться в поддержку компонента по поводу множественных значений свойств.
Как-то так:
<?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» зависят от того, что у Вас в поле «Цвет маркера».
Ну тогда выберите «Разделитель» и поставьте в кач-ве него запятую.
Сделайте сниппет:
<?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]]
Можно передавать сниппету поля:
[[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]]
Да, честно говоря, непонятно )).

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

То есть если у Вас в поле 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.
Я предложил второй вариант в ответ на Ваш комментарий про разные поля и он имеет смысл, если для content один набор замен, а для description другой.

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

Можно вообще не привязываться к полям, а сделать плагин замены на событие OnWebPagePrerender и тогда будет обрабатываться вообще весь код страницы перед выводом в браузер.
Сделайте сниппет с логикой замены и используйте его в качестве модификатора.
Например, сниппет 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]]
Должно работать, вот к примеру: 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]]