+3

Introdução ao Cajax

criado por Thiago F. Pappacena em 22/09/2005 1:53pm
Explicando o que foi feito:

Este é um exemplo bem simples e útil da utilização do Cajax.

Primeiro, requisita-se a classe de Interface. Esta classe implementa os métodos básicos (de javascript e PHP) para a manipulação de eventos XMLHttpRequest, além de incluir as classes de todos os "Handlers" disponíveis.

Após o require, instanciamos a classe CajaxInterface.

Por padrão, a classe tenta usar como cache o diretório cajaxJS a partir do script sendo executado. Assim, se você está executando a página /var/www/meusite/index.php, Cajax tentará utilizar o diretório /var/www/meusite/cajaxJS como diretório de cache. Para alterar este mecanismo, dois métodos são utilizados:

$Cajax->setCacheDir('diretorio'): este método definirá a pasta de arquivos de cache. Este diretório deve ser relativo ao DOCUMENT_ROOT e o webserver deve possuir permissão de escrita nele.
$Cajax->useCache( false ): Define se Cajax usará ou não cache. Tenha em mente que desabilitar o cache pode acarretar perda significativa de desempenho, já que toda saída javascript gerada pela classe será gerada a cada requisição e enviada ao browser junto do resto da página, aumentando o processamento do PHP e impossibilitando o navegador de usar seus caches de arquivos já baixados.

Após a definição da "política" de cache, o Handler para manipulação de formulário é criado.

Este handler em especial recebe como parâmetros o ID do formulário a ser observado e uma função javascript que recebe a string retornada pelo servidor. Esta função pode ser definida diretamente na passagem do parâmetro à classe CajaxFormHandler ou ao longo do script. Se a segunda opção fosse a escolhida, a página teria uma função javascript definida com um nome qualquer e, na instanciação do objeto CajaxFormHandler, o nome desta função seria passado. Por exemplo:

<?php
$FormHandler = new CajaxFormHandler( 'formID', 'mostraResposta' ); 
?>
<script>
function mostraResposta(resposta) {
    document.getElementById("respostaDiv").innerHTML = resposta;
}
</script>

Para funcionar, todo handler deve ser adicionado à interface Cajax com o método $Cajax->addHandler.

Quando todos os handlers estiverem definidos e adicionados à interface, o método $Cajax->handleAll() deve ser executado para processar possíveis necessidades dos handlers.

Pronto. Agora, só resta mostrar o Javascript no header da página:
<?= $Cajax->displayJSInterface(); ?>

A explicação é longa, mas o script foi simples, não foi? Agora, toda vez que ocorrer um submit no formulário formID, a requisição será enviada através de XMLHttpRequest ao servidor e a resposta será colocada, através do javascript (document.getElementById("respostaDiv").innerHTML = resposta;), dentro da div que possui o ID "respostaDiv". Simples! :D

Comentários:

Mostrando 1 - 10 de 63 comentários
Você precisa alterar as permissões da pasta.

Entre com SSH ou algo do gênero, ou peça para que o administrador da máquina execute este script de instalação (ele é simples... só dá alguns chown e chmod nos arquivos do Cajax, além de limpar caches antigos...)
05/06/2006 1:20pm (~18 anos atrás)

Mariana Réa disse:
Eu tenho uma maquina windows e acesso o servidor atraves do samba, teria outra maneira? se naum tiver eu entro e faço isso, é q terei q pedir a senha.
Mto obrigada
05/06/2006 1:05pm (~18 anos atrás)

Então execute o bash-script install para mudar as permissões dos arquivos.

entre no diretório onde você descompactou o Cajax e rode
# ./install
ou
# bash install
05/06/2006 1:01pm (~18 anos atrás)

Mariana Réa disse:
O servidor é Linux.
05/06/2006 12:49pm (~18 anos atrás)

Linux ou Windows? Qual servidor web?
Provavelmente o diretório padrão de cache não pode ser acessado para gravação pelo webserver.

Flávia, o erro acontece por uma mudança de comportamento entre versões do PHP. Na verdade, não é um erro... só um warning. Mudando o error_reporting, o warning some. ;)

Espero ter tempo em breve para reparar esses bugs...
05/06/2006 12:11pm (~18 anos atrás)

Mariana Réa disse:
Eu puxei o arquivo e descompactei no servidor, numa pasta cajax. Mas qdo entro na pasta os arquivos Install, credits e os readme's ficam como arquivos indefinidos, eu testei tb o examplo e nada, veja aki http://www.arcaretentores.com.br/cajax/Cajax-20051021/Examples/
o q eu fiz d erado?
05/06/2006 11:08am (~18 anos atrás)

Desculpem, eu não havia visto a solução pro erro acima... já corrigi... mas, de onde vem isso???

vti_encoding:SR|utf8-nl vti_author:SR|flaviajo vti_modifiedby:SR|flaviajo vti_timelastmodified:TR|30 May 2006 23:39:40 -0000 vti_timecreated:TR|30 May 2006 23:39:40 -0000 vti_cacheddtm:TX|30 May 2006 23:39:40 -0000 vti_filesize:IR|6088 vti_extenderversion:SR|5.0.2.2634 vti_backlinkinfo:VX| vti_encoding:SR|utf8-nl vti_author:SR|flaviajo vti_modifiedby:SR|flaviajo vti_timelastmodified:TR|30 May 2006 23:39:31 -0000 vti_timecreated:TR|30 May 2006 23:39:31 -0000 vti_cacheddtm:TX|30 May 2006 23:39:31 -0000 vti_filesize:IR|7162 vti_extenderversion:SR|5.0.2.2634 vti_backlinkinfo:VX| vti_encoding:SR|utf8-nl vti_author:SR|flaviajo vti_modifiedby:SR|flaviajo vti_timelastmodified:TR|30 May 2006 23:39:55 -0000 vti_timecreated:TR|30 May 2006 23:39:55 -0000 vti_cacheddtm:TX|30 May 2006 23:39:55 -0000 vti_filesize:IR|15895 vti_extenderversion:SR|5.0.2.2634 vti_backlinkinfo:VX| vti_encoding:SR|utf8-nl vti_author:SR|flaviajo vti_modifiedby:SR|flaviajo vti_timelastmodified:TR|30 May 2006 23:39:52 -0000 vti_timecreated:TR|30 May 2006 23:39:52 -0000 vti_cacheddtm:TX|30 May 2006 23:39:52 -0000 vti_filesize:IR|5031 vti_extenderversion:SR|5.0.2.2634 vti_backlinkinfo:VX| vti_encoding:SR|utf8-nl vti_author:SR|flaviajo vti_modifiedby:SR|flaviajo vti_timelastmodified:TR|30 May 2006 23:39:57 -0000 vti_timecreated:TR|30 May 2006 23:39:57 -0000 vti_cacheddtm:TX|30 May 2006 23:39:57 -0000 vti_filesize:IR|6699 vti_extenderversion:SR|5.0.2.2634 vti_backlinkinfo:VX| vti_encoding:SR|utf8-nl vti_author:SR|flaviajo vti_modifiedby:SR|flaviajo vti_timelastmodified:TR|31 May 2006 00:00:11 -0000 vti_timecreated:TR|30 May 2006 23:39:28 -0000 vti_extenderversion:SR|5.0.2.2634 vti_backlinkinfo:VX| vti_nexttolasttimemodified:TW|30 May 2006 23:39:28 -0000 vti_cacheddtm:TX|31 May 2006 00:00:11 -0000 vti_filesize:IR|7817

Obrigada!
30/05/2006 5:05pm (~18 anos atrás)

Meu problema é o mesmo do Jorge Jardim mais acima...

Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of get_class(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /usr/home3/flaviajo/public_html/ajax/cajax/Handlers/CajaxHandler.class.php on line 167
30/05/2006 4:58pm (~18 anos atrás)

Léo Hackin disse:
Salve pessoal,

O problema que está ocorrendo com vocês (referente à linha 525/531) dos warnings:
Warning: Invalid argument supplied for foreach() in [blablabla]\Cajax-20051021\CajaxInterface.php on line 531

... Não é com o glob (claro, se vocês tiverem o php atualizado) ...

O problema está na forma que o interpretador PHP no rWindows devolve a array retornada pelo glob e como o foreach vê esse resultado, pois ele precisa de uma array nativa. No caso, o foreach não estava enxergando a array de forma correta.

Para resolver, exige-se uma alteração na linha 525 do arquivo em questão (CajaxInterface.php):

Linha antiga:
foreach(glob("{$dir}/*", GLOB_NOSORT) as $k => $v)

Linha nova:
foreach((array)glob("{$dir}/*", GLOB_NOSORT) as $k => $v)

(array) força o interpretador a enxergar a volta do comando glob como um array, resolvendo o problema dos warnings que estavam ocorrendo.

Portanto, creio que o problema não seja o EasyPHP (que por sinal funciona até legal) e sim desse detalhe, pois estou aqui com WAMP instalado na mão e deu esse problema também. E pelo que vi, os outros erros (diretorios vazios,

Enviei um e-mail ao Thiago para ele poder acertar e atualizar o CAJAX lá. Se é que à essa altura ele já não resolveu. ;)

Do mais, parabéns ao cara pela excelente ferramenta.

Abração a todos.
05/05/2006 5:55pm (~18 anos atrás)

Jorge Jardim disse:
Esse problema continua, alguem pode me dizer oq é?

Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of get_class(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /home/frames2/public_html/ajax/cajax/cajax2/cajax2/Handlers/CajaxHandler.class.php on line 167
21/03/2006 1:53am (~18 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)