"Shorcode" yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
dps_guest
Сообщения: 19
Зарегистрирован: 2019.03.04, 15:31

"Shorcode" yii2

Сообщение dps_guest » 2019.11.05, 16:06

Например есть категория авто
и есть разные марки
- бмв
-мерседес и т.д.
СЕО описание записывает только один раз для категории авто.
А для марок получается что дубли.
Категории и марки связаны много к одному, получается категории могут быть и другие не только Авто а и мото как пример.
По этому хочеться какой-то шорткод чтобы можно как и просто марку подставлять по умолчанию так же и id может страницы и для неё другой текст совсем.
Подскажите как реализовать данное может уже похожее есть, буду благодарный.

unknownby
Сообщения: 34
Зарегистрирован: 2019.11.05, 16:34

Re: "Shorcode" yii2

Сообщение unknownby » 2019.11.05, 17:06

Для категорий и марок в БД делаешь поля с СЕО описанием.
Когда выводишь страницу с категорией, выдаешь значение из поля БД категорий, если выдается страница марок, то берется из БД марок.
Оптимально по-моему.

dps_guest
Сообщения: 19
Зарегистрирован: 2019.03.04, 15:31

Re: "Shorcode" yii2

Сообщение dps_guest » 2019.11.18, 15:55

А как добавить переменную в админке?
Вся суть в том что информация для каждого товара может быть разная.

dps_guest
Сообщения: 19
Зарегистрирован: 2019.03.04, 15:31

Re: "Shorcode" yii2

Сообщение dps_guest » 2019.11.18, 16:04

Пример :
Текст текст текст текст текст текст [brand=1 text="TEST 5"] текст текст текст текст .

И в нужном месте если ето бренд=1 вставиться TEST 5.

yiiliveext
Сообщения: 507
Зарегистрирован: 2019.08.13, 01:49

Re: "Shorcode" yii2

Сообщение yiiliveext » 2019.11.18, 17:41

Рендерите в переменную, находите регуляркой шорткод, парсите и заменяете.
Возвращаете результат.

dps_guest
Сообщения: 19
Зарегистрирован: 2019.03.04, 15:31

Re: "Shorcode" yii2

Сообщение dps_guest » 2019.11.28, 22:56

А можно какой-то примитивный пример?
может есть готовая библиотека /addons ?

unknownby
Сообщения: 34
Зарегистрирован: 2019.11.05, 16:34

Re: "Shorcode" yii2

Сообщение unknownby » 2019.11.29, 09:18

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

Модель подгружается же для страницы?

Код: Выделить всё

return $this->render('product', [
            'model'  => $model,
        ]);
То можно использовать модель.

Код: Выделить всё

Текст текст текст <?= $model->brand_name ?> текст текст текст.
Может можно увидеть модель, вьюху и контроллер? Чтоб понимать где и что выводить собираешься.

someweb
Сообщения: 544
Зарегистрирован: 2017.03.09, 10:12

Re: "Shorcode" yii2

Сообщение someweb » 2019.11.29, 10:47

Пример: https://gist.github.com/dukeofharen/e2c ... 408b53d743
Перед тем как передать во view прогоняете текст через него.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

dps_guest
Сообщения: 19
Зарегистрирован: 2019.03.04, 15:31

Re: "Shorcode" yii2

Сообщение dps_guest » 2019.12.03, 16:45

Понял, супер.
Спасибо.

dps_guest
Сообщения: 19
Зарегистрирован: 2019.03.04, 15:31

Re: "Shorcode" yii2

Сообщение dps_guest » 2019.12.04, 16:47

А подскажите как взять текст из [cat id='1']текстекст текст текст[/cat]
а то получаеться в $data только идишник

Код: Выделить всё

   "cat" => function($data){
                        $content_desc = "";
                        if(isset($data["id"])){
                            $content_desc = print_r($data);
                        }
                        return $content_desc;
                    }
            );
        function handleShortcodes($content_desc, $shortcodes){
            foreach($shortcodes as $key => $function){
                $dat = array();
               preg_match_all("/\[".$key." (.+?)\](.*?)\[\/".$key."\]/s", $content_desc, $dat);
                if(count($dat) > 0 && $dat[0] != array() && isset($dat[1])){
                    $i = 0;
                    $actual_string = $dat[0];
                    foreach($dat[1] as $temp){
                        $temp = explode(" ", $temp);
                        $params = array();
                        foreach ($temp as $d){
                            list($opt, $val) = explode("=", $d);
                            $params[$opt] = trim($val, '"');
                        }
                        $content_desc = str_replace($actual_string[$i], $function($params), $content_desc);
                        $i++;
                    }
                }
            }
            return $content_desc;
        }

yiiliveext
Сообщения: 507
Зарегистрирован: 2019.08.13, 01:49

Re: "Shorcode" yii2

Сообщение yiiliveext » 2019.12.04, 18:02

Код: Выделить всё

<?php
//The content which should be parsed
$content = '<p>Hello, my name is John an my age is [calc-age day="4" month="10" year="1991"]years[/calc-age].</p>';
$content .= '<p>Hello, my name is Carol an my age is [calc-age day="26" month="11" year="1996"].</p>';
//The array with all the shortcode handlers. This is just a regular associative array with anonymous functions as values. A very cool new feature in PHP, just like callbacks in JavaScript or delegates in C#.
$shortcodes = array(
    "calc-age" => function($data){
        $content = "";
        //Calculate the age
        if(isset($data["day"], $data["month"], $data["year"])){
            $age = date("Y") - $data["year"];
            if(date("m") < $data["month"]){
                $age--;
            }
            if(date("m") == $data["month"] && date("d") < $data["day"]){
                $age--;
            }
            $content = $age;
        }
       
        return $content . (empty($data['text']) ? '' : ' ' . $data['text']);
    }
);
//http://stackoverflow.com/questions/18196159/regex-extract-variables-from-shortcode
function handleShortcodes($content, $shortcodes){
    //Loop through all shortcodes
    foreach($shortcodes as $key => $function){
        $dat = array();
        preg_match_all("#\[".$key." (.+?)\]((.*?)\[/".$key."\])?#", $content, $dat);
        if(count($dat) > 0 && $dat[0] != array() && isset($dat[1]) && isset($dat[3])){
            $i = 0;
            $actual_string = $dat[0];
            foreach($dat[1] as $temp){
                $temp = explode(" ", $temp);
                $params = array();
                foreach ($temp as $d){
                    list($opt, $val) = explode("=", $d);
                    $params[$opt] = trim($val, '"');
                }
                $params['text'] = $dat[3][$i];
                $content = str_replace($actual_string[$i], $function($params), $content);
                $i++;
            }

        }
    }
    return $content;
}
echo handleShortcodes($content, $shortcodes);
?>

Ответить