“#0 timeout-or-duplicate” error in VirtueMart

Do you see an error code like this “#0 timeout-or-duplicate” when sending messages from “Ask for Price” or “Ask a question about the product” VirtueMart forms? Then you’re on the right place.

#0 timeout-or-duplicate

#0-timeout-or-duplicate

This error message is actually from Recaptcha plugin, so it will appear only if we have Recaptcha enabled in the Virtuemart configuration, which is advisable because spammers will find you sooner or later.

It is important to mention that this happened only in Virtuemart. Joomla contact form and sending a test email from the Joomla Global configuration worked just fine. Actually, I also saw error message “Could not instantiate mail function”. I don’t recall anymore if that error showed in Joomla contact form or just in VirtueMart, but I fixed it simply by changing “Mailer” setting from “PHP Mail” to SMTP. After that I dind’t see this error message, but it still didn’t work from Virtuemart showing damn “#0 timeout-or-duplicate”.

After some investigation and experimenting I realized that the problem was that I had multiple captcha plugins enabled. So I had configuration like this:

My Joomla captcha plugins configuration

After disabling the second captcha plugin and leaving only the “Captcha – ReCaptcha” enabled sending of email started to work 🙂 It seems that VirtueMart is stupid enough to invoke each enabled captcha plugin, instead of only the one that is selected in the Joomla Global Configuration and that’s why we see this “duplicate” error.

#0 Empty solution not allowed

Then I wanted to see what would happen if I switch to “Invisible reCaptcha”. After that, sending email from Joomla contact form worked fine and it was cool that I don’t need to click “I am not a robot”. Unfortunately, it seems that Virtuemart doesn’t know how to use Invisible reCaptcha because it showed a new error “#0 Empty solution not allowed”. Umph!

#0 Empty solution not allowed

#0 invalid-keys

OK, then I tried some other combinations, e.g. enabling both “Captcha – ReCaptcha” and “Invisible reCaptcha” with a small hope that VirtueMart will use “Captcha – ReCaptcha” and that the Joomla contact form will use “Invisible reCaptcha” (as it was selected as default in the Global configuration). Needless to say that it didn’t work. This time it showed “#0 invalid-keys” error:

#0 invalid-keys

OK, after wasting 2.5 hours on that, it was time to stop experimenting and stick to the only solution that worked, i.e. enabling only “Captcha – ReCaptcha” and poor users will always need to confirm that they are not robots. I guess we all feel like robots sometimes when working on super-boring tasks, so at least this thing will remind us to stop being robots anymore 🙂

You may wonder why this 3rd captcha plugin “The new Recaptcha” in my configuration that caused me all this trouble. Well, this was downloaded from the web because of one experiment, but this plugin is not really needed because Joomla’s built in plugins seem to work just fine.

qFuzzyCompare fails with small (near zero) values

Qt’s qFuzzyCompare function is useful for approximate comparison of two float or double values. As we know that arithmetic operations with double values often result with numerical errors, comparing two values directly with operator == would most likely make your algorithm fail. So qFuzzyCompare or similar function is a must-have for most algorithms that need to compare doubles.

So for example, if we write:

bool equal = qFuzzyCompare(1, 1.00000000000000000001);

the function would indeed return true. We would expect the same for this example:

bool equal = qFuzzyCompare(0, 0.00000000000000000001);

But wait, this results in equal = false. How can that be possible? Well, it is caused by implementation of qFuzzyCompare like this:

return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)))

Now if any of p1 or p2 is zero, obviously the right side of the expression will be zero too. In this case, only if p1 and p2 are exactly equal the function will detect that and return true, but otherwise, if values are only approximately equal, it will return false. The Qt docs (https://doc.qt.io/qt-5/qtglobal.html#qFuzzyCompare) indeed confirms that and advises: “If one of the values is likely to be 0.0, one solution is to add 1.0 to both values.” Really? But what if we do that and one of the values is -1.0? Again we fail.

To fix that, we could naively implement our own version of fuzzyCompare like this:

return std::abs(p1 - p2) < 1e-12;

But we could be wrong with this implementation. To show this, let’s construct this example:

double p1 = 1e5 * (1 + 1e-13), p2 = 1e5;
bool equal1 = qFuzzyCompare(p1, p2);
bool equal2 = std::abs(p1 - p2) < 1e-12;

and equal1 = true (correct), while equal2 = false (not correct). So obviously a more sophisticated check is needed. But there is a solution, see e.g. this: http://realtimecollisiondetection.net/blog/?p=89

If we decide to use simpler solution from this blog so that absolute tolerance is equal to relative tolerance, and we choose 1e-12 (the same as in Qt), we can implement like this:

return std::abs(p1 - p2) <= 1e-12 * std::max({ 1.0, std::abs(p1), std::abs(p2) });

This would finally succeed for all the examples on this page 🙂

Ustaše napale Beograd

Splitski huligani

USTAŠE NAPALE BEOGRAD – Ovakvi i slični naslovi osvanuli su u komšijskoj štampi, a eto i naš tisak ne prestaje se baviti ovom vrućom temom. Mnogi se još uvijek pitaju što su ova šestorica uzoritih splitskih mladića uistinu radili na “većitom derbiju” Crvena zvezda – Partizan. No meni je od početka bilo jasno: ovi su se hrabri hrvatski vitezovi tamo uputili da padnu za domovinu, da udare ravno u srce srpsko-četničkog elementa.

Nadamo se samo da hrvatski rodoljubi neće zaboraviti na ovaj herojski čin bez premca, te očekujemo, jednom kada se vrate (srećom, to neće biti tako brzo), da ih Kolinda odlikuje Veleredom kralja Tomislava s lentom i Velikom Danicom, Krstičević plaketom heroja, Hasanbegović da imenuje trg po njima, Opara podigne spomenik, Crkva da ih proglasi mučenicima i naposljetku, Reiner vitezovima. Jesam li nešto zaboravio? 🙂

Nije lako biti HDZ-ovac

Darko Milinovic HDZ

Da je biti HDZ-ovac sve samo ne lako, dokazuje nam ova neslužbena Milinovićeva izjava 🙂
“Ljudi moji, ne možeš više ni u nacionalnom parku svoje zaposlit a kamoli na pravoj poziciji. Sedam im kandidata pošaljem, sve stručnjak do stručnjaka, ponajbolji hrvatski domoljubi, pošteni, svi prošli edukaciju, čak im iz stranačkog fonda uplatim ulaznice, reko ‘ajte ljudi tamo, popijte nešto, prošećite malo i pogledajte o čemu se radi da ne kažu da niste educirani’. A vjerujte mi, neki od njih su i prekvalificirani, bili već na školskoj ekskurziji na Plitvice. I svih sedam mi odbiju!
Ja u zadnje vrijeme ne spavam mirno. Ponavljam im neprestano ‘ma strpite se ljudi, polako, ne mogu sada ništa, neka HDZ dođe na vlast i bit će posla za sve’. I eto, napokon naši na vlasti, ja mislio odahnut ću, riješit ćemo, bit će posla i pozicija za sve. Kad eto, zabiše mi nož u leđa. I tko: ne SDP, ne ni Most, nego moji, moji iz vlastite stranke, iz mojeg HDZ-a! Ne poštuju me više ni moji Ličani, kažu ‘kakav si ti to šef stranačke podružnice kad ne možeš ni ovdi u Plitvicama posao sredit?’ Šta da kažem, ljudi moji, ja ovo više ne mogu, bolje dat ostavku nego se ovako sramotit pred svojima.”

A tko će ostati?

220 000 – to je broj Hrvata koji bi mogao ostati nakon apokaliptičke emigracijske i demografske katastrofe koja se kao ralje nadvila nad napaćenom Hrvatskom, spremajući se progutati je. A zašto baš toliko? Kako saznajemo iz medija, emigracija je najveća u županijama gdje je na vlasti HDZ. Slijedeći tu logiku, i uzevši u obzir da je sada HDZ na vlasti u cijeloj državi, možemo predvidjeti da će na koncu emigrirati cijela država. A tko će onda ostati? Pa, zna se, HDZ! Eto, uvjeravaju nas dužnosnici te stranke, “Hrvatska je najbolja zemlja na svijetu”. Zaista, zemlja koja pruža neviđene potencijale, što za prisvajanje narodne imovine, što za uhljebljivanje, ne može biti nego najbolja. Naposljetku, 220 000 – toliko je, kako tvrdi HDZ, broj njihovih članova 🙂

Izgradnja drvarnice s prozirnim krovom

Evo  da ukratko opišem kako je tekao moj prvi samostalni graditeljski pokušaj – izgradnja drvarnice u nadi da će nekome pomoći. Kako smo imali velike probleme sa mokrim drvima (slabo griju, teško gore, zaštopavaju dimnjak, čađe staklo kamina) odlučih napraviti nešto po tom pitanju.

Budući da je već postojala mala šupa sa ravnim betonskim krovom (koji prokišnjava) odluka je pala da se drvarnica napravi na krovu šupe.tmp1

Naravno poželjno je da drvarnica bude čim jeftinija stoga će biti od drva. Metal je skuplji, a traži i zavarivanje što ne spada u moju domenu. Odlučio sam koristiti samo štafle 8 x 5 cm i letve 4 x 5 cm. To su relativno slabe debljine, koje sam kompenzirao tako da sam stavio više tanjih profila umjesto mali broj debljih profila čime sam po mojem mišljenju dobio sasvim zadovoljavajuću čvrstoću. Međutim, da idem ponovo raditi vjerojatno bi ipak odabrao manji broj većih profila zbog uštede vremena – brže je postaviti manji broj debljih profila, zar ne? 🙂

Kao krovne ploče odlučio sam koristiti prozirne ploče jer nisam htio da nam krov zaklanja svjetlo (drvarnica je uz kuću), i u nadi da će sunce koje probija kroz njih pospješiti sušenje drva (no svjestan nedostatka u vidu potrebe za češćim farbanjem drvene konstrukcije). Jesam li u pravu ili ne, pokazat će vrijeme 🙂 U trgovinama koje sam posjetio mogao sam izabrati Renolit Ondex Ecolux trapezne ili Gutta sinusne prozirne plastične ploče. Obje su duge 2 m, a budući da su Ecolux šire (oko 110 cm) u odnosu na Gutta (90 cm), odlučio sam se za Ecolux. Cijena po kvadratu je otprilike ista, tj. nekih 75 kn/m2, a jedna ploča je oko 115 kn. Prednost Ecolux ploča je i to da se doimaju nešto jače, razmak letvi je 1 m, za razliku od Gutta oko 50 cm. Tako veliki razmak izgledao mi je sumnjivo, ali odlučio sam pokušati tako, pa ako se pokaže da se ploče savijaju onda naknadno umetnuti još međuletvi. Ovime i svjesno ulazim u rizik da ih deblji nanos snijega iskrivi, ali računam na to da je krov drvarnice lako dostupan s balkona pa ga mogu lako očistiti od snijega.

prozirna-krovna-ploca

Ono što je loše u vezi tih ploča, je da dućan u kojem sam ih kupio ne nudi nikakav pribor za njih niti ikakve upute za postavljanje pa sam bio prisiljen tražiti na internetu. Pribor koji je potreban su šrafi za ploče. Uzeo sam 6 cm duge 6 mm šrafe sa gumenim kapama, 100 komada nekih 130 kn. Također, budući da šraf ide na vrh vala, potreban je odstojnik (distancer) koji ide ispod ploče na mjesto gdje ide šraf i sprečava savijanje ploče. Po to sam morao ići u ZG u Bauhaus. I na kraju, proizvođač preporučuje plastični stupnjeviti borer za bušenje ploča. Kako takvoga nisam nigdje našao (najbliže tome bio je borer za lim u Bauhausu od nekih 200 kn koji je preskup), odlučio sam pokušati sa borerom za drvo. Borer mora biti za 4 mm širi od šrafa, dakle 10 mm. Borer za drvo je sasvim zadovoljavajuće obavio posao, a nije skup. Rupe nisu baš idealne, ali pošto ih pokrije šraf, ispalo je sasvim OK. Evo primjer jedne rupe:

prozirna-krovna-ploca-busenje

Možda bi netko pokušao i s borerom za metal, ali po mojem mišljenju to bi bilo loše. Zna se što takav borer, u slučaju veće debljine, radi u drvu (lomi ga), pa bi se isto moglo desiti i ovdje. A njega je i puno teže centrirati, za razliku od onog za drvo koje ima tanak šiljak u sredini.

Vertikalne stupe za beton odlučio sam postaviti tako da probušim betonsku deku šupe i s donje strane deke proguram šrafe za drvo i zašrafam ih u vertikalne stupove. Izabrao sam 8 mm šrafe duge 18 cm. Da bi se tako dugi šraf mogao ušrafati, potrebno je drvo prethodno izbušiti, za što treba malo dulji borer. Jedini dovoljno dugi kojeg sam našao je bio 4 mm za metal, pa sam koristio takvog, iako ne bi škodio malo deblji. Ukupno sam stavio 12 vertikalnih stupova. Da, to je malo veći broj, ali računao sam da će tako jednoliko raspoređeni stupovi dobro i ravnomjerno poduprijeti konstrukciju i time kompenzirati tanko drvo. Također, na veći broj stupova bit će lakše pričvrstiti ogradu za drva. Na te stupove stavio sam 3 horizontalne grede koje su također pričvršćene šrafima. Ovo je naravno potrebno precizno izmjeriti i napraviti, na što odlazi dosta vremena. Ovo je rezultat prve faze:

donji-dio-drvene-konstrukcije

Na to je išlo 5 kosih greda koje sam pričvrstio sa navojnim šipkama 6 mm (da, jednostavnije bi bilo čavlima, ali ja si nekad volim zakomplicirati život).

kose-letve-postavljene

I kao posljednji dio drvene konstrukcije, na to idu letve. Savjetuje se letve s gornje strane obljepiti aluminijskom samoljepljivom trakom, što je odlična zaštita od sunca jer se toplina reflektira od letve. Ljepljenje trake i krajnji rezultat izgledaju ovako nekako:

letva_ljepljenje_alu_trakealu_traka_zaljepljena

Letve zabijemo čavlima, a razmak je ispao nešto manje od 1 m, što je veliko, ali još uvijek u skladu sa uputama proizvođača. Određivanje razmaka letvi nije tako jednostavno, treba uzeti u obzir preklop ploča, koliko redova ploča ide i koji napust letva puštamo. Ja sam odabrao donji napust 15 cm, a gornji nešto manji. Iz tog razloga razmak između svih letvi nije jednak. Prije postavljanja na krov letve sam ofarbao, jer je to lakše obaviti dok su još dole. Ovo je fotka nakon što su 4 od 5 letvi postavljene:

letve_skoro_postavljene

Važno je naglasiti da je potrebno u svim tim koracima biti jako precizan, te da je puno toga potrebno unaprijed planirati, skicirati i proračunati. Recimo nije svejedno koliko imamo širinu krova i duljinu krova, ako je moguće treba ju tako isplanirati da ne moramo rezati ploče. Ja sam uspio postići da budu točno 2 reda ploča bez rezanja i bočno 4 ploče, dakle ukupno 8. Osim toga, ako šlampavo mjerimo, greške se kako idemo dalje akumuliraju sve više i možemo kasnije imati ogromnih problema sa slaganjem ploča. To je ujedno i nedostatak ovih ploča, jer recimo crijep puno više “oprašta” pogreške. Ono što je kritično je postići da imamo kuteve od točno 90 stupnjeva između bočnih i horizontalnih letva. To meni nije uspjelo od prve jer je krov šupe bio sve samo ne 90°. No uspio sam to postići pritiskanjem u stranu stražnjeg dijela konstrukcije i onda to fiksirati sa kosom letvom koja se vidi na prethodnoj slici. Bez te kose letve sve skupa se njiše da imate osjećaj da će se sve raspasti kod najmanjeg vjetra. Ali nakon zabijanja te letve sve postane čvrsto ko stijena! I naposljetku, tko se boji visine ovo nije za njega, na nekim dijelovima visina je cca. 4 m, ali zato je pogled lijep. Evo za ilustraciju 🙂

visokooopogled

Sljedeća operacija je bušenje ploča. Normalno se one buše na krovu i odmah šrafaju. To bi možda i išlo tako sa specijalnim borerom za te ploče, no s borerom za drvo koji sam ja imao bušenje uopće ne ide tako lagano, pa sam ih ja probušio na podu. Buši se na određene valove prema specifikaciji proizvođača ploča. Ovo je dosta spor, precizan i mučan posao, ali na kraju i to se nekako obavi. Bilo je potrebno i rezati dvije ploče jer se u jednom dijelu šupa i kuća dodiruju pa je u skladu s tim trebalo prilagoditi ploče. Ovo rezanje je sa ručnom pilom išlo jako sporo, srećom su bile samo dvije ploče za rezati.

I na kraju postavljanje ploča. Većina ploča (osim krajnjih) mogla se postaviti sa lojtre bez penjanja na krov, zahvaljujući činjenici da su ploče lijepo savitljive. U slučaju da se treba penjati na krov, treba postaviti daske i hodati po njima kako se ploče ne bi savijale. Evo kako je izgledalo na kraju:

sve_ploce_postavljene

Slijedi farbanje… odabrao sam bijelu Chromos Aqualux temeljnu boju, s njom se lijepo radi jer je na vodenoj bazi, dakle razređuje se samo s vodom i alati se peru s vodom, a da li će dugoročno biti dovoljno dobra zaštita drva (s obzirom da je to samo temeljna bez završnog laka koji normalno još ide na nju), vrijeme će pokazati. Evo i prvih drva već u drvarnici:

drvarnica_sa_drvima

Kao ogradu na dvije strane stavio sam armaturnu mrežu. Mreža je namazana prvo sa antikorozinom, a onda ofarbana sa Chromos Hardlux 3u1 smeđom (pokušao sam i sa bijelom, ali nije baš estetski bilo nešto, smeđa je puno bolja). Sa prednje strane kao ogradu stavio sam drvene palete radi nešto bolje estetike u odnosu na mrežu (palete se još ne vide na ovoj slici). I naravno, jedna strana ostaje bez ograde radi pristupa.

Ovdje još nema bočnih obruba, a naknadno sam ih napravio tako da sam kupio još jednu ploču i bočno ju razrezao na 4 dijela. Budući da se ploče lijepo savijaju, savio sam ih i na taj način napravio najjeftinije moguće bočne obrube. Eventualno bi još trebalo staviti žlijeb za kišu.

Drvarnica je izložena vjetru, što je povoljno za sušenje drva. Ali nažalost nije povoljno kad istodobno pada i kiša. Onda vjetar nosi kišu (ili snijeg) na drva, pogotovo na stranama gdje je samo armaturna mreža.

Na kraju, sve skupa je koštalo oko 3500 kn, uključujući tu i neke promašene investicije kao kad se kupi nečega previše ili nešto što se na kraju pokaže kao promašaj. Ali to je dio svakog projekta. Moja očekivana cijena bila je 2000 kn, ali očito sam bio preoptimističan 🙂

Ovdje naravno nisam opisao punooo sitnih, a dosta važnih i teških detalja (vrag je u detaljima!). Često nešto u teoriji izgleda jednostavno, a strašno se zakomplicira u praksi.

Zašto vjerojatno za 20 godina nećemo biti sretniji nego sada?

Evo jedan vrlo zanimljiv članak iz psihologije koji ukratko kaže: vjerojatno mislite da ćete za 20 godina biti puno sretniji nego što ste danas, ali zapravo ćete vrlo vjerojatno biti jednako sretni kao i sada (bez obzira na to što ćete možda imati bolju situaciju u životu, bolja primanja, itd.). Ne zvuči baš utješno, ali tako je 🙂

A zašto je to tako? Pretpostavlja se da smo tako evolucijski programirani, jer ako bismo bili potpuno sretni i zadovoljni cijelo vrijeme, onda nas (a i naše pretke) apsolutno ništa ne bi motiviralo da napredujemo. Zato se evolucija pobrinula da uvijek zamišljamo vedriju budućnost nego što će ona stvarno biti, i time se motiviramo na napredak za kojeg očekujemo da će nam donijeti sreću (iako zapravo neće). Dokaz za to su dobitnici lota: iako se njihov dobitak čini kao san svih snova, on zapravo neće promijeniti njihov dugoročni osjećaj sreće.

Više detalja u članku:

Why You Shouldn’t Want to Always Be Happy

HTV sučeljavanje Milanović – Plenković

I što smo vidjeli u sučeljavanju? U svakom slučaju bilo je zanimljivo nakon toliko godina vidjeti TV sučeljavanje lidera najvećih stranaka, ali po meni vidjeli smo sve već uobičajeno po principu raspali po protivniku činjenicama koje ti odgovaraju, a prešuti ono što ti ne odgovara i dodaj malo praznih obećanja.

Gospodarski program je na razini želja: željeli bismo rast od X%, a onda ćemo sniziti porez za Y%. To smo već previše puta čuli. S tim da se HDZ-ov program čini puno nerealniji, no pričekajmo sve detalje.

Teritorijalni ustroj: Ni ovdje ništa. Ako već ne žele dirati županije, zašto onda nismo ništa čuli o racionalizaciji prevelikog broja općina i gradova? Ili barem racionalizacija broja službenika. Jedinice koje su nekad imale 2 službenika danas ih imaju 15 i oni velikim dijelom obavljaju poslove koje bi bez problema obavio kompjuter.

Slučaj Mustač/Perković: Problem očito nije od jučer nego datira još iz devedesetih. Sve stranke koje su bile na vlasti, a nisu provele nikakve istrage i suđenja, snose dio odgovornosti, a više HDZ koji je dulje bio na vlasti.

Porez na nekretnine: Razlog neuvođenja bi bio taj da Hrvati štede u nekretninama? Volio bih vidjeti ozbiljniju analizu toga. Znam ljude za koje po primanjima ne bismo mogli reći da su bogataši, ali za vrijeme Juge napravili su vikendicu na moru i vikendicu u Zagorju, i istina, takvi ne bi mogli platiti visoki porez (porez na vikendice već se plaća, ali nije posebno visok). Ali što je sa onima koji imaju npr. 5 stanova u ZG. Zašto se takve ne bi oporezovalo? Npr. uvođenjem kriterija da porez progresivno raste s brojem nekretnina iznad 3.

Revizija nezakonite pretvorbe: O tome ni riječi. Postoje procjene da je iz Hrvatske nezakonito izneseno 60 milijardi eura. Kada bi se samo dio tog novca vratio značajno bi se smanjili dugovi i ne bi se morali toliko zaduživati. Ja Jednostavno ne mogu vjerovati da jedino Živi zid još priča o toj temi!

Sve skupa još jednom pokazuje da su velike stranke inertni sustavi isprepleteni raznoraznim interesima i ništa im ne odgovara više od više-manje zadržavanja postojećeg stanja. Zato mislim da nam opet treba treća opcija koja se zalaže za promjene, koja možda ne može sama puno napraviti, ali barem može prisiliti veliku stranku na promjene. Ako ništa drugo hvala Mostu da smo se riješili ispraznog huškača, generatora ekstremizma, netolerancije i nepotrebnih podjela koji pogoduje MOL-u, Karamarka i dobili puno normalnijeg Plenkovića.

Customizing Joomla Contact Form

Suppose we want to customize Joomla contact form. We want to do two modifications:

  1. Set some default text into text fields, e.g. to E-mail subject text box
  2. Set content of these fields via the URL argument (querry string), e.g. www.yoursite.com/book-excursion?subject=Book%20excursion

The purpose of this for me is to be able to display a customized contact form, which is displayed upon click on a button. The form can be shown through different buttons, e.g. “Book Makarska Excursion”, “Book Biokovo Excursion”. The form sends e-mail to web site owner, so, to be able to tell from which button is e-mail sent (i.e. what is being booked), we show different versions of the contact form depending on which button is clicked.

To do this in Joomla 3.4 we need to modify the file JOOMLA_ROOT\components\com_contact\views\contact\tmpl\default_form.php. But of course, to preserve our changes when Joomla is updated, we need to copy this file into our Joomla template. So even if we update Joomla later, the modified version stays untouched. After some research, I found that the correct location where to put the file is:

JOOMLA_ROOT\templates\YOUR_TEMPLATE\html\com_contact\contact\default_form.php

To meet requirement 2., we need to get url arguments in PHP. E.g. if we want to get value of the argument “subject”, we do that like this: $_GET[“subject”].

And to meet requirement 1. we need to pass this value to the form field. The e-mail subject text box in Joomla is created like this:

$this->form->getInput(‘contact_subject’);

In Joomla documentation (https://api.joomla.org/cms-3/classes/JForm.html), we can see that default value can be set via the 3rd argument to getInput(), so finally we do like this:

$this->form->getInput(‘contact_subject’, null, $_GET[“subject”]);

We can now access the form with predefined Subject field via the link. E.g. if the contact form is normally accessed via www.yoursite.com/book-excursion, to set Subject field to “Book excursion”, call it via the following link:

www.yoursite.com/book-excursion?subject=Book%20excursion

Now you might ask yourself how to access the contact form via such an URL. The answer is simple, just create an invisible menu, add a new item to it that opens this contact form, and set menu alias to book-excursion. Although the menu is not visible (as it is not assigned to a module), menu item will be accessible via the alias. To get rid of “index.php” in the URL you also need to enable Apache mod_rewrite module, but that’s another story.

We want to do a few additional customizations. We just want to show the contact form, without contact details. Here is a solution for that: http://www.joomla-css.nl/en/styling-joomla-3-content-components/contact-and-contactform. Citing this website: “If you only want to show a contact form, you hide all options of the Contact Options, except set the “Display Format” on Plain. Then you only see a contact form on the page” . “The headings “Contact” and “Contact Form” are unnecessary on the page. To hide these headings we add the following CSS to the template.css:”

div.contact h3 {
display: none;
}

That’s all!

CustomizedJoomlaContactForm

Just imagine other beautiful stuff that can be done in similar way! 🙂 E.g. you can add one more URL argument “form_type” which will affect form shape, e.g. you can add some additional form fields like “Number of persons”.

The described method worked on Joomla 3.4, but should be identical (or very similar) for other Joomla versions. It should even work in Joomla 2.5 – I checked it and it has default_form.php file on the same location.