Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Блог » Реализуем диапазоны значений в тэгах ДЛЕ на примере категорий

Реализуем диапазоны значений в тэгах ДЛЕ на примере категорий


 nowheremany    15.05.2013    тэги, функциональное программирование    Блог    4441    21 комментарий

На оф сайте просят реализовать в тэге категорий ([category=x]) возможность указать диапазон значений 1-5, а не 1,2,3,4,5.
Celsoft отказывается, а вот мы - нет )

Для 9.8 (у остальных вероятно также)

engine/modules/functions.php
найти
function check_category($cats, $block, $category, $action = true) {

    $cats = str_replace(" ", "", $cats );    
    $cats = explode( ',', $cats );

заменить на это
function check_category($cats, $block, $category, $action = true) {
    $cats = str_replace(" ", "", $cats );
    $cats = preg_replace('#(\d+)-(\d+)#e', "implode(',',range('\\1','\\2'))", $cats);
    $cats = explode( ',', $cats );


Теперь можно указывать [category=1-5][/category] вместо [category=1,2,3,4,5][/category]

А дело то было в 1 строчке ))))

21 комментарий

nowheremany
Эксперт

nowheremany - 15 мая 2013 11:01 -

Не удивлюсь если целсофт скопипастит ) Гы

Благодарность принимаю тут Связь

ПафНутиЙ
Админ

ПафНутиЙ - 15 мая 2013 11:12 -

Надо будет в BlockPro добавить )))
Спасибо за полезняшку!

Каков вопрос - таков и ответ. Просто помните об этом.

tcse
Юзер

tcse - 15 мая 2013 11:19 -

оооо... крайне полезная штука!!!!
особенно на сайтах с количеством категорий от 50 и выше :)

TheImDim
Юзер

TheImDim - 15 мая 2013 13:56 -

также будет работать [category=1-5, 10-15, 20-30][/category], что крайне удобно

jensen
Юзер

jensen - 15 мая 2013 14:15 -

Спасибо большое! Действительно удобная штука, как раз делаю сайт, категорий более 20.

Serik
Местный

Serik - 15 мая 2013 15:24 -

Плюсанул.
А почему Целсовт отказывался ? Не умеет или влом ? ))

СПАСИБО надо тыкать в кнопку!

TheImDim
Юзер

TheImDim - 15 мая 2013 18:16 -

не знал наверно про функцию range()

Serik
Местный

Serik - 15 мая 2013 15:29 -

Для [group=xxx][/group] надо тоже по возможности сделать, nowheremany )

СПАСИБО надо тыкать в кнопку!

nowheremany
Эксперт

nowheremany - 15 мая 2013 15:41 -

аналогично. Вставляем эту строку также и все

Благодарность принимаю тут Связь

ivantu
Юзер

ivantu - 15 мая 2013 23:35 -

nowheremany,
Краксавчек

rabidabi
Юзер

rabidabi - 21 мая 2013 14:06 -

Красавчик! Очень удобно.

dj-avtosh
PHP-developer

dj-avtosh - 28 мая 2013 00:30 -

хороша дыра, где стоит такой мод? дайте адрес)

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 28 мая 2013 14:22 -


да бы обойти все эти модификаторы e, и лишние телодвижения, иначе можно любой символ кроме цифры протолкнуть в способ в шапке, накидал аналог:


$cats = str_replace( " ", "", $cats );

preg_match ( "#(\d+)-(\d+)#i", $cats, $test );

$cats = ! empty ( $test ) ? range ( $test[1], $test[2] ) : array();

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

TheImDim
Юзер

TheImDim - 28 мая 2013 14:58 -

Каким образом все что вы написали тут связано с уязвимостью? И как это вы собрались протолкнуть переменную $cats GET запросом? Поподробней пожалуйста.

dj-avtosh
PHP-developer

dj-avtosh - 28 мая 2013 15:17 -

Уязвимость на уровне доступа к редактированию шаблона..

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 28 мая 2013 15:18 -

TheImDim,
так то кому как удобно, держите у себя в коде побольше e модификаторов ;)

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ПафНутиЙ
Админ

ПафНутиЙ - 1 июня 2013 10:58 -

Безопасный код:
Заменяем:
unction check_category($cats, $block, $category, $action = true) {

    $cats = str_replace(" ", "", $cats );    
    $cats = explode( ',', $cats );

На:
function getDiapazone($diapazone = false)
{
    if ($diapazone !== false)
    {
        $diapazone = str_replace(" ", "", $diapazone);
        if (strpos ($diapazone, ',') !== false)
        {
            $diapazoneArray = explode (',', $diapazone);
            $diapazoneArray = array_diff($diapazoneArray, array(null));

            foreach ($diapazoneArray as $v)
            {
                preg_match ("#(\d+)-(\d+)#i", $v, $test);

                $diapazone = !empty($diapazone) && is_array ($diapazone) ?
                array_merge ($diapazone, (!empty ($test) ? range($test[1], $test[2]) : array()))
                : (!empty ($test) ? range($test[1], $test[2]) : array());
            }

        } else {
            preg_match ("#(\d+)-(\d+)#i", $diapazone, $test);

            $diapazone = !empty ($test) ? range($test[1], $test[2]) : array();
        }

        $diapazone = !empty ($diapazone) ? array_unique($diapazone) : array();

        return $diapazone;
    }

    return array();
}

function check_category($cats, $block, $category, $action = true) {
    $cats = getDiapazone($cats);

Код взят из модуля blockpro 3, но я его не проверял.

Каков вопрос - таков и ответ. Просто помните об этом.

ivantu
Юзер

ivantu - 3 июня 2013 22:41 -

целсофт уже внедрил по ходу код к себе в пресс релиз 10

ПафНутиЙ
Админ

ПафНутиЙ - 3 июня 2013 23:21 -

И не только это ))
Хоть бы спасибо сказал людям...

Каков вопрос - таков и ответ. Просто помните об этом.

dj-avtosh
PHP-developer

dj-avtosh - 3 июня 2013 23:41 -

а сегодня мы код вообще здорово переделали))

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 3 июня 2013 23:46 -

Код таков:


        /**
         * Получение диапазона между двумя цифрами, и не только
         * @param string $diapasone
         * @return string
         * @author Elkhan I. Isaev <elhan.isaev@gmail.com>
         */

        public function getDiapazone($diapazone = false)
        {
            if ($diapazone !== false)
            {
                $diapazone = str_replace(" ", "", $diapazone);

                if (strpos ($diapazone, ',') !== false)
                {
                    $diapazoneArray = explode (',', $diapazone);
                    $diapazoneArray = array_diff($diapazoneArray, array(null));
        
                    foreach ($diapazoneArray as $v)
                    {
                        if (strpos ($v, '-') !== false)
                        {
                            preg_match ("#(\d+)-(\d+)#i", $v, $test);
            
                            $diapazone = !empty($diapazone) && is_array ($diapazone) ?
                            array_merge ($diapazone, (!empty ($test) ? range($test[1], $test[2]) : array()))
                            : (!empty ($test) ? range($test[1], $test[2]) : array());

                        } else {
                            $diapazone = !empty($diapazone) && is_array ($diapazone) ?
                            array_merge ($diapazone, (! empty ($v) ? array ((int) $v) : array()) )
                            : (!empty ($v) ? array ((int) $v) : array());                            
                        }
                    }
        
                } elseif (strpos ($diapazone, '-') !== false) {

                    preg_match ("#(\d+)-(\d+)#i", $diapazone, $test);         
                    $diapazone = !empty ($test) ? range($test[1], $test[2]) : array();

                } else {
                    $diapazone = array ((int) $diapazone);
                }
        
                $diapazone = !empty ($diapazone) ? array_unique($diapazone) : array();        
                $diapazone = implode(',', $diapazone);
            }

            return $diapazone;
        }


По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте
наверх