Banner Rotativo

Olá a todos,

Eu tinha um script obsoleto para banner rotativo, mais era somente para 3 categoria fixa.

Tive que desenvolver um dinâmico, vamos lá.

Não sei se posicionei os meus códigos correto.

/protected/components/Controller.php




public function init() {

        

        

        $banners = Categoria::model()->findAll(array(

                    'condition' => 'categoria = :categoria',

                    'params' => array(':categoria' => 'banner')

                ));


        foreach ($banners as $key => $value) {


            $banner[$value->titulo] = Banner::model()->with(array('arquivo'))->findAll(array(

                        'select' => 'b.codbanner, b.titulo, b.datacriacao, b.url, a.arquivo as arquivo',

                        'condition' => 'a.bd = :bd AND b.liberar = :liberar AND b.codcategoria = :codcategoria',

                        'params' => array(':bd' => 'banner', ':liberar' => 1, ':codcategoria' => $value->codcategoria),

                        'order' => 'rand()',

                        'limit' => 10

                    ));

        }


        Yii::app()->session->add('banners', $banner);

    }



Agora o Widget que criei:




class boxBanner extends CWidget {


    public $categoria, $posicao;


    public function init() {       

    }


    public function run() {


        $banner = Yii::app()->session['banners'];

        $codbanner = $banner[$this->categoria][$this->posicao]->codbanner;

        $titulo = $banner[$this->categoria][$this->posicao]->titulo;

        $datacriacao = $banner[$this->categoria][$this->posicao]->datacriacao;

        $url = $banner[$this->categoria][$this->posicao]->url;

        $arquivo = $banner[$this->categoria][$this->posicao]->arquivo;


        $pathinfo = pathinfo($arquivo);

        $extension = $pathinfo['extension'];

        $pasta = ($datacriacao = explode(' ', $datacriacao)) ? preg_replace('/-/', '_', $datacriacao[0]) : $datacriacao[1];

        list($largura, $altura) = explode('x', $this->categoria);


        if ($extension == "jpg" || $extension == "gif" || $extension == "png") {

            echo CHtml::link(CHtml::image(Yii::app()->baseUrl . '/up/banner/' . $pasta . '/' . $arquivo, $titulo, array('width' => $largura, 'height' => $altura)), Yii::app()->createUrl('banner/view', array('id' => $codbanner)), array('target' => '_blank', 'title' => $titulo));

        } else if ($extension == "swf") {

            echo "<div onclick=\"open('verlink.php?id=$codbanner', null,'height=$altura,width=$largura,status=yes,toolbar=yes,menubar=yes,resizable=yes,location=yes,scrollbars=yes')\" style=\"position:absolute; cursor: pointer; width:$largura" . "px; height:$altura" . "px; z-index:1\">

						<table width=\"$largura\" height=\"$altura\" style=\"cursor: pointer;\">

							<td></td>

						</table>

					</div>

					<div align=\"left\" style=\"cursor: pointer;\">

						<script type=\"text/javascript\">

							AC_FL_RunContent('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0', 'width', '$largura', 'height', '$altura', 'src', '" . substr($pasta, 0, -4) . "', 'wmode', 'opaque', 'quality', 'high', 'pluginspage', 'http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','" . substr($pasta, 0, -4) . "' );

						</script>

					</div>

				<noscript>

					<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\" width=\"$largura\" height=\"$altura\">

							<param name=\"movie\" value=\"$pasta\">

							<param name=\"quality\" value=\"high\">

							<param name=\"wmode\" value=\"transparent\">

						<embed src=\"$pasta\" wmode=\"transparent\" quality=\"high\" pluginspage=\"http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"application/x-shockwave-flash\" width=\"$largura\" height=\"$altura\">

			</embed>

					</object>

				</noscript>";

        }


        $banner = Banner::model()->findByPk($codbanner);

        $banner->view += 1;

        $banner->save(false);

    }


}



O script ta funcionando perfeito, eu só postei aqui, para saber se fiz algo de errado de declarar a construção do array no init() do Controller, ou se tinha uma colocação correta de fazer este widget.

Valeu

Olá, Newerton,

Eu fiz um componente de banner e faço da seguinte maneira:

Na view principal do site insiro o $this->widget(‘SJqueryBanner’,array(…))

No meu widget, na init() eu chamo um método dentro do meu model Banner que me retorna os banners ativos, exemplo

(widget SJqueryBanner)




$banners = null;


public function init(){

$this->banners = Banner::model()->getActive();

}



No run do meu widget eu faço:




public function run(){

if($this->visible):

$this->render('sjquerybanner',array($banners=>$this->banners));

endif;


E na view do meu widget (sjquerybanner) eu coloco todo o html

[code]

<div class="banner">

<?php 

foreach($banners as $banner):

.....

endforeach;

?>

</div>



}

[/code]

Obviamente, são apenas duas maneiras de se fazer, não existe o certo e errado, mas da forma que eu mostrei acima, não utilizamos o SESSION para armazenar os banners e fica flexível para reutilizar em qualquer controller, sem a necessidade de utilizar o init() do controller.

Não lembro o motivo de eu não ter publicado o SJqueryBanner como extensão, talvez foi falta de tempo…hehe

Espero que tenha sido útil

:)

Abração!

Scoob,

Legal o que você vez, tem como anexar sua extensão ae, quero entender o "if($this->visible):", e que no site que faço, é mostrando 1 banner por categoria, as vezes tem 2 locais no layout que vai categoria repetida, e nesse caso não pode repetir os banners.

Opa, posto sim, porém estou sem o código aqui, preciso pegar à noite em casa e aí envio.

O ($this->visible) é só para caso você precise condicionar a renderização do banner, é um atributo do widget, por exemplo, se eu precisar renderizar somente se o usuário estiver logado, passo o valor para o componente:




$this->widget('SJqueryBanner',array(

'visible'=>(!Yii::app()->user->isGuest)

))



No caso, você manipularia o valor de acordo com o que precisa.

:)

Abçs

Newerton, segue anexo, descompacte na pasta protected/extensions…tem um code_sample e um exemplo da função que carrega os banners no model

O visible não está incluído nesta versão, mas é só questão de você declarar como public e checar no método run()

QQ coisa dá um alô…

Abraços!!

:)

1655

sjquerybanner_1.zip

Eu sabia que tinha alguma coisa estranha hehehehe

Foi falta de comunicação minha!

Scoob vou guardar essa extensão, estudei ela agora e está bem feita.

Eu acho que o tópico não era banner ROTATIVO, e sim banner ALEATÓRIO. Eu fiz sua extensão e vi o jquery já no nome da extensão ai vi que tinha coisa de errado.

No meu caso, são banners de publicidade que fica espalhado pelo site, como existe 2 areas no site que vai banner as mesmas dimensões do banner, então ela não pode se repetir.

Site desenvolvimento: http://ocorreionews.cazper.com.br/

Observa que acima da Galeria de Foto, e depois abaixo temos os mesmo banner ‘630x80’, eles nunca podem se repetir no site, acho que essa seria a explicação correta.

Entendo,

A extensão é só para exibir os banners, a lógica de como recuperá-los deverá ser programada de acordo com a regra de negócio.

:)

Abraços!