![]() |
||||||||
|
|
||||||||


| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

|
|
Pesquisa personalizada
Vamos criar um projeto para testar alguns truques com user controls, webParts e formView. Este projeto pode ser visto como um complemento para o projeto de uma cesta de compras em http://www.bufaloinfo.com.br/artigos/artigo01012006.asp A única diferença (exigindo uma pequena adaptação para unir os dois projetos) é a tabela cesta, que neste projeto possui um campo adicional, PUnit. Neste projeto vamos criar uma página principal de um site de vendas. Nesta página principal mostraremos promoções diversas, uma promoção para cada categoria de produto. Vamos permitir que o usuário possa alterar as categorias de promoções que são exibidas conforme sua preferência. Além disso permitiremos que um administrador possa definir as promoções que serão exibidas por default na página, definindo assim uma visualização padrão para todos os usuários. Veja como fica a tabela de promoções :
Na página principal desejaremos inserir várias promoções diferentes e de forma bem versátil, então a melhor forma será criar um webUserControl para a exibição de promoções. Este será o próximo passo. 1a Etapa : Criar o user control Vamos primeiramente criar e testar nosso user control. O user control deverá ir ao banco e consultar as promoções para uma determinada categoria, exibindo os detalhes da promoção. O user control precisará ter uma propriedade idCategoria para identificar a categoria da promoção que será exibida. Assim o user control será parametrizado, quem for utiliza-lo poderá definir de qual categoria será a promoção exibida. Veja como fica a definição da propriedade : 45 Public Enum eCategoria 46 Bevereages = 1 47 SeaFood = 8 48 Condiments = 2 49 Produce = 7 50 Confections = 3 51 Meat = 6 52 Cereals = 5 53 DairyProducts = 4 54 End Enum 55 56 Dim vCategoria As eCategoria = 1 57 58 <WebBrowsable(), Personalizable()> _ 59 Public Property Categoria() As eCategoria 60 Get 61 Return (vCategoria) 62 End Get 63 Set(ByVal value As eCategoria) 64 vCategoria = value 65 End Set 66 End Property
Obseve os atributos inseridos na propriedade Categoria : WebBrowsable : Faz com que o atributo fique visível para exibição web, como no propertygridEditor. Personalizable : Faz com que o atributo seja personalizável, permitindo que cada usuário possa manter seu próprio valor para esta propriedade, sem programação adicional.
Precisaremos então criar um SQLDataSource para buscar os dados da promoção. A propriedade será utilizada como parâmetro do SQL Data Source. Veja como fica a query :
Ao definir os parâmetros, definimos o parâmetro como "None", para podermos atribuir seu valor via código. Iremos então programar o evento Selecting do datasource de forma a atribuir o valor do parâmetro.
Veja como fica o código do evento selecting : 69 Protected Sub SqlDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataSource1.Selecting 70 71 72 e.Command.Parameters("@Categoria").Value = Categoria 73 End Sub Para que seja possível exibir os dados diretamente a partir do SQLDataSource vamos fazer uso de um formView. O formView, além de nos permitir exibir as informações, nos permite fazer a montagem de um layout flexivel, que é o que precisaremos nesse caso. Mas devemos prever desde já o passo seguinte : A promoção que iremos exibir deverá possuir um link "comprar agora" que irá inserir o produto na cesta de compras. Ao contrário de outros objetos, o formView não obedece ao commandName caso não esteja no modo apropriado. Então se utilizarmos o formView em seu modo padrão teremos o trabalho de programar toda a inclusão na cesta. Mas se alterarmos o modo de exibição do formView podemos fazer com que o formView dispare a inclusão na cesta automaticamente para nós. Não podemos utilizar o modo de insert, pois ele não buscaria os dados iniciais da promoção para exibir, então devemos utilizar o modo de edição. Ele vai buscar os dados da promoção e o click no link fará com que execute a gravação da edição. A questão é que como instrução para gravação da edição podemos inserir qualquer coisa, inclusive um insert na tabela cesta.
Vamos então criar o DataSource a query de update, que na verdade será um insert na tabela cesta.
A forma natural de garantirmos o preenchimento dos parâmetros deste insert seria através do two-way databinding, ou seja, a instrução Bind ao vincular os campos do dataSource na tela para exibir os dados. Porém esse vinculo envolve também formatação, como no caso do preço que vamos desejar formatar em reais. Essa formatação prejudica a gravação dos dados, misturando tipos de dados e exigindo conversões em locais complexos. Considerando o fato que os dados em momento algum serão editados, apenas exibidos e posteriormente gravados em outra tabela, temos então uma outra alternativa : incluir os campos na coleção DataKeys. Desta forma os valores gravados não passarão por transformações e formatações, resolvendo nosso problema.
O próximo passo é criar o link para a realização da compra. O único truque especial neste linkButton é o CommandName que deve ser especificamente Update, exatamente para disparar o update no formView.
Precisaremos ainda programar o preenchimento do campo com o id do usuário, teremos que fazer isso no evento updating. O usuário pode estar logado ou não e a forma de recuperar o id do usuário em cada caso é diferente. Portanto vamos criar uma função para isso. Veja como fica : 80 Protected Sub SqlDataSource1_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles SqlDataSource1.Updating 81 82 83 e.Command.Parameters("@idUsuario").Value = usuario() 84 response.redirect("cesta.aspx") 85 End Sub 86 87 Private Function usuario() As String 88 If Context.User.Identity.IsAuthenticated Then 89 Return (Context.User.Identity.Name) 90 Else 91 Return (Request.AnonymousID) 92 End If 93 End Function 2o Passo - Configurar a página principal Iremos inserir na página principal não apenas um, mas vários destes user controls que acabamos de criar. Para permitirmos ao usuário personalizar os user controls vamos fazer a inserção na forma de webParts. Veja como fica :
A edição dos controles será feita com base na propriedade que eles possuem para indicar qual a categoria da promoção que será exibida. Por isso utilizaremos o PropertyGridEditor, que exibe as propriedades dos controles nas webPartZones.
3a Etapa - Autenticação Para que todo esse cenário possa funcionar é necessário habilitarmos a autenticação na página. As webParts não permitem ser personalizadas se a autenticação não for habilitada e um usuário estiver logado. Os usuários poderão visualizar a página quer estejam ou não autenticados, mas apenas poderão personalizar a página caso estejam autenticados. Desta forma o ideal será utilizarmos um loginView nesta página. O loginView possui dois templates, um para quando o usuário está logado e outro para quando não está. Assim sendo quando o usuário não estiver logado poderemos exibir o controle de login, quando estiver podemos exibir, além do nome do usuário e uma opção de logoff, opções para personalizar a página. Observando que para que tudo isso funcione precisaremos configurar adequadamente os providers de Membership e Roles no web.config. Sobre essa configuração você pode ler um pouco mais em http://www.bufaloinfo.com.br/artigos/coluna32.asp
Após o usuário realizar seu login, o loginView substitui o controle de login por dados do usuário (porque assim foi configurado) e um linkbutton "Personalize esta página". O ideal é que este linkButton seja tipo on/off, mudando o estado de personalização do webPartManager. Veja como fica o código para fazer isso :
96 Protected Sub lnkPersonalizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) 97 98 If WebPartManager1.DisplayMode Is WebPartManager.BrowseDisplayMode Then 99 100 101 WebPartManager1.DisplayMode = WebPartManager.EditDisplayMode 102 103 104 sender.text = "Visualização normal" 105 Else 106 WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode 107 108 109 sender.text = "Personalizar esta página" 110 End If 111 End Sub
Quando, após entrar em modo de personalização, o usuário seleciona a instrução "Edit" no menu, a Editor Zone é exibida e o PropertyGridEditor faz seu trabalho permitindo a alteração do valor das propriedades marcadas como WebBrowsable() (uma, em nosso caso). Porém a alteração da propriedade não tem um efeito imediato. É necessário um "refresh" no formView para gerar um efeito imediato em nosso user control, para isso precisaremos utilizar um truque, cuidadosamente : 113 Dim binicializando As Boolean = True 114 115 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 116 117 118 binicializando = False 119 End Sub 120 121 <WebBrowsable(), Personalizable()> _ 122 Public Property Categoria() As eCategoria 123 Get 124 Return (vCategoria) 125 End Get 126 Set(ByVal value As eCategoria) 127 vCategoria = value 128 If Not binicializando Then 129 FormView1.DataBind() 130 End If 131 End Set 132 End Property
A variável binicializando apenas recebe false no page_load, quando todos os objetos já foram inicializados. No Set da propriedade testamos essa variável. Se a propriedade estiver sendo alterada após a inicialização então fazemos um dataBind, pois trata-se de uma personalização. Caso contrário não fazemos, pois trata-se da inicialização normal e forçar o dataBind no formView geraria erro.
4a Etapa - Personalização Global Agora que cada usuário já pode personalizar sua própria visualização, o próximo passo é permitir que o administrador personalize a visualização padrão dos usuários anônimos. O webPartManager permite realmente duas formas de visualização das webparts : User ou Shared. O modo Shared tipicamente só é exibido para usuários que não possuem personalizações em suas exibições, é, enfim, uma exibição default. É possível para um usuário mudar de uma visualização para outra, User para Shared ou vice-versa, mas por questão de segurança é necessária uma permissão específica para este tipo de mudança na visualização. As permissões padrões estão definidas no web.config global (framework\(versao)\config), mas podemos altera-las em nosso próprio web.config. Veja como fica a configuração permitindo que membros do grupo Admins (definição do roles provider) possa mudar de um modo de visualização para outro :
Feito isso vamos criar mais um linkButton para alternar entre o modo User e Shared, esse linkButton deverá estar apenas visível para administradores. Veja como fica o código deste linkButton :
134 Protected Sub lnkGlobal_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkGlobal.Click 135 136 WebPartManager1.Personalization.ToggleScope() 137 End Sub 138 139 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 140 141 If WebPartManager1.Personalization.Scope = PersonalizationScope.User Then 142 lnkGlobal.Text = "Visualização Global" 143 144 Else 145 lnkGlobal.Text = "Visualização Pessoal" 146 147 End If 148 lnkGlobal.visible = context.user.isinrole("Admins") 149 End Sub
O método ToggleScope provoca uma interrupção e um reinicio do processamento da página, por isso processamentos adicionais, tal como a mudança do text do linkButton, precisam estar separados em pontos distintos, dai que o Page_Load é um bom local para configurar o linkButton.
Observe ainda a configuração do visible do linkButton, para que este só apareça para os administradores.
Conclusão
Com este artigo vimos mais uma série de truques com formView, userControls e WebParts
Dennes Torres
|
|
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Quer
saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e Prepare-se para o Mercado! Veja o que a Búfalo tem para você. |
© Búfalo Informática,
Treinamento e Consultoria -
Rua Álvaro Alvim, 37 Sala 920 • Cinelândia • Rio de Janeiro • RJ
Tel.: (21)2262-1368 • e-Mail: contato@bufaloinfo.com.br