Overzicht van artiesten met data grid - jquery
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?
Ik ben bezig met een overzicht van artiesten en wil daar wat filter mogelijkheden maken voor de bezoeker. Nu kwam ik deze website tegen: 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?
www.site.nl/artiesten/delta-goodrem.html
En boven de lijst een filter plaatsen die op filters zoekt in je hele database. Uiteraard via GET.
Dat jQuery-script is overigens 'deprecated' en gebruik daarvan raad ik dus niet meer aan. Verder moet ik even kijken hoe de vervanger precies werkt, een of die nuttig is
Ik zou sowieso gaan voor een directe filtering op de alfabetisering van de achternamen. En dus een lijst met letter-navigatie. Zorg dat je slugs gebruikt voor de resultaten, zoals bijv.: En boven de lijst een filter plaatsen die op filters zoekt in je hele database. Uiteraard via GET.
Dat jQuery-script is overigens 'deprecated' en gebruik daarvan raad ik dus niet meer aan. Verder moet ik even kijken hoe de vervanger precies werkt, een of die nuttig is
Gewijzigd op 08/01/2019 09:23:38 door - Ariën -
www.site.nl/artiesten/borsato of www.site.nl/artiesten/trijntje
Weet jij ook of er ergens een voorbeeld is zodat ik kan zien hoe dat werkt? Ben al even aan het zoeken geweest maar kan het nog niet vinden.
En weet jij of de data om te filteren ook in de table van de artiesten moet staan?
Ik heb een table met 'artiesten' en een table 'filters'
ARTIESTEN
artiesten_id
artiesten_naam
FILTERS
filters_id
filters_naam
Dank voor je informatie. Dat met de slugs begrijp ik een beetje. Je keuze moet er dan uitzien als: Weet jij ook of er ergens een voorbeeld is zodat ik kan zien hoe dat werkt? Ben al even aan het zoeken geweest maar kan het nog niet vinden.
En weet jij of de data om te filteren ook in de table van de artiesten moet staan?
Ik heb een table met 'artiesten' en een table 'filters'
ARTIESTEN
artiesten_id
artiesten_naam
FILTERS
filters_id
filters_naam
Gewijzigd op 08/01/2019 11:15:34 door Kees Mulder
Ikzelf gebruik een 'Single Point of Entry', waarbij alle verzoeken in de index.php terechtkomen.
Daar kan je dan eenvoudig alles in routeren naar de juiste delen van je site:
Code (php)
Dat bespaart een hele sloot aan rewrite-rules als je een flinke site hebt. Maar inbouw van een dergelijk SPE-systeem is niet triviaal, en vergt een flinke verbouwing aan je code. Terwijl een mod-rewrite rule simpeler is. Maar wel op den duur minder makkelijker onderhoudbaar is.
Verder snap ik niet wat je wilt met een filtertabel in de database? Filteren doet de gebruiker toch zelf? Of ga je dit cachen?
Gewijzigd op 08/01/2019 11:37:36 door - Ariën -
Zet je deze dan in de table artiesten?
ARTIESTEN
artiesten_id
artiesten_naam
artiesten_taal
ARTIESTEN
1
trijntje
nederlands engels
2
borsato
nederlands italiaans
Dus een tabel met talen, een een koppeltabel met artiesten_talen
Talen
1 - Nederlands
2 - Vlaams
3 - Frans
4 - Fries
5 - Engels
etc..
artiesten_talen
1 - 1
1 - 5
2 - 5
Artiesten
1 - Trijntje
2 - Madonna
Met CONCAT() kan je ook een veld met de talen in de artiesten-tabel toevoegen, en daarop de juiste taal extraheren, maar filteren wordt lastig als er taalfouten in staan.
Gewijzigd op 08/01/2019 13:14:35 door - Ariën -
Duidelijk. Maar even terug komende op je 'Single Point Entry' met index.php. Betekent dit dat er maar 1 bestand is? index.php met in het bestand verwijzingen met include('file.php')?
Dus als www.site.nl/contact wordt aangeroepen, dan gebruik je in index.php een include naar contact.php
Gewijzigd op 10/01/2019 09:32:37 door - Ariën -
Nu heb ik een overzicht van artiesten: www.site.nl/artiesten/ (wat eigenlijk artiesten.php) is
Maar hoe doe je dat dan met filters:
www.site.nl/artiesten/taal/nederlands/genre/popgroep/
Hoe weet jij dat dit de include van /artiesten (artiesten.php) is?
Je moet zelf een routeringsscript in index.php bouwen. Dit kan je bijv. met switch() doen.
Kees Mulder op 10/01/2019 12:16:50:
Hoe weet jij dat dit de include van /artiesten (artiesten.php) is?
Dit doe je door dit zelf zo te programmeren. In wezen schrijf je dus zelf een "mapping" of "route" van een applicatiepad naar een PHP-bestand die het verzoek verder afhandelt, vaak op grond van de vorm van de URL of extra informatie die bij deze URL is opgeslagen.
index.php is de centrale plek waar alle verzoeken binnenkomen, daar vandaan wordt je middels code verder geleid naar de juiste bestemming, of een ander verdeelpunt die je verder op weg helpt naar de uiteindelijke bestemming. Deze bestemming is meestal een specifiek stuk code die je invoegt die verder acteert op de aangeroepen URL.
Je bent helemaal vrij in hoe je deze routing verder implementeert. Dit kan met een eenvoudig switch-statement, met reguliere expressies waarbij je tekstpatronen gebruikt, of wellicht een database waarin alle (gedeeltelijke of volledige) applicatiepaden staan opgeslagen die daar worden gekoppeld aan bijbehorende code(-bestanden) die de verdere afhandeling verzorgen.
Bijvoorbeeld:
aangeroepen URL: https://jesite.nl/forum/message/12/hello-world
applicatie pad: /forum/message/12/hello-world
index.php verzorgt de initiële afhandeling, en je routing is zodanig geïmplementeerd dat alles van de vorm /forum/* leidt tot het includen van /pad/naar/code/forum.php
forum.php ziet vervolgens dat het het onderdeel "message" betreft, dit zou weer kunnen leiden tot het includen van /pad/naar/code/forum/message.php
en daar wordt uiteindelijk bericht 12 weergegeven.
In dit voorbeeld dient index.php dus voor de routing van je hele applicatie, en /pad/naar/code/forum.php specifiek voor de routing binnen het forum.
Van de oorspronkelijke single point of entry in je applicatie (index.php) wordt in deze opzet de URL onderweg ook partje voor partje "opgegeten" totdat het zijn uiteindelijke bestemming bereikt.
En als je dit dus een beetje generiek opzet kun je de volledige navigatie door je site op deze manier via code opbouwen.
Gewijzigd op 10/01/2019 15:49:48 door Thomas van den Heuvel
Ik heb mijn .htaccess aangepast en de index.php gemaakt met:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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';
}
?>
// 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.
Een tipje: kijk eens met print_r($path) in welk element de paginanaam zit ;-)
Gewijzigd op 10/01/2019 19:20:16 door - Ariën -
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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
}
}
?>
// ... 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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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
}
}
?>
// ... 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'
Code (php)
Maar hoe kan ik dit dan naar de selectie van tabel doen. Want ik kan ook doen www.site.nl/artiesten/genre/popgroep
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.
Gewijzigd op 10/01/2019 20:52:52 door - Ariën -
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.
Gewijzigd op 10/01/2019 23:16:08 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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';
?>
$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.
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:
Code (php)
Hoe je je URLs opbouwt moet afgestemd worden op hoe deze worden uitgelezen en vice versa.
Overigens, dit:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$pathParts[1];
$pathParts[2];
$pathParts[3];
$pathParts[4];
$pathParts[5];
$pathParts[6];
?>
$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...
Als iemand klikt op [klassiek]
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