Ik ben bezig met een overzicht van artiesten en wil daar wat filter mogelijkheden maken voor de bezoeker. Nu kwam ik deze website tegen: www.sportsspeakers.nl/sprekers | waar je kan filteren op verschillende mogelijkheden.

Hoe kan ik dit het beste doen? Ik heb gezocht en kwam ook deze website tegen jplist.com/togglefiltersexamples/radio-buttons-filters waarbij je data kan filteren met jquery. Zou dit een oplossing kunnen zijn of is dit weer niet seo vriendelijk?

Kan iemand hier wat over vertellen?
Dank voor de uitleg en heb inderdaad al wat zitten lezen en bekijken maar begrijp nog niet zo goed hoe je dan de routing doet zoals in je url voorbeeld.

Ik heb mijn .htaccess aangepast en de index.php gemaakt met:

<?php
// Read REQUEST_URI, suppress errors (gave E_WARNING prior to PHP 5.3.3).
$uriData = @parse_url($_SERVER['REQUEST_URI']);

$path = '';
if ($uriData === false) {
// Do something?
} else {
if (isset($uriData['path'])) {
// We might be in a subdirectory of the webroot.
// We are only interested in the part starting from this relative root.
$path = str_replace(DIRECTORY_SEPARATOR, '/', $uriData['path']);
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', dirname($_SERVER['SCRIPT_NAME']));
// Strip the relative path from $path.
$path = substr($path, strlen($relativePath));
// Finally, strip any leading/trailing slashes so we end up with a "cleaned" path.
$path = trim($path, '/');
}
}

$path = trim(substr($uriData['path'], strlen(dirname($_SERVER['SCRIPT_NAME']))), '/');

switch ($path) {
case ('homepage'):
include 'homepage.php';
break;
case ('about'):
include 'about.php';
break;
case ('artiesten'):
include 'artiesten.php';
break;
default:
include 'homepage.php';
}
?>

Als ik dan www.site.nl/artiesten in tik kom ik daar wel op uit. Maar als ik dan www.site.nl/artiesten/taal/nederlands in tik gaat hij naar de homepage. Hoe kan ik dat oplossen net zoals in je voorbeeld.
Heb je al de .htaccess aangemaakt, zoals het artikel uitlegt?

Een tipje: kijk eens met print_r($path) in welk element de paginanaam zit ;-)
Nu ja, je kunt dus een soort van verdeel-en-heers strategie gebruiken zoals ik eerder aangaf.

Het schoongemaakte applicatiepad zit in $path. Je zou dus ook $path kunnen opdelen op grond van (forward) slashes. Deze partjes -ook wel slugs genoemd- kun je weer gebruiken om te besluiten welke code wordt uitgevoerd.

Dus zoiets:
<?php
// ... alle bovenstaande code minus het switch deel ...
$pathParts = explode('/', $path);

if (empty($pathParts[0])) {
    // lege slug - toon voorpagina
    // ...
} else {
    // controleer hier eerste deel van applicatiepad
    switch ($pathParts[0]) {
        case 'x':
            // do stuff;
        break;
        // et cetera
        default: // niet-bestaande pagina, toon 404
    }
}
?>

En zo kun je meerdere partjes controleren, of de verdere afhandeling verplaatsen naar de code zelf en bovenstaande code enkel als initiele doorverwijzing gebruiken. In die case 'x' zet je dus het eerste deel van je applicatiepad ('artiesten').

Een alternatief is een autoloader in combinatie met classes, dat is tevens ook wat generieker en vereist geen code voor alle specifieke pagina's. Maar het bovenstaande doet in principe wat je ermee wilt bereiken.
Ik begin het een klein beetje te begrijpen. Ik heb je code overgenomen:

<?php
// ... alle bovenstaande code minus het switch deel ...
$pathParts = explode('/', $path);

if (empty($pathParts[0])) {
// lege slug - toon voorpagina
// ...
} else {
// controleer hier eerste deel van applicatiepad
switch ($pathParts[0]) {
case 'artiesten':
// do stuff;
include 'artiesten.php';
break;
// et cetera
case 'about':
include 'about.php';
break;
default: // niet-bestaande pagina, toon 404
}
}
?>

Als ik dan www.site.nl/artiesten/taal/nederlands

Dan zie ik de pagina artiesten.php

Als ik dan een op de pagina artiesten.php een onderstaande echo doen dan krijg ik los te zien 'taal' en 'nederlands'

<?php
echo $pathParts[1];
echo $pathParts[2];
echo $pathParts[3];
echo $pathParts[4];
echo $pathParts[5];
?>

Maar hoe kan ik dit dan naar de selectie van tabel doen. Want ik kan ook doen www.site.nl/artiesten/genre/popgroep



$pathParts[1] bevat de waarde van de het tweede URL-deel.
Die kan je gebruiken bij het zoeken.

Als je echt met een zoekformulier wilt zoeken zou ik persoonlijk $_GET aanraden voor de zoek-opdrachten. Dan kan je met de 'back'-functie van je browser nog makkelijk terug gaan, als je POST gebruikt, geeft elke browser dan een waarschuwing of de POST-request opnieuw moet worden uitgevoerd, en dat is best hinderlijk.
Kees Mulder op 10/01/2019 20:13:33
Maar hoe kan ik dit dan naar de selectie van tabel doen. Want ik kan ook doen www.site.nl/artiesten/genre/popgroep

Dit regel je op precies eenzelfde wijze (verder) in artiesten.php waar je $pathParts[1], $pathParts[2] et cetera verder inspecteert. Het helpt hierbij dat je er een koppelwoord tussenzet, zoals /artiesten/genre/<genre> waarbij <genre> bijvoorbeeld jazz of klassiek is. De /genre na /artiesten is dan in artiesten.php een indicatie dat er een specifiek genre volgt. Op die manier kun je makkelijker beslissen welk overzicht je wilt tonen.

- Ariën - op 10/01/2019 20:32:32
Als je echt met een zoekformulier wilt zoeken zou ik persoonlijk $_GET aanraden voor de zoek-opdrachten. Dan kan je met de 'back'-functie van je browser nog makkelijk terug gaan, als je POST gebruikt, geeft elke browser dan een waarschuwing of de POST-request opnieuw moet worden uitgevoerd, en dat is best hinderlijk.

Je zou er ook aparte "pagina's" met nette URLs van kunnen maken die dynamisch gegenereerd worden op grond van wat er in de URL staat. Hiermee scoor je in zoekmachines waarschijnlijk beter dan met iets wat uit een querystring komt.

EDIT: of je gebruikt dus een autoloader en een zwik classes, dan is de kans wat kleiner dat dit verzandt in één grote brei als je niet netjes te werk gaat. Maar dat is dus weer een stapje verder qua complexiteit.

Dit is van zichzelf ook al redelijk ingewikkelde materie, vooral als je met interne links aan de slag gaat en dan je site wilt verhuizen :). Het liefst houd je dit allemaal dynamisch zodat het automatisch meeverandert wanneer je je site verplaatst. Ooit gekeken naar een blogsysteem of CMS toevallig? Daarin is meestal al het e.e.a. omtrent routing geregeld.
Ik heb in artiesten.php het volgende staan. Ik begrijp nu niet zo goed hoe ik path zoals <taal> of <genre> in een $_GET moet zetten.

<?php

$pathParts[1];
$pathParts[2];
$pathParts[3];
$pathParts[4];
$pathParts[5];
$pathParts[6];

$sql = 'SELECT * FROM artiesten
LEFT JOIN artiesten_talen ON artiesten_talen.artiest_id = artiesten.artiest_id
LEFT JOIN talen ON talen.talen_id = artiesten_talen.talen_id
LEFT JOIN artiesten_genres ON artiesten_genres.artiest_id = artiesten.artiest_id
LEFT JOIN genres ON genres.genre_id = artiesten_genres.genre_id

';
if (isset($_GET['taal']) && ctype_digit($_GET['taal'])) {
$sql .= ' WHERE taal = ' . $_GET['taal'];
}

$sql .= ' GROUP BY artiesten.naam ASC';
?>

Ik heb wel een klein CMS-systeem draaien voor toevoegen en veranderen van de artiesten.



Als je GET gebruikt is het toch goed zo?
Vergeet niet te escapen.
Kees Mulder op 11/01/2019 11:02:00
Ik heb in artiesten.php het volgende staan. Ik begrijp nu niet zo goed hoe ik path zoals <taal> of <genre> in een $_GET moet zetten.

Wederom, dit zul je zelf moeten programmeren. En als je dat in $_GET wil doen, so be it. Als je dan toch bezig bent met het bouwen van nette URLs zou ik dit ook gewoon meenemen.

Je bereikt dit dus door zelf de URLs te bouwen. Dit is de wederhelft van het onderdeel "routing". Aan de ene kant bouw je URLs in hun nette vorm en aan de andere kant moeten deze herkend en opgevangen worden om verder verwerkt te worden. Het eerste deel is dus gewoon een kwestie van het bouwen van hyperlinks in HTML, bijvoorbeeld als volgt:
<?php
foreach (array('jazz', 'klassiek', 'pop') as $genre) {
    ?><a href="/artiesten?genre=<?php echo $genre; ?>"><?php echo $genre; ?></a><?php
}
?>

Hoe je je URLs opbouwt moet afgestemd worden op hoe deze worden uitgelezen en vice versa.

Overigens, dit:
<?php
$pathParts[1];
$pathParts[2];
$pathParts[3];
$pathParts[4];
$pathParts[5];
$pathParts[6];
?>

Doet niets. Daarnaast, het is niet gegarandeerd dat $pathParts[x] bestaat, dus je zou hier eerst op moeten controleren...
Dat klopt inderdaad dat die $pathParts[1] zo niets doet. Maar deze doe ik in index.php via switch() naar de artiesten.php.

Als iemand klikt op [klassiek]

<a href="/artiesten/genre/klassiek">Klassiek</a>


Dan gaat hij uiteindelijk via index naar artiesten.php en zie je in de url site.nl/artiesten/genre/klassiek

Maar nu is mijn vraag hoe krijg ik in artiesten.php dat hij dit kan omzetten naar het selecteren in de query. Deze gegevens zijn nl. uit de $pathParts te halen maar weet niet zo goed hoe ik dat kan omzetten naar de select in de query. Daarbij komt dat je verschillende mogelijkheden kan krijgen:

site.nl/artiesten/genre/klassiek/taal/nederlands
maar ook anders om:
site.nl/artiesten/taal/nederlands/genre/klassiek

Reageren