Self ringer former i en Joomla! indhold - tutorial

Der er en masse mennesker, der ønsker at offentliggøre deres brugerdefinerede formularer i en Joomla! indhold.

At opfylde deres behov besluttede jeg at skrive denne tutorial. Den tutorial er dedikeret til Joomla! 1.0.x kodning begyndere, men mellemliggende dem kan findes nogle tricks nyttigt.

I dette trin for trin tutorial vil du lære

  • Hvad self Colling former og til hvilket formål de tjener,
  • nogle mest nyttige PHP og Joomla! 1.0.x tricks, der er relevante for selv at kalde former. F.eks:
    • hvordan et script fangster, som en bruger har sendt data,
    • hvordan man genkender en URL-adresse, hvor scriptet kører,
    • hvordan man kan slukke for bestemte Joomla! side cache off,
    • hvad Joomla! bestemt objekt $ database, $ min, er, hvor man kan finde deres metoder og deres beskrivelse,
    • osv.

Hvad self kalder former og til hvilket formål de tjener

Enhver form indsamler nogle data fra respondenter.

Indsamlede data ikke forbliver i en form, men de er - som regel efter at have trykket send-knappen - sendt et eller andet sted. De er sendt til nogle forarbejdningsmetoder script, der "sidder" på en anden URL-adresse, og at - efter mulig programmeringssproget - skriver data ind i databasen og / eller sender dem til en e-mail-adresse.

Dette er den mest almindelige tilgang. Og på denne fremgangsmåde er afhængige standard Joomla! former komponenter.

Men det er muligt at leve uden former komponent, er det muligt at have vores egne formularer, der skal indgå i et indhold artikel. Formularer kan sende indsamlede data til sig selv og behandle dem. De er såkaldte self ringer former.

Det er endda muligt endnu mere: at vise den form resultaterne i det samme indhold artiklen.

I denne tutorial vil jeg vise dig hvordan.

Fordi der skal være nogle PHP script der, der manipulerer med form data, jeg vil gøre brug af Jumi plugin til at medtage denne scripts ind i indholdet. Hvis du foretrækker noget andet plugin til php script inklusion i Joomla! indhold, du kan bruge det så godt.

Demo formular beskrivelse

Selv om følgende demo form er meget konkret du kan skrive hver formular, du kan forestille dig ved tilgang forklaret i denne tutorial.

Gør ikke forsøg på din offentlige produktion server, men på din lokale vært only!

Lad os antage, vi ønsker

  • en afstemning formular, der indsamler svar på 3 gensidigt udelukkende spørgsmål,
  • til at gemme svarene i en database sammen med dato og tidspunkt for svar, og sammen med en brugers identifikation,
  • at vise "tak" annonceringen og sammenfatning af resultaterne, men kun til de brugere, der har stemt.

Grundlæggende strategi

Opdeling af koden i flere stykker, funktionelle og logiske blokke giver mange fordele. Selv om jeg ikke vil drøftede fordelene her vil jeg følge denne almene praksis her.

Der er to primære logiske blokke i vores opgave:

  • Vis formular + indsamle data + verificere dem + gemme data til en database (selv kalder form)
  • læse data fra en database og vise resultaterne.

Så jeg vil opdele vores ansøgning i to script filer også: self_call_form.php og show_results.php.

Vi vil gå ind i detaljerne i det følgende.

Men lad os starte med en database først.

Database

Lad vores database tabelnavnet er xxx_mytable_test hvor xxx står for dit Joomla! database præfiks. Nogle Joomla! brugere har Jos præfiks andre har MOS præfiks. Jeg vil antage, Jos præfiks i det følgende.

Jeg gentager vores opgave er at gemme registrere dato og tid, bruger-id og et svar.

Uden at gå ind i MySQL-database og tabel design detaljer, der kan findes andre steder strukturen af ​​tabellen er beskrevet i MySQL sprog vil være:

CREATE TABLE IF NOT EXISTS `jos_mytable_test` (`id` int (11) NOT NULL AUTO_INCREMENT, `recordtime` datetime NOT NULL som standard '0000-00-00 00:00:00 ', `USER_ID` varchar (15) NOT NULL standard 'host', `svar` int (6) IKKE NULL default '0 ', PRIMARY KEY (`id`)) TYPE = MyISAM;

Feltet id blev tilføjet bare for tabellen rekord unik identifikation.

Du er nødt til at oprette tabellen i din Joomla database. Kontroller, at dit præfiks er jos_. Hvis det stadig er mos_, ændre tabellens præfiks.

Du kan oprette tabel via phpMyAdmin enten manuelt eller automatisk ved at copy-paste af MySQL erklæring ovenfor.

Jeg vil antage bordet jos_mytable_test er skabt fra nu.

self_call_form.php

Der er grundlæggende to metoder, som en form kommunikere med sine omgivelser: POST og GET. GET sender (og læser) data fra URL bilag. Vi vil ikke bruge GET-metoden her.

Metode POST skriver data til den globale php variabel $ _POST. Så vi har fuld adgang til de data, der sendes her.

Generel algoritme for self_call_form.php

Hvis der ikke er relevante data i $ _POST, dvs der er intet svar fra en bruger, så vise form. Hvis brugeren besvaret, så tak til ham og skrive svaret (og andre data) i databasen.

Algoritmen ovenstående oversat til PHP sprog ligner denne kode:

funktion self_form()
 / / Radio-knap navn (her "svar") skal være en kolonne navn i en database, også!
{

 $ Anker = "Minform"; / / De $ anker variable vi får brug for senere
 ekko "<a Name = $anchor> </ a>"; / / Html anker vi får brug for senere
 ekko "<blockquote>"; / / Form container

 hvis(!Isset($ _POST['Svar'])) / / Hvis der ikke er svaret så skriv form
 {
  $ Return_url = Get_return_url($ Anker);
  ekko "<form Name='my_form' action=$return_url method='post'>";
  ekko "<h3> Har du fundet denne tutorial hjælpsom? </ H3>";
  ekko "<input Type='radio' name='answer' value='1'> Absolut ingen.\ N";
  ekko "<input Type='radio' name='answer' value='2'> Så det.\ N";
  ekko "<input Type='radio' name='answer' value='3'> Ja. Tak for det.\ N";
  ekko "<input Type='submit' onClick='return checkForm(this.form)' value='Submit' class='button'/>";
  ekko "</ Form>";
 }

 andet / / Hvis der er et svar tak og skriv svaret i databasen
 {
  ekko "<b> Tak for din stemme </ b>"; Write_data($ _POST['Svar']);
 }

 ekko "</ Blockquote>";
}

Forklaringen og nogle tricks

PHP-funktion Isset ('svar') kontrol vejr 'svar' findes i $ _POST.

Vi ønsker, at formularen til at sende data til sig selv. Det betyder, at den samme URL-adresse (form og dens behandling script kan findes på samme URL). Vi kan bruge hårdt kodet URL-adressen på en side eller, som i vores tilfælde, kan vi få webadressen fra Joomla miljø ved hjælp af et simpelt trick. Brug det trick er bedre end den første hard kodet tilgang, fordi vores kode er genanvendelige i forskellige sider uden touch.

Så her kommer det trick, der er indeholdt i funktionen get_return_url ($ anker).

Funktion get_return_url ()
funktion get_return_url($ Anker)
{
 hvis ($ QUERY_STRING = MosGetParam( $ _SERVER, 'QUERY_STRING', '' ))

 {
  $ Tilbage = 'Index.php?' . $ QUERY_STRING;
 }
 andet
 {

  $ Tilbage = 'Index.php';
 }
 / / En url starter med index.php nu
 
 / / Konvertere & til & for xtml overholdelse

 $ Tilbage = str_replace( '&', '&', $ Tilbage );
 / / Tilføjer anker til slutningen af ​​URL

 $ Tilbage .="# $ Anker"; / / Tilføjer anker til URL
 / / Prepand http:// til begyndelsen af ​​url
 tilbage sefRelToAbs($ Tilbage);

}

Der er ingen mirakel i det. Funktionen bare returnerer URL-adresse, hvor det kører (i vores form). Herunder ankeret.

Hvorfor jeg har medtaget de (html) anker til afsenderadressen?

Forestil dig, at vores formular er i bunden af ​​en meget lang side. Hvis det ikke var for anker så efter at have sendt data bruger vil se øverst på siden og er nødt til at rulle ned. Med forankring brugeren vil blive tilbage til det sted, han stemte.

Jeg vil gerne gøre dig opmærksom på Joomla! specifik funktion mosGetParam () også. Det er den mest nyttige funktion. Og bør anvendes i dig former intensivt.

Den generelle beskrivelse af mosGetParam () kan findes her. En af den praktiske anvendelse følger:

Stedet for at bruge:

$ _POST ['Somename']

det er bedre at bruge:

mosGetParam ($ _POST, 'somename')

fordi det ikke blot nogle trimning af uønsket brugerens input, men der er nogle andre nyttige muligheder i det.

Men hvis du har mange data, der skal behandles det kan være lidt tid brystsyge til at trække alle værdier fra _POST en $ ad gangen: enten ved direkte at få adgang til dem eller via mosGetParam () funktion. Der er en anden trick: bruge PHP-funktionen ekstrakt ($ _POST), der bygger variabler og tildeler dem navne fra alle indholdet af $ _POST.

Bemærk vi bruger $ _SERVER i funktionen get_return_url (). $ _SERVER Er en anden php global variabel som $ _POST og kan være af en vis brug i dine scripts også. Hvis du ikke kender indholdet af variabler, du kan vise dem i din scripts hjælp var_dump ($ somoevaribale) funktion.

Funktion checkForm ()

Dette er den validering JavaScript-funktion, der validerer brugerinput mod nogle regler. At e-mail er virkelig en e-mail-adresse, dette navn er ikke tom, osv.

Igen: du kan finde forskellige validering scripts på flere hundrede kilder på Internettet.

I vores demo-form, vi vil validere at brugeren har valgt en "svar" radio-knappen. Hvis der ikke "svarer" ikke sender data, men viser en advarsel:

<SCRIPT type ="Text / javascript"> <! -
funktion checkForm(theForm) {
 var hvorfor = "";
  for (i =0; I <theForm.answer.length; i + +) {

   hvis (theForm.answer[Jeg]. Kontrolleret) {
    var checkvalue = theForm.answer[Jeg]. Værdi;
     break;
    }
  }

  hvorfor + = checkRadio(checkvalue);
  hvis (hvorfor! = "") {
   hvorfor + = "\ NHvis du tror det er vores fejl, så lad os kendte venligst. "; Alarm(hvorfor);
   tilbage falske;
  }

  tilbage sandt;
}
 
funktion checkRadio(checkvalue) {
 var error = "";
  hvis (!(checkvalue)) {

   error = "Du har ikke valgt nogen mulighed.\ N";
   }
   tilbage fejl;
}
->
</ SCRIPT>

Der er ingen tricks og ingen mirakler her, så lad os gå til skrivning af data til databasen.

Funktion write_data ()

Du kan spare meget tid, hvis du bruger Joomla! objekter og metoder i stedet for at bruge standard MySQL-database funktion. Jeg mener at bruge database-> load ..., database-> forespørgsel, kan osv. Meget beskrivende manual findes her.

funktion write_data($ Værdi)
/ / Hvis brugeren er logget redde hans id ellers redde 'vært'

{
 globale $ Database, $ Min;
 hvis ($ Min->id)
  $ USER_ID = $ Min->id;
 andet

  $ USER_ID = "Host";
 $ Database->setQuery( "INSERT INTO # __mytable_test (id, recordtime, USER_ID, svar) VALUES ('', '". dato('Ymd H: i: s')."','".$ USER_ID."','".$ Værdi."');" );
 $ Database->forespørgsel(); / / Skrive data

}

Intet interessant her, undtagen globale Joomla! Variablen $ min. Den indeholder bruger-id, navn, hans e-mail osv. Igen: Prøv at bruge var_dump ($ min) i din kode, og du vil se strukturen og indholdet.

Validering af forespørgsel:

Jeg har ikke medtaget nogen bekræftelse på, at data rent faktisk blev skrevet. Du kan gøre det, hvis du ønsker det. Bare erstatte linjen $ database-> query (), ved
hvis (!$ Database->forespørgsel()) { / / Skrive data, og hvis der opstår fejl alarm

  ekko "<script> Alert ('".$ Database->getErrorMsg()."'); </ Script>";
 }

Så vi har alle byggestenene i vores egen kalde form nu.

Du kan prøve med det samme (forudsat at man har jos eller mos_mytable_test oprettet tabel).

Men der er én ting mere ...

Ikke for os alle ansøgningen adfærd vil være som forventes generelt: efter indsendelse af skema, vil blive stadig synlige, og der vil være nogen "tak" meddelelse.

Dette vil ske for dem, hvis Joomla! cache er slået til.

Og her kommer et andet trick: at slukke for hele Joomla cache er nemt, men at slukke cachen til en af ​​Joomla sider synes at være problemet.

Det store problem med meget enkel løsning.

Cachen hack blev beskrevet i Joomla! forum:

Rediger / includes / Cache / Lite.php
Du vil se "funktionen gemmer ($ data ..."
ændre

funktion spare($ Data, $ Id = NULL, $ Gruppe = 'Default')

{
 hvis ($ This-> _caching) {

til

funktion spare($ Data, $ Id = NULL, $ Gruppe = 'Default')

{
 hvis(strpos($ Data,'<!-- Nocache -> ') ! == falske) {
  $ This-> _caching = 0;
 }

 hvis ($ This-> _caching ) {

Opret derefter et modul med

<-! Nocache ->

i kroppen, offentliggøre og den til enhver viste position (Brugerne kan ikke se det) ... Så bare gøre det muligt at modulet på en side, som du ikke ønsker cached ...

Jeg er blot at tilføje, at "nocache direktivet" kan indgå i det materiale, som godt.

Resumé af self_call_form.php

Så der er hele indholdet af self_call_form.php:

<? Php
definerede( »_VALID_MOS ' ) eller ( 'Begrænset adgang' ); / / Sikkerhedsmæssige årsager

?>
<SCRIPT type ="Text / javascript"> <! -
funktion checkForm(theForm) {
 ...
}
funktion checkRadio(checkvalue) {

...
}
->
</ SCRIPT>
<-! Nocache ->
<? Php
funktion self_form()
{
...

}
funktion get_return_url($ Anker){
 ...
}
funktion write_data($ Værdi){
...
}
 

/ / Koncerndirektør kode starter her
self_form();
/ / Koncerndirektør kode slutter her
?>

NB: hele scriptet er "pakket ind" i den udøvende self_form () funktioner. Ingen script variabler er defineret uden for nogen funktioner, så der er ingen risiko for de variabler vil interagere med andre 3. parts eller Joomla! variabler i en uforudsigelig måde.

Uff ...

Det er alt for selv at kalde form: Vis formular + indsamle data + verificere dem + gemme data til en database.

Nu skriver i din artikel

{jumi [somepathway / self_call_form.php]}

og teste det.

Først vil du se

jumi form input

og efter din stemme (kun efter afstemningen) kan du se resultatet af den anden del (show_results.php):

jumi form output

Den anden del - at præsentere resultaterne fra databasen - er meget nemmere end den foregående del.

show_results.php

<? Php
definerede( »_VALID_MOS ' ) eller ( 'Begrænset adgang' );
funktion show_results()
{
 globale $ Database;
 ekko "<!-- Nocache -> "; / / Ikke nødvendigt, men nyttigt her

 $ Radios_name = "Svar"; / / Skal være en kolonne i en database, også!
 hvis(Isset($ _POST[$ Radios_name])) {/ / Vis resultater for dem, der stemte kun
  ekko "<blockquote>";
  ekko "<h3> Denne tutorial var </ h3>";
  $ Database->setQuery( "SELECT $ radios_name, COUNT (id) AS numitems FRA # __myform_test GROUP BY $ radios_name");
  $ Rækker = $ Database->loadObjectList();
  foreach ( $ Rækker som $ Row ){ / / Gå gennem svar

   skifte ($ Row->svar){
    tilfælde 1:
     ekko "Ikke brugbar for".$ Row->numitems."Læsere,\ N";
    break;
    tilfælde 2:
     ekko "Så så nyttige for".$ Row->numitems."Læsere og\ N";
    break;
    tilfælde 3:
     ekko "Meget nyttige for".$ Row->numitems."Læsere\ N";
    break;
    standard:
   }

 }
 ekko "</ Blockquote>";
 }
}
show_results();
?>

Nu skriver i dit indhold lige under tidligere jumi plugin erklæring:

{jumi [somepathway / show_results.php]}

og teste det.

Jeg tror ikke der er meget for at se forklaringerne bortset fra at manipulere databasen og rækker objekter. Igen: gå til Joomla! API beskrivelse.

Konklusion

Alt var løst, var alt skrevet. Du kan downloade hele scriptet her.

Buy Oil Paintings, Acrylic Paintings, order custom painted Murals, Portraits, Landscapes, Still Lifes, Flowers, Replicas and Art Prints on ArtMaestro.com.
Rejseportal - tours.am! Søg ture i Armenien, Ture, Søg efter ture online, Reserve Hoteller online, Travel News.