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

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


 nowheremany    15.05.2013    Блог    3111    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
192

1659 | 1292

nowheremany - 15 мая 2013 11:01 - Эксперт

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

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

ПафНутиЙ
1064

3393 | 2433

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

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

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

tcse
1

39 | 22

tcse - 15 мая 2013 11:19 - Юзер

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

TheImDim
18

327 | 291

TheImDim - 15 мая 2013 13:56 - Юзер

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

jensen
3 | 2

jensen - 15 мая 2013 14:15 - Юзер

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

Serik
4

408 | 191

Serik - 15 мая 2013 15:24 - Местный

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

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

TheImDim
18

327 | 291

TheImDim - 15 мая 2013 18:16 - Юзер

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

Serik
4

408 | 191

Serik - 15 мая 2013 15:29 - Местный

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

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

nowheremany
192

1659 | 1292

nowheremany - 15 мая 2013 15:41 - Эксперт

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

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

ivantu
13 | 5

ivantu - 15 мая 2013 23:35 - Юзер

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

rabidabi
43 | 39

rabidabi - 21 мая 2013 14:06 - Юзер

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

dj-avtosh
39

1479 | 390

dj-avtosh - 28 мая 2013 00:30 - шашлычник

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

skype: elhan.isaev

dj-avtosh
39

1479 | 390

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();

skype: elhan.isaev

TheImDim
18

327 | 291

TheImDim - 28 мая 2013 14:58 - Юзер

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

dj-avtosh
39

1479 | 390

dj-avtosh - 28 мая 2013 15:17 - шашлычник

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

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 28 мая 2013 15:18 - шашлычник

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

skype: elhan.isaev

ПафНутиЙ
1064

3393 | 2433

ПафНутиЙ - 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
13 | 5

ivantu - 3 июня 2013 22:41 - Юзер

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

ПафНутиЙ
1064

3393 | 2433

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

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

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

dj-avtosh
39

1479 | 390

dj-avtosh - 3 июня 2013 23:41 - шашлычник

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

skype: elhan.isaev

dj-avtosh
39

1479 | 390

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;
        }


skype: elhan.isaev

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