Urdu Português
English English Deutsch Deutsch Español Español Français Français Italiano Italiano Nederlands Nederlands Português Português Русский Русский Ελληνικά Ελληνικά
Login



 
Bem-vindo ao Jumi! Tutorial >> >> Auto formas de chamada em um Joomla! conteúdo

Há um monte de pessoas que desejam publicar seus formulários personalizados em um Joomla! conteúdo.

Para atender às suas necessidades, eu decidi escrever este tutorial. O tutorial é dedicado a Joomla! 1.0.x codificação iniciantes, mas os intermediários podem encontrar alguns truques úteis também.

Neste tutorial passo a passo, você vai aprender

  • que formas de auto Colling são e para que fins a que servem,
  • alguns php mais útil e Joomla! 1.0.x truques que são relevantes para as formas de chamada auto. Por exemplo:
    • como um script pega um usuário que enviou os dados,
    • como reconhecer um endereço URL na qual o script é executado,
    • como desligar o Joomla específica! off cache da página,
    • o que Joomla! objeto específico do banco de dados $, $ a minha é, onde encontrar os seus métodos e sua descrição,
    • etc.

Que formas são chamadas auto e para que servem

Toda forma recolhe alguns dados de respondedores.

Os dados coletados não permanecer em um formulário, mas eles são - geralmente após pressionar botão enviar - enviou em algum lugar. Eles são enviados para um script de processamento que "senta" em outro endereço URL e que - depois de pré-processamento possível - grava os dados no banco de dados e / ou envia-los para um endereço de e-mail.

Esta é a abordagem mais comum. E no que depender abordagem padrão Joomla! formas componentes.

Mas é possível viver sem componente de formulários, é possível ter nossas próprias formas para ser incluído em um artigo de conteúdo. Os formulários podem enviar os dados coletados para auto e processá-los. Eles são assim chamados formas de chamada auto.

É mesmo possível ainda mais: para mostrar os resultados do formulário no artigo mesmo conteúdo.

Neste tutorial vou mostrar-lhe como.

Porque tem que haver algum script php lá que manipula com os dados do formulário farei uso do plugin Jumi para incluir este scripts para o conteúdo. Se você preferir qualquer outro plugin para php inclusão script em Joomla! conteúdo que você pode usá-lo também.

Descrição do formulário de demonstração

Embora a forma de demonstração que se segue é muito concreta, você pode escrever todas as formas que você pode imaginar pela abordagem explicado neste tutorial.

Não faça testes no servidor de produção pública, mas no seu host local apenas!

Vamos supor que queremos

  • uma forma de votação que recolhe as respostas sobre questões 3 mutuamente exclusivos,
  • para salvar respostas numa base de dados, juntamente com a data e hora da resposta e, juntamente com uma identificação do utilizador,
  • para mostrar "obrigado" anúncio e um resumo dos resultados, mas apenas para aqueles usuários que votaram.

A estratégia básica

Dividir o código em vários pedaços, blocos funcionais e lógica oferece muitas vantagens. Embora eu não discutiu as vantagens aqui eu vou seguir esta boa prática aqui.

Existem dois principais blocos lógicos em nossa tarefa:

  • mostrar formar + + coletar dados verificá-los + salvar dados em um banco de dados (formulário chamado self)
  • ler dados de um banco de dados e mostrar os resultados.

Então eu vou dividir a nossa aplicação em dois arquivos de script também: self_call_form.php e show_results.php.

Nós vamos entrar em detalhes a seguir.

Mas vamos começar com um primeiro banco de dados.

banco de dados

Que o nosso nome da tabela de banco de dados é xxx_mytable_test onde xxx significa o seu Joomla! prefixo banco de dados. Alguns Joomla! os usuários têm outros prefixo Jos tem prefixo mos. I irá assumir prefixo jos a seguir.

Repito a nossa tarefa é a de armazenar data de registo e hora, identificação do usuário e uma resposta.

Sem entrar em MySQL banco de dados e os detalhes de concepção da tabela que pode ser encontrados em outro lugar a estrutura da tabela descrita no MySQL idioma será:

CREATE TABLE IF NOT EXISTS `jos_mytable_test` (
`Id` int (11) NOT NULL auto_increment,
`` Default recordtime datetime NOT NULL '0000-00-00 00: 00: 00',
`User_id` varchar NOT (15) NULL default 'host',
`Responder` int NOT (6) NULL default '0',
PRIMARY KEY (`id`)
) TYPE = MyISAM;

O ID de campo foi adicionado apenas para identificação tabela de registro único.

Você tem que criar a tabela em seu banco de dados Joomla. Verificar se o prefixo é jos_. Se for ainda mos_, alterar o prefixo da tabela.

Você pode criar tabela via phpMyAdmin manualmente ou automaticamente pelo copy-paste da declaração MySQL acima.

Vou assumir o jos_mytable_test tabela é criada a partir de agora.

self_call_form.php

Existem basicamente dois métodos pelos quais se comunicam formulário com o seu ambiente: POST e GET. GET envia (e lê) os dados do apêndice URL. Nós não vamos usar o método GET aqui.

POST método grava dados mundial php $ _POST variável. Portanto, temos pleno acesso aos dados enviados aqui.

Algoritmo geral do self_call_form.php

Se não existem dados relevantes em $ _POST, ou seja, não há uma resposta de um usuário, em seguida, mostrar formulário. Se o usuário respondeu, em seguida, agradecer-lhe e escrever a resposta (e outros dados) para o banco de dados.

O algoritmo acima traduzidas para a linguagem php parecido com este código:

função self_form()
 // O nome do botão de opção (aqui "resposta") deve ser um nome de coluna em um banco de dados também !!!
{

 $ Âncora = "myform"; / / A variável $ âncora vamos precisar mais tarde
 eco " "; / / Html a âncora vamos precisar mais tarde
 eco " "; / Form / container

 if(!isset($ _POST['Resposta'])) / / Se não houver resposta em seguida, escrever a forma
 {
  $ Return_url = Get_return_url($ Âncora);
  eco " ";
  eco " Você achou este tutorial útil? ";
  eco " Absolutamente não.\n";
  eco " Mais ou menos.\n";
  eco " Sim. Obrigado por isso.\n";
  eco " ";
  eco " ";
 }

 outro / / Se houver uma resposta agradecer e escrever a resposta no banco de dados
 {
  eco " Obrigado pelo seu voto ";
  write_data($ _POST['Resposta']);
 }

 eco " ";
}

A explicação e alguns truques

PHP função isset ('resposta') verifica 'resposta' tempo existe no $ _POST.

Nós queremos que o formulário para enviar dados para auto. Isso significa que para o endereço de URL mesmo (forma e seu script de processamento podem ser encontrados na mesma URL). Podemos usar o endereço URL codificado de uma página ou, como no nosso caso, podemos obter a URL do ambiente Joomla usando um truque simples. Usando o truque é melhor, então a abordagem rígido primeiro código porque o nosso código é reutilizável em várias páginas, sem qualquer toque.

Então, aqui vem o truque contida no get_return_url função ($ âncora).

Função get_return_url ()
função get_return_url($ Âncora)
{
 if ($ Query_string = MosGetParam( $ _SERVER, 'QUERY_STRING', '' ))

 {
  $ Retornar = 'Index.php? . $ Query_string;
 }
 outro
 {

  $ Retornar = 'Index.php';
 }
 / / Url começa com um index.php agora
 
 // convertendo & para & para conformidade xtml

 $ Retornar = str_replace( '&', '&', $ Retornar );
 / / Adição de âncora para o fim da URL

 $ Retornar .="# $ âncora"; / / Adicionando âncora para url
 / / Prepand http:// para o início da URL
 retorno sefRelToAbs($ Retornar);

}

Não há milagre nisso. A função só retorna o endereço URL onde ele é executado (no nosso formulário). Incluindo a âncora.

Por eu ter incluído a âncora (html) para o endereço de retorno?

Imaginar que a nossa forma é, na parte inferior de uma página de muito longa. Se não fosse para a âncora, em seguida, após o envio de dados do usuário verá na parte superior da página e tem que rolar para baixo. Com usuário ancoragem será voltar para o lugar que ele votou.

Eu gostaria de voltar sua atenção para Joomla! mosGetParam função específica () também. É a função mais útil. E deve ser usado em vós forma intensiva.

A descrição geral de mosGetParam () pode ser encontrada aqui. Um dos uso prático segue:

Em vez de usar:

$ _POST ['Somename']

é melhor usar:

mosGetParam ($ _POST, 'somename')

porque ele não só faz algum corte de entrada do usuário indesejado, mas há algumas outras opções úteis na mesma.

No entanto, se você tem muitos dados a serem processados ​​que pode ser bastante tempo de consumo de retirar todos os valores de $ _POST um por um: ou por acessá-los direta ou através de mosGetParam () função. Há um outro truque: use extrato função php ($ _POST) que constrói variáveis ​​e atribui-lhes nomes de todo o conteúdo de $ _POST.

Note que nós usamos $ _SERVER no get_return_url function (). $ _SERVER É outra variável php global como $ _POST e pode ser de algum uso em seus scripts também. Se você não sabe o conteúdo de variáveis ​​que você pode mostrá-los em seus scripts usando var_dump ($ somoevaribale) função.

Função checkForm ()

Esta é a validação função javascript que valida a entrada do usuário contra algumas regras. Esse e-mail é realmente um endereço de e-mail, que o nome não está vazio, etc

Mais uma vez: você pode encontrar vários scripts de validação de fontes de centenas de Internet.

Em nosso formulário de demonstração que irá validar o usuário tenha selecionado uma "resposta" botão de rádio. Se não houver um "resposta" não enviar os dados, mas mostrar um alerta:

<SCRIPT type="text / javascript">
função checkForm(theform) {
 var porque = "";
  para um (i=0; Eu) {

   if (theForm.answer[i]. Verificado) {
    var checkvalue = theForm.answer[i]. Valor;
     quebrar;
    }
  }

  por + checkRadio =(checkvalue);
  if (porquê! = "") {
   Por + = "\nSe você acha que é nosso erro, informe-nos, por favor. ";
   alertar(porque);
   retorno falso;
  }

  retorno verdadeiro;
}
 
função checkRadio(checkvalue) {
 var erro = "";
  if (!(checkvalue)) {

   erro = "Você não selecionou nenhuma opção.\n";
   }
   retorno erro;
}
->

Não há truques e sem milagres aqui, então vamos para as gravação de dados em banco de dados.

Função write_data ()

Você pode poupar muito tempo se você usar o Joomla! objetos e métodos, em vez de usar a função de banco de dados MySQL padrão. Quero dizer com banco de dados-> load ..., banco de dados-> query, etc manual muito descritiva pode ser encontrada aqui.

função write_data($ Value)
/ / Se o usuário está logado salvar a sua ID de outra forma salvar 'host'

{
 global $ Banco de dados, $ Minha;
 if ($ Minha->id)
  $ User_id = $ Minha->id;
 outro

  $ User_id = "hospedeiro";
 $ Banco de dados->setQuery( "INSERT INTO #__mytable_test (id, recordtime, user_id, answer) VALUES ('', '". dados('Y-m-d H: i: s')."','".$ User_id."','".$ Value."');" );
 $ Banco de dados->pergunta(); / / Escreve dados

}

Nada de interessante aqui, exceto Joomla global! variável $ minha. Ele contém user id, nome, etc seu e-mail novamente: tente usar var_dump ($ meu) em seu código e você verá a estrutura eo conteúdo.

Validando consulta:

Eu não incluí qualquer validação de dados que foi realmente escrito. Você pode fazê-lo se quiser. Basta substituir a linha de $ database-> query (); por
if (!$ Banco de dados->pergunta()) { / / Escreve dados e se o erro ocorre alerta

  eco " alert('".$ Banco de dados->getErrorMsg()."'); ";
 }

Portanto, temos todos os blocos de construção de nosso formulário de auto chamando agora.

Você pode experimentá-lo imediatamente (desde que você tenha jos ou tabela mos_mytable_test criado).

Mas há mais uma coisa ...

Não é para todos nós o comportamento do aplicativo será como geralmente se espera: após enviar o formulário será ainda visível e não haverá nenhum "obrigado" anúncio.

Isso ocorrerá para aqueles cuja Joomla! cache é ligado.

E aqui vem um outro truque: desligar o cache Joomla todo é fácil, mas desligar o cache para uma das páginas do Joomla parece ser o problema.

O grande problema com uma solução muito simples.

O hack de cache foi descrita em Joomla! fórum:

Editar / includes / cache / Lite.php
Você vai ver "save função ($ dados ..."
alterar

função salvar(R $ dados, $ Id = NULL, $ Grupo = 'Default')

{
 if ($ This-> _ cache) {

para

função salvar(R $ dados, $ Id = NULL, $ Grupo = 'Default')

{
 if(strpos(R $ dados,' ') ! == falso) {
  $ This-> _ caching = 0;
 }

 if ($ This-> _ cache ) {

em seguida, criar um módulo com


no corpo, e publicá-lo em qualquer posição apresentada (os usuários não se vê) ... Depois, basta habilitar esse módulo em qualquer página que você não quer em cache ...

Estou apenas acrescentando que "a directiva nocache" pode ser incluído no conteúdo também.

Resumo da self_call_form.php

Portanto, há todo o conteúdo do self_call_form.php:


definido( "_VALID_MOS ' ) or morrer( "Acesso Restrito" ); / Security / razões

?>
<SCRIPT type="text / javascript">
função checkForm(theform) {
 ...
}
função checkRadio(checkvalue) {

...
}
->

 


função self_form()
{
...

}
função get_return_url($ Âncora){
 ...
}
função write_data($ Value){
...
}
 

/ / Código executivo começa aqui
self_form();
/ / Código executivo termina aqui
?>

NB: todo o roteiro é "embrulhado" no self_form executivo () funções. Nenhuma variável de script são definidos fora de quaisquer funções que não há risco as variáveis ​​irão interagir com outros 3rd partido ou Joomla! variáveis ​​de uma forma imprevisível.

Uff ...

Isso é tudo para o formulário chamado self: forma espectáculo + + coletar dados verificá-los + salvar dados em um banco de dados.

Agora escrever em seu artigo

{Jumi [somepathway / self_call_form.php]}

e testá-lo.

Primeiro você vai ver

formulário de entrada jumi

e após o seu voto (só depois da votação), você pode ver o resultado da segunda parte (show_results.php):

saída forma jumi

A segunda parte - apresentando os resultados obtidos a partir do banco de dados - é muito mais fácil, em seguida, a parte anterior.

show_results.php


definido( "_VALID_MOS ' ) or morrer( "Acesso Restrito" );

 
função show_results()
{
 global $ Banco de dados;
 eco " "; / / Não é necessário, mas útil aqui

 $ Radios_name = "responda"; / / Deve ser uma coluna numa base de dados também!
 if(isset($ _POST[$ Radios_name])) {/ / Mostra os resultados para aqueles que votaram apenas
  eco " ";
  eco " Este tutorial foi ";
  $ Banco de dados->setQuery( "SELECT $ radios_name, COUNT (id) AS numitems FROM #__myform_test GROUP BY $ radios_name");
  R $ linhas = $ Banco de dados->loadObjectList();
  foreach ( R $ linhas as $ Row ){ / / Caminhando através das respostas

   interruptor ($ Row->responder){
    casas 1:
     eco "não é útil para".$ Row->numItems."leitores,\n";
    quebrar;
    casas 2:
     eco "tão útil para".$ Row->numItems."leitores e\n";
    quebrar;
    casas 3:
     eco "muito útil para".$ Row->numItems."leitores\n";
    quebrar;
    omissão:
   }

 }
 eco " ";
 }
}
show_results();
?>

Agora escreva o seu conteúdo em pouco menos de declaração anterior do plugin Jumi:

{Jumi [somepathway / show_results.php]}

e testá-lo.

Eu não acho que há muito para explicação, exceto a manipulação de banco de dados e objetos de linhas. Mais uma vez: vá para Joomla! Descrição API.

Conclusão

Tudo foi resolvido, tudo foi escrito. Você pode baixar todo o script aqui.