Você está na página 1de 48

Iniciando com YII Framework

Volmar Machado da Silva Neto

PHP: Linguagem, aplicabilidades, porque php?

Linguagem Dinamica Linguagem com foco em desenvolvimento Web - Velocidade e robustez - Estruturado eorientado a objetos - ortabilidade - !i"agem dinamica - Sinta#e similar ao $%$&&e erl - '"en-source

PHP: Linguagem, aplicabilidades, porque php?

' ( tem muitas bibliotecas) E#* S'+ , -ML, D'M, Stream, D' etc))) !em uma comunidade gigantesca) E#) Listas, gru"os, foruns, em"resas) +tualiza./es constantes) Documenta.0o)
Estatisticas
Linguagem Sites Porcentagem

PHP ASP.NET Perl Python a!a

3.9984.25 2.294.166 259.931 159.475 18."65

59% 34% 4% 2% "%

PHP: Linguagem, aplicabilidades, porque php?


1 usado "or muitas em"resas de sites institucionais, a a"lica./es de intranet e e#tranet) !emos como e#em"lo, faceboo2, milhares de sites e blogs com 3ord"ress, temos ainda outros 4ue usam joomla e dru"al, e tamb5m 6ii frame3or2)

file:///C:/Users/Internet/Desktop/magento.jpg file:///C:/Users/Internet/Desktop/images.jpg file:///C:/Users/Internet/Desktop/drupal.jpeg

file:///C:/Users/Internet/Desktop/joomla.jpeg

YII Framework
' nome 6ii re"resenta as "alavras f7cil 8eas9:, e;ciente 8ef;cient: e e#tens<vel 8e#tensible: 6ii 5 um frame3or2 de alta "erformance em ( 4ue utiliza com"onentes "ara o desenvolvimento de grandes a"lica./es Web) =eutiliza.0o de c>digos) +celera.0o signi;cativa do "rocesso de desenvolvimento) ' 6ii 5 um frame3or2 de "rograma.0o Web gen5rico) $aching "ara o desenvolvimento de a"lica./es com alto tr7fego de dados) $omo a maioria dos frame3or2s ( , ' 6ii 5 um frame3or2 MV$) E;ciente, rico em recursos e bem documentado) ' 6ii 5 n0o 5 nem um sub"roduto de algum "rojeto, nem um conglomerado de trabalho de terceiros)

htt"*%%nomedoservidor%caminho%do%9ii%re4uirements%inde#)"h"

YII Framework: Estrutura

YII Framework: Logica

YII Framework:

!"

Modelo-Vis0o-$ontrole ' 6ii im"lementa o "adr0o de desenvolvimento modelo-vis0o-controle 8MV$: 4ue 5 am"lamente adotado na "rograma.0o Web) ' MV$ visa se"arar a l>gica de neg>cio da interface com o usu7rio, assim os "rogramadores "odem mudar facilmente cada "arte, sem afetar as outras) No "adr0o MV$, o modelo re"resenta as informa./es 8os dados: e as regras de neg>cio, a vis0o cont5m elemento de interface com o usu7rio, como te#tos, formul7rios, e o controle gerencia a comunica.0o entre o modelo e a vis0o) +l5m MV$, o 6ii tamb5m introduz um controle de frente, chamado a"lica.0o 8a""lication:, 4ue re"resenta o conte#to de e#ecu.0o dos "rocessos re4uisitados) + a"lica.0o recebe a solicita.0o do usu7rio e a envia "ara um controlador ade4uado "ara ser "rocessada)

YII Framework: Logica

YII Framework: YII"


@erramenta de linha de comando "ara automa.0o comandos* - controller - crud - form - hel" - model - module ? cd Web=oot ? "h" 6ii=oot%frame3or2%9iic)"h" 3eba"" nomea""

YII Framework: YII"


$reate a Web a""lication under A%Webroot%nomea""B C6esDNoE 6es m2dir %Web=oot%nomea"" m2dir %Web=oot%nomea""%assets m2dir %Web=oot%nomea""%css generate css%bg)gif generate css%form)css generate css%main)css )))

YII Framework: Estrutra de diretorio da aplica#$o


e#em"lo% inde#)"h" Scri"t Fnico de entrada da a"lica.0o inde#-test)"h" Scri"t de entrada "ara testes funcionais assets% +r4uivos de recurso "ublicados css% @olhas de estilo images% Diretorio de imagens themes% !emas da a"lica.0o "rotected% Diretorio "rotegido dos ar4uivos de a"lica.0o com"onents% $om"onentes reusaveis da a"lica.0o $ontroller)"h" $lasse base "ara as controllers GserHdentit9)"h" $lasse usada "ara autentica.0o config% Diretorio de configura.0o da a"lica.0o console)"h" $onfigura.0o do console da a"lica.0o main)"h" $onfigura.0o da a"lica.0o 3eb test)"h" $onfigura.0o "ara os testes funcionais controllers% Diretorio das controllers da a"lica.0o Site$ontroller)"h" $ontroller "adr0o

YII Framework: Estrutra de diretorio da aplica#$o


e#tensions% messages% models% Login@orm)"h" $ontact@orm)"h" runtime% tests% vie3s% la9outs% main)"h" columnI)"h" columnJ)"h" site% "ages% about)"h" contact)"h" error)"h" inde#)"h" login)"h" $ontem e#tens/es de terceiros Mensagens traduzidas Diretorio de Modelos Modelo de formulario "ara action AloginA Modelo de formulario "ara a action AcontactA +r4uivos tem"orarios Scri"ts de teste +r4uivos de a"resenta.0o e la9out La9out de a"resenta.0o La9out base da a"lica.0o La9out "ara "aginas com uma coluna La9out "ara "aginas com duas colunas +"resenta.0o "ara a controller Site aginas AestaticasA +"resenta.0o "ara a action AaboutA +"resenta.0o "ara a action AcontactA +"resenta.0o "ara a action AerrorA +"resenta.0o "ara a action Ainde#A +"resenta.0o "ara a action AloginA

YII Framework: "on%igura#$o


<?php // uncomment the following to define a path alias // Yii::setPathOfAlias('local','path/to/local-folder' ! // "his is the main #e$ application configuration% An& writa$le // '#e$Application properties can $e configured here% return arra&( 'modules'()arra&( 'telemar*eting', , '$asePath'()dirname(++,-./++ %0-1/'"O1Y+2/PA1A"O1%'%%', 'name'()'%: 2istema -ntegrado 3P :%', // preloading 'log' component //'preload'()arra&('log' , // autoloading model and component classes 'import'()arra&( 'application%models%4', 'application%components%4', 'application%models%utils%4', 'application%models%5ornal%4', 'application%models%5ornal%cliente%4', 'application%models%5ornal%telemar*eting%4', 'application%models%sistema%4', ,

YII Framework: "on%igura#$o


'modules'()arra&( // uncomment the following to ena$le the 6ii tool 'gii' ()arra&( 'class' () 's&stem%gii%6ii7odule', 'password' () '89:;<=', 'ip,ilters' () false, , , // application components 'components'()arra&( 'user'()arra&( // ena$le coo*ie-$ased authentication 'allowAuto.ogin'()true, , // uncomment the following to ena$le >1.s in path-format /4 'url7anager'()arra&( 'url,ormat'()'path', 'rules'()arra&( '<controller:?w@)/<id:?d@)'()'<controller)/Aiew', '<controller:?w@)/<action:?w@)/<id:?d@)'()'<controller)/<action)', '<controller:?w@)/<action:?w@)'()'<controller)/<action)', , , 4/ /4 'd$'()arra&( 'connection2tring' () 'sBlite:'%dirname(++,-./++ %'/%%/data/testdriAe%d$', , 4/

YII Framework: "on%igura#$o


// uncomment the following to use a 7&2C. data$ase 'd$'()arra&( 'connection2tring' () 'm&sBl:host(8D%D%8%8D!d$name(o+sul', 'emulatePrepare' () true, 'username' () 'd$user', 'password' () '89:;', 'charset' () 'utfE', , 'errorFandler'()arra&( 'errorAction'()'site/error', , 'log'()arra&( 'class'()''.og1outer', 'routes'()arra&( arra&( 'class'()'',ile.og1oute', 'leAels'()'error, warning', , arra&( 'class'()''#e$.og1oute', , , ,

', !

'params'()arra&( // this is used in contact page 'admin/mail'()'we$masterGpampa%com%$r ,

YII Framework: &cript de entrada

<?php // change the following paths if necessar& H&ii(dirname(++,-./++ %'/%%/%%/&ii-8%8%=%r9EII/framewor*/&ii%php'! Hconfig(dirname(++,-./++ %'/protected/config/main%php'! // remoAe the following lines when in production mode defined('Y--+0/J>6' or define('Y--+0/J>6',true ! // specif& how man& leAels of call stac* should $e shown in each log message defined('Y--+"1A'/+./K/.' or define('Y--+"1A'/+./K/.',: ! reBuire+once(H&ii ! Yii::create#e$Application(Hconfig -)run( !

YII Framework: "iclo de 'ida da aplica#$o

I) r5-inicia a a"lica.0o com o m5todo $+""lication**"reinit8:K J) $onfigura as o auto-carregamento de classes 8autoloader: e o tratamento de errosK L) =egistra os "rinci"ais com"onentes da a"lica.0oK M) $arrega as configura./es da a"lica.0oK N) Hnicia a a"lica.0o com o $+""lication**init8:* I) =egistra os com"ortamentos 8behaviors: da a"lica.0oK J) $arrega os com"onentes est7ticos da a"lica.0oK O) Dis"ara o evento onPegin=e4uest 8no in<cio da re4uisi.0o:K Q) rocessa a re4uisi.0o do usu7rio* I) =esolve a re4uisi.0o do usu7rioK J) $ria um controleK L) E#ecuta o controleK R) Dis"ara o evento onEnd=e4uest 8ao fim da re4uisi.0o:K

YII Framework: (II

YII Framework: (II

YII Framework: (II

YII Framework: (II

YII Framework: (II

YII Framework: "ontroller


class /Lemplo'ontroller eLtends 'ontroller M pu$lic function ++construct(Hid Hthis-)la&out ( 'colunm8'! parent::++construct(Hid ! N pu$lic function actionAction8( M Hthis-)render('action8' ! N pu$lic function actionAction9( M Hthis-)render('action9' ! N pu$lic function actionAction:( M Hthis-)render('action:' ! N pu$lic function action-ndeL( M Hthis-)render('indeL' ! N N M

YII Framework: "ontroller


// >ncomment the following methods and oAerride them if needed /4 pu$lic function filters( M // return the filter configuration for this controller, e%g%: return arra&( 'inline,ilterOame', arra&( 'class'()'path%to%,ilter'lass', 'propert&Oame'()'propert&Kalue', , ! N pu$lic function actions( M // return eLternal action classes, e%g%: return arra&( 'action8'()'path%to%Action'lass', 'action9'()arra&( 'class'()'path%to%AnotherAction'lass', 'propert&Oame'()'propert&Kalue', , ! N 4/

YII Framework:
<?php

odel

/44 4 "his is the model class for ta$le PentidadeP% 4 4 "he followings are the aAaila$le columns in ta$le 'entidade': 4 @property integer Hid 4 @property string Hnome 4 @property string Hdescricao 4/ class /ntidade eLtends 'ActiAe1ecord M /44 4 1eturns the static model of the specified A1 class% 4 @return /ntidade the static model class 4/ pu$lic static function model(HclassOame(++'.A22++ M return parent::model(HclassOame ! N /44 4 @return string the associated data$ase ta$le name 4/ pu$lic function ta$leOame( M return 'entidade'! N

YII Framework:

odel

/44 4 @return arra& Aalidation rules for model attri$utes% 4/ pu$lic function rules( M // OO"/: &ou should onl& define rules for those attri$utes that // will receiAe user inputs% return arra&( arra&('nome, descricao', 'reBuired' , arra&('nome, descricao', 'length', 'maL'()9<< , // "he following rule is used $& search( % // Please remoAe those attri$utes that should not $e searched% arra&('id, nome, descricao', 'safe', 'on'()'search' , ! N /44 4 @return arra& relational rules% 4/ pu$lic function relations( M // OO"/: &ou ma& need to ad5ust the relation name and the related // class name for the relations automaticall& generated $elow% return arra&( ! N

YII Framework:

odel

/44 4 @return arra& customiQed attri$ute la$els (name()la$el 4/ pu$lic function attri$ute.a$els( M return arra&( 'id' () '-0', 'nome' () 'Oome', 'descricao' () '0escricao', ! N /44 4 1etrieAes a list of models $ased on the current search/filter conditions% 4 @return 'ActiAe0ataProAider the data proAider that can return the models $ased on the search/filter conditions% 4/ pu$lic function search( M // #arning: Please modif& the following code to remoAe attri$utes that // should not $e searched% Hcriteria(new '0$'riteria! Hcriteria-)compare('id',Hthis-)id ! Hcriteria-)compare('nome',Hthis-)nome,true ! Hcriteria-)compare('descricao',Hthis-)descricao,true ! return new 'ActiAe0ataProAider(get+class(Hthis , arra&( 'criteria'()Hcriteria, ! N N

YII Framework: La)out *

ain

main)"h" columnI)"h" columnJ)"h"

<R0O'"YP/ html P>J.-' P-//#:'//0"0 3F"7. 8%D 2trict///OP Phttp://www%w:%org/"1/Lhtml8/0"0/Lhtml8-strict%dtdP) <html Lmlns("http://www.w3.org/1999/xhtml" Lml:lang("en" lang("en") <head) <meta http-eBuiA("Content-Type" content("text/html; charset=utf- " /) <meta name("language" content("en" /) <R-- $lueprint '22 framewor* --) <lin* rel("stylesheet" t&pe("text/css" href(P<?php echo Yii::app( -)reBuest)$ase>rl! ?)/css/screen.cssP media("screen! pro"ect#on" /) <lin* rel("stylesheet" t&pe("text/css" href(P<?php echo Yii::app( -)reBuest)$ase>rl! ?)/css/pr#nt.cssP media("pr#nt" /) <R--Sif lt -/ ET) <lin* rel(Pst&lesheetP t&pe(PteLt/cssP href(P<?php echo Yii::app( -)reBuest-)$ase>rl! ? )/css/ie%cssP media(Pscreen, pro5ectionP /) <RSendifT--) <lin* rel("stylesheet" t&pe("text/css" href(P<?php echo Yii::app( -)reBuest)$ase>rl! ?)/css/ma#n.cssP /) <lin* rel("stylesheet" t&pe("text/css" href(P<?php echo Yii::app( -)reBuest)$ase>rl! ?)/css/form.cssP /) <script language(""a$ascr#pt" src(P<?php echo Yii::app( -)reBuest-)$ase>rl! ? )/"s/"s/"%uery."sP )</script) <script language(""a$ascr#pt" src(P<?php echo Yii::app( -)reBuest-)$ase>rl! ? )/"s/start."sP )</script) <title)<?php echo 'Ftml::encode(Hthis-)page"itle ! ?)</title) </head)

YII Framework: La)out *

ain

<$od&) <diA class("conta#ner" id("page") <diA id("hea&er") <diA id("logo")<?php echo 'Ftml::encode(Hthis-)page"itle ! ?)</diA) </diA)<R-- header --) <?php if(RYii::app( -)user-)is6uest M ?) <diA id("alert'hea&er" class("alert'hea&er") </diA) <?php N ?) <?php Hthis-)widget('Qii%widgets%'Jreadcrum$s', arra&( 'lin*s' () Hthis-)$readcrum$s, ! ?)<R-- $readcrum$s --) <?php echo Hcontent! ?) <diA id("footer") 'op&right Ucop&! 1ede Pampa - <?php echo date('Y' ! ?)% </diA)<R-- footer --) </diA)<R-- page --) </$od&) </html)

YII Framework: !iew * action+

<?php Hthis-)$readcrum$s(arra&( '/Lemplo'()arra&('/eLemplo' , 'Action8', !?) <h8)<?php echo Hthis-)id % '/' % Hthis-)action-)id! ? )</h8) <p) You ma& change the content of this page $& modif&ing the file <tt)<?php echo ++,-./++! ?)</tt)% </p)

YII Framework: Pagina gerada

YII Framework: ",-. * Inde/

YII Framework: ",-. * "reate

YII Framework: ",-. * 'iew

YII Framework: ",-. *

anage

YII Framework: ",-. * "ontroller


class /ntidade'ontroller eLtends 'ontroller M /44 4 @var string the default la&out for the Aiews% 0efaults to '//la&outs/column9', 4 meaning using two-column la&out% 2ee 'protected/Aiews/la&outs/column9%php'% 4/ pu$lic Hla&out('//la&outs/column9'! /44 4 @return arra& action filters 4/ pu$lic function filters( M return arra&( 'access'ontrol', // perform access control for '1>0 operations ! N /44 4 2pecifies the access control rules% 4 "his method is used $& the 'access'ontrol' filter% 4 @return arra& access control rules 4/ pu$lic function access1ules( M return arra&( arra&('allow', // allow all users to perform 'indeL' and 'Aiew' actions 'actions'()arra&('indeL','Aiew' , 'users'()arra&('4' , ,

YII Framework: ",-. * "ontroller


arra&('allow', // allow authenticated user to perform 'create' and 'update' actions 'actions'()arra&('create','update' , 'users'()arra&('G' , , arra&('allow', // allow admin user to perform 'admin' and 'delete' actions 'actions'()arra&('admin','delete' , 'users'()arra&('admin' , , arra&('den&', // den& all users 'users'()arra&('4' , , ! N /44 4 0ispla&s a particular model% 4 @param integer Hid the -0 of the model to $e displa&ed 4/ pu$lic function actionKiew(Hid M Hthis-)render('Aiew',arra&( 'model'()Hthis-)load7odel(Hid , ! N

YII Framework: ",-. * "ontroller


/44 4 'reates a new model% 4 -f creation is successful, the $rowser will $e redirected to the 'Aiew' page% 4/ pu$lic function action'reate( M Hmodel(new /ntidade! // >ncomment the following line if AVA3 Aalidation is needed // Hthis-)performA5aLKalidation(Hmodel ! if(isset(H+PO2"S'/ntidade'T M Hmodel-)attri$utes(H+PO2"S'/ntidade'T! if(Hmodel-)saAe( Hthis-)redirect(arra&('Aiew','id'()Hmodel-)id N Hthis-)render('create',arra&( 'model'()Hmodel, ! N /44 4 >pdates a particular model% 4 -f update is successful, the $rowser will $e redirected to the 'Aiew' page% 4 @param integer Hid the -0 of the model to $e updated 4/ pu$lic function action>pdate(Hid M Hmodel(Hthis-)load7odel(Hid ! // >ncomment the following line if AVA3 Aalidation is needed // Hthis-)performA5aLKalidation(Hmodel !

YII Framework: ",-. * "ontroller

if(isset(H+PO2"S'/ntidade'T M Hmodel-)attri$utes(H+PO2"S'/ntidade'T! if(Hmodel-)saAe( Hthis-)redirect(arra&('Aiew','id'()Hmodel-)id N Hthis-)render('update',arra&( 'model'()Hmodel, ! N

/44 4 0eletes a particular model% 4 -f deletion is successful, the $rowser will $e redirected to the 'indeL' page% 4 @param integer Hid the -0 of the model to $e deleted 4/ pu$lic function action0elete(Hid M if(Yii::app( -)reBuest-)isPost1eBuest M // we onl& allow deletion Aia PO2" reBuest Hthis-)load7odel(Hid -)delete( ! // if AVA3 reBuest (triggered $& deletion Aia admin grid Aiew , we should not redirect the $rowser if(Risset(H+6/"S'a5aL'T Hthis-)redirect(isset(H+PO2"S'return>rl'T ? H+PO2"S'return>rl'T : arra&('admin' N else throw new 'Fttp/Lception(;DD,'-nAalid reBuest% Please do not repeat this reBuest again%' ! N

YII Framework: ",-. * "ontroller


/44 4 .ists all models% 4/ pu$lic function action-ndeL( M HdataProAider(new 'ActiAe0ataProAider('/ntidade' ! Hthis-)render('indeL',arra&( 'dataProAider'()HdataProAider, ! N /44 4 7anages all models% 4/ pu$lic function actionAdmin( M Hmodel(new /ntidade('search' ! Hmodel-)unsetAttri$utes( ! // clear an& default Aalues if(isset(H+6/"S'/ntidade'T Hmodel-)attri$utes(H+6/"S'/ntidade'T! Hthis-)render('admin',arra&( 'model'()Hmodel, ! N

YII Framework: ",-. * "ontroller


/44 4 1eturns the data model $ased on the primar& *e& giAen in the 6/" Aaria$le% 4 -f the data model is not found, an F""P eLception will $e raised% 4 @param integer the -0 of the model to $e loaded 4/ pu$lic function load7odel(Hid M Hmodel(/ntidade::model( -)findJ&P*((int Hid ! if(Hmodel(((null throw new 'Fttp/Lception(;D;,'"he reBuested page does not eList%' ! return Hmodel! N /44 4 Performs the AVA3 Aalidation% 4 @param '7odel the model to $e Aalidated 4/ protected function performA5aLKalidation(Hmodel M if(isset(H+PO2"S'a5aL'T UU H+PO2"S'a5aL'T((('entidade-form' M echo 'ActiAe,orm::Aalidate(Hmodel ! Yii::app( -)end( ! N N

YII Framework: ",-. * 0idgets


<?php Hthis-)$readcrum$s(arra&( '/ntidades'()arra&('indeL' , '7anage', ! Hthis-)menu(arra&( arra&('la$el'()'.ist /ntidade', 'url'()arra&('indeL' , arra&('la$el'()''reate /ntidade', 'url'()arra&('create' ! Yii::app( -)client2cript-)register2cript('search', P H('%search-$utton' %clic*(function( M H('%search-form' %toggle( ! return false! N ! H('%search-form form' %su$mit(function( M H%fn%&ii6ridKiew%update('entidade-grid', M data: H(this %serialiQe( N ! return false! N ! P ! ?) <h8)7anage /ntidades</h8)

YII Framework: ",-. * 0idgets


<p) You ma& optionall& enter a comparison operator (<$)Ult!</$), <$)Ult!(</$), <$)Ugt!</$), <$)Ugt!(</$), <$)Ult!Ugt!</$) or <$)(</$) at the $eginning of each of &our search Aalues to specif& how the comparison should $e done% </p) <?php echo 'Ftml::lin*('AdAanced 2earch','W',arra&('class'()'search-$utton' <diA class("search-form" st&le("&#splay:none") <?php Hthis-)renderPartial('+search',arra&( 'model'()Hmodel, ! ?) </diA)<R-- search-form --) <?php Hthis-)widget('Qii%widgets%grid%'6ridKiew', arra&( 'id'()'entidade-grid', 'dataProAider'()Hmodel-)search( , 'filter'()Hmodel, 'columns'()arra&( 'id', 'nome', 'descricao', arra&( 'class'()''Jutton'olumn', , , ! ?) ! ?)

YII Framework: ",-. * Partial !iew


<diA class("form") <?php Hform(Hthis-)$egin#idget(''ActiAe,orm', arra&( 'id'()'entidade-form', 'ena$leA5aLKalidation'()false, ! ?) <p class("note"),ields with <span class("re%u#re&")4</span) are reBuired%</p) <?php echo Hform-)error2ummar&(Hmodel ! ?) <diA class("row") <?php echo Hform-)la$el/L(Hmodel,'nome' ! ?) <?php echo Hform-)teLt,ield(Hmodel,'nome',arra&('siQe'()=D,'maLlength'()9<< <?php echo Hform-)error(Hmodel,'nome' ! ?) </diA) <diA class("row") <?php echo Hform-)la$el/L(Hmodel,'descricao' ! ?) <?php echo Hform)teLt,ield(Hmodel,'descricao',arra&('siQe'()=D,'maLlength'()9<< <?php echo Hform-)error(Hmodel,'descricao' ! ?) </diA)

! ?)

! ?)

<diA class("row (uttons") <?php echo 'Ftml::su$mitJutton(Hmodel-)isOew1ecord ? ''reate' : '2aAe' ! ?) </diA) <?php Hthis-)end#idget( ! ?) </diA)<R-- form --)

YII Framework: &cripts


$lasse $$lientScri"t
H$ase>rl ( Yii::app( -)$ase>rl! Hcs ( Yii::app( -)get'lient2cript( ! Hcs-)register'ss,ile(H$ase>rl % '/css/calendar5s%css' ! Hcs-)register'ss,ile(H$ase>rl % '/css/drh/principal%css' ! Hcs-)register2cript,ile(H$ase>rl % '/5s/calendario/5Buer&%5s' ! Hcs-)register2cript,ile(H$ase>rl % '/5s/calendario/mootools%5s' ! Hcs-)register2cript,ile(H$ase>rl % '/5s/calendario/calendar%5s' !

333)9iiframe3or2)com netocameS9ahoo)com)br 9ii-frame3or2-brasilSgooglegrou"s)com htt"*%%333)9iiframe3or2)com%doc%guide%

Você também pode gostar