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



 
Benvenuti a Jumi! Tutorial >> >> Appartamenti forme di chiamata in un Joomla! contenuto

Ci sono un sacco di persone che desiderano pubblicare i propri moduli personalizzati in Joomla! contenuto.

Per soddisfare le loro esigenze, ho deciso di scrivere questo tutorial. Il tutorial è dedicato a Joomla! 1.0.x codifica i principianti, ma quelli intermedi possono trovare alcuni trucchi utili.

In questo tutorial passo passo imparerete

  • quali forme colling auto sono e per quale scopo servono,
  • un po 'più utile php e Joomla! 1.0.x trucchi che sono rilevanti per le forme di chiamata auto. Es.:
    • come uno script cattura che un utente ha inviato i dati,
    • come riconoscere un indirizzo URL a cui lo script viene eseguito,
    • Come spegnere il Joomla specifico! pagina cache disattivata,
    • che Joomla! oggetto specifico $ database, $ my sono, dove trovare i loro metodi e la loro descrizione,
    • ecc.

Quali forme di chiamata auto sono e per quale scopo servono

Ogni forma raccoglie alcuni dati provenienti da responders.

I dati raccolti non rimangono in forma ma sono - di solito dopo aver premuto il pulsante di invio - inviato da qualche parte. Essi vengono inviati ad alcuni script di elaborazione che "siede" su un altro indirizzo URL e che - dopo la pre-elaborazione possibile - scrive i dati nel database e / o li invia a un indirizzo e-mail.

Questo è l'approccio più comune. E su questo approccio si affidano standard di Joomla! forme componenti.

Ma è possibile vivere senza componente dei moduli, è possibile avere le nostre proprie forme da inserire in un articolo contenuto. I moduli possono inviare i dati raccolti per sé e la loro elaborazione. Sono così chiamati forme di chiamata auto.

E 'anche possibile anche di più: per mostrare i risultati del modulo nell'articolo stesso contenuto.

In questo tutorial vi mostrerò come fare.

Perché ci deve essere qualche script php lì che manipola con i dati del modulo che si avvarrà di Jumi plug-in per inserire questo script nel contenuto. Se preferite un altro plugin per l'inserimento script php in Joomla! contenuto che si può usare come bene.

Demo scheda descrittiva

Sebbene la forma demo che segue è molto concreto si può scrivere ogni forma che si possa immaginare da un approccio spiegato in questo tutorial.

Non effettuare test sul server di produzione pubblica, ma sul vostro host locale solo!

Supponiamo che vogliamo

  • una forma di voto che raccoglie le risposte alle domande più 3 si escludono a vicenda,
  • salvare le risposte in un database insieme con data e ora della risposta e, insieme con l'identificazione di un utente,
  • per mostrare l'annuncio "grazie" e sintesi dei risultati, ma - esclusivamente. a quegli utenti che hanno votato.

La strategia di base

Dividere il codice in diversi pezzi, i blocchi funzionali e logico offre molti vantaggi. Anche se non sarà discusso i vantaggi qui seguirà questa prassi generale bene qui.

Ci sono due principali blocchi logici nel nostro compito:

  • mostrano formare + + raccogliere i dati verificarli + salvare i dati in un database (forma chiamata self)
  • leggere i dati da un database e mostrano i risultati.

Così ho dividerà la nostra applicazione in due file di script anche: self_call_form.php e show_results.php.

Andremo nei dettagli nel seguito.

Ma partiamo con un primo database.

Banca Dati

Lasciate che il nostro nome della tabella del database è xxx_mytable_test dove xxx sta per il tuo Joomla! prefisso database. Alcune estensioni di Joomla! gli utenti hanno gli altri prefissi prefisso Jos hanno mos. I assumerà il prefisso Jos in seguito.

Ripeto il nostro compito è quello di memorizzare data e ora di registrazione, l'identificazione utente e una risposta.

Senza entrare nel database MySQL e dettagli di design da tavolo che si possono trovare altrove la struttura della tabella descritta in lingua MySQL sarà:

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

Il campo ID è stato aggiunto solo per l'identificazione tabella record univoco.

È necessario creare la tabella nel database di Joomla. Verifica che il tuo prefisso è jos_. Se è ancora mos_, cambiare il prefisso delle tabelle.

È possibile creare tabella tramite phpMyAdmin manualmente o automaticamente tramite copia-incolla della dichiarazione MySQL sopra.

I assumerà il jos_mytable_test tabella viene creata da ora.

self_call_form.php

Ci sono fondamentalmente due metodi con cui un modulo di comunicazione con l'ambiente: POST e GET. GET invia (e legge) i dati da appendice URL. Non useremo il metodo GET qui.

POST Metodo scrive i dati globali php variabile $ _POST. Così abbiamo pieno accesso ai dati inviati qui.

Algoritmo generale del self_call_form.php

Se non ci sono dati rilevanti in $ _POST, vale a dire non c'è una risposta da un utente, quindi mostrare forma. Se l'utente risponde, quindi lo ringrazio e scrivere la risposta (e altri dati) nel database.

L'algoritmo di cui sopra tradotto in linguaggio php assomiglia a questo codice:

function self_form()
 // Il nome del pulsante di opzione (qui "risposta") deve essere anche il nome di una colonna in un database !!!
{

 $ Anchor = "myform"; / / La variabile $ ancora avremo bisogno in seguito
 eco " "; / / L'ancora html avremo bisogno in seguito
 eco " "; / / Form container

 if(!isset($ _POST['Risposta'])) / / Se non c'è risposta, allora scrivere la forma
 {
  $ Return_url = Get_return_url($ Anchor);
  eco " ";
  eco " Hai trovato utile questo tutorial? ";
  eco " Assolutamente no.\n";
  eco " Così così.\n";
  eco " Sì. Grazie per questo.\n";
  eco " ";
  eco " ";
 }

 altro / / Se c'è una risposta ringrazio e scrivere la risposta nel database
 {
  eco " Grazie per il tuo voto ";
  WRITE_DATA($ _POST['Risposta']);
 }

 eco " ";
}

La spiegazione e alcuni trucchi

PHP funzione isset ('risposta') controlla 'risposta' tempo esiste in $ _POST.

Vogliamo che il modulo per inviare dati a sé. Ciò significa che l'indirizzo URL stessa (forma e il suo script di elaborazione possono essere trovati allo stesso URL). Possiamo usare rigido indirizzo codificato URL di una pagina o, come nel nostro caso, siamo in grado di ottenere l'URL dall'ambiente Joomla utilizzando un semplice trucco. Utilizzando il trucco è meglio quindi il primo approccio hardcoded perché il nostro codice è riutilizzabile in varie pagine senza alcun contatto.

Così ecco che arriva il trucco contenuta nel get_return_url funzione ($ ancoraggio).

Funzione get_return_url ()
function get_return_url($ Anchor)
{
 if ($ Query_string = MosGetParam( $ _SERVER, 'QUERY_STRING', '' ))

 {
  $ Tornare = 'Index.php?' . $ Query_string;
 }
 altro
 {

  $ Tornare = 'Index.php';
 }
 / / L'url inizia con index.php ora
 
 // conversione da & a & per conformità xtml

 $ Tornare = str_replace( "&", '&', $ Tornare );
 / / Ancoraggio aggiungendo alla fine di URL

 $ Tornare .="# $ ancora"; / / Aggiunta di ancoraggio a url
 / / Prepand http:// all'inizio della url
 ritorno sefRelToAbs($ Tornare);

}

Non c'è miracolo in esso. La funzione restituisce solo l'indirizzo URL da cui viene eseguito (nel nostro modulo). Compreso l'ancoraggio.

Perché ho incluso l'(html) ancora nel indirizzo di ritorno?

Immaginiamo che il modulo è in fondo di una pagina molto lunga. Se non fosse per l'ancoraggio poi dopo l'invio dei dati utente vedrà all'inizio della pagina e deve scorrere verso il basso. Con l'utente ancoraggio sarà tornare al posto che ha votato.

Mi piacerebbe rivolgere la vostra attenzione a Joomla! mosGetParam funzione specifica () troppo. E 'la funzione più utile. E deve essere usato in modo intensivo si fa.

La descrizione generale del mosGetParam () può essere trovato qui. Uno degli usi pratici segue:

Invece di usare:

$ _POST ['Somename']

è meglio utilizzare:

mosGetParam ($ _POST, 'somename')

perché non solo qualche taglio di input utente indesiderato, ma ci sono alcune altre opzioni utili in esso.

Tuttavia, se si dispone di molti dati da elaborare può essere piuttosto il tempo consuma di ritirare tutti i valori a partire da $ _POST uno per uno: o loro accesso diretto o tramite mosGetParam () function. C'è un altro trucco: l'uso di estratto di funzione php ($ _POST) che costruisce le variabili e assegna loro un nome di tutto il contenuto di $ _POST.

Avviso usiamo $ _SERVER nel get_return_url function (). $ _SERVER È un'altra variabile globale php come $ _POST e può essere di qualche uso nei vostri script troppo. Se non si conosce il contenuto delle variabili è possibile mostrare nei vostri script utilizzando var_dump ($ somoevaribale) funzione.

Funzione checkForm ()

Questa è la funzione di validazione javascript che convalida l'input dell'utente contro alcune regole. Che la posta elettronica è in realtà un indirizzo di posta elettronica, questo nome non è vuoto, ecc

Ancora: si possono trovare vari script di validazione delle fonti Internet centinaia.

Nel nostro modulo di demo ci sarà la convalida che l'utente ha selezionato un tasto "risposta" radio. Se non c'è "risposta" non inviare i dati, ma mostrano un avviso:

<SCRIPT type="testo / javascript">
function checkForm(configurava) {
 var perché = "";
  per (i=0; io) {

   if (theForm.answer[i]. Controllato) {
    var checkvalue = theForm.answer[i]. Valore;
     rompere;
    }
  }

  perché + = checkRadio(checkvalue);
  if (perché! = "") {
   perché + = "\nSe pensi che sia un nostro errore, faccelo sapere per favore. ";
   allarme(Perché);
   ritorno falso;
  }

  ritorno vero;
}
 
function checkRadio(checkvalue) {
 var = errore "";
  if (!(checkvalue)) {

   = errore "Non hai selezionato alcuna opzione.\n";
   }
   ritorno errore;
}
->

Non ci sono trucchi e non miracoli qui così andiamo ai dati di scrittura nel database.

Funzione WRITE_DATA ()

Si può risparmiare molto tempo se si usa Joomla! oggetti e metodi invece di utilizzare la funzione standard di database MySQL. Voglio dire utilizzando il database-> load ..., database-> query, manuale ecc molto descrittivo si possono trovare qui.

function WRITE_DATA($ Value)
/ / Se l'utente è loggato salvare il suo id altrimenti salvare 'host'

{
 globale $ Database, $ My;
 if ($ My->id)
  $ User_id = $ My->id;
 altro

  $ User_id = "ospite";
 $ Database->setQuery( "INSERT INTO #__mytable_test (id, recordtime, user_id, answer) VALUES ('', '". quando('Y-m-d H: i: s')."','".$ User_id."','".$ Value."');" );
 $ Database->domanda(); / / Scrittura dei dati

}

Niente di interessante, tranne Joomla globale! variabile $ mia. Esso contiene id utente, il nome, la sua e-mail, ecc Ancora: tenta di utilizzare var_dump ($ my) nel codice e vedrete la struttura e il contenuto.

Convalida query:

Non ho incluso alcuna convalida che i dati è stata effettivamente scritta. Puoi farlo se vuoi. Basta sostituire la linea $ database-> query (); da
if (!$ Database->domanda()) { / / Scrivere i dati e se l'errore si verifica alert

  eco " alert('".$ Database->getErrorMsg()."'); ";
 }

Così abbiamo tutti i blocchi di costruzione della nostra forma di auto chiama adesso.

Si può provare immediatamente (purché si disponga di jos o una tabella mos_mytable_test creato).

Ma c'è una cosa più ...

Non per tutti noi il comportamento dell'applicazione sarà come generalmente previsto: dopo aver inviato il modulo sarà ancora visibile e non ci sarà alcun annuncio "grazie".

Questo accadrà per coloro il cui Joomla! cache è su.

Ed ecco un altro trucco: spegnendo l'intera cache Joomla è facile, ma spegnere la cache per una delle pagine Joomla sembra essere il problema.

Il grande problema con una soluzione molto semplice.

L'hack della cache è stata descritta in Joomla! foro:

Modifica / includes / Cache / Lite.php
Vedrete "funzione di risparmio ($ data ..."
il cambiamento

function salvare($ Data, $ Id = NULL, $ Group = 'Default')

{
 if ($ This-> _ memorizzazione nella cache) {

a

function salvare($ Data, $ Id = NULL, $ Group = 'Default')

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

 if ($ This-> _ memorizzazione nella cache ) {

quindi, creare un modulo con


nel corpo, e pubblicarlo in qualsiasi posizione visualizzare (utenti non lo vedrà) ... Poi basta attivare quel modulo in qualsiasi pagina non si desidera cache ...

Sto solo aggiungendo che "la direttiva nocache" possono essere inclusi nel contenuto pure.

Riepilogo delle self_call_form.php

Quindi c'è tutto il contenuto del self_call_form.php:


definito( '_VALID_MOS' ) or il( 'Accesso limitato' ); / / Motivi di sicurezza

?>
<SCRIPT type="testo / javascript">
function checkForm(configurava) {
 ...
}
function checkRadio(checkvalue) {

...
}
->

 


function self_form()
{
...

}
function get_return_url($ Anchor){
 ...
}
function WRITE_DATA($ Value){
...
}
 

/ / Codice executive inizia da qui
self_form();
/ / Codice executive finisce qui
?>

NB: l'intero script è "avvolto" nella self_form esecutivo () funzioni. Non ci sono le variabili dello script vengono definite le funzioni al di fuori quindi non c'è alcun rischio le variabili interagiscono con altri 3rd partito o Joomla! variabili in modo imprevedibile.

Uff ...

Questo è tutto per il modulo di chiamata di sé: Modulo di raccogliere i dati mostrano + + + verificarli salvare i dati in un database.

Ora scrivere nel vostro articolo

{jumi [somepathway / self_call_form.php]}

e testarlo.

In primo luogo si vedrà

jumi Ingresso forma

e dopo il voto (solo dopo il voto) è possibile vedere il risultato della seconda parte (show_results.php):

Uscita forma jumi

La seconda parte - presentazione dei risultati ottenuti dal database - è molto più facile allora la parte precedente.

show_results.php


definito( '_VALID_MOS' ) or il( 'Accesso limitato' );

 
function show_results()
{
 globale $ Database;
 eco " "; / / Non necessario ma utile qui

 $ Radios_name = "risposta"; / / Deve essere una colonna in un database troppo!
 if(isset($ _POST[$ Radios_name])) {/ / Show risultati per coloro che hanno votato solo
  eco " ";
  eco " Questo tutorial è stato ";
  $ Database->setQuery( "SELECT $ radios_name, COUNT (id) AS numitems FROM #__myform_test GROUP BY $ radios_name");
  $ Rows = $ Database->loadObjectList();
  foreach ( $ Rows as $ Row ){ / / Passeggiando per le risposte

   interruttore ($ Row->rispondere){
    Custodie 1:
     eco "non utile per".$ Row->numItems."lettori,\n";
    rompere;
    Custodie 2:
     eco "così così utile per".$ Row->numItems."lettori e\n";
    rompere;
    Custodie 3:
     eco "molto utile per".$ Row->numItems."lettori\n";
    rompere;
    difetto:
   }

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

Ora scrivere sul suo sito web poco meno di precedente dichiarazione plug jumi:

{jumi [somepathway / show_results.php]}

e testarlo.

Non credo ci sia molto per la spiegazione, tranne la manipolazione di database e gli oggetti righe. Ancora una volta: vai a Joomla! API descrizione.

Conclusione

Tutto è stato risolto, tutto è stato scritto. È possibile scaricare l'intero script qui.