AltoRouter conflicteert met Bootstrap.js
AltoRouterAltoRouter Ik heb AltoRouter voor verschillende andere meertalige websites gebruikt zonder enig probleem. Maar om een of andere reden werkte de navigatie op deze website niet (bij het klikken op een menu-item gebeurde er niets). Sinds gisteravond laat ben ik aan het werk om erachter te komen wat de reden hiervoor zou kunnen zijn. Een voor een heb ik de verschillende plug-ins, stylesheets en andere afhankelijkheden verwijderd en teruggezet als bleek dat deze geen invloed hadden op de werking van de navigatie. Ik heb net de laatste Bootstrap.min.js, verwijderd en het bleek dat dat de boosdoener is. Na het verwijderen werkte de navigatie weer gewoon. Weet iemand wat de reden kan zijn? Ik heb in de console gekeken maar zie tot nu toe niets vreemds.
Voor een meertalige website gebruik ik voor de routing AltoRouter is serverbased en Bootstrap is clientside.
Heb je een live voorbeeld, of kun je anders de resulterende HTML van het menu laten zien?
@- Ariën - en @Rob Doemaarwat Ik moet mezelf corrigeren. Was idd niet Bootstrap.min.js dat er voor zorgde dat de navigatie niet werkte. Uit eindelijk blijkt het een conflict te zijn tussen jquery en Bootstrap wat de oorzaak is/was. Want ook als ik jQuery verwijder en Bootstrap laat staan werkt het opeens wel. Hetgeen op zich wel vervelend is daar ik beidde eigenlijk nodig heb
Heb je een voorbeeld?
Code (php)
1
2
3
4
5
2
3
4
5
<script src="/js/bootstrap.min.js"></script> //incl. jQuery?
<script>
//bind logica voor je menu
</script>
<script src="/js/jquery.min.js"></script> //hierdoor worden voorgaande bindingen ongedaan gemaakt / overschreven
<script>
//bind logica voor je menu
</script>
<script src="/js/jquery.min.js"></script> //hierdoor worden voorgaande bindingen ongedaan gemaakt / overschreven
Kan ook zijn dat je een async of defer aan je script bestand hebt hangen, en dat ze niet in de volgorde laden die je in gedachte had.
@Rob Doemaarwat. Dank je voor de reactie en tip. Door jQuery na Bootstrap te laden werkt het inderdaad. Hartstikke bedankt helemaal top
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
RewriteEngine On
RewriteRule ^([a-z]{2})/(.*)$ index.php?lang=$1&route=$2 [NC,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?lang=&route=$1 [NC,L,QSA]
RewriteRule ^([a-z]{2})/(.*)$ index.php?lang=$1&route=$2 [NC,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?lang=&route=$1 [NC,L,QSA]
en voor de reguliere websites waar ik aan werk:
Toen ik op de eerder genoemde test pagina bepaalde functionaliteiten teste werkte deze nog steeds niet. Toen ik echter tijdelijk de .htaccess verving werkte alles zo als het zou moeten. Is er iets in het .htaccess dat ik zou kunnen aanpassen?
Edit het .htaccess file in zijn geheel te vervangen is geen optie, want dan werken de routes niet meer
Alvast bedankt
Gewijzigd op 21/10/2018 17:13:58 door Donald Boers
Oftewel ontleed $_SERVER['REQUEST_URI'] in je code zelf in plaats van de taal te injecteren in $_GET.
Gewijzigd op 21/10/2018 17:47:47 door Thomas van den Heuvel
Code (php)
1
2
3
2
3
if($requestUrl === null) {
$requestUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
}
$requestUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
}
De server request methode staat ookin deze class
Code (php)
1
2
3
2
3
if($requestMethod === null) {
$requestMethod = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
}
$requestMethod = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
}
Hoe zou jij dit anders aanpakken.
Ik sta voor andere suggesties open
Gewijzigd op 21/10/2018 18:48:47 door Donald Boers
Vervolgens controleer je hier ergens welke taal je gaat gebruiken. Dit doe je dus in de code zelf, gebruik geen RewriteRules etc. want dat compliceert alles alleen maar.
Het "huiswerk" wat daar ongeveer gedaan zou moeten worden komt min of meer op het volgende neer. Als je meer routing-functionaliteit in je applicatie hebt (waar ik eigenlijk wel vanuit ga) dan zou je daar het een en ander van kunnen lenen. Ook ga ik er vanuit dat je ergens de geselecteerde taal bijhoudt, in het onderstaande fragment ga ik er gemakshalve vanuit dat deze is opgeslagen in $config['lang']. Alle taalgerelateerde zut (iig tav configuratie en navigatie) wordt dan zoiets:
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
37
38
39
40
41
42
43
44
45
46
47
48
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
37
38
39
40
41
42
43
44
45
46
47
48
<?php
// init
$validLanguages = array('en', 'nl'); // etc.
$defaultLang = 'en'; // the default language should preferrably not be added in the URL
$config['lang'] = $defaultLang; // default language stored in some configuration - this determines the language used in the application
$uriData = @parse_url($_SERVER['REQUEST_URI']);
if ($uriData === false) {
die('bad url');
}
$path = '/'; // default path
$pathParts = array(); // default path, in parts
// determine language
if (isset($uriData['path'])) {
$path = trim($uriData['path'], '/'); // strip leading and trailing slashes
$pathParts = explode('/', $path);
if (isset($pathParts[0]) && in_array($pathParts[0], $validLanguages)) {
$config['lang'] = $pathParts[0]; // overwrite default
}
}
// swap language?
// if a valid language is set and is not the current language, swap languages
if (isset($_GET['lang']) && in_array($_GET['lang'], $validLanguages) && $_GET['lang'] != $config['lang']) {
if (isset($uriData['path'])) {
$path = trim('/', $uriData['path']);
$pathParts = explode('/', $path);
}
// if we swap to the default language, strip language from URL
if ($_GET['lang'] == $defaultLang) {
unset($pathParts[0]); // it doesn't matter if it was not set
} else {
$pathParts[0] = $_GET['lang']; // replace lang
}
// redirect - note that the rest of $_GET will be lost
$targetPath = '/';
if (count($pathParts) > 0) {
$targetPath = '/'.implode('/', $pathParts);
}
header($_SERVER['SERVER_PROTOCOL'].' 303 See Other');
header('Location: '.$targetPath);
exit;
}
?>
// init
$validLanguages = array('en', 'nl'); // etc.
$defaultLang = 'en'; // the default language should preferrably not be added in the URL
$config['lang'] = $defaultLang; // default language stored in some configuration - this determines the language used in the application
$uriData = @parse_url($_SERVER['REQUEST_URI']);
if ($uriData === false) {
die('bad url');
}
$path = '/'; // default path
$pathParts = array(); // default path, in parts
// determine language
if (isset($uriData['path'])) {
$path = trim($uriData['path'], '/'); // strip leading and trailing slashes
$pathParts = explode('/', $path);
if (isset($pathParts[0]) && in_array($pathParts[0], $validLanguages)) {
$config['lang'] = $pathParts[0]; // overwrite default
}
}
// swap language?
// if a valid language is set and is not the current language, swap languages
if (isset($_GET['lang']) && in_array($_GET['lang'], $validLanguages) && $_GET['lang'] != $config['lang']) {
if (isset($uriData['path'])) {
$path = trim('/', $uriData['path']);
$pathParts = explode('/', $path);
}
// if we swap to the default language, strip language from URL
if ($_GET['lang'] == $defaultLang) {
unset($pathParts[0]); // it doesn't matter if it was not set
} else {
$pathParts[0] = $_GET['lang']; // replace lang
}
// redirect - note that the rest of $_GET will be lost
$targetPath = '/';
if (count($pathParts) > 0) {
$targetPath = '/'.implode('/', $pathParts);
}
header($_SERVER['SERVER_PROTOCOL'].' 303 See Other');
header('Location: '.$targetPath);
exit;
}
?>
EDIT: verder niet getest dus kunnen nog fouten in zitten, het idee spreekt echter voor zich, lijkt mij.
EDIT: en geef niet nogmaals dit pad mee in $_GET['route'], dat is helemaal niet nodig. In de REQUEST_URI zit alle informatie, hier hoef je $_GET niet (nogmaals) mee te vervuilen. Houd $_GET transparant. Wat de gebruiker in de browser ziet in de querystring is alles wat in $_GET zou moeten/mogen zitten, manipuleer dit het liefst niet of zo min mogelijk aan de serverzijde.
Zo ook: de taal kun je ook uit de URL vissen, die hoef je niet nogmaals in de (serverside) URL te stoppen. $_GET['lang'] zou je wel kunnen gebruiken om tussen talen te schakelen zoals in het bovenstaande codevoorbeeld gebeurt.
EDIT: is je pagina ook voorzien van een base href? Anders wordt mogelijk in de verkeerde directory gezocht naar een javascript-bestand.
Gewijzigd op 22/10/2018 15:01:06 door Thomas van den Heuvel