Het is maandag 9 november en het is weer tijd voor de maandelijkse JUG Eindhoven meeting. Na de verscherpte maatregelen nog steeds niet in onze vertrouwde pub maar weer een Google Meet meeting online. De organisator van dienst is Arjan vanavond.

Bijzonder vandaag is het feit dat we twee presentaties hebben. Peter Martin geeft een demo van een RSForm waarmee het aantal inschrijvingen kan worden gelimiteerd in relatie tot het aantal beschikbare plaatsen en Ernst zal een presentatie geven over een zelf gebouwde component waarbij een aantal velden gevuld worden door een pulldown in een form. Genoeg te doen dus! Half acht, we gaan van start!

Max beschikbare plaatsen verwerken in RSForm Pro

Peter Martin laat in deze demo zien hoe hij voor Open Coffee Nijmegen het aantal inschrijvingen middels RSForm Pro kon limiteren op 18 toegestane plaatsen.

Hij heeft er voor gekozen om in een 'textbox' veld code toe te voegen waarmee op basis van de gedane inschrijvingen het aantal overgebleven plaatsen te zien is. De code spreekt een database tabel van RSForms aan waarbij geteld wordt hoeveel inschrijvingen er al zijn geweest. Vervolgens wordt het getal afgetrokken van het maximum aantal beschikbare plaatsen. Het berekende getal wordt weergegeven in het formulier. 

De code die Peter hiervoor heeft gebruikt is als volgt:

//<code>

$max = 18;

$db = JFactory::getDbo();

$db->setQuery("SELECT COUNT(`SubmissionId`) FROM #__rsform_submissions WHERE FormId='".$this->formId."'");

$freeSeats = $max - $db->loadResult();

return  $freeSeats . ' plaat(sen) beschikbaar';

//</code>

Peter heeft de code in het 'textbox' veld als Default value opgenomen. Een voorbeeld van het formulier kun je hier bekijken

De functionaliteit in het formulier is zeer basic. Er zijn geen conditions ingebouwd. Een voorbeeld van een conditional kan zijn om het formulier niet meer te tonen of inschrijven niet meer mogelijk te maken als het maximale aantal inschrijvingen heeft plaatsgevonden.

Een andere oplossing voor hetzelfde probleem

Na enige discussie geeft Jack aan dat Ernst al eens een inschrijfformulier voor Filmclub Schijndel heeft gebouwd met dezelfde functionaliteit als het formulier voor Open Coffee maar wel met de gewenste conditions dat inschrijven niet meer mogelijk is als het maximum is bereikt. Tevens zit in het inschrijfformulier een functie gebouwd dat (ingelogde) leden eerst in kunnen schrijven en niet-leden een dag later.

Ernst heeft echter voor het inschrijfformulier van Schijndel Film een iets andere approach gekozen dan Peter. Hieronder zie je de voorbeelden op de website van Filmclub Schijndel

FS leden      FS niet leden

De code die wordt gebruikt is geplaatst in het betreffende formulier in RSForm Pro > Form properties > PHP scripts > Script called on Form display

De code ziet er als volgt uit:

// variabelen voor datum berekening en aantal bezoekers
$filmdatum = '20200902';
$periode = 5;
$zaalgrootte = 63;

//    Start datum berekening voor inschrijving
$vandaag = date( 'Ymd', time());
$tijd = date( 'H:i', time());
$verschil = $filmdatum - $vandaag;
$verschil2 = strtotime($filmdatum) - strtotime($vandaag);
$verschil3 = $verschil2 / (60*60*24); 
$startInschrijvingTxt = date( 'd-m-Y', strtotime("-" . $periode . " days", strtotime($filmdatum))) . ', 20:00 uur';

if( !(($verschil3 <= $periode and $tijd > '19:57') || ($verschil3 <= ($periode - 1) ) ) )
{
$formLayout = '<h3 class="nogNiet">Leden kunnen inschrijven vanaf ' . $startInschrijvingTxt . ' (niet-leden 1 dag later)</h3>'; 
}
else
{
  
$db = JFactory::getDbo();
$db->setQuery(true);
$db->setQuery("SELECT sum(`r`.`fieldvalue`) FROM `#__rsform_submission_values` as `r` INNER JOIN `#__rsform_submission_values` as `s` on `s`.`SubmissionId` = `r`.`SubmissionId` and `s`.`fieldname` = '_TRANSACTION_ID' WHERE `r`.`FieldName` = 'ReserveringLeden' and `r`.`FormId` ='".(int) $formId."' and `s`.`FieldValue` <> ''");
$ReserveringLeden=$db->loadResult();

$db->setQuery(true);
$db->setQuery("SELECT sum(`r`.`fieldvalue`) FROM `#__rsform_submission_values` as `r` INNER JOIN `#__rsform_submission_values` as `s` on `s`.`SubmissionId` = `r`.`SubmissionId` and `s`.`fieldname` = '_TRANSACTION_ID' WHERE `r`.`FieldName` = 'ReserveringNietLeden' and `r`.`FormId` ='".(int) $formId."' and `s`.`FieldValue` <> ''");
$ReserveringNietLeden=$db->loadResult();

$aantalTotaal = $zaalgrootte - ($ReserveringLeden + $ReserveringNietLeden);

if ($aantalTotaal <= 0)
{
$formLayout = '<p>Max aantal inschrijvingen bereikt, zaal is uitverkocht.</p>';
}
else
{

$formLayout.="Er zijn op dit moment nog " . $aantalTotaal . " zitplaatsen te reserveren. </p>
<br>MAATREGELEN COVID-19 VIRUS
<br>Er is er geen kassa.
<br>Bij het bestellen van een ticket wijzen we je op het volgende:
<br>- Bij ziekte en verkoudheid blijf je thuis
<br>- Je krijgt bij elke reservering een bevestiging email. 
<br> Omdat het lidmaatschap 2020 verhuisd is naar april 2021 dienen leden ook vanaf september 2020 t/m maart 2021 te betalen voor elke film.</br>";
}
}

En aan het formulier wordt de volgende tekst toegevoegd

$formLayout.="Er zijn op dit moment nog " . $aantalTotaal . " zitplaatsen te reserveren." 

Let even op de .= in de voorgaande code

Variabele dropdown voor eigen component

Ernst Sangen laat in deze demo zien hoe hij voor een eigen component gemaakt met Component Creator ervoor gezorgd heeft dat de inhoud van een selectieveld afhankelijk kan zijn van de opgegeven waarde van een ander selectieveld.

Met behulp van Component Creator (CC) kun je een basic component maken op basis van een tabel. In het formulier zijn de standaard type velden beschikbaar die ook beschikbaar zijn in Joomla. Iedere type veld heeft een aantal eigenschappen die in te stellen zijn maar niet alle eigenschappen kunnen in CC worden gebruikt.

Om de functionaliteit te creëren dat een aantal TextBox velden worden gevuld met data die afhankelijk is van een selectie in een Keuzelijst blijkt dat de standaard functionaliteit van CC te kort schiet.

Je moet hiervoor dus je eigen code toevoegen aan de component. Het type veld dat hiervoor het best te gebruiken is, is een Foreignkey field. Hiermee kun je een keuzelijst genereren.  

Om de andere velden te vullen heb je echter een stukje Javascript nodig, een zogenaamde OnChange functie. De JS functie roept een php-script aan dat, op basis van de selectie die je maakt, de waardes uit een andere tabel haalt. Het resultaat kan nu naar de betreffende velden worden gestuurd.

Uiteindelijk worden in het formulier in de demo van Ernst de NAW velden gevuld op basis van de gekozen Taxateur of Eigenaar van het te taxeren voertuig.

Een mooie oplossing!

Dr Joomla

vraag: 

Ik heb problemen om de in Excel gegenereerde HTML code goed zichtbaar te maken op mijn website

antwoord:

Het probleem bij het knippen en plakken van HTML code in bepaalde velden in Joomla is dat de code "opgeschoond" wordt waardoor de HTML code anders (of niet) weergegeven wordt.

Om toch de code weer te geven kun je naar de volgende instellingen kijken:

  • Algemene instellingen (TAB Website) > Standaard tekstverwerker > Geen tekstverwerker. Nu opnieuw HTML code importeren in website en kijken of de code nu wel goed wordt weergegeven
  • Algemene instellingen (TAB Tekstfilters) > Check of bij de Super Users "Geen filter staat"
  • Als je een editor gebruikt als JCE Pro moet je in de gebruikte profielen controleren of de filtering van de invoer uit staat.

Een andere oplossing is om een eenvoudige component te creëren op basis van 1 tabel waar je de excel data in importeert. Daarna is het een kwestie van data bijhouden en alle data is zichtbaar op de site (en te filteren indien nodig)!


vraag:

Ik heb een component gemaakt met Component Creator. Een aantal velden zijn verplicht maar moeten bij nader inzien niet meer verplicht zijn. Als ik een update maak op de site van Component Creator en de nieuwe component installeer, blijft dan de data behouden of ben je alle data kwijt.

antwoord:

Het is onbekend of de data behouden wordt na de installatie van een component update.

Je hoeft echter geen update te draaien om het gewenste effect te bereiken. Je kunt in de XML file in de map com_naamcomponent/models/forms/naamform.xml de gebruikte velden terug vinden met hun respectievelijke eigenschappen.

Door required ="true" toe te voegen (als het veld verplicht moet zijn) of required="true" weg te halen (als het veld NIET verplicht moet zijn) is het gewenste effect heel makkelijk te bereiken en blijft de data in de database onveranderd.

Andere handige links die nog werden genoemd in de Dr. Joomla

Gebruik en instellingen van PHPStorm: link

Volgende keer

De volgende JUG Eindhoven is op dinsdag 8 december. De onderwerpen voor deze meeting zijn nog niet bekend. Aanmelden voor deze bijeenkomst kan via https://www.joomlacommunity.nl/agenda/joomla-gebruikersgroepen/eindhoven/event/565-jug040-bijeenkomst-eindhoven

Vragen voor Dr. Joomla kun je kwijt als reactie onder de aankondiging.

2 reacties

EasyDiscuss Avatar
Fred
Max beschikbare plaatsen verwerken in RSForm ProOverige attributen
Mooie toevoeging. Ik heb readonly="readonly" toegevoegd aan 'Overige attributen' van de tekstbox.
Zo wordt de tekst statisch weergegeven.

0
EasyDiscuss Avatar
Jac
Goed dat er verslag gemaakt wordt van de bijeenkomst. Kunnen we alles nog eens goed nalezen. En voor mij is dat wel echt nodig. Dus dank!

0

Reageer

1000 Resterende tekens