Дублировать сниппет php

На сайте реализовал появление случайного текста в поле, через вызов сниппета:

<?php
function StrCharPosBack($haystack, $needle) {
    for ($i = strlen($haystack) ; $i>=0 ; $i--){
        if (substr($haystack, $i, 1) === $needle)
            return $i;
    }
    return false;
}

while (strpos($str, "{") !== false){
    $pos1 = strpos($str, "}");
    $buf_mas = substr($str, 0, $pos1);
    $pos2 = StrCharPosBack ($buf_mas, "{");
    $buf_mas = substr($buf_mas, $pos2+1);
    $exploded_buf_mas = explode ("|", $buf_mas);
    $rnd = rand(0, count($exploded_buf_mas)-1);
    $str = substr_replace($str, $exploded_buf_mas[$rnd], $pos2, $pos1+1-$pos2);
}

$str = (isset($str )) ? $str : '';
return $str ;
Сам вызов:
[[!str? &str= {
текст| 
текст2|
текст3|
тест4
}
]]

При попытке добавить еще одно такое поле и вызвать такой же сниппет, происходит краш.

PHP Fatal error: Cannot redeclare StrCharPosBack() (previously declared in /modx_11/public_html/core/cache/includes/elements/modsnippet/40.include.cache.php:2) in /modx_11/public_html/core/cache/includes/elements/modsnippet/40.include.cache.php on line 2

Как реализовать несколько таких полей на ресурсе, для рандомного отображения контента? Спасибо.
Иван
08 декабря 2020, 15:30
modx.pro
464
0

Комментарии: 3

Артур Шевченко
08 декабря 2020, 16:24
0
Если этот вызов работает
[[!str? &str= {
текст| 
текст2|
текст3|
тест4
}
]]
То возможно стоит попробовать вот так
[[!str? &str= `{
текст| 
текст2|
текст3|
тест4
}
{
текст| 
текст2|
текст3|
тест4
}`
]]
Если я конечно правильно понял принцип работы сниппета.
    Наумов Алексей
    08 декабря 2020, 16:27
    0
    Функцию нельзя 2 раза объявлять, вот и идет ошибка.
    А вообще давайте я поищу за вас.
      Alexey
      08 декабря 2020, 23:14
      0
      Попробуйте тело функции поместить в отдельный сниппет, который вызывался бы из основного сниппета(вместо вызова функции). Конечно, со всеми «вытекающими» параметрами. Fatal Error должна пропасть.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        3