Autor |
Mensagem |
|
Olá, obrigado pelos comentários.
Você pode baixar a documentação em http://www.neoframework.org/siteneo/download/categoria/15/Documentacao
Novos capítulos e atualizações serão adicionados aos poucos, mas se tiver alguma dúvida, pode postar no fórum que a gente responde...
Flw
|
 |
|
Valew...
Estamos à disposição...
|
 |
|
Realmente o MooTools é bem interessante. Por enquanto a intenção é adicionar várias funcionalidades Ajax na versão 4. A versão 4 na verdade seria Ajax puro, mas com a mesma simplicidade. Mas a versão 4 ainda é um pouco distante.
No caso da integração, talvez, a utilização dos templates do NEO pode ser suficiente.
O NEO possui um conceito de templates que podem ser modificados pela aplicação para determinada funcionalidade específica.
É mais ou menos assim. Você utiliza a tag t:property, essa tag possui o template PropertyTag.jsp que pode ser alterado pela aplicação de forma a renderizar o property da forma que desejar.
Suponha que desejamos adicionar um calendário a todos os inputs do tipo date para a aplicação. O NEO, agora, não possui esse recurso. Mas ele poderia facilmente ser adicionado alterando o arquivo InputTag-date.jsp.
Talvez a integração com o MooTools possa ser feita através dos templates. Posso ajudar também nessa integração.
Existe um tutorial em http://www.neoframework.org/siteneo/tutorial/ver/22/Desenvolvendo_uma_TagLib_com_suporte_a_template ensinando a fazer um template.
Se desejar modificar um template existente pode tentar alterar o ListagemTag.jsp e ver o que acontece nas listagens.
http://www.neoframework.org/forum/posts/list/34.page
Os templates podem ser encontrados no fonte ou dentro do jar do NEO
|
 |
|
Olá Igor, tudo bem?!
O Desenvolvimento do NEO OpenSource ainda está engatinhando. Nós pretendemos receber novas funcionalidades para o projeto, mas primeiro temos que organizar como isso deve ser feito.
Sugestões são muito bem vindas, tentaremos ao máximo adicionar funcionalidades e corrigir bugs o mais rápido possível.
A licença do projeto é LGPL.
Quando tivermos um esquema bom e organizado para o projeto, abriremos para outras pessoas contribuirem. Estamos providenciando um SVN (Controlador de versão) no source-forge e um JIRA (Controlador de bugs) e em breve está disponível no site.
Qualquer dúvida é só postar no fórum...
|
 |
|
Um que atualiza as matérias do aluno, que fizemos até um Ajax pra ela?
|
 |
|
Fala Túlio...
Não entendi muito bem qual é o problema, teria algum exemplo de um JSP desses?
|
 |
|
Sim é possível utilizar Herança. Você terá que colocar algumas anotações extras nos seus beans (entidades).
Existem 3 formas de herança, providos pelo Hibernate.
Verifique a documentação do Hibernate Annotations para saber qual é a forma mais indicada para a sua situação.
Eu recomendo a utilização do método Joined Subclasses é mais simples e possui menos complicações. Para esse tipo de herança você deve anotar a classe pai de todas na hierarquia com
@Inheritance(strategy=InheritanceType.JOINED)
Nesse caso o primary key da tabela filha é um foreign key para a tabela pai
|
 |
|
O arquivo CSS default do NEO (default.css) configura a altura do input. Será necessário aplicar um estilo para alterar a altura (esse problema não ocorrerá na versão 3.3.14)
<t:property style="height: 200px" .../>
Quando utilizar o atributo cols ou rows da tag property você pode omitir o o type se desejar:
<t:property name="..." rows="5"/> <%-- Isso já será um textarea --%>
Também é possível utilizar letras minúsculas e trocar o underscore por hífen
<t:property type="text-area" .../>
Talvez fique mais limpo o código dessa forma.
|
 |
|
Você pode fazer o seguinte:
Vamos supor o seguinte combo:
Code:
<t:property name="subItem.item">
Existe um evento Javascript que é disparado pelo combo ajax, quando os itens chegam do servidor, esse evento é o onLoadItens. O código ficaria assim:
Code:
<t:property name="subItem.item"
onLoadItens="if(this.options.length ==1){document.getElementById('infor').innerHTML = 'Nenhum item encontrado';} else {document.getElementById('infor').innerHTML =''}}">
Se estiver dentro de um panelGrid com 2 colunas e desejar que a mensagem fique ao lado do controller você deve fazer o seguinte código:
Code:
<n:panel>Item</n:panel>
<n:panel>
<t:property name="subItem.item" ....>
<span id="infor"></span>
</n:panel>
Todos os templates que são tabelas no NEO utilizam panelGrids. Então, se desejar que vários componentes fiquem no mesmo TD é só englobá-los numa tag n:panel
|
 |
|
Especificamente para completar as opções de um text o NEO não possui nada pronto. Mas nas chamadas AJAX ele possui uma tag que pode ser útil, a ajax:call. Utilizada em conjunto com View.getCurrent().
O código especifico para fazer o 'code completion' pode ser encontrado facilmente na internet, aí é só integrar com a seguinte solução.
Controller
Code:
package org.neoframework.teste;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.servlet.ModelAndView;
import br.com.linkcom.neo.controller.Controller;
import br.com.linkcom.neo.controller.DefaultAction;
import br.com.linkcom.neo.controller.MultiActionController;
import br.com.linkcom.neo.core.web.WebRequestContext;
import br.com.linkcom.neo.view.ajax.View;
@Controller(path="/modulo/CodeComplete")
public class CodeCompleteController extends MultiActionController{
@DefaultAction
public ModelAndView pagina(WebRequestContext request, Filtro filtro){
return new ModelAndView("pagina", "filtro", filtro);
}
public void ajaxCodeComplete(WebRequestContext request, Filtro filtro){
//aqui ficaria o código que monta as opções
//o código a seguir é ficticio apenas para devolver algo para o cliente
String nome = filtro.getNome();
List<String> opcoes = new ArrayList<String>();
opcoes.add(nome + ((char)(Math.random()*30+65)));
opcoes.add(nome + ((char)(Math.random()*30+65)));
opcoes.add(nome + ((char)(Math.random()*30+65)));
opcoes.add(nome + ((char)(Math.random()*30+65)));
View view = View.getCurrent(); // a variável view provê funcionalidades para lidar com Ajax
for (String string : opcoes) {
view.println(string);
view.println("<BR>");//o println do view será enviada para a variável data lá no JSP
}
}
}
Filtro
Code:
package org.neoframework.teste;
public class Filtro {
String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
JSP
Code:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="n" uri="neo"%>
<%@ taglib prefix="t" uri="template"%>
<%@ taglib prefix="ajax" uri="ajax"%>
<n:bean name="filtro">
<t:property name="nome" mode="input" onkeypress="codeComplete(this.value)"/>
<div id="propostas">
</div>
</n:bean>
<ajax:call
functionName="codeComplete(string)"
action="ajaxCodeComplete"
callback="function(data){montarPropostas(data);}"
parameters="javascript:'nome='+string"
/>
<%-- functionName: Nome da função Javascript que será criada, recebe um parâmetro --%>
<%-- action: Nome da action (no controller) para onde deve ser enviada a requisição --%>
<%-- callback: Indica o que deve ser feito com o resultado, a varável data é o que o servidor devolveu --%>
<%--
parameters: Indica quais parametros devem ser enviados na requisição, o javascript: indica que estamos colocando código javascript e não texto puro
'nome='+string Estamos montando os parâmetro como é monta a URL. Estamos concatenando nome= com o conteúdo da variável string.
string é o nome do parâmetro recebido no método (indicado em functionName)
--%>
<script type="text/javascript">
function montarPropostas(data){
document.getElementById('propostas').innerHTML = data;
//aqui seria montada a funcionalidade javascript para as opções enviadas pelo servidor
}
</script>
Qualquer dúvida pode perguntar.. flw
|
 |
|
Leandro existe um flag no NEO que indica se deve ou não ser renderizado um link de ordenação para o dataGrid.
Esse flag é um atributo de sessão chamado TEMPLATE_listagem.
Para habilitar a ordenação para o dataGrid automaticamente você deve colocar um atributo com o nome TEMPLATE_listagem no escopo de requisição.
Existem duas formas, no controller:
Code:
request.setAttribute("TEMPLATE_listagem", "true");
ou no JSP:
Code:
<c:set var="TEMPLATE_listagem" value="true" scope="request"/>
Você pode ainda utilizar o atributo order da tag t:property e indicar como deve ser ordenada a coluna.
Em qualquer um dos casos de ordenação acima, será passado o parâmetro orderBy, isso quer dizer que seu Command (bean da action do controller, segundo parametro do método) deve possuir um atributo orderBy. No DAO será necessário utilizar o método order do QueryBuilder para indicar a ordenação.
Quando utilizar essa ordenação, não é feito um submit do formulário, ou seja, suas informações serão perdidas se o Command não for de sessão.
Para colocar um command como um command de sessão, é necessária a seguinte anotacao na sua action:
Code:
@Command(session=true)
public ModelAndView(WebRequestContext request, Bean bean){
...
}
Lembrando que se existir outra action que utilize o mesmo bean, deve ser colocada @Command(session=true) nos outros métodos também.
Fique atento, pois o formulário de sessão altera um pouco o comportamento da tela (se o usuário sair da página e voltar a página mais tarde os dados do formulário ainda terão os valores configurados anteriormente)
Nada impede ainda de colocar o seu próprio código no header do column do dataGrid
Code:
<n:dataGrid ...>
<n:column>
<n:header>
<a href="faça o que desejar aqui"> Nome </a>
</n:header>
<n:body>
<t:property name="nome" />
</n:body>
</n:column>
</n:dataGrid>
Você pode ainda alterar o Template do Property (PropertyTag.jsp) para adicionar ordenações padrão da maneira que desejar.
|
 |
|
Guilherme, você pode no método getLista algo do tipo
Code:
ListagemResult<Bean> result = super.getLista(request, filtro);
List<Bean> list = result.list();
for (Bean bean : list) {
if("o".equals(bean.getValor()){
bean.setValor("Ok");
}
...
}
Para o modo output não é possível utilizar um map e o NEO fazer a tradução automática como no caso do combo. Mas isso é interessante e vou adicionar essa funcionalidade numa versão futura.
Uma outra possibilidade é alterar o JSP
Code:
<t:tabelaResultados>
<t:property name="..."/>
<n:column header="titulo">
<c:if test="${nomeDoBean.valor == 'O'}">Ok</c:if>
<c:if test="${nomeDoBean.valor == 'I'}">Interrado</c:if>
</n:column>
</t:tabelaResultados>
No nomeDoBean você coloca o nome da classe do bean com a primeira letra minúscula.
Se estiver utilizando um dataGrid diretamente utilize row (ou configure o atributo var do dataGrid para indicar com qual nome o bean estará no escopo)
Uma outra forma ainda é criar um Enum
Code:
public enum Tipo {
OK, INTERRADO
}
Será impresso na tela OK e INTERRADO, mas no banco será salvo um int.
Você pode mudar o valor impresso sobrescrevendo to toString do enum.
Code:
public enum Tipo {
OK, INTERRADO;
@Override
public String toString() {
switch(this){
case OK: return "Ok";
case INTERRADO: return "Interrado";
}
return super.toString();
}
}
}
|
 |
|
Existe também a tag ajax:call que cria funções javascript para chamadas ajax
Você precisará importar a taglib
Code:
<%@ taglib prefix="ajax" uri="ajax"%>
Code:
<script language="jajavascript">
...
jsFuncion(); // isso faz a chamada ajax
....
</script>
<ajax:call functionName="jsFunction" action="doAjax" />
|
 |
|
Túlio você pode utilizar a tag comboReloadGroup.
Suponha que você possua um bean C que tem referencia para o bean B que tem referencia para o bean A.
Você precisará de um DAO para cada bean.
Code:
<n:comboReloadGroup useAjax="true">
<t:property name="a"/>
<t:property name="b"/>
<t:property name="c"/>
</n:comboReloadGourp>
Isso criará uma sequencia de reloads de combo via Ajax. Voce pode também utilizar:
Code:
<n:comboReloadGroup useAjax="true">
<t:property name="c.b.a"/>
<t:property name="c.b"/>
<t:property name="c"/>
</n:comboReloadGourp>
|
 |
|
Os campos que não são combos são ignorados pelo comboReloadGroup. Mas você pode especificar na propriedades itens um método que utiliza uma propriedade que esteja fora do combo reload.
Voce poderia fazer assim:
Code:
<t:property name="mes_ano" onchange="form.listaCurso.loadItens()"/>
<n:comboReloadGroup useAjax="true">
<t:property name="listaCurso" itens="cursoService.findBy(mes_ano)"/>
</n:comboReloadGroup>
O método loadItens é adicionado a qualquer combo que esteja em ajax. Ele irá carregar os itens do combo direto do servidor utilizando ajax.
Code:
<n:comboReloadGroup useAjax="true">
<t:property name="mes_ano" onchange="form.listaCurso.loadItens()"/>
<t:property name="listaCurso" itens="cursoService.findBy(mes_ano)"/>
</n:comboReloadGroup>
Também funcionaria
|
 |
|