Transformar em URL amigavel o GET

Galera surgiu uma dúvida um pouco complexa.

Quero enviar atraves do metodo GET os dados quando submito um botão. Sendo assim quero tambem transformar as URL’s em amigaveis:

Tipo: galeria=3&id=12

em galeria/3/id/12

E tambem quero saber se posso fazer isso no index, e como posso pegar o GET da forma que o Yii oferece?

É um pouco grande minha duvida, mas agradeço desde já quem ajudar :D

Acácio,

Na sua ‘urlManager’ do main/config.php, vai precisa incrementar uma expressão regular parecida com essa aqui:


'<controller:\w+>/<id_galeria:\d+>/id/<id:\d+>' => '<controller>',

galeria/3/id/12

ou


'<controller:\w+>/<id_galeria:\d+>/<id:\d+>' => '<controller>',

galeria/3/12

Ai sua URL vai ter que ser criada assim:


Yii::app()->createUrl('galeria', array('id_galeria' => 3, 'id' => 12));

ou


Yii::app()->createAbsoluteUrl('galeria', array('id_galeria' => 3, 'id' => 12));

Eu uso createAbsoluteUrl() por que to usando uma extensão de SEO que recomenta o uso.

A função createUrl ficaria na action do controller?

Dentro da action do controller você pode chamar ela da seguinte forma:


$this->createUrl('controller/action')

Galera resolveu parte do app que estou fazendo. Muito obrigado mais uma vez pela atenção de vocês.

Abraço a todos.

Newerton, nao entendi muito bem essa regra que vc colocou ai.

Também to com esse problema em alguns forms. No caso, vc coloca na rule o nome do proprio parametro que será passado pra url?

Dyego,

Isso mesmo, vou pegar o exemplo do Acácio (galeria/3/id/12)


'<controller:\w+>/<id_galeria:\d+>/id/<id:\d+>' => '<controller>',

Só que você precisa usar o createUrl() ou createAbsoluteUrl(), assim ele detecta qual das regras vai se encaixar sua URL.

Acho que nao consegui entender muito bem. Ve se eu fiz algo errado aqui, olha só:

Tenho um formulario com um campo que gera essa URL:


/busca/buscaGenerica?search=teste&btn_search=Buscar

No formulário eu coloquei a action dessa forma:


'action'=>$this::createUrl('busca/buscaGenerica/')

E inclui isso aqui no urlManager:


'veiculos/<search>/<btn_search>' => 'busca/buscaGenerica',

deixei passar algo?

No formulário deixa assim:


'action'=>Yii::app()->createUrl('busca/buscaGenerica'),

E no urlManager:


'busca/<search:.+>/<btn_search:.+>' => 'busca/buscaGenerica',

Eu não sei, se você deixar o veiculo com parametro de url, se ele vai buscar os dados no VeiculoController, faça o teste com os dois.

Tentei assim tb…nada

Olha só como tá o UrlManager completo:


'urlManager'=>array(

			'urlFormat'=>'path',

                        'showScriptName'=>false,

                        'appendParams'=>true,

                        'baseUrl'=>'/emc001',

			'rules'=>array(

                            

                                'veiculos' => 'busca/index',

                            

                                'busca/<search:.+>/<btn_search:.+>' => 'busca/buscaGenerica',

				

                                'sitemap.xml'=>'site/sitemapxml',

                            

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

                            

                                '<controller:\w+>/<id:\d+>'=>'<controller>/view',

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

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

			),

                        

                        

		),

Tipo, todas as urls eu consigo mudar, com excessão das URLS que são geradas pelos forms…elas continuam dando errado.

Olha só, testando escrever a URL em formato PATH manualmente, a pagina é acessada corretamente, desse jeito:


/busca/buscaGenerica/search/dd/btn_search/Buscar

Meu problema é que quando eu submito o form, a URL não é escrita nesse formato…é escrita no formato GET tradicional.

Olha como tá meu htaccess:


RewriteEngine on

# if a directory or a file exists, use it directly

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST-FILENAME} !-d


 

#otherwise forward it to index.php

RewriteRule ^.*$ index.php [NC,L]

bom…desenterrando esse topico pra saber se alguem ja teve um problema parecido que possa compartilhar como foi resolvido. Tá tenso isso.

abraço

Opa Dyego, beleza!?

Cara… Para que a URL seja gerada no padrão amigável, o seu padrão deve estar definido no urlManager.

Tens certeza que o padrão foi definido?

Posta aqui para a gente o teu urlManager e a URL que o formulário esta gerando para a gente dar uma olhada.

Tranquilo Lothor,

Postei uns posts acima. Usei o método path no UrlManager. Dá uma olhada:


'urlManager'=>array(

			'urlFormat'=>'path',

                        'appendParams'=>true,

                        'baseUrl'=>'/emc001',

			'rules'=>array(

                            

                                'veiculo/<id>/<desc>' => 'veiculos/detalhesVeiculo',

                                'anunciante/<id>/<desc>' => 'anunciantes/perfilVendedor',

                                

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

                                

                                'comprar-veiculo' => 'busca/index',

                                'vender-veiculo' => 'site/login',

                            

                                'sitemap.xml'=>'site/sitemapxml',

                            

                                '<controller:\w+>/<id:\d+>'=>'<controller>/view',

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

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

			),

                        

                        

		),

Todas essas regras ai funcionam bem, porém quando eu tento criar uma regra para deixar os parametros GET amigáveis também, é que não funciona. Por exemplo, quero deixar essa url:


/busca/buscaGenerica?search=teste&btn_search=Buscar

desse jeito:


/busca/teste

Não sei se vc entendeu, mas a ideia é esconder o nome da variável e passar apenas o valor que é enviado pelo form.

Já tentei uma regra assim:


'busca/<search:\w+>' => 'busca/buscaGenerica'

Porém não funciona. O engraçado, como eu disse anteriormente, é que se eu tentar acessar a URL no modo amigável, digitando manualmente no navegador…ela funciona, mas quando submito o form, a URL gerada é a no modo normal.

Você já tentou adicionando essa regra?


'busca/<search:\w+>/<btn_search:\w+>' => 'busca/buscaGenerica'

Tentei agora. Nada também.

Só pra vc como tá o form:


 <?php $form=$this->beginWidget('CActiveForm', array(

                            'id'=>'search-form',

                            'enableAjaxValidation'=>false,

                            'method'=>'get',

                            'action'=>Yii::app()->createUrl('busca/buscaGenerica')

                        )); ?>

Dyego,

Te respondi por MP, mais vou explicar aqui.

Os dados do formulário em si não pode ser adicionado na URL amigavel, por que são váriaveis não definidas, então essas váriaveis precisa ser tratada depois de submita.

Na sua actionBuscaGenerica(), você pega os dados do formulário vindo do $_GET, e usa em um redirect(), mais ou menos assim:




if(!empty($_GET['btn_search']) && isset($_GET['btn_search'])){

                $this->redirect(Yii::app()->createUrl('busca/resultado', array('search' => $_GET['search'])));

        }




Ai na sua actionResultado(), você posta os dados, mais agora a váriavel será somente a $_GET[‘search’], caso esteja indo concatenado na URL, posta para nos sua ‘urlManager’ que fica na pasta config/main.php.