Ticket #911 (new melhoria)

Opened 11 years ago

Last modified 10 years ago

Unificação da parte Ajax dos módulos

Reported by: amuller Owned by: ninguem
Priority: média Milestone:
Component: API Version: sandbox
Severity: média Keywords: ajax
Cc: amuller WorkGroup:

Description (last modified by amuller) (diff)

Ao invés de cada módulo ter um código separado, unificar estes códigos.

Para quem quiser saber mais: Documentação expressoAjax

Change History

comment:2 Changed 11 years ago by rodsouza

Corrigindo problemas no emailadmin.

phpgwapi/inc/class.common.inc.php

Committed revision r2049.

comment:3 Changed 11 years ago by rodsouza

Corrigindo problemas no expressoMail.

expressoMail1_2/index.php

Committed revision r2050.

comment:4 Changed 11 years ago by amuller

[2169] Correção

comment:5 Changed 11 years ago by niltonneto

A string "$this" na função cExecute() servia para referenciar o próprio módulo de onde estava sendo chamado. Depois dessa unificação, há erro ao tentar carregar em outra aba outro módulo diferente. Provavelmente porque o "controller.php" unificado perde a referência do módulo que estava, tentando instanciar a classe dentro no módulo errado.

comment:6 Changed 11 years ago by niltonneto

Veja o erro: include_once(admin/inc/class.imap_functions.inc.php) : failed to open stream: No such file or directory in /home/niltonneto/workspace/expresso/controller.php on line 45, referer:  http://localhost/expresso/expressoMail1_2/index.php''[[BR]] Está tentando carregar a classe "imap_functions" de dentro do módulo admin, que abri em outra aba.

comment:7 Changed 11 years ago by niltonneto

Não encontrei nenhuma solução simples para isso. Substituir as chamadas "$this" pelo módulo correspondente (ex. "expressoMail1_2.imap_functions...") acho um pouco trabalhoso mas funciona. Alguém tem alguma ideia melhor?

comment:8 Changed 11 years ago by amuller

O $this referencia aquela variável "current_app" da sessão. Não tem muita solução mesmo a não ser chamar o nome do módulo. Ou fazer com que o controller saiba sozinho o módulo pela classe chamada.

comment:9 Changed 11 years ago by rodsouza

Como simular o problema em questão???

Não existe o porque a requisição de uma aba interferir na requisição da outra, sendo que o ExpressoLivre? ainda realiza todo o processamento com a sessão aberta, assim sendo não há a possibilidade de requisições concorrentes.

Com isso as requisições são executadas a conta-gotas.

comment:10 Changed 11 years ago by amuller

É só abrir duas aplicações em abas do Firefox que usam a mesma sessão. Daí o current_app vai ser modificado, e todas as requisições que usam $this.class.metodo podem dar problema.

comment:11 follow-up: ↓ 12 Changed 11 years ago by rodsouza

Realmente o problema não são requisições simultâneas, tão pouco o uso de várias abas, e sim o fato de que a suposta "variável" não varia.

E isso ocorre pois existe a antiga questão da utilização da superglobal $_SESSION em detrimento da execução dos métodos responsáveis pela disponibilização dos dados corretamente.

Assim ao utilizar um módulos e passar a utilizar outro sem passar pela sua página inicial, consequentemente executando toda a rotina para popular os dados, torna inconsistente os mesmos.

comment:12 in reply to: ↑ 11 Changed 11 years ago by niltonneto

Replying to rodsouza:

Realmente o problema não são requisições simultâneas, tão pouco o uso de várias abas, e sim o fato de que a suposta "variável" não varia.

E isso ocorre pois existe a antiga questão da utilização da superglobal $_SESSION em detrimento da execução dos métodos responsáveis pela disponibilização dos dados corretamente.

Assim ao utilizar um módulos e passar a utilizar outro sem passar pela sua página inicial, consequentemente executando toda a rotina para popular os dados, torna inconsistente os mesmos.

Sem mais delongas. Ninguém falou em requisição simultânea. O fato foi confirmado e descrito melhor pelo Muller. Aí pessoal, alguma solução?

comment:13 Changed 11 years ago by rodsouza

Anteriormente o problema não ocorria pois não utilizava-se o dado do módulo corrente para a inclusão do arquivo, conforme segue:

if($app == '$this')
    $filename = 'inc/class.'.$class.'.inc.php';
else
    $filename = '../'.$app.'/inc/class.'.$class.'.inc.php';

comment:14 follow-up: ↓ 15 Changed 11 years ago by rodsouza

Como eu vinha afirmando, a alteração proposta em  http://trac.expressolivre.org/ticket/911#comment:7 apenas aumentaria a bola de neve.

Enfim, por mais uma vez ficou evidente que a decisão pretérita de utilizar a sessão para finalidades fora de seu escopo é totalmente equivocada. Equivoco que é agravado pelo fato da mesma permanecer aberta durante a execução da requisição.

E novamente por esse motivo, somado à inconsistência gerada nos dados, foi removido o uso da sessão para a inclusão de arquivos.

Sending        controller.php

Committed revision r2331.

comment:15 in reply to: ↑ 14 Changed 11 years ago by niltonneto

Replying to rodsouza:

Como eu vinha afirmando, a alteração proposta em  http://trac.expressolivre.org/ticket/911#comment:7 apenas aumentaria a bola de neve.

Enfim, por mais uma vez ficou evidente que a decisão pretérita de utilizar a sessão para finalidades fora de seu escopo é totalmente equivocada. Equivoco que é agravado pelo fato da mesma permanecer aberta durante a execução da requisição.

E novamente por esse motivo, somado à inconsistência gerada nos dados, foi removido o uso da sessão para a inclusão de arquivos.

Sending        controller.php

Committed revision r2331.

Não adianta usar 'HTTP_REFERER'. A Agenda, por exemplo, usa o menuaction da API - "/index.php?menuaction=calendar.uicalendar...."

comment:16 Changed 11 years ago by amuller

O filemanager também usa menuaction da API só que nunca usa $this acho que deve ser o caso do calendar

comment:17 Changed 11 years ago by niltonneto

Talvez possamos mudar apenas no calendar então, para não usar "$this". Melhor do que mudar em tudo.

comment:18 follow-up: ↓ 19 Changed 11 years ago by rodsouza

E em que momento é realizada uma requisição para o 'controller.php' a partir dos módulos que seguem esse padrão?

comment:19 in reply to: ↑ 18 Changed 11 years ago by niltonneto

Replying to rodsouza:

E em que momento é realizada uma requisição para o 'controller.php' a partir dos módulos que seguem esse padrão?

Então, a Agenda usa o ExpressoAjax? ao adicionar um compromisso, para carregar os participantes.

comment:20 follow-up: ↓ 21 Changed 11 years ago by rodsouza

Utilizando o formato proveniente do eGroupWare para acesso ao módulo ou seja 'menuaction'.

controller.php

Committed revision r2341.

comment:21 in reply to: ↑ 20 Changed 11 years ago by niltonneto

Replying to rodsouza:

Utilizando o formato proveniente do eGroupWare para acesso ao módulo ou seja 'menuaction'.

controller.php

Committed revision r2341.

Rodrigo, a partir da revisão [2331] (controller.php), se configuro o expresso para ser meu documentRoot, está dando problema ao carregar o ExpressoMail?.

comment:22 Changed 11 years ago by rodsouza

Flexibilizando o formarto da obtenção do módulo corrente.

controller.php

Committed revision r2346.

comment:23 follow-ups: ↓ 24 ↓ 26 Changed 11 years ago by david.ianakiara

Cara, a revisão [2032] está causando um erro no módulo calendar. Na tela de edição e evento, na hora de pesquisar por um usuário para adicionar no compromisso tá dando erro de javascript.

comment:24 in reply to: ↑ 23 ; follow-up: ↓ 25 Changed 11 years ago by wmerlotto

Replying to david.ianakiara:

Cara, a revisão [2032] está causando um erro no módulo calendar. Na tela de edição e evento, na hora de pesquisar por um usuário para adicionar no compromisso tá dando erro de javascript.

Falando nisso, é possível consolidar as pesquisas por usuários/grupos/listas/... do expressoMail e calendar (nas duas pesquisas, a principal e participantes externos) na API?

comment:25 in reply to: ↑ 24 Changed 11 years ago by niltonneto

Replying to wmerlotto:

Replying to david.ianakiara:

Cara, a revisão [2032] está causando um erro no módulo calendar. Na tela de edição e evento, na hora de pesquisar por um usuário para adicionar no compromisso tá dando erro de javascript.

Falando nisso, é possível consolidar as pesquisas por usuários/grupos/listas/... do expressoMail e calendar (nas duas pesquisas, a principal e participantes externos) na API?

A pesquisa do Calendar é a mesma usada no ExpressoMail?. Na época eu já tinha essa ideia de unificar. Mas com certeza, a ideia é centralizar na API essas pesquisas sim, assim como foi feito com o connetor e o controller do ExpressoMail?.

comment:26 in reply to: ↑ 23 Changed 11 years ago by amuller

Replying to david.ianakiara:

Cara, a revisão [2032] está causando um erro no módulo calendar.

Eu não consegui reproduzir o erro em questão usando o trunk

comment:27 Changed 11 years ago by niltonneto

Eu consegui reproduzir o mesmo erro, tanto na minha máquina quanto no servidor de homologação (dev.expresso). Dá isso aqui: [Wed Mar 31 14:52:26 2010] [error] [client 127.0.0.1] PHP Warning: include_once(expressoMail1_2.php) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /var/www/expresso/controller.php on line 40, referer:  http://localhost/expresso/index.php?menuaction=calendar.uicalendar.add&date=20100401

comment:28 follow-up: ↓ 29 Changed 11 years ago by diogenesduarte

Senhores, acho que a revisão [2032] realmente apresenta problemas, e é simples ver isso mesmo sem tentar reproduzir o erro. Notem a linha 37:

if( strpos($app, '$this/') == 0 ) 

A função strpos pode voltar false caso não ache a substring, fazendo entrar nesse if em um momento inesperado pois 0 também é false. Acredito que o certo seria:

if( strpos($app, '$this/') =='''=''' 0 ) 

Não comitei essa modificação pois posso estar enganado, pois não fui eu que implementei e talvez quem o fez, fez propositadamente, mas acho que isso é um problema realmente pois com a nova modificação o erro relatado não ocorreu em meu ambiente de desenvolvimento.

comment:29 in reply to: ↑ 28 Changed 11 years ago by diogenesduarte

tentei colocar negrito em bloco de código, o que eu quis dizer eh que o certo seria

if( strpos($app, '$this/') === 0 ) 

Replying to diogenesduarte:

Senhores, acho que a revisão [2032] realmente apresenta problemas, e é simples ver isso mesmo sem tentar reproduzir o erro. Notem a linha 37:

if( strpos($app, '$this/') == 0 ) 

A função strpos pode voltar false caso não ache a substring, fazendo entrar nesse if em um momento inesperado pois 0 também é false. Acredito que o certo seria:

if( strpos($app, '$this/') =='''=''' 0 ) 

Não comitei essa modificação pois posso estar enganado, pois não fui eu que implementei e talvez quem o fez, fez propositadamente, mas acho que isso é um problema realmente pois com a nova modificação o erro relatado não ocorreu em meu ambiente de desenvolvimento.

comment:30 Changed 11 years ago by amuller

Diogenes: svn up! isso já foi corrigido.

comment:31 Changed 11 years ago by diogenesduarte

Verdade, corrigido na revisão [2426].

comment:32 Changed 11 years ago by amuller

Desculpe o inconveniente.

comment:33 Changed 11 years ago by amuller

r2616 traz algumas das funções comuns do expressoMail para Api

comment:34 Changed 11 years ago by amuller

  • Description modified (diff)

comment:35 Changed 11 years ago by amuller

r2752 unificação do cache do connector

comment:36 Changed 10 years ago by niltonneto

  • Priority changed from grave to média
  • Milestone changed from Expresso 2.2 to Expresso 3.0

comment:37 Changed 10 years ago by niltonneto

  • Owner changed from amuller to ninguem
  • Version changed from trunk to sandbox
  • Severity set to média
  • Milestone changed from Backlog do Produto to Sandbox - Expresso 3.0
Note: See TracTickets for help on using tickets.