Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, gostaria que todas as imagens do meu sistema passassem por uma ação. Isso para fazer thumb automatico.
Então se o cara fizer a inclusão de uma imagem, o sistema ja vai fazer o thumb sozinho.
Fiz isso ó
SetEnv APPLICATION_ENV development
RewriteBase /site
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !(\./$)
RewriteRule ^(.common/uploads.\.(jpg|JPG|gif|png).*)$ index.php?/default/index/thumb/name/, [L,QSA]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Olhem a saida
[b]Request Parameters:[/b]
array ( 'controller' => 'common', 'action' => 'uploads', 'destaques' => 'fdf222bd3c793a64f73d2be778fc8e35.jpg', 'module' => 'default', '/index/index/name/common/uploads/destaques/fdf222bd3c793a64f73d2be778fc8e35_jpg' => '', )
Notem que o controller e o action devedia ser "index", e a imagem deveria ser "name"
Alguem ja fez isso?
Valeu
Tem como você me dar um exemplo de como fazer isso com o router?
Por que o parametro $name vai ter o valor "common/uploads/destaque/asdasdasd.jpg"
Se eu fizer isso, ele acha que o $name = "common", $uploads = "destaque", $asdasdasd = ""
Tive esse problema com o router
Antes de mais nada, eu quero dizer que não curto muito esta pegada, porque toda vez que uma imagem for aberta desta forma será como se você estivesse abrindo uma página normal, ou seja, vai executar todos os seus plugins, front controller... Ou seja, se em uma página tiverem 20 imagens, ele vai executar 20 vezes todo este processo.
------------------
Tendo feito este alerta, vamos ao código para fazer isto funcionar. Primeiro você elimina o rewrite que você criou no .htacces. Depois, no seu application.ini você adiciona (vou incrementar um pouquinho):
resources.router.routes.imagem.route = "thumb/:nome-imagem/:largura/:altura"
resources.router.routes.imagem.defaults.module = default
resources.router.routes.imagem.defaults.controller = imagens
resources.router.routes.imagem.defaults.action = create-thumb
resources.router.routes.imagem.defaults.nome-imagem =
resources.router.routes.imagem.defaults.largura = 80
resources.router.routes.imagem.defaults.altura = 80
Aí, no src da imagem você faz algo assim:
<img src="<?php echo $this->url(array('nome-imagem' => 'fdf222bd3c793a64f73d2be778fc8e35.jpg', 'largura' => 100, 'altura' => 80), 'imagem', true)?>" />
E você terá um HTML gerado mais ou menos assim:
<img src="/baseurl/thumb/fdf222bd3c793a64f73d2be778fc8e35.jpg/100/80" />
Mas que vai direcionar para o controller Imagens, action createThumb do módulo default, tendo como parâmetros nome-imagem = fdf222bd3c793a64f73d2be778fc8e35.jpg, largura = 100 e altura = 80. Lá na definição da rota dissemos que o padrão para altura e largura são 80, então se você não passar de diferente, eles pegam estes valores. Aí dentro deste controller e action você pode criar o thumb do tamanho que você precisar, inclusive passando dinamicamente altura e largura, ou ainda passar mais parâmetros, como a pasta da imagem, se tem marca d'água ou qualquer outra informação que você precisar.
Captou a ideia? Se ficar alguma dúvida sobre o que foi feito, eu escrevi um artigo (link aqui) explicando como se faz para criar rotas no Zend.
Carlos Eduardo
Respondido pelo @MatiasRezende :)
Muito boa explicação Matias, mas só vou poder testar na segunda no serviço
Tambem pensei no rendimento disso, pensei até em fazer um fork no index.php, algo no inicio do index.php, algo assim
if(isset($_GET['imagem'])) {
// Cria o thumb
exit(0);
}
// Daqui pra baixo, o arquivo padrão
Você acha que essa solução seria boa? teria alguma dica para me dar quanto à isso? Criar o thumb na hora do upload está fora de questão, pois é um projeto que provavemente terá outras paginas e terá versão mobile futuramente, então isso tem que ser gerado na hora da exibição
>
Tambem pensei no rendimento disso, pensei até em fazer um fork no index.php, algo no inicio do index.php, algo assim
if(isset($_GET['imagem'])) {
// Cria o thumb
exit(0);
}
// Daqui pra baixo, o arquivo padrão
Você acha que essa solução seria boa?
Não vai funcionar, porque não existe $_GET['imagem']. Qualquer solução dentro do index.php vai ficar estranha.
>
teria alguma dica para me dar quanto à isso? Criar o thumb na hora do upload está fora de questão, pois é um projeto que provavemente terá outras paginas e terá versão mobile futuramente, então isso tem que ser gerado na hora da exibição
Já que não tem como criar na hora do upload, penso em algumas sugestões:
Veja se consegue entender o que eu sugeri ali acima. Se decidir por alguma mas tiver dificuldades de entender, pode postar que eu tento explicar melhor.
Carlos Eduardo
É Matias, acho que vou deixar assim mesmo e esperar, até por que as imagens que vao ser redirecionadas, são poucas. A pagina que mais vai ter essa manipulação, vai ter 9 imagens.
Olhando o que você postou, ja vi onde errei, mas só vou poder testar amanha cedinho no serviço, ai ja posto, mas acho que entendi sim ;)
Qualquer coisa existe algumas propostas de implementação do Zend_Image.
Elas ainda não foram oficializadas mas da para se usar, uma coisa que eu acho que seria legal você fazer é a implementação do cache da imagem do tamanho que você irá utilizar, além de você ganhar desempenho na aplicação e menos risco de alguem ficar tentando fazer a manipulação da URL. Segue 3 proposta:
Zend_Image Proposal - Davey Shafik - Já usei com sucesso!
Vou dar uma olhada, mas eu portei a classe canvas para o zend =)
Matias, ficou muito boa a solução. Mesmo carregando todos os plugins e tal, fiz um stress e ficou muito rapido na (listagem de produtos, onde tem 12 imagens por pagina)
Acho que vou continuar com essa solução, ja que meu stress retornou um bom tempo para 500 conexões. Acredito que meu site não terá isso simultaneamente =)
Ficou muito legal, agora não preciso ficar criando 15 thumbs diferentes e ainda correr o risco do cliente querer mais um thumb =)
Obrigado a todos, valeu pela solução
Para isso você tem que usa o Zend_Router