|
@@ -149,8 +149,21 @@ hoe belangrijk het voor de app is.*
|
|
|
*Is less than or equal to* met identifier **`datum_tot`**, beide op
|
|
*Is less than or equal to* met identifier **`datum_tot`**, beide op
|
|
|
`field_date_value`. Let op: "Is between" geeft één identifier met
|
|
`field_date_value`. Let op: "Is between" geeft één identifier met
|
|
|
`[min]`/`[max]` — dat is juist niet wat we willen (zie `CLAUDE.md`).
|
|
`[min]`/`[max]` — dat is juist niet wat we willen (zie `CLAUDE.md`).
|
|
|
-2. **Eén exposed `title`-contains filter op diezelfde view** (voor P2-26),
|
|
|
|
|
- identifier bv. **`zoek`**. Client-side zoeken kan hier niet: `services_1`
|
|
|
|
|
|
|
+2. **Eén `title`-contains filter op diezelfde view** (voor P2-26), parameter
|
|
|
|
|
+ **`zoek`** — **niet via de Views-UI** (zes van de zeven displays overriden
|
|
|
|
|
+ hun filters) maar als extra blok in `custom_views_query_alter()`, binnen het
|
|
|
|
|
+ bestaande `if ($view->name == 'flutterflowmobiel1') { … }`, direct **na de
|
|
|
|
|
+ `foreach ($grenzen …) { … }`** en vóór de sluitende accolade van die `if`:
|
|
|
|
|
+ ```php
|
|
|
|
|
+ if (!empty($_GET['zoek']) && is_string($_GET['zoek'])) {
|
|
|
|
|
+ $zoek = trim(drupal_substr($_GET['zoek'], 0, 100));
|
|
|
|
|
+ if ($zoek !== '') {
|
|
|
|
|
+ $query->add_where(0, 'node.title', '%' . db_like($zoek) . '%', 'LIKE');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+ Test: `…services_3.json?townid=28695&zoek=jazz&_cb=…` → deelverzameling,
|
|
|
|
|
+ `zoek=qqqzzz` → `[]`, zonder `zoek` → ongewijzigd aantal. Client-side zoeken kan hier niet: `services_1`
|
|
|
heeft 937 items voor Amsterdam (38 pagina's), `services_3` 497,
|
|
heeft 937 items voor Amsterdam (38 pagina's), `services_3` 497,
|
|
|
`services_5` 450 — gemeten 2026-09-15.
|
|
`services_5` 450 — gemeten 2026-09-15.
|
|
|
*Zodra 1 en 2 er staan is de app-kant van allebei klein werk: één
|
|
*Zodra 1 en 2 er staan is de app-kant van allebei klein werk: één
|
|
@@ -903,8 +916,12 @@ taak 21/33 (datumfilter, zie het blok hieronder), taak 43 + 46
|
|
|
API-calls van `/en/` naar `/nl/`), taak 50 (pager 25 → 50), taak 52
|
|
API-calls van `/en/` naar `/nl/`), taak 50 (pager 25 → 50), taak 52
|
|
|
(`dblog_row_limit` stond al goed) en taak 53 (`services_2` uitgezet).*
|
|
(`dblog_row_limit` stond al goed) en taak 53 (`services_2` uitgezet).*
|
|
|
|
|
|
|
|
-**Taak 47 · Theater Landgraaf mist zijn gemeente/plaats.** Horecagelegenheid
|
|
|
|
|
-nid **70155** heeft geen `field_hor_municipality_town`. Gevolg: de events daar
|
|
|
|
|
|
|
+**Taak 47 · Theater Landgraaf mist zijn gemeente/plaats · ⚠️ HALF (Bob
|
|
|
|
|
+2026-09-15: "gedaan in productie". Claude meet om 22:15: de zaak zelf heeft nu
|
|
|
|
|
+`plaats: Nieuwenhagen` in `establishment_info`, maar alle drie de events geven
|
|
|
|
|
+nog `"plaats": null` in `flutterflow_events.json` (cache-buster) — de tweede
|
|
|
|
|
+stap, de events opnieuw opslaan, ontbreekt nog; zie de ⚠️ hieronder).**
|
|
|
|
|
+Horecagelegenheid nid **70155** heeft geen `field_hor_municipality_town`. Gevolg: de events daar
|
|
|
(nid 221721, 221722, 221723 — adres "Kerkberg 4") hebben een lege `plaats` en
|
|
(nid 221721, 221722, 221723 — adres "Kerkberg 4") hebben een lege `plaats` en
|
|
|
zijn dus **niet vindbaar via `townid`**; ze komen in geen enkele stadstab. Het
|
|
zijn dus **niet vindbaar via `townid`**; ze komen in geen enkele stadstab. Het
|
|
|
zijn er 3 van de 1200 gemeten events (0,2%), dus het is één node, geen
|
|
zijn er 3 van de 1200 gemeten events (0,2%), dus het is één node, geen
|
|
@@ -912,32 +929,19 @@ structureel probleem. ⚠️ `custom_node_presave()` kopieert de plaats naar het
|
|
|
event **op het moment dat het event wordt opgeslagen** — de zaak repareren is
|
|
event **op het moment dat het event wordt opgeslagen** — de zaak repareren is
|
|
|
dus niet genoeg, die drie events moeten daarna opnieuw opgeslagen worden.
|
|
dus niet genoeg, die drie events moeten daarna opnieuw opgeslagen worden.
|
|
|
|
|
|
|
|
-**Taak 48 · FlutterFlow-commit op `main`.** Staat sinds 14 sep open (Claude's
|
|
|
|
|
-klik op de commit-knop in het Version Control-paneel komt niet aan) en er zijn
|
|
|
|
|
-op 15 sep opnieuw drie API-calls gewijzigd.
|
|
|
|
|
-
|
|
|
|
|
-**Taak 54 · Cloudflare Cache Rule voor de publieke endpoints.** De winst is
|
|
|
|
|
-gemeten: dezelfde URL zonder cache-buster geeft **1,23 s (MISS) → 0,10 s
|
|
|
|
|
-(HIT)**, maar `cf-cache-status` staat op `DYNAMIC`, dus Cloudflare cachet niets
|
|
|
|
|
-en elke gebruiker legt de volle weg naar de origin af. Bob doet dit puur in
|
|
|
|
|
-Cloudflare (geen Drupal-header). De twee instellingen die het bepalen:
|
|
|
|
|
-- **Expression**: `http.request.method eq "GET"` **en** `not http.cookie
|
|
|
|
|
- contains "SESS"` **en** een expliciete lijst van paden.
|
|
|
|
|
-- **Edge TTL**: "Ignore cache-control header and use this TTL" → **300 s**.
|
|
|
|
|
- De optie "Use cache-control header if present, bypass cache if not" werkt
|
|
|
|
|
- hier **niet**, want de origin stuurt `no-store, no-cache`.
|
|
|
|
|
-⚠️ `flutterflowmobiel_establishments.json` hoort **niet** in die lijst: die
|
|
|
|
|
-display filtert in `custom_views_query_alter()` op de favorietenlijst van de
|
|
|
|
|
-ingelogde gebruiker, dus dezelfde URL geeft per gebruiker een ander antwoord.
|
|
|
|
|
-Idem voor `/flutterdrup/favorieten*`, `/mijn_*`, `/accountdelete`, `/user/*`.
|
|
|
|
|
-
|
|
|
|
|
-**Taak 56 · De opruim-cron zegt 30 dagen maar doet 360.** In
|
|
|
|
|
-`custom_cronapi()` staat *"after 30 days"*, in
|
|
|
|
|
-`custom_delete_expired_events_callback()` staat `$date->modify('- 360 days')`.
|
|
|
|
|
-Met 16.065 events in de voorraad is dat geen detail. Er zit bovendien een
|
|
|
|
|
-`range(0, 500)` op: max 500 verwijderingen per cronrun, wat bij de huidige
|
|
|
|
|
-importsnelheid mogelijk niet meer volstaat. Besluit welke van de twee klopt,
|
|
|
|
|
-maak description en code gelijk, en hernoem `$date_after_30`.
|
|
|
|
|
|
|
+**Taak 54 · Cloudflare Cache Rule · ✅ AFGEROND 2026-09-15 (Bob), nagemeten
|
|
|
|
|
+door Claude.** Rule "FlutterFlow publieke endpoints": `GET` én geen cookie met
|
|
|
|
|
+`SESS` én URI in `flutterflowmobiel1.json`, `flutterflow_events.json`,
|
|
|
|
|
+`flutterflowmobiel_establishment_info.json`,
|
|
|
|
|
+`flutterflowmobiel_establishment_events.json`, `plaatsen.json`,
|
|
|
|
|
+`plaatsen_bij_gemeente.json`; Edge TTL "Ignore cache-control" 5 min. Meting op
|
|
|
|
|
+`flutterflowmobiel1` services_3 Amsterdam: 1e call `cf-cache-status: MISS`,
|
|
|
|
|
+3e call **`HIT`, age 2, 0,06–0,09 s**. `flutterflowmobiel_establishments.json`
|
|
|
|
|
+staat er terecht **niet** in (favorieten-filter per gebruiker). **Gevolg voor
|
|
|
|
|
+later:** een Drupal-wijziging aan één van deze zes endpoints is voor de app pas
|
|
|
|
|
+na max. 5 min zichtbaar, én een cache-buster (`_cb=`) omzeilt Cloudflare óók —
|
|
|
|
|
+dus een `_cb`-test zegt niets over wat de app ziet; wacht 5 min of purge de
|
|
|
|
|
+rule in Cloudflare.
|
|
|
|
|
|
|
|
### Voor Bob — drie Drupal-taken, uitgeschreven
|
|
### Voor Bob — drie Drupal-taken, uitgeschreven
|
|
|
|
|
|
|
@@ -1151,6 +1155,14 @@ en staat in de map `kanweg`. Drie dingen die daaruit volgen:
|
|
|
|
|
|
|
|
### Bij livegang
|
|
### Bij livegang
|
|
|
|
|
|
|
|
|
|
+- **Taak 56 · Opruim-cron: description zegt 30 dagen, code doet 360 (Bob's
|
|
|
|
|
+ besluit 2026-09-15: na livegang).** In
|
|
|
|
|
+`custom_cronapi()` staat *"after 30 days"*, in
|
|
|
|
|
+`custom_delete_expired_events_callback()` staat `$date->modify('- 360 days')`.
|
|
|
|
|
+Met 16.065 events in de voorraad is dat geen detail. Er zit bovendien een
|
|
|
|
|
+`range(0, 500)` op: max 500 verwijderingen per cronrun, wat bij de huidige
|
|
|
|
|
+importsnelheid mogelijk niet meer volstaat. Besluit welke van de twee klopt,
|
|
|
|
|
+maak description en code gelijk, en hernoem `$date_after_30`.
|
|
|
- **AdMob: `Show Test Ads` uitzetten** (App Settings → AdMob). Staat nu AAN,
|
|
- **AdMob: `Show Test Ads` uitzetten** (App Settings → AdMob). Staat nu AAN,
|
|
|
dus de banner op `pUitgaanPage` toont testadvertenties en levert niets op.
|
|
dus de banner op `pUitgaanPage` toont testadvertenties en levert niets op.
|
|
|
De GDPR-consentflow staat sinds 2026-09-15 wél goed (`adMobRequestConsent()`
|
|
De GDPR-consentflow staat sinds 2026-09-15 wél goed (`adMobRequestConsent()`
|