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

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

С нами с 03 марта 2014; Место в рейтинге пользователей: #42
Павел Романов
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]]
?
Павел Романов
30 августа 2019, 14:13
0
Ну а если поставить:
&clearFieldsOnSuccess=`0`
?
Павел Романов
26 августа 2019, 23:12
1
+1
На локалке есть готовая установка, поддерживаемая в актуальном состоянии. Компоненты, стандартные шаблоны, TV-шки, заготовки, настройки и т. д.
В корне лежит PHP-скриптик, которому скармливается бд-юзер, пароль и имя базы. Он прописывает в config.inc.php эти данные + заменяет везде путь к ядру в соответствии с серверным.
Соответственно, развертывание заключается в копировании файлов на хостинг, заливке дампа базы и запуске вышеупомянутого скрипта. На все про все — минут пять от силы ).
Павел Романов
26 августа 2019, 16:05
+1
Если зависит от родителя, то и проверяйте его (например, 8 — Новости, 53 — Акции):
{if $_modx->resource.parent == 8}
<img src="[[*news_image:phpthumbon=`w=300&h=300`]]" class="img-fluid">
{/if}
{if $_modx->resource.parent == 53}
<img src="[[*actions_image:phpthumbon=`w=300&h=300`]]" class="img-fluid">
{/if}
Павел Романов
19 августа 2019, 10:07
0
Сделайте сниппет:
<?php
if(!$tvo = $modx->getObject('modTemplateVar', array('name' => $tvname))) return;
$elements = explode('||', $tvo->get('elements'));
foreach($elements as $element){
   $el = explode('==', $element);
   if($el[1] == $value){
        $out = $el[0];
        break;
    }
}
return $out;

Выводите:
[[Snippet? &tvname=`имя_TV` &value=`Значение_TV`]]
Павел Романов
17 августа 2019, 09:36
+1
Попробуйте так:
<h1>[[+title]]</h1>
<p>
    [[getImageList?
        &tvname=`TVFields2`
        &tpl=`TVFields2`
        &totalVar=`count[[+idx]]`
    ]]
    [[+count[[+idx]]:is=`0`:then=`
        Если пусто
    `:else=`
        Если нет
    `]]
</p>
Павел Романов
13 августа 2019, 18:35
0
Проверьте menuindex. Должно работать: test.rpa-design.ru/
Структура и вызов: