CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » Как преобразовать УРЛ с ЧПУ в динамический?
Официальный форум Eleanor CMS » Для вебмастеров и владельцев сайтов » Комната программистов
Loader
Собственно сабж.
Как преобразовать УРЛ вида: /films/sort_byreads/page_58.html
в: module=films&sort=byreads&page=58 ?
Maximkaboom
Loader, в чем же он динамический? )))) он тоже не изменяется)

если в eleanor отключить ЧПУ
Loader
В-общем я показал примеры что и из чего надо сделать. Если что-то неправильно - извиняйте!
Alexander
Вопрос? Зачем?

Как вариант, отпарсить при помощи стандартного класса URL. Потом преобразовать в строку...
Loader
Цитата (Alexander @ 2020-10-23 15:11)
Вопрос? Зачем?

Как вариант, отпарсить при помощи стандартного класса URL. Потом преобразовать в строку...


Это нужно для корректного редиректа на PDA-версию.
Допустим у человека есть ссылка на обычную версию сайта на которой включено ЧПУ, и он переходит по этой ссылке с мобильного устройства. Задача в том, чтобы корректно перекинуть этого человека на эту же страницу, но в PDA-версии, где ЧПУ не работает.
Loader
Написал вот такую каракатицу, она в принципе работает но хотелось бы чего попроще:

Цитата
        if (!$mob && $this->Mainclass->Functions->IsMobile() && $this->Mainclass->service_id!='7')
{
        $mname=isset($_GET['module']) ? $_GET['module'] : '';
if ($mname='films')
{
$url=$this->Mainclass->MyGetEnv('REQUEST_URI');
$cid=isset($_GET['cid']) ? (int)$_GET['cid'] : '';
$nid=isset($_GET['nid']) ? (int)$_GET['nid'] : '';
$news=isset($_GET['news']) ? $_GET['news'] : '';
$page=isset($_GET['page']) ? $_GET['page'] : '';
$do=isset($_GET['do']) ? $_GET['do'] : '';
$let=isset($_GET['let']) ? $_GET['let'] : '';
$date=isset($_GET['date']) ? $_GET['date'] : '';
$sort=isset($_GET['sort']) ? $_GET['sort'] : '';

$url=str_replace(
array(
                                                        $this->Mainclass->Url->s_delimeter.$mname,
                                                        $this->Mainclass->Url->s_defis,
                                                        $this->Mainclass->Url->ending,
                                                        $this->Mainclass->Url->s_delimeter,
                                                        $cid,
                                                        $nid,
                                                        $news,
                                                        $page,
                                                        $do,
                                                        $let,
                                                        $date,
                                                        $sort,
                                                ),
                                                array(
                                                        '?module='.$mname,
                                                        '=',
                                                        '',
                                                        '&',
                                                        'cid='.$cid,
                                                        'nid='.$nid,
                                                        'news='.$news,
                                                        'page='.$page,
                                                        'do='.$do,
                                                        'let='.$let,
                                                        'date='.$date,
                                                        'sort='.$sort,
                                                ),
                                                $url);


} else $url='';
    $this->Mainclass->Functions->Redirect('http://pda-kino.net/pda.php'.$url);#Если уникальный и с мобильного девайса то перенаправим на PDA-версию
     }
    
Loader
Пока есть такой вот код:

Цитата
        if (!$mob && Functions::IsMobile() && $this->Mainclass->service_id!='7')#Если уникальный и с мобильного девайса то перенаправим на PDA-версию
        {
         $mname=$this->Mainclass->Url->ParseToValue('module',false);
         $this->Mainclass->Url->Parse();
            $url=array('module'=>$mname)+array_slice($_GET,0,end($_GET) ? count($_GET) : -1);
            $url='?'.$this->Mainclass->Url->Query($url);
            Functions::Redirect('http://pda-kino.net/pda.php'.$url);
        }


Функции Query:

Цитата
        protected function QueryPart($arr,$pref,&$res)
    {
        $i=0;
        foreach($arr as $k=>&$v)
            if(is_array($v))
                $this->QueryPart($v,$pref.$k.'][',$res);
            elseif($v!==false)
                $res[]=$pref.(($k===$i++) ? '' : urlencode($k)).']='.(is_string($v) ? urlencode($v) : (int)$v);
    }

    public function Query($arr,$opts=array())
    {
        $opts+=array(
            'delim'=>'&',
        );
        $res=array();
        foreach($arr as $k=>&$v)
        {
            $k=urlencode($k);
            if(is_array($v))
                $this->QueryPart($v,$k.'[',$res);
            elseif($v!==false)
                $res[]=$k.'='.(is_string($v) ? urlencode($v) : (int)$v);
        }
        return join($opts['delim'],$res);
    }


но проблема в том что он не работает для полной новости. :(
Loader
Проблема решена Александром, за что ему огромное спасибо!

Первую часть кода из предыдущего поста надо заменить на это:

Цитата
#Если уникальный и с мобильного девайса то перенаправим на PDA-версию
        if(!$mob && Functions::IsMobile() && $this->Mainclass->service_id!='7')
        {
            $mname=$this->Mainclass->Url->ParseToValue('module',true);
            if($mname=='films')
            $this->Mainclass->Url->params=array('news');
            $this->Mainclass->Url->Parse();
            $url=array('module'=>$mname)+array_slice($_GET,0,end($_GET) ? count($_GET) : -1);
            $url='?'.$this->Mainclass->Url->Query($url);
            Functions::Redirect(ELEANOR_PROTOCOL.$this->Mainclass->domain.$this->Mainclass->site_path.'/pda.php'.$url);
        }

Loader
Исправлена Александром некорректная работа при переходе в категорию, первую часть кода заменить на это:

Цитата
#Если уникальный и с мобильного девайса то перенаправим на PDA-версию
        if(!$mob && Functions::IsMobile() && $this->Mainclass->service_id!='7')
        {
            $mname=$this->Mainclass->Url->ParseToValue('module',true);
            if($mname=='films')
            {
                $cat=false;
                if($this->Mainclass->Url->GetEnding()=='/')
                {
                    $cat=true;
                    $cnt=substr_count($this->Mainclass->Url->string,$this->Mainclass->Url->s_delimeter);
                    for($i=1;$i<=$cnt;$i++)
                        $this->Mainclass->Url->params[]='cat'.$i;
                }
                else
                    $this->Mainclass->Url->params=array('news');
            }
            $this->Mainclass->Url->Parse();
            if($mname=='films' and $cat)
            {
                $curl_trace=array();
                for($i--;$i>0;$i--)
                    if(!empty($_GET['cat'.$i]))
                    {
                        $curl_trace[]=$_GET['cat'.$i];
                        unset($_GET['cat'.$i]);
                    }
                $curl_trace=array_reverse($curl_trace);
                $this->Mainclass->SetModVal('categories_table','news_categories');
                $this->Mainclass->LoadClass('classes/others/class_categories_l.php');
                $this->Mainclass->Categories_l->Init();
                $dump=$this->Mainclass->Categories_l->GetDump(0,$curl_trace);
                if($dump)
                    $_GET['cid']=$dump['id'];
            }
            foreach($_GET as $k=>&$v)
                if($v=='')
                    unset($_GET[$k]);
            $url=array('module'=>$mname)+array_slice($_GET,0,end($_GET) ? count($_GET) : -1);
            $url='?'.$this->Mainclass->Url->Query($url);
            Functions::Redirect(ELEANOR_PROTOCOL.$this->Mainclass->domain.$this->Mainclass->site_path.'/pda.php'.$url);
        }

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.