Class e views
25/03/2013 12:42
0
Olá gente, tudo certo?

Então eu estou com a seguinte situação: Tenho na minha class tres variáveis, login, senha, e papel do usuário. Na view "create" aparecem todos os 3, porém gostaría que mostrasse somente o login e a senha, e colocasse o papel default como "user".

Alguém pode me ajudar? Eu gostaria que somente o administrador editasse esses campos na view "edit".

Obrigado!
Tags: views class


1
Neste caso você vai ter de gerar estáticamente os arquivos e em seguida os alterar para que se adequem à sua situação.

Da pra fazer o seguinte: execute o generate-all. Logo em seguida, apague todo o conteúdo gerado menos o que é referente à esta visualização específica: que é a que você quer alterar.

Assim nas demais, caso surjam novos atributos você vai tirar proveito do scaffold dinâmico.


0
Olá Henrique, muito obrigado pela sua resposta.

Então vamos lá, eu gerei estas views utilizando o generate-all, porém não sei como filtrar estes atributos, o que eu estou utilizando é o padrão do grails, que mostra todos os atribuitos existentes na class. o que existe é um padrão que aparentemente busca todos os valores que existem lá, e não existe uma tag para cada atributo.

Sou novo em groovy/grails e não tenho a menor idéia de como fazer.

att, Diego Brioschi
25/03/2013 13:51


0
Oi Diego,

o scaffolding sempre é gerado usando os padrões do Grails. Dentre estas convenções, está o fato de que todos os atributos não transientes da sua classe serão expostos no formulário gerado.

(atributo transiente é aquele que você define da seguinte forma dentro da sua classe de domínio:

static transients = ['nomeCampo','campo2','campo3'];)

O que ocorre: temos dois tipos de scaffolding. Um é o dinâmico, outro é o estático. Se você está usando o estático, está usando o comando grails generate-all. Se estiver usando o dinâmico, vai declará-lo em sua classe de controle tal como no exemplo abaixo:


class PessoaController {
static scaffold = Pessoa // Pessoa sendo a classe em cima da qual será gerado o scaffolding.
}


No seu caso, você quer customizar apenas uma das views geradas, mas pelo que estou vendo, quer manter a natureza dinâmica do scaffolding. Neste caso, eu faria o seguinte executando o passo a passo abaixo:

1) Gere o scaffolding estático da sua classe de domínio.
2) Apague tudo o que não seja relacionado ao create (incluindo as actions geradas no seu controlador)
3) Modifique sua classe de controle para que fique tal como no exemplo que te mostrei.

Com isto, o Grails continua com o scaffolding dinâmico normal para tudo, menos para o que já existe. Caso queira adicionar um novo campo na parte estática, você terá de fazer manualmente, mas a maior parte do problema já terá sido resolvido.


0
Diego, complementando a resposta do Kico, acho que sua principal dificuldade vai ser com o controller.
Feito o scaffold deixe o campo papel como hiddenField no form.

Vamos lá, para você entender o processo por trás da ação de criar um novo usuário.
1- Você acessa o Controller do seu usuário, e requisita a ação create.
2- A ação create cria um objeto vazio, e retorna uma página contendo o formulário para ser preenchido associado a este objeto vazio.
3- O usuário preenche os dados, e salva. A ação save então é requisitada, onde este objeto é passado por params para que o mesmo seja persistido na ação save.

Bom, você disse que o papel default precisa ser 'user', correto? Então você pode já criar este objeto com o papel user na ação create. Ou incluir o papel user na ação save.

** Digamos que seja na ação create.
Você deve deixar o campo papel como hidden no form, e no controller fazer algo assim:

def create() {
def usuarioInstance = new Usuario(params)
usuarioInstance.papel = 'user'

[usuarioInstance: usuarioInstance]
}


** Se for na ação Save

def save(){
def usuarioInstance = new Usuario(params)
usuarioInstance.papel = 'user'

.... bla bla bla de acordo com o que já foi gerado
}


Quanto a sua necessidade de somente administrador editar... Você está implementando um sistema de login, correto?
Bom, é um trabalho um pouco árduo fazer tudo manualmente, controlar seção, permissão, etc.. Já estudou a possibilidade de utilizar um plugin? Recomendo o Spring Security Core.

Ele faz todo o controle para você, e fica simples controlar esse tipo de acesso usando somente as anotations que o plugin provê.


Espero que tenha ajudado.

[]'s
26/03/2013 12:50


1
Muito obrigado pelas respostas Henrique e Luciano.

Estou realizando um estudo de caso na faculdade, então a questão da segurança tem que ser feita manualmente, justamente para abordar as dificuldades da implementação. A implementação dos papeis e tratamentos de sessões já estão feitos, só estou precisando agora travar na criação do usuário o papel do mesmo para somente o administrador modificar usando a action "edit" no próprio usuário.

Agora eu estou trabalhando, mas assim que eu chegar em casa eu posto para vocês o código da view e do meu controller. Eu não estou com o scaffolding no controller da minha classe usuário, estou com os códigos dentro da view, com a implementação "solta" de cada uma das actions.

A dificuldade que eu tive para a solução é de que é meio "travado", o form que mostra e capta os valores das variáveis mostradas no formulário de criação do usuário. Tipo que não é tão claro quanto num PHP da vida.

Mas as dicas de vocês já me ajudou no que eu posso tentar fazer. Muito Obrigado mesmo!
26/03/2013 13:45


0
Galera, eu não vou postar o controller todo, mas ele está no seguinte padrão:

class UserController {

static navigation = true

def beforeInterceptor = [action:this.&auth,
except:['menu','menu2','teste','login', 'logout', 'authenticate']]

def login = {}

def menu = {}

def menu2 = {}

def log = {}

Dentre algumas outras "Defs".

Minha view "create" para esta classe "user" está da seguinte forma:

<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main">
<g:set var="entityName" value="${message(code: 'user.label', default: 'User')}" />
<title><g:message code="default.create.label" args="[entityName]" /></title>
</head>

<body>

<a href="#create-user" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content&hellip;"/></a>
<div class="nav" role="navigation">
<ul>
<li><a class="home" href="${createLink(uri: '/')}"><g:message code="HOME"/></a></li>
<li><g:link class="create" action="create"><g:message code="Criar usuários" args="[entityName]" /></g:link></li>
<li><g:link class="list" action="list"><g:message code="Listar usuários" args="[entityName]" /></g:link></li>
<li><g:link class="edit" action="edit"><g:message code="Editar usuário" args="[entityName]" /></g:link></li>
<li><g:link class="show" action="show"><g:message code="Buscar usuário" args="[entityName]" /></g:link></li>


</ul>
</div>
<div id="create-user" class="content scaffold-create" role="main">
<h1><g:message code="default.create.label" args="[entityName]" /></h1>
<g:if test="${flash.message}">
<div class="message" role="status">${flash.message}</div>
</g:if>
<g:hasErrors bean="${userInstance}">
<ul class="errors" role="alert">
<g:eachError bean="${userInstance}" var="error">
<li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li>
</g:eachError>
</ul>
</g:hasErrors>
<g:form action="save" >
<fieldset class="form">
<g:render template="form"/>
</fieldset>
<fieldset class="buttons">
<g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
</fieldset>
</g:form>
</div>
</body>
</html>


Obrigado pela ajuda galera!
26/03/2013 19:44



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto