Шорткод для простановки ссылок в редакторе, с учетом состояния ресурса

Всем привет, у меня не вопрос, а просто удобный сниппет, в другие разделы публиковать не дает, рейтинг низкий =((, не нашел ни чего подобного, поэтому пилил сам, может кому то понадобится, упрощает жизнь сеошнику при внутренней перелинковке сайта. Собственно к сути:
Сделал сниппет который получает текст где проставлены вот такие шорткоды — "[id10] анкор ссылки []" где 10 это id ресурса на который должна сформироваться ссылка, по мне так удобнее чем делать жесткую ссылку через функционал редактора в админке, часто бывает что я меняю структуру, и меняется uri страницы, еще одним удобством сделал то что если ресурс на который мы ссылаемся еще не опубликован, то ссылка игнорируется, а конструкция шорткода просто вырезается, но как только ресурс публикуется (сделали отложенную публикацию к примеру) то ссылка на него сразу появится.
Создаем сниппет в админке, называем к примеру — url_by_id
Код сниппета:
<?php
$text = $input;
for ($i = 1; $i <= 8; $i++) { //8 это максимальное количество обрабатываемых шорткодов, можно конечно с foreach что то придумать, но тогда нужно массив создавать заранее, не стал заморачиваться
preg_match('[id\d{1,}]', $text, $output);
$res_id = str_replace('id','',$output[0]);
    if ($res_id) { 
        $res = $modx->getObject('modResource', $res_id);
            if ($res->get('published')){
                $url = $modx->makeUrl($res_id);
                $link = "<a href=\"$url\">";    
                $seraching_string = '['.$output[0].']';
                $text = str_replace($seraching_string, $link, $text);
               $text = preg_replace('/\[\]/', '</a>',$text, 1);
            }elseif(!$res->get('published')){
                $link = "";    
                $seraching_string = '['.$output[0].']';
                $text = str_replace($seraching_string, $link, $text);
                $text = preg_replace('/\[\]/', '',$text, 1);
                }
        }
}
return $text;
И использование в шаблонизаторе:
{$_modx->resource.content | url_by_id}
Если в текстовом редакторе сделать вот [id5]такую конструкцию[], то на фронте получится ссылка на url ресурса с id = 5, с анкором «такую конструкцию»
Как то так, сильно не пинайте)))
Max
Max
16 марта 2023, 09:54
modx.pro
417
-1

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

Артур Шевченко
16 марта 2023, 14:29
0
А почему бы не использовать [[~10]]?
    Max
    Max
    16 марта 2023, 14:41
    0
    [[~10]] просто вернет uri страницы с id = 10, а нужно обернуть фразу в тег «a» и подставить uri в href.
    Этот сниппет не для верстки чанков, а для использования его прямо в редакторе текста типа TinyMCE или любого другого поля, которое поддерживает ввод текста
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2