Simpel probleempje met een while loop en include
Moet nog 1 probleempje oplossen in mijn project maar zie door de bomen het bos niet meer.
Ik heb een cronjob die elke dag om 14:00 checkt of er een mailtje uit moet naar een klant, zo ja stuur een mail, het probleem is enkel dat ik niet de juiste taal kan inladen waarschijnlijk omdat het in een loop gebeurd.
Zie hier:
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
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
<?php function verkrijgKlantTaalCrobjob($land)
{
// Laad de taal file in op basis van de klant zijn ingestelde taal.
switch (strtolower($land)) {
case "netherlands":
include '/home/admin/domains/xxxx/public_html/customers/languages/nl.php';
break;
case "spain":
include '/home/admin/domains/xxxx/public_html/customers/languages/es.php';
break;
case "italy":
include '/home/admin/domains/xxxx/public_html/customers/languages/it.php';
break;
case "germany":
include '/home/admin/domains/xxxx/public_html/customers/languages/de.php';
break;
case "united kingdom":
include '/home/admin/domains/xxxx/public_html/customers/languages/en.php';
break;
case "france":
include '/home/admin/domains/xxxx/public_html/customers/languages/fr.php';
break;
default:
include '/home/admin/domains/xxxx/public_html/customers/languages/en.php';
}
}?>
{
// Laad de taal file in op basis van de klant zijn ingestelde taal.
switch (strtolower($land)) {
case "netherlands":
include '/home/admin/domains/xxxx/public_html/customers/languages/nl.php';
break;
case "spain":
include '/home/admin/domains/xxxx/public_html/customers/languages/es.php';
break;
case "italy":
include '/home/admin/domains/xxxx/public_html/customers/languages/it.php';
break;
case "germany":
include '/home/admin/domains/xxxx/public_html/customers/languages/de.php';
break;
case "united kingdom":
include '/home/admin/domains/xxxx/public_html/customers/languages/en.php';
break;
case "france":
include '/home/admin/domains/xxxx/public_html/customers/languages/fr.php';
break;
default:
include '/home/admin/domains/xxxx/public_html/customers/languages/en.php';
}
}?>
Code (php)
Het probleem is dat hij altijd de taal pakt van de eerste in de while loop dus nederlandse klanten krijgen ook een spaanse mail als de eerste record spanje is. Lijkt wel alsof die de include altijd laat staan en niet de nieuwe goed inlaad.
Gewijzigd op 10/07/2019 11:43:11 door Furio Scripting
Gewijzigd op 10/07/2019 12:03:35 door Rob Doemaarwat
Overigens heb je het in je functie over Crobjob, terwijl je Cronjob bedoelt.
Rob Doemaarwat op 10/07/2019 11:48:30:
Zo te zien staan er in die taal bestanden (nl.php, es.php, enz) een hoop defines (ala MAIL_REMINDER_DAY_1_SUBJECT)? Die kun je niet opnieuw definen (waarschijnlijk krijg je een sloot warnings). De eerste taal blijft dus behouden. Ipv daarvan zul je dan met variabelen moeten gaan werken - die kun je wel overschrijven.
Dat klopt Rob, in de taal bestanden zijn dezelfde defines op deze manier:
define("MAIL_REMINDER_DAY_1_SUBJECT", "stukje content");
Het hele systeem is zo gebouwd dus hoop stiekem dat er toch een manier is om het makkelijk op te lossen of moet ik toch variablen gaan gebruiken? Is in principe geen ramp daar het maar om 3 mailtjes gaat en 6 talen.
Toevoeging op 10/07/2019 11:53:47:
- Ariën - op 10/07/2019 11:50:53:
Echo eens (wel in testomgeving met dummy-personen) wat er in $rows['land'] staat. Dan weet je zeker wat er gebeurt.
Overigens heb je het in je functie over Crobjob, terwijl je Cronjob bedoelt.
Overigens heb je het in je functie over Crobjob, terwijl je Cronjob bedoelt.
Bedankt voor je reactie, dit heb ik ook gedaan en daar komt netjes NL of ES uit, enkel de taal haalt die niet lekker op (altijd dezelfde taal).
Ik test nog wat door...
Nee, defines zijn statisch, en kunnen niet meer halverwege wijzigen. Daarom zijn variabelen de beste oplossing voor taalbestanden.
Zelf werk ik altijd met een functie, die ook meteen een log/mailtje doet als er een vertaling ontbreekt. Heel plat:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function translate($code){
global $translations; //array met de actieve vertalingen (taal afhankelijk dus)
if(array_key_exists($code,$translations)) return $translations[$code];
mail('[email protected]','Ontbrekende vertaling',"$code ontbreekt in het {huidige taal}");
return "<!-- $code -->"; //handig voor debuggen
}
//en dan in nl.php dus iets van:
$translations = [
'MAIL_REMINDER_DAY_1_SUBJECT' => 'Je bent iets vergeten',
'MAIL_REMINDER_DAY_1_MESSAGE' => '...',
//enz
];
//en in je script
mail($to,translate('MAIL_REMINDER_DAY_1_SUBJECT'),translate('MAIL_REMINDER_DAY_1_MESSAGE'));
global $translations; //array met de actieve vertalingen (taal afhankelijk dus)
if(array_key_exists($code,$translations)) return $translations[$code];
mail('[email protected]','Ontbrekende vertaling',"$code ontbreekt in het {huidige taal}");
return "<!-- $code -->"; //handig voor debuggen
}
//en dan in nl.php dus iets van:
$translations = [
'MAIL_REMINDER_DAY_1_SUBJECT' => 'Je bent iets vergeten',
'MAIL_REMINDER_DAY_1_MESSAGE' => '...',
//enz
];
//en in je script
mail($to,translate('MAIL_REMINDER_DAY_1_SUBJECT'),translate('MAIL_REMINDER_DAY_1_MESSAGE'));
Gewijzigd op 10/07/2019 12:06:28 door Rob Doemaarwat
- Ariën - op 10/07/2019 11:53:54:
Nee, defines zijn statisch, en kunnen niet meer halverwege wijzigen. Daarom zijn variabelen de beste oplossing voor taalbestanden.
Het is mij duidelijk dat constanten niet overschreven kunnen worden, weer wat geleerd.
Heb nu even snel wat aangepast en stiekem gehoopt dat jullie dit bedoelen met variablen maar hij geeft nu leeg resultaat, wat gaat er mis?
Code (php)
1
2
2
NL.php: <?php $MAIL_REMINDER_DAY_1_SUBJECT = "content Nederlands"; ?>
ES.php: <?php $MAIL_REMINDER_DAY_1_SUBJECT = "content Spaans"; ?>
ES.php: <?php $MAIL_REMINDER_DAY_1_SUBJECT = "content Spaans"; ?>
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
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
<?php // 1 dag
$q = 'SELECT * FROM bestellingen WHERE DATE(bestel_datum) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)';
$result = $database->query($q);
while ($rows = mysqli_fetch_assoc($result))
{
verkrijgKlantTaalCronjob($rows['land']);
if (checkOfKlantAbbonementHeeft($rows['klant_id']) == 0)
{
echo 'webshop: '.$rows['land'].'<br/>';
echo 'Onderwerp: '.$MAIL_REMINDER_DAY_1_SUBJECT.'<br/>';
}?>
$q = 'SELECT * FROM bestellingen WHERE DATE(bestel_datum) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)';
$result = $database->query($q);
while ($rows = mysqli_fetch_assoc($result))
{
verkrijgKlantTaalCronjob($rows['land']);
if (checkOfKlantAbbonementHeeft($rows['klant_id']) == 0)
{
echo 'webshop: '.$rows['land'].'<br/>';
echo 'Onderwerp: '.$MAIL_REMINDER_DAY_1_SUBJECT.'<br/>';
}?>
Toevoeging op 10/07/2019 12:21:41:
Dit geeft die aan: Notice: Undefined variable: MAIL_REMINDER_DAY_1_SUBJECT in /home/admin/domains/xxxxx/public_html/page/test.php on line 57
Dus ergens gaat het mis bij het inladen, de variable staat denk ik wel in orde zo.
Als ik het zo doe in de while loop gaat die wel goed:
Code (php)
Dus ik moet de functie eens nalopen
Gewijzigd op 10/07/2019 12:26:50 door Furio Scripting
Ik denk dat het zinvoller is als je er een array van maakt:
NL.php:
ES.php:
En in je verkrijgKlantTaalCronjob() kan je dan $lang in een global plaatsen.
Gewijzigd op 10/07/2019 12:50:05 door - Ariën -
Bedankt voor alle adviezen en hulp! Top forum dit!! Het is gelukt en ik heb weer wat geleerd :)
Quote:
Dit geeft die aan: Notice: Undefined variable: MAIL_REMINDER_DAY_1_SUBJECT in /home/admin/domains/xxxxx/public_html/page/test.php on line 57
Dus ergens gaat het mis bij het inladen, de variable staat denk ik wel in orde zo.
Dus ergens gaat het mis bij het inladen, de variable staat denk ik wel in orde zo.
Dit heeft te maken met de scope (het geldigheidshgebied) van de include. In de documentatie staat hierover het volgende:
Quote:
If the include occurs inside a function within the calling file, then all of the code contained in the called file will behave as though it had been defined inside that function. So, it will follow the variable scope of that function.
Oftewel de vertalingen zijn alleen beschikbaar binnen de functie. Dit probleem had je voorheen niet omdat je constanten gebruikte. Deze leven in de globale scope, m.a.w. zijn altijd en overal beschikbaar. Maar daar werden waarschijnlijk tig waarschuwingen gegenereerd omdat je probeerde constanten te herdefiniëren.
In het algemeen lijkt het mij zeer de moeite waard om het melden + weergeven van fouten aan te zetten bij ontwikkeling zodat dit soort fouten in een vroeg stadium worden gedetecteerd. Dit scheelt je een heleboel stront, vooral als dit soort code al in gebruik is genomen op het moment dat je je realiseert dat er iets misgaat...