Функция cot_rc_modify в Cotonti

предназначена для изменения HTML-строки, содержащей атрибуты (например, тегов <input>, <div> и др.), добавляя или изменяя значения атрибутов. Она полезна для динамического изменения resource string (ресурсной строки) в шаблонах и PHP-коде фреймворка

Функция cot_rc_modify — мощный инструмент для управления атрибутами HTML-тегов в рамках Cotonti. Она полезна как для разработчиков, так и для верстальщиков, упрощая обработку шаблонов и HTML.
Функция cot_rc_modify предназначена для изменения HTML-строки, содержащей атрибуты (например, тегов <input>, <div> и др.), добавляя или изменяя значения атрибутов. Она полезна для динамического изменения resource string (ресурсной строки) в шаблонах и PHP-коде фреймворка Cotonti.
 

/**
 * Modifies rc string
 *
 * Example:
 *   $R['input_text'] = cot_rc_modify($R['input_text'], ['class' => 'form-control'])
 *   or in template:
 *   {PAGEADD_FORM_TITLE|cot_rc_modify($this, 'class="form-control"')}
 *
 * @param string $resourceString A resource string
 * @param array<string, string>|string $attributes A string or associative array
 * @return string
 */
function cot_rc_modify($resourceString, $attributes)
{
    $resourceString = (string) $resourceString;
    if ($resourceString === '' || empty($attributes)) {
        return $resourceString;
    }

    if (!is_array($attributes)) {
        preg_match_all("/((?<key>[a-z0-9-_]+)=(['\"])(?<value>.*?)\g{3})/", $attributes, $matches);
        $attributes = [];
        foreach ($matches['key'] as $num => $key) {
            $attributes[$key] = $matches['value'][$num];
        }
    }

    if (empty($attributes)) {
        return $resourceString;
    }

    foreach ($attributes as $key => $value) {
        if (mb_stripos($resourceString, " " . $key . "=") !== false) {
            $resourceString = preg_replace(
                "/" . $key . "=(\"|')(.*?)(\"|')/",
                $key . '="' . $value . '"',
                $resourceString
            );
        } else {
            $resourceString = preg_replace(
                "/<([^\/ ]+)(.+)/",
                "<$1 " . $key . '="' . $value . '"$2',
                $resourceString
            );
        }
    }

    return $resourceString;
}

Разбор функции cot_rc_modify

/**
 * Modifies rc string
 *
 * Example:
 *   $R['input_text'] = cot_rc_modify($R['input_text'], ['class' => 'form-control'])
 *   or in template:
 *   {PAGEADD_FORM_TITLE|cot_rc_modify($this, 'class="form-control"')}
 *
 * @param string $resourceString A resource string
 * @param array<string, string>|string $attributes A string or associative array
 * @return string
 */
function cot_rc_modify($resourceString, $attributes)
{
    // Приводим ресурсную строку к строковому типу (на случай, если передали не строку)
    // Если строка пуста или атрибуты не указаны, возвращаем исходную строку без изменений
    $resourceString = (string) $resourceString;
    if ($resourceString === '' || empty($attributes)) {
        return $resourceString;
    }

    // Если атрибуты переданы строкой (например, 'class="form-control"'),
    // преобразуем их в массив вида ['class' => 'form-control']
    if (!is_array($attributes)) {
        preg_match_all(
            "/((?<key>[a-z0-9-_]+)=(['\"])(?<value>.*?)\g{3})/", // Ищем пары ключ="значение"
            $attributes,
            $matches
        );
        $attributes = [];
        foreach ($matches['key'] as $num => $key) {
            $attributes[$key] = $matches['value'][$num]; // Заполняем массив ключ-значение
        }
    }

    // Если после обработки атрибуты всё равно пусты, возвращаем исходную строку
    if (empty($attributes)) {
        return $resourceString;
    }

    // Перебираем массив атрибутов для добавления или изменения их в ресурсной строке
    foreach ($attributes as $key => $value) {
        // Проверяем, существует ли уже указанный атрибут в строке
        if (mb_stripos($resourceString, " " . $key . "=") !== false) {
            // Если атрибут существует, заменяем его значение на новое
            $resourceString = preg_replace(
                "/" . $key . "=(\"|')(.*?)(\"|')/", // Ищем существующий атрибут
                $key . '="' . $value . '"',         // Заменяем его значение
                $resourceString
            );
        } else {
            // Если атрибут отсутствует, добавляем его после имени открывающего тега
            $resourceString = preg_replace(
                "/<([^\/ ]+)(.+)/",               // Находим начало тега и его атрибуты
                "<$1 " . $key . '="' . $value . '"$2', // Добавляем новый атрибут
                $resourceString
            );
        }
    }

    // Возвращаем модифицированную строку с изменёнными или добавленными атрибутами
    return $resourceString;
}

Подробные комментарии
Проверка строки и атрибутов:

Преобразуем ресурсную строку к строковому типу.
Если строка пуста или атрибуты отсутствуют, дальнейшая обработка не требуется, возвращается исходная строка.
Обработка строковых атрибутов:

Если атрибуты переданы строкой, используется регулярное выражение для разбора строки в формат массива.
Это позволяет поддерживать оба способа передачи атрибутов: строкой или массивом.
Модификация или добавление атрибутов:

Проверяем существование атрибута в строке.
Если атрибут уже есть, обновляем его значение.
Если атрибут отсутствует, добавляем его после имени тега.
Возврат результата:

После обработки всех атрибутов возвращается модифицированная строка.


Назначение
Функция позволяет:

Динамически добавлять новые атрибуты к HTML-тегу.
Изменять значения существующих атрибутов в строке HTML.
Работать как в PHP-коде, так и через шаблоны Cotonti.

Параметры

$resourceString (строка): Исходная HTML-строка, которую нужно изменить. Пример: <input type="text" name="username">.
$attributes (строка или массив): Атрибуты, которые нужно добавить или изменить.
В формате массива: ['class' => 'form-control', 'placeholder' => 'Enter your name'].
В строковом формате: 'class="form-control" placeholder="Enter your name"'.


Результат
Возвращается модифицированная строка HTML с внесёнными изменениями атрибутов.

Как работает функция


Приведение строки ресурса к строковому типу:

$resourceString = (string) $resourceString;
if ($resourceString === '' || empty($attributes)) {
    return $resourceString;
}


Если ресурсная строка пуста или отсутствуют атрибуты для изменения, функция возвращает исходную строку без изменений.

Обработка атрибутов: Если $attributes переданы строкой, функция преобразует её в массив. Для этого:

Используется регулярное выражение для нахождения пар ключ="значение".
Извлечённые пары сохраняются в массив $attributes.

Пример:

preg_match_all("/((?<key>[a-z0-9-_]+)=(['\"])(?<value>.*?)\g{3})/", $attributes, $matches);


Модификация строки: Для каждого атрибута из массива $attributes:

Если атрибут уже существует в строке ресурса, его значение заменяется.
 

$resourceString = preg_replace(
    "/" . $key . "=(\"|')(.*?)(\"|')/",
    $key . '="' . $value . '"',
    $resourceString
);


 


Если атрибут отсутствует, он добавляется после имени открывающего тега.

$resourceString = preg_replace(
    "/<([^\/ ]+)(.+)/",
    "<$1 " . $key . '="' . $value . '"$2',
    $resourceString
);


Возврат результата: После обработки всех атрибутов функция возвращает модифицированную строку.

Примеры использования функции в Cotonti

Пример 1: Добавление атрибута в PHP

$html = '<input type="text" name="username">';
$modified = cot_rc_modify($html, ['class' => 'form-control', 'placeholder' => 'Enter your name']);
echo $modified;
// Результат: <input type="text" name="username" class="form-control" placeholder="Enter your name">

 

Пример 2: Изменение существующего атрибута

$html = '<input type="text" name="username" class="old-class">';
$modified = cot_rc_modify($html, ['class' => 'new-class']);
echo $modified;
// Результат: <input type="text" name="username" class="new-class">


Пример 3: Использование в шаблоне Cotonti

{PAGEADD_FORM_TITLE|cot_rc_modify($this, 'class="form-control" placeholder="Enter title"')}


В шаблоне изменяет класс и добавляет плейсхолдер к заголовку.

Рекомендации по применению в Cotonti
Модификация HTML в шаблонах: Используйте cot_rc_modify для динамического изменения атрибутов элементов в шаблонах. Это избавляет от необходимости дублировать HTML-структуру в разных вариантах.

Генерация форм: Применяйте функцию для модификации атрибутов полей форм, добавляя стили, плейсхолдеры или идентификаторы.

Темизация: Используйте для внесения изменений в ресурсные строки $R, что позволяет адаптировать HTML под различные темы или условия.

Плюсы функции
Гибкость: поддерживает как строковые, так и массивные атрибуты.
Простота использования.
Интеграция с системой ресурсов $R и шаблонами Cotonti.
Минусы
При большом количестве атрибутов или сложных HTML-структурах может быть менее эффективной, чем работа с DOM.
Требует корректной работы с регулярными выражениями (в случае сложных атрибутов или ошибок в их написании).

 

Пример записи прямо в шаблонах:

{USERS_REGISTER_USER|cot_rc_modify($this, 'placeholder="MyNickName"')}
{PHP|cot_rc_modify({PRDEDIT_FORM_METATITLE}, 'placeholder="{PHP.L.market_rmetatitle_placeholder}"')}
{PRDEDIT_FORM_TAGS|cot_rc_modify($this, 'class="uk-input"')}
{PRDEDIT_FORM_METATITLE|cot_rc_modify($this, 'placeholder="{PHP.L.market_rmetatitle_placeholder}"')}
{CONTACT_FORM_TEXT|cot_rc_modify($this, 'style="width:100%;"')}
{CONTACT_FORM_EMAIL|cot_rc_modify($this, '', 'contact_form_email')}
{FORM_PHONE|cot_rc_modify($this, 'class="text-form f-s_14 default w_240 m_col_12" placeholder="Номер телефона"')}
{PRDADD_FORM_TITLE|cot_rc_modify($this, '', 'folio_add_title_ph')}
{PRDADD_FORM_LOCATION_INPUT|cot_rc_modify($this, '', 'market_add_location_ph')}
{USERS_EDIT_NEWPASS|cot_rc_modify($this, 'placeholder="Введите" class="text-form m_col_12 m_m-l_0 default w_240 m_m-t_10"')}
{USERS_PROFILE_TEXT|cot_rc_modify($this, 'class="text wMax js-stopwords-check" id="details" rows="4" placeholder="Навыки, опыт, специализация..."')}

 

6 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 22.01.2025 22:55
  • Последнее обновление: 22.01.2025 22:55