# Ontwikkeling Bij de aanschaf van onze Makelaar plugin ontvang je een standaard thema, deze kan je als child-theme naast je hoofd thema installeren. Hierdoor kan je je hoofdthema up-to-date houden en verlies je geen instellingen van onze plugin. Binnen dit thema werk je aan de ontwikkeling van de betreffende pagina's, zoals het overzicht en de detailpagina van de objecten. Je schrijft zelf de HTML, CSS, PHP en eventueel extra Javascript om de pagina's vorm te geven.
Je kan deze pagina's niet bewerken vanuit WordPress, ook niet met page builders zoals Elementor.
In de onderstaande beschrijvingen wordt alleen de module voor woningen uitgelicht, de werking is hetzelfde voor alle andere modules. Daarnaast worden er veel velden gebruikt in de voorbeeldcode, het kan zijn dat er voor de koppeling met jouw CRM pakket een (net iets) ander veldnaam gebruikt moet worden. Bijvoorbeeld bij het gedeelte "[Afhankelijkheden van andere velden](https://doc.tussendoor.nl/books/makelaar-plugins/page/ontwikkelingbkmrk-afhankelijkheden-van "Ontwikkeling")" wordt er gebruik gemaakt van de velden `koopprijs` en `koopconditie`, dit is voor de koppeling met het CRM van Realworks.Alle velden voor de koppeling met jouw CRM pakket vind je onder [Velden](https://doc.tussendoor.nl/books/makelaar-plugins/chapter/velden "Velden").
--- ## Templates Het standaard thema is opgedeeld in verschillende templates.Template | Beschrijving |
---|---|
wonen/**archive.php** | Wordt door WordPress geladen op de archiefpagina van woningen. |
wonen/**search.php** | Bevat het zoekformulier op de archiefpagina. Aparte template i.v.m. live zoeken. |
wonen/**loop.php** | Bevat de resultaten op de archiefpagina. Aparte template i.v.m. live zoeken. |
wonen/**item.php** | Compacte weergave van een woning, gebruikt vanuit *loop.php* om resultaten te renderen. |
wonen/**map-info.php** | Inhoud van een Google Map info venster. Wordt ingeladen door de Google Maps ondersteuning binnen de plugin. |
wonen/**none.php** | Wordt ingeladen vanuit *archive.php* als er geen zoekresultaten zijn. |
wonen/**single.php** | Wordt door WordPress geladen wanneer een enkele woning wordt bekeken. |
WordPress laadt de archive, single en de functions in omdat we via de geavanceerde instellingen van de plugin het pad aangeven naar de templates. Als je het thema anders op wil bouwen moet je daarom de paden aanpassen.
Globals Binnen de loop worden zonder zoekopdracht alle woningen opgehaald en op het moment dat de bezoeker een zoekopdracht instelt worden hier de woningen getoond die voldoen aan die zoekopdracht. In deze loop is de huidige woning in de iteratie beschikbaar in de variabele `$woning`. Het is over het algemeen niet nodig om deze variabele expliciet als `global` te declareren wanneer een template gebruikt wordt, de plugin zal dit voor zijn rekening nemen. Met deze variabele kan je informatie van de woning tonen in de item.php.Let op: Wanneer er geen gebruik gemaakt wordt van een template is de globale variabele `$woning` leeg. We raden daarom het gebruik van templates aan.
Caching We raden aan om een WordPress caching plugin te gebruiken om het laden van de site te versnellen. Voor het ophalen van de data voor alle woningen zijn veel database query's nodig, wat alles bij elkaar enkele tientallen milliseconden in beslag kan nemen. Om dit te versnellen, raden we aan om templates waarin gegevens van een woning worden opgevraagd te cachen. Bijvoorbeeld binnen de loop tijdens het weergeven van de woningen: `= Wonen::template('item')->cache(); ?>`Templates worden gecached op basis van de naam en ID van de huidige woning.
--- ## Weergave van velden Het kan voorkomen dat er specifieke eisen zijn om velden op een bepaalde manier weer te geven, soms afhankelijk van andere velden en soms omdat je een prijs als een prijs wil formatten. Om te voorkomen dat deze logica overal door het thema opnieuw geschreven wordt biedt de plugin een aantal manieren om dit op een prettige manier te laten verlopen, waarbij alles op een centrale plek aangepast kan worden. Een veld uit onze plugin is een object en kan naast het terug geven van zijn waarde nog veel meer informatie terug geven. Zo kunnen de volgende methods worden gebruikt: ```PHP $woning->plaats; // Het volledige object voor het veld 'plaats' $woning->plaats->render(); // De plaats van de woning na transformaties $woning->plaats->value(); // De waarde van het veld plaats $woning->plaats->label(); // Label van het veld plaats $woning->plaats->is('Leeuwarden'); // Is de plaats Leeuwarden? $woning->plaats->is('Leeuwarden', 'Groningen'); // Is de plaats Leeuwarden of Groningen? $woning->plaats->isnt('Leeuwarden'); // Is de plaats niet Leeuwarden? $woning->plaats->isEmpty(); // Heeft de plaats geen waarde? $woning->plaats->hasValue(); // Heeft de plaats een waarde? ```**TIP:** Doordat onze plugin gebruik maakt van Magic Methods ([\_\_toString()](https://www.php.net/manual/en/language.oop5.magic.php#object.tostring)) kunnen we voor het tonen van de plaats ook simpel het volgende schrijven `= $woning->plaats; ?>`. Voor een simpele echo is `->render()` niet nodig.
### Veld types Elk veld heeft een bepaald type zodat het weergeven ervan automatisch gebeurt. Ieder van de types heeft verder specifieke methodes als hulp. Voor de onderstaande veldtypes worden letterlijke voorbeelden in de objecten gezet, er zijn echter geen velden die letterlijk ‘list’, ‘boolean’, ‘date’, ‘dateTime’, ‘integer’ of ‘double’ heten. Deze velden referen naar velden met dat type waarde. De velden die geschikt zijn voor jouw CRM pakket vind je allemaal terug onder het hoofdstuk 'velden'. Arrays ```PHP $woning->list->render($separator = ', '); $woning->list->count(); $woning->list->all(); $woning->list->first(); $woning->list->last(); $woning->list->implode($glue); ``` In plaats van komma gescheiden waardes kan ook gebruik worden gemaakt van een lijst. Verander hiervoor de formatter in `list`, waarbij als standaard een `Standaard wordt het veld *plaats* al slim omgezet in de juiste vorm. Bovenstaande geldt als voorbeeld en kan beter worden bereikt met CSS.
Afhankelijkheden van andere velden In sommige gevallen is voor het bepalen van de weergave meer informatie over de woning nodig. Het volgende voorbeeld toont hoe de koopprijs wordt weergegeven in combinatie met de koopconditie, maar alleen als de prijs mag worden weergegeven. ```PHP Wonen::formatter('koopprijs', function ($value, $field) { if ($field->post()->prijsTonen->isTrue()) { return $field->formatter('money').' '.$field->post()->koopconditie; } else { return 'Prijs op aanvraag'; } }); ``` Waar het eerste argument dus de waarde van het veld is, is het tweede argument het veld zelf. De woning is van daaruit op te vragen a.d.h.v. `$field->post()`. In bovenstaande voorbeeld wordt ook duidelijk dat we terug kunnen vallen op de valuta weergave door gebruik te maken van de formatter 'money' : `$field->formatter('money')`, zoals het *koopprijs* veld origineel zou worden weergegeven.De volgende formatters zijn beschikbaar: *string, bool, date, datetime, double, float, integer, array, list, money*.
Formatter class Als niet alleen de waarde van het veld moet worden getransitioneerd maar bijvoorbeeld ook het label moet worden afgeleid van een ander veld, kan een class worden gebruikt om de weergave te beinvloeden: ```PHP class KoopprijsFormatter extends CustomPost\Formatter\DelegateFormatter { public function label () { return ucfirst($this->post()->koopprijsVoorvoegsel->render()) ?: parent::label(); } public function render () { if ($this->post()->prijsTonen->isTrue()) { return $this->formatter('money').' '.$this->post()->koopconditie; } else { return 'Prijs op aanvraag'; } } } Wonen::formatter('koopprijs', 'KoopprijsFormatter'); ``` De waarde van het veld is beschikbaar via `$this->value` en de woning zelf via `$this->post()`. Label aanpassen In het vorige voorbeeld wordt een class gebruikt om het label af te leiden van een ander veld. In veel gevallen zal het label echter niet afhankelijk zijn van een waarde en kan een simpelere constructie worden gebruikt: `Wonen::label('koopconditie', 'Conditie');` Values aanpassen Als een veld een beperkt aantal values heeft waarvan de weergave moet worden aangepast, gebruik dan de volgende constructie: ```PHP Wonen::values('koopconditie', array( 'kosten koper' => 'k.k.', 'vrij op naam' => 'v.o.n.', )); ``` Hierdoor zal het veld *koopconditie* met waarde *kosten koper* worden weergegeven als *k.k.*, enz. Waardes waarvoor geen transformatie is opgegeven zullen zonder wijziging worden weergegeven.Let er op dat je de waardes aanpast die zijn weggeschreven in de database. Voor de koppeling met het Realworks CRM gaat het bijvoorbeeld om de values `KOSTEN_KOPER` en `VRIJ_OP_NAAM`.
--- #### Listings Vaak moet een lijstje van bepaalde eigenschappen worden gegeven. Daarbij moet worden gecontroleerd of iedere eigenschap wel een waarde heeft om zo geen lege rijen te tonen. Dit is waar listings gebuikt kunnen worden: `= $woning->listing('prijs', 'woning.perceelOppervlakte', 'woning.aantalKamers'); ?>` Bovenstaande snippet geeft een lijst met de opgegeven velden in een lijst, met hun bijbehorende labels en alleen als de velden een waarde hebben. Optioneel kan er een titel worden weergegeven welke voor de lijst komt te staan: ```PHP = $woning->listing(...) ->title('Geen eigenschappen bekend
'); ?> ```Als op deze manier een melding wordt ingevoegd wordt ook de titel getoond.
Templates Standaard wordt een definition list `Template | Standaard waarde |
---|---|
title | `'#{title}'` |
before | ``'
|
item | `' |
between | `''` |
after | `''` |
empty | `'#{message}'` |
De array notatie voor `'suffix'` geeft de twee waardes op voor enkelvoud en meervoud.
Render argumenten opgeven Geef aangepaste argumenten op om een veld te renderen door in de lijst met data de key `'render'` op te geven als array van de argumenten. ```PHP = $woning->listing(array( 'datumInvoer' => array('render' => '%B %Y'), )); ?> ``` Formatter type aanpassen Het type formatter kan worden aangepast door in de lijst met data de key `'formatter'` op te geven met de naam van de gewenste formatter. ```PHP = $woning->listing(array( 'woning.voorzieningen' => array('formatter' => 'list'), )); ?> ``` Item template aanpassen We hebben al gezien hoe `$listing->field($name, $template)` kan worden gebruikt om de template specifiek voor een item aan te passen. Voor gemak kan het ook via de data key `'template'` worden bereikt. In het volgende voorbeeld gebruiken we al het bovenstaande om een lijst weer te geven waarbij alle waardes van het veld *woning.voorzieningen* geintegreerd zijn in de lijst zelf: ```PHP = $woning->listing(array( 'woning.perceelOppervlakte', 'woning.aantalKamers', 'woning.voorzieningen' => array('template' => '#{value}', 'formatter' => 'list', 'render' => '#{items}') )) ->before('Methode | Beschrijving |
---|---|
`where('veld', '=', $value)` | Geef op dat `veld` een bepaalde waarde heeft. Operator `=` is standaard en kan worden weggelaten. |
`whereBetween('veld', $min, $max)` | Geef op dat `veld` tussen `$min` en `$max` moet zijn. |
`whereNull('veld')` | Geef op dat `veld` geen waarde mag hebben. |
`whereNonNull('veld')` | Geef op dat `veld` een waarde moet hebben. |
`whereSql('veld', 'sql')` | Gebruik een ruwe SQL clause als zoekopdracht. |
`matching($woning->field, $operator = '=')` | Zoek op woningen met dezelfde waarde als `$woning->field`, optioneel kan een operator worden opgegeven. |
`without($woning, ...)` | Neemt `$woning` niet mee in de resultaten. |
Methode | Beschrijving |
---|---|
`amount($n)` | Beperkt het resultaat tot `$n` woningen. |
`all()` | Geef op dat alle woningen opgehaald moeten worden. |
`order($field, $direction = 'asc')` | Geef sorteervolgorde op. |
`ascending($field)` | Geef oplopende sorteervolgorde op. |
`descending($field)` | Geef aflopende sorteervolgorde op. |
`arg($key, $value)` | Geef direct een WordPress query argument op. |
`args($args)` | Geef direct WordPress query argumenten op. |
Wanneer de manuele includes niet verwijderd worden zal alles blijven werken, echter blijft de snelheidswinst dan ook grotendeels uit.
Modules uitschakelen De plugins zullen normaal alle beschikbare modules laden, terwijl ze wellicht niet allemaal gebruikt zullen worden. Pas hiertoe voor bijvoorbeeld het Realworks CRM *realworks/functions.php* aan en schakel de modules hier uit door middel van: ```PHP Realworks::disable('wonen'); Realworks::disable('bog'); Realworks::disable('nieuwbouw'); ``` Vervolgens zullen de modules niet meer worden ingeladen. Merk op dat de modules hierdoor ook niet langer beschikbaar zijn in de admin omgeving van de plugin. --- ## Zoekvelden Eerder heb je over[ het instellen van zoekvelden](https://doc.tussendoor.nl/books/makelaar-plugins/page/https://doc.tussendoor.nl/books/autobedrijf-voertuigen/page/admin#bkmrk-zoekvelden) gelezen in het admin gedeelte van onze plugin, in dit gedeelte van de documentatie leggen we uit hoe je de ingestelde zoekvelden kunt koppelen aan de code in de `search.php` en daarnaast leggen we uit hoe je de zoekvelden kunt gebruiken. Zoekvelden koppelen In het admin gedeelte van de plugin kan je zoekvelden aanmaken, de naam die je het zoekveld daar geeft zorgt voor de koppeling. Een aantal voorbeelden. **Status:** `dropdown('status'); ?>` **Plaats:** `dropdown('plaats'); ?>` **Land:** `dropdown('land'); ?>` **Type:** `dropdown('type'); ?>` Let er daarom goed op dat je de naam een duidelijke, maar simpele naam geeft.Een naam met spaties, hoofdletters of bijzondere karakters kan voor onverwachte problemen zorgen.
### Type zoekvelden Zoekvelden aangemaakt vanuit de admin kunnen op verschillende manieren worden weergegeven. Dropdown `dropdown('naam', $options = []); ?>` De volgende mogelijkheden heb je in de options array:Optie | Type | Standaard | Beschrijving |
---|---|---|---|
`'emptyLabel'` | string | `''` | Label van optie om zoekveld leeg te laten. |
`'showCounts'` | bool | `false` | Weergave van aantal resultaten per optie. |
`'hideWhenNoResults'` | bool | `false` | Verberg een optie als er 0 resultaten zijn. |
`'hideWhenNotExists'` | bool | `false` | Verberg een optie als de waarde nooit resultaten zal geven. |
`'select'` | array | `[]` | Extra HTML attributen voor de ` |
`'option'` | array | `[]` | Extra HTML attributen voor ` |
`'emptyOption'` | array | `[]` | Extra HTML attributen voor ` |
Optie | Type | Standaard | Beschrijving |
---|---|---|---|
`'emptyLabelMin'` | string | `''` | Label van optie om zoekveld leeg te laten voor minimum dropdown. |
`'emptyLabelMax'` | string | `''` | Label van optie om zoekveld leeg te laten voor maximum dropdown. |
Optie | Type | Standaard | Beschrijving |
---|---|---|---|
`'showCounts'` | bool | `false` | Weergave van aantal resultaten per optie. |
`'hideWhenNoResults'` | bool | `false` | Verberg een optie als er 0 resultaten zijn. |
`'hideWhenNotExists'` | bool | `false` | Verberg een optie als de waarde nooit resultaten zal geven. |
`'label'` | array | `[]` | Extra HTML attributen voor ` |
`'input'` | array | `[]` | Extra HTML attributen voor `` elementen. |
`'count'` | array | `[]` | Extra HTML attributen voor de `` om aantal resultaten in te tonen. |
Optie | Type | Standaard | Beschrijving |
---|---|---|---|
`'input'` | array | `[]` | Extra HTML attributen voor de ``. |
Extra HTML attributen kunnen worden opgegeven via de opties, zoals in de tabellen staat beschreven. Voor nodes die specifiek zijn voor een bepaalde optie worden de placeholders `{{label}}`, `{{value}}` en `{{count}}` ingevuld met de label, waarde en aantal resultaten voor de optie. Dit kan bijvoorbeeld worden gebruikt om extra data-attributen op te geven welke door JavaScript plugins worden gebruikt om de weergave van de zoekvelden aan te passen.
--- Vrije input Zoekvelden hebben een vast aantal opties en accepteren geen aangepaste waardes. Om bijvoorbeeld te kunnen zoeken op adres moet handmatig de query worden aangepast. Als HTML fragment kan het volgende worden gebruikt: `` Om vervolgens het adres op de query toe te passen moet een event listener worden toegevoegd om de query te wijzigen: ```PHP Wonen::listen('search.before', function($form, $query) { if ($address = $form->value('adres')) { $query->compare('adres', 'like', '%'.str_replace(' ', '%', $address).'%'); } }); ``` De query kan in alle mogelijke constructies worden beinvloed:Operator | Code |
---|---|
IS NULL | `$query->isNull('veld')` |
IS NOT NULL | `$query->isNotNull('veld')` |
BETWEEN | `$query->between('veld', $min, $max)` |
*SQL* | `$query->sql('veld', '> NOW()')` |
=, <>, <, >, … | `$query->compare('veld', $operator, $value)` |
Voor meer informatie wordt aangeraden om contact met ons op te nemen. De standaard types bieden ruime mogelijkheden om via CSS aan te passen, alleen in uitzonderlijke gevallen zal een aangepast type noodzakelijk zijn.
--- ### Zoekopties vanuit Javascript In enkele gevallen kan het handig zijn om alle opties van een zoekveld in Javascript beschikbaar te hebben, bijvoorbeeld om afhankelijke velden handmatig bij te kunnen werken als er geen gebruik wordt gemaakt van live bijwerken. Een geneste structuur, vooral geschikt voor een zoekveld met afhankelijkheden, kan in JSON formaat worden verkregen via: ```PHP Wonen::form()->options('plaats')->json(); ``` Dit geeft een JSON object waarbij alle opties onderverdeeld zijn onder de afhankelijke waarde waar de optie bij hoort. Als voorbeeld een zoekveld plaats waarvan de waardes afhankelijk zijn van het geselecteerde land: ```JSON { "nederland": [ {"value": "leeuwarden", "label": "Leeuwarden"}, {"value": "groningen", "label": "Groningen"} ], "duitsland": [ {"value": "berlijn", "label": "Berlijn"} ] } ``` Het is echter ook mogelijk om alle opties in een vlakke lijst te krijgen: ```PHP Wonen::form()->options('plaats')->flat()->json(); ``` ```JSON [ {"value": "leeuwarden", "label": "Leeuwarden", "parents": {"land": "nederland"}}, {"value": "groningen", "label": "Groningen", "parents": {"land": "nederland"}}, {"value": "berlijn", "label": "Berlijn", "parents": {"land": "duitsland"}} ] ```In plaats van de opties in JSON representatie kan ook een PHP array worden opgevraagd via `get()` in plaats van `json()`.
Voorbeeld Als voorbeeld een manier om een dropdown voor het zoekveld plaats bij te werken met de opties behorende bij een bepaald land, nadat een ander land is geselecteerd. We geven hierbij alle opties in bovenstaande geneste structuur op via een HTML data-attribuut, zodat dit vervolgens vanuit Javascript beschikbaar is. ```PHP dropdown('plaats', array( 'emptyLabel' => 'Plaats', 'select' => array( 'data-options' => Wonen::form()->options('plaats')->json(), ), )); ?> ``` Het onderstaande is de minimaal benodigde Javascript om de dropdown bij te werken: ```JavaScript $('#land').change(function() { var land = $(this), plaats = $('#plaats'); plaats.empty().append($('').attr('value', '').text('Plaats')); $.each(plaats.data('options')[land.val()] || [], function(option) { plaats.append($('').attr('value', option.value).text(option.label)); }); }); ``` --- ## Resultaten sorteren Binnen het Admin gedeelte van de documentatie heb je kunnen lezen hoe je sorteer opties kunt toevoegen, dit doe namelijk via de [geavanceerde instellingen](https://doc.tussendoor.nl/books/makelaar-plugins/page/admin#bkmrk-sorteren) van de plugin. Om de bezoeker van de website de mogelijkheid te geven om te switchen tussen de door jou ingestelde opties moeten we een `orderby` veld vullen met opties. Een lijst van de ingestelde sorteeropties is beschikbaar via `Wonen::form()->orderings()` (voor de module Wonen) en kan bijvoorbeeld worden gebuikt om een dropdown weer te geven: ```PHP ``` Als je in plaats van een dropdown buttons wil gebruiken kan bijvoorbeeld een verborgen input worden ingevoegd waarvan de waarde met JavaScript wordt aangepast: ```PHP orderings() as $ordering): ?> = $ordering['label'] ?> ``` ```PHP $(document).on('click', 'a.orderby', function() { var orderby = $(this).data('orderby'), current = $('#orderby').val(); if (current !== orderby) { $('#orderby').val(orderby).trigger('change'); } } ```In de vormgeving ben je vrij, zolang je maar de `name` `orderby` mee stuurt met de zoekopdracht. De plugin sorteert vervolgens de resultaten.
--- ## Hulpmiddelen De plugin bevat ingebouwde hulpmiddelen die je kunnen helpen bij het ontwikkelen van je thema, hier lees je meer over deze hulpmiddelen. ### Woningen overslaan Het kan voorkomen dat je bepaalde woningen niet wilt importeren, bijvoorbeeld als ze vertrouwelijk zijn of wanneer de publicatiedatum in de toekomst ligt. Dit kan worden bereikt door een filter toe te voegen welke bepaalt of de woning moet worden overgeslagen. In het onderstaande voorbeeld worden woningen die vertrouwelijk zijn en woningen met een publicatiedatum in de toekomst overgeslagen. ```PHP Wonen::filter('updater.skip', function($skip, $woning) { // Skip deze woning wanneer vertouwelijk op 'ja' is ingevuld if ($woning->vertrouwelijk->value()) { return true; } // Skip deze woning als de publicatiedatum in de toekomst ligt if ($woning->publicatiedatum->hasValue()) { if ($woning->publicatiedatum->date()->startOfDay() > \Carbon\Carbon::now()) { return true; } } return $skip; }); ``` De bovenstaande code kan je toevoegen binnen het onderstaande bestand, dit is een voorbeeld voor de gebruikers van het CRM van Realworks: `/wp-content/themes/*active-theme*/realworks/functions.php` Het mechanisme werkt via de WordPress `add_filter` API, het eerste argument `$skip` is standaard `false`. Want zonder dit filter willen we immers alle woningen uit de feed importeren. Dit is de reden dat we `return true` doen op het moment dat een woning aan onze eisen voldoet.Wanneer je van de laatste functie in de bovenstaande code gebruikt controleer dan of je de volgende code bovenaan je functions.php hebt staan: `use Carbon\Carbon;`
### Post Collections Ingebouwde query resultaten zijn van het type `QueryCollection`, een gebruiksvriendelijke interface in plaats van het standaard WordPress `WP_Query` object. Dit biedt een aantal voordelen, zo zijn alle methods uit [Illuminate’s Collection class](https://laravel.com/api/5.5/Illuminate/Support/Collection.html) beschikbaar, en blijven ook alle properties en methods van `WP_Query` direct beschikbaar. ```PHP $woningen = Wonen::search(...); $woningen->count(); // Aantal woningen in resultaat, rekening houdende met pagination $woningen->total(); // Totaal aantal gevonden resultaten, zonder pagination $woningen->has(); // Of er resultaten zijn $woningen->isEmtpty(); $woningen->first(); $woningen->last(); $woningen->random(); $woningen->sample(3); // Collection van 3 random woningen ```Het `WP_Query` object is beschikbaar via `$woningen->getQuery()`, al zijn alle properties en methods dus ook beschikbaar op de Collection zelf.
The loop De Collection biedt een PHP iterator om de WordPress loop constructie niet handmatig uit te hoeven schrijven: ```PHP while ($woningen->next()): // ... endwhile; ``` Dit is equivalent aan de loop constructie: ```PHP while ($woningen->have_posts()): $woningen->the_post(); // ... endwhile; wp_reset_postdata(); ``` --- ### Media Voor iedere woning kan de bijbehorende media eenvoudig worden opgevraagd d.m.v. `$woning->media()` met eventueel een argument om query opties in te geven: ```PHP $media = $woning->media(array('posts_per_page' => 3)); ``` Ook dit levert een Collection op. Groepen Vanuit jouw CRM wordt media onderverdeeld in een aantal groepen. Alle media in een bepaalde groep kan eenvoudig worden opgevraagd, als volgt:Methode | Groepen |
---|---|
`$woning->afbeeldingen()` | HoofdFoto, Foto, Plattegrond |
`$woning->fotos()` | HoofdFoto, Foto |
`$woning->plattegronden()` | Plattegrond |
`$woning->brochures()` | Brochure |
`$woning->groep('VIDEO')` | MP4 bestanden |
`$woning->groep('CONNECTED_PARTNER')` | Media van 3e partijen (bv. floorplanner / virtuele tour) |
Methode | Groepen |
---|---|
`$woning->pictures()` | HoofdFoto, Foto |
`$woning->floorplans()` | Plattegrond |
`$woning->documents()` | Documenten |
Code | Omschrijving |
---|---|
`$woning->prijs` | De *koopprijs* of *huurprijs* van de woning, afhankelijk van welke beschikbaar is. |
`$woning->isKoop` | Bepaalt of de woning een koopprijs heeft. |
`$woning->isHuur` | Bepaalt of de woning een huurprijs heeft. |
`$woning->hasLocation` | Bepaalt of voor de woning locatiegegevens bekend zijn. |
`$woning->adresPlaats` | Het adres van de woning, inclusief plaats. Houdt ook rekening met woningen in het buitenland, waarbij de adresgegevens in andere velden staat opgeslagen. |
Template | Beschrijving |
---|---|
js/wonen/**archive.js** | Geregistreerd als `wonen-archive` en te enqueuen vanuit *wonen/archive.php*. |
js/wonen/**single.js** | Geregistreerd als `wonen-single` en te enqueuen vanuit *wonen/single.php*. |
js/**googlemap.js** | Google Maps plugin. Geregistreerd als `realworks-googlemap` en als dependency op te geven aan `wonen-archive` en `wonen-single`. |
Optie | Standaard | Beschrijving |
---|---|---|
`'container'` | `'#entity-search-form'` | DOM element of selector voor ` |
`'els'` | *Zie [Templates](#bkmrk-templates-1)* | Bepaalt welke templates moeten worden bijgewerkt in welke containers. |
`'pageLinkEls'` | `'.pagination a'` | Selector voor pagination links. |
Event | Argumenten | Beschrijving |
---|---|---|
`'load'` | `data|null` | Uitgevoerd bij initialisatie en nadat bijwerken is voltooid. |
`'updated'` | `data` | Uitgevoerd nadat bijwerken is voltooid. |
`'refresh'` | Uitgevoerd wanneer een refresh wordt gestart. | |
`'before:replace'` | `data` | Uitgevoerd net voordat de templates worden ingevoegd in hun DOM parents. |
`'after:replace'` | `data` | Uitgevoerd direct nadat de templates zijn ingevoegd. |
`'request:data'` | `data`, `request` | Geeft de mogelijkheid om extra data aan de request toe te voegen door `data` argument aan te passen. |
`'change:page'` | Uitgevoerd wanneer van pagina wordt gewisseld. |
Event | Argumenten | Beschrijving |
---|---|---|
`'before:append'` | `item` | Uitgevoerd net voordat een woning wordt toegevoegd in de DOM. |
`'after:append'` | `item` | Uitgevoerd direct nadat een woning is ingevoegd. |
`'appended'` | `data` | Uitgevoerd direct nadat alle woningen zijn ingevoegd. |
`'infinite:end'` | `data` | Uitgevoerd wanneer alle resultaten zijn ingeladen. |
`'append:page'` | Uitgevoerd wanneer meer resultaten worden opgehaald. |
Als voor een woning ongeldige HTML wordt gegenereert zal er geen DOM element aangemaakt kunnen worden, met als gevolg dat er vanuit *liveform.js* een fout optreedt. Ga in dat geval na of alle elementen wel worden gesloten en of dit in de correcte volgorde gebeurt.
Voor ieder resultaat zal de template `item` worden gerendered en worden ingevoegd in de DOM. De template per woning kan worden aangepast door `options.infinite.template` te wijzigen in het gewenste template. Om infinite scrollen te bereiken moet een klik-event op de pagination link handmatig worden uitgevoerd, zodat automatisch de juiste pagina aan extra resultaten geladen wordt. De pagination link moet verplicht zijn opgenomen in de DOM maar kan uiteraard verborgen worden indien gewenst. Voorbeeldcode om dit te bereiken is als volgt: ```JavaScript var scrolled = false, $window = $(window); $window.scroll(function() { scrolled = true; }); setInterval(function() { if (scrolled && !form.isLoading() && $window.scrollTop() + $window.height() >= form.$el.offset().top + form.$el.height()) { $('.infinite-results a, a.infinite-results').click(); } scrolled = false; }, 100); ``` Laad indicatie Tijdens het wachten op resultaten van de server krijgt de container `