Endereço

Boas pessoal!

Ando a estudar o urlManager através do blog demo e tenho uma pequena questão.

Tendo no main.php a seguinte configuração relacionada com o urlManager




...

'urlManager'=>array(

        	'urlFormat'=>'path',

                'showScriptName'=>false,

        	'rules'=>array(                        

        		'post/<id:\d+>/<title:.*?>'=>'post/view',

        		'posts/<tag:.*?>'=>'post/index',

        		'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

        	),

        ),

...



a qual permite fazer um endereço do tipo …blog/post/3/Linux+com+nova+versão! sendo o ‘3’ o id e ‘Linux+com+nova+versão!’ o title do post. Pelo que estive a ver, o id é preciso ser passado no endereço para que o PostController o apanhe através do $_GET[‘id’], caso contrário da erro.

É possível alterar as rules de modo a que o endereço fico do tipo …blog/post/3-Linux-com-nova-versao ou até mesmo blog/post/Linux-com-nova-versao (sendo aqui neste caso possível esconder o id do post do endereço mas mesmo assim o PostController conseguir saber qual o mesmo) ?

Vamos ao fato.

É possível alterar as rules de modo a que o endereço fico do tipo …blog/post/3-Linux-com-nova-versao?

É possivel sim, é só você alterar o urlManager, colocando um traço ao invés da barra, assim:


'post/<id:\d+>-<title:.*?>'=>'post/view'

… ou até mesmo blog/post/Linux-com-nova-versao (sendo aqui neste caso possível esconder o id do post do endereço mas mesmo assim o PostController conseguir saber qual o mesmo) ?

Para esconder o ID, você precisa criar esse titulo curto na Administração do site, como é feito no Magento, não tem como esconder o ID da URL e depois resgatar o ID pelo $_GET[‘ID’], por que o número 3 não vai está disponivel na URL para resgatar.

Se você cadastrar uma URL curta na Administração do tipo "linux-com-versao-nova", ai sim você pode fazer a busca por este titulo.

Obrigado Newerton, pela resposta :)

Bom, em relação à questão sobre blog/post/3-Linux-com-nova-versao, efectivamente altera o url mas apenas em relação do id, ou seja, colocando ‘-’ no urlManager em main.php o url passa para algo blog/post/3-Linux+com+nova+versão!, masno url ainda continuam ‘+’

Na segunda questão, não percebi onde queres chegar quando dizes para criar o titulo na administração! O titulo vem da introdução pela parte do utilizador quando este introduz um novo post.

Será boa politica, por ex. criar uma class helper para que faça uma replace de valores que não queiramos ver no url, tipo um preg_replace ?!

Para deixar uma URL mais limpa, você pode usar essa função aqui como Helper.




function slug($text, $limit = 100, $lower = true) {

    $azhifen = array(

        'Á' => 'A', 'À' => 'A', 'Ã' => 'A', 'Â' => 'A', 'Ä' => 'A', 'Æ' => 'AE', 'Å' => 'A',

        'á' => 'a', 'à' => 'a', 'ã' => 'a', 'â' => 'a', 'ä' => 'a', 'æ' => 'ae', 'å' => 'a',

        'É' => 'E', 'È' => 'E', 'Ê' => 'E', 'Ë' => 'E',

        'é' => 'e', 'è' => 'e', 'ê' => 'e', 'ë' => 'e',

        'Í' => 'I', 'Ì' => 'I', 'Î' => 'I', 'Ï' => 'I',

        'í' => 'i', 'ì' => 'i', 'î' => 'i', 'ï' => 'i',

        'Ó' => 'O', 'Ò' => 'O', 'Õ' => 'O', 'Ô' => 'O', 'Ö' => 'O', 'Ø' => 'O',

        'ó' => 'o', 'ò' => 'o', 'õ' => 'o', 'ô' => 'o', 'ö' => 'o', 'ø' => 'o', 'ð' => 'o',

        'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ü' => 'U',

        'ú' => 'u', 'ù' => 'u', 'û' => 'u', 'ü' => 'u',

        'Ç' => 'C', '?' => 'C', '?' => 'C',

        'ç' => 'c', '?' => 'c', '?' => 'c',

        'Ñ' => 'N', 'ñ' => 'n',

        'Ý' => 'Y', '?' => 'y', 'ý' => 'y', 'ÿ' => 'y',

        'Þ' => 'B', 'ß' => 'Ss',

        '?' => 'R', '?' => 'r',

        '?' => 'S', '?' => 's',

        '?' => 'Dj', '?' => 'dj',

        '?' => 'Z', '?' => 'z',

        ' ' => '-', '-' => '',

        ',' => '', '.' => ''

    );

    $slug = strtr($text, $azhifen);

    $slug = preg_replace('/ {2,}/', ' ', $slug); // remove unnecessary white spaces 

    $slug = trim($slug);

    $slug = preg_replace('/[^a-zA-Z0-9-]/i', '-', $slug);

    if ($lower)

        $slug = strtolower($slug);

    return $slug;

}



Eu uso ele assim:


Yii::app()->createUrl('produto/view', array('id' => $model->primaryKey, 'titulo' => slug($model->titulo)));

Resultado seria assim:

http://blog/post/3-linux-com-nova-versao

Na segunda questão, não percebi onde queres chegar quando dizes para criar o titulo na administração! O titulo vem da introdução pela parte do utilizador quando este introduz um novo post.

Vou lhe mostrar como é feito no Magento, e você veja como é o funcionamento.

Olha os campos preenchidos na Administração.

Olha como é a URL do produto.

A consulta é feita pela URL KEY, assim você não precisa usar o ID.

Obg Newerton pela dicas, ajudaram bastante!!