Problém s php scriptem pro generování e-mailu
Dotaz bude trochu složitější, omlouvám se... ale pokusím se co nejjednodušeji vysvětlit problém.
1) PHP příliš nerozumím, umím jen to, co jsem se naučil "za pochodu", což je opravdu hodně málo...
2) Používám CMS PHP-Fusion a rád bych použil soubor s "panelem" Tell a Friend, tedy jakési jednoduché doporučení stránky, na které uživatel je.
3) Na stránkách s mody pro CMS PHP-Fusion jsem našel jakýsi skript, který moc nefungoval a jestli dokážu laicky posoudit, zdál se mi poněkud "zmatený" a svými vlastními úpravami jsem ho dorazil. Nicméně po konzultacích s lidmi, kteří tomu rozumějí jsem ho jakžtakž dokázal zprovoznit, což považuji za malý zázrak. Ovšem dějí se v něm stále docela zvláštní věci.
4) Nejpozoruhodnější je následující: skript využívá proměnné z externího souboru (kvůli lokalizaci) např.
$webmasterEmail = $locale['TF_002'];
. Někdy to jde bez problémů, na jiném místě scriptu odkaz na jiný soubor nefunguje - a syntaxe je poodle věech lidí, se kterými jsem to konzultoval správná... Proto mi nezbývalo, než lokalizaci definovat "natvrdo".
5) A teď co vlastně potřebuji: hledám někoho, kdo dokáže odhalit problém s těmi odkazy na externí soubor a eventuálně ten script pročistit... (rád bych ještě jednu drobnou úpravu, ale tohle je teď to hlavní). Díky všem, kteří najdou tu odvahu a podívají se na to...
1. část scriptu:
if (!defined("IN_FUSION")) { header("Location:../../index.php"); exit; }
if (file_exists(INFUSIONS."tell_friend_panel/locale/".$settings['locale'].".php")) {
include INFUSIONS."tell_friend_panel/locale/".$settings['locale'].".php";
} else {
include INFUSIONS."tell_friend_panel/locale/English.php";
}
openside($locale['TF_001']);
$webmasterEmail = $locale['TF_002'];
$returnPage = $locale['TF_003'];
$sendNotification = 0;
$subject = $locale['TF_009'];
$customMessage = $locale['TF_016'];
$sendAsHtml = 0;
$htmlHeader = <<<EOD
EOD;
error_reporting(E_ERROR);
/* start main */
if(!isset($_POST["action"])) {
if($useHeader) include($headerFile);
show_form();
if($useFooter) include($footerFile);
} else {
//begin error checking
$_POST['senderEmail'] = trim($_POST['senderEmail']);
if(!isValid($_POST['senderEmail'])) {
$error[] = $locale['TF_005'];
unset($_POST['senderEmail']);
}
$validRecips = check_valid($_POST['friend']);
if($validRecips == FALSE) {
$error[] = $locale['TF_006'];
}
//end error checking
if($useHeader) include($headerFile);
if($error) {
echo "<center>\n";
foreach($error as $oneError) {
echo "$oneError<br>\n";
}
echo "</center>\n";
echo show_form();
if($useFooter) include($footerFile);
} else { //no error
$subject = str_replace("[SENDER_EMAIL]", $_POST['senderEmail'], $subject);
$message = $_POST['customMessage'] . "\n\n\n_________________________________________\n"
.$locale['TF_007']. $_SERVER['SERVER_NAME'] . $locale['TF_008']. "$webmasterEmail.";
2. část scriptu:
Losi, kde jsi...? Nezklam mě...
No potěš koště!
Takhle "nasucho" hledat chybu bude trochu problém.
Na jakém řádku konkrétně a jaký odkaz nefunguje? Jak se to projevuje? Týká se to jen tohoto jednoho skriptu? Je includován ten externí jazykový soubor?
Co to bylo za úpravy? Jak vypadá originál skript?
http://php-fusion.co.uk/forum/viewthread.php?forum_ id=26&thread_id=16775&pid=98202
1) Ten externí soubor je includován - viz úvodní řádky sktiptu
2) Nejedou ty řádky, kde je natvrdo nakódována čeština místo odkazu na ten externí soubor
3) Ano, ten originál skript (který ale nefungoval jak měl) je na té adrese v php-fusion fóru - BTW, to je moje vlákno, kde jsem právě řešil ty úpravy...
Díky za každou myslitelnou i nemyslitelnou pomoc...
V konštante INFUSIONS máš relatívnu cestu?
Keď používaš include, tak aktuálna cesta je rovnaká, ako vo volajúcom skripte, takže keď používaš aj vo volanom skripte include s relatívnou cestou, tak na to musíš myslieť.
Bože můj, jak já bych chtěl vědět o čem mluvíš...
Ty nefunkční odkazy byly ve tvaru (např):
a tak podobně... ten externí soubor je stále jeden a tentýž...
P.S. Los nezklamal! Tedy zatím jen svojí přítomností... Ale jak už jsem psal v tom vláknu ohledně javascriptu, my zvířata bychom si měla pomáhat (severské - los x jihoamerické - lama)
Píšeš, že ti nefunguje ti 2. až 6. riadok - include súboru. V include používaš konštantu INFUSIONS. Ak je prázdna, tak sa inkludovaný súbor "tell_friend_panel/locale/..." berie z aktuálneho adresára.
Predpokladám, že ti to funguje vtedy, keď inkluduješ tento skript z toho istého adresára a nefunguje to vtedy, keď ho inkluduješ z iného adresára. Je to tak?
Takže aký je vlastne aktuálny adresár pri volaní include v prípade, že to nefunguje a v prípade, že to funguje?
Alebo to nefunguje pri jednom volaní skriptu? Tak potom to môže byť tým, že vo funkcii nemáš tú premennú prístupnú. Môžeš dať na začiatok funkcie
a malo by to ísť.
Czech.php vypadá takhle:
Omlouvám se, opravdu jsem jen laik... takže nevím, jestli ti odpovím správně, ale konstanta INFUSIONS jenom odkazuje na cestu root/infusions. V adresáři infusions je adresář "tell_friend" a ten obsahuje jednak tenhle php soubor, jednak složku "locale" kde je ten inkludovaný - vida, už si připadám jako programátor - soubor.
Čo vlastne nefunguje - include alebo len nemáš prístupnú tú premennú? Akú chybovú hlášku to vypíše (pre debugovanie nastav error reporting na E_ALL)?
Nemám přístupné ty proměnné - ale jen někdy, což je právě zvláštní... Někde to funguje bez problémů a někde to prostě nereaguje - chybovou hlášku to nenapíše žádnou, jen se to prostě nezobrazí... Typický příklad:
Tohle funguje, normálně se zobrazí tlačítko s popiskem "Odeslat"
a tohle ne:
Žádnou hlášku to ale nevyhodí, prostě se objeví tlačítko bez popisku.
Kedy presne je to někdy?
Ten riadok <tr>... value='".$locale['TF_018']."'>...</tr> v tom pôvodnom kóde nevidím - odkiaľ to voláš?
To je řádek z kódu, kdy jsem se to marně pokoušel přepsat... dělá to ve všech případech, kde je v tom původním kódu napsaná česká věta místo toho, aby to odkazovalo na ten inkludovaný soubor. (správně by se tam žádná čeština vůbec neměla objevit a všechny věty by měly odkazovat ven kvůli lokalizaci do jiných jazyků).
Čiže to je v tej funkcii show_form? Keď dáš na začiatok tej funkcie toto, pomôže to?
Okamžik, vyzkouším...
Ano, jsi génius!!! Asi to bylo v tom. tlačítko Odeslat funguje i s odkazem na local file... Překóduji to všude a pak uvidíme... Měl bych ještě jednu prosbu, jestli bys nemohl letmo shlédnout celý ten script jednak jestli tam nejsou nějaké další zhůvěřilosti, které já samozřejmě nepoznám a jednak jestli by nebylo možné někde určit, aby text mailu který jde (pokud se zaškrtne volba) jako kopie odesílateli byl jiný než ten doporučující adresátovi... uff, snad jsem to řekl srozumitelně...
Za tu první korekci ještě jednou dík, snad to bude fungovat i ve zbytku toho scriptu...
Ak chceš posielať iný text, tak musíš posielať ďalší e-mail.
Zhůvěrilosti? Nevidím tam nič také strašné, čo by som neprežil. Iba drobnosť: adresa v hlavičke Location by mala byť podľa špecifikácie absolútna, hoci som sa ešte nestretol s programom, ktorý by s tým mal problém.
Ak hrozí, že ten skript budeš udržiavať/rozširovať (alebo niekto iný, kto vie, kde bývaš), tak by som ničnehovoriace názvy kľúčov TF_xxx premenoval (napr. na trochu výstižnejšie WTF_xxx).
OK, díky moc... jen nerozumím, proč přejmenovávat TF na WTF...
Skrátka na niečo výstižnejšie, nemusí to byť WTF.
WTF - měl jsi na mysli to co já?
Tak zatím to všechno chodí... ještě jednou díky... ale objevil jsem další zvláštnost - tedy pro mě zvláštnost, pro tebe pravděpodobně logickou věc... Nicméně pohlédni na následující řádky:
Ta tečka na začátku echa ve třetím řádku je "tečka za větou", která následuje po doporučované adrese. V tom doporučovacím mailu je ovšem ta tečka součástí linku , takže ten pak zní "www.xxx.cz.", je aktivní na kliknutí a odkaz je pak vlastně chybný...
Druhá drobnost je, že přijatý mail nezobrazuje korektně češtinu:
Jistě bych to mohl přeformulovat tak, aby se nikde v textu nevyskytoval háček, ale přece jen - chybí tam někde nějaké nastavení?
Tam ti něco chybí, ne? Tečku bych dal za input a na konec echa uvozovky. Zkus takto:
A češtinu v mailu generovaném v PHP doporučuju nepoužívat, raději to překonvertuj na znaky bez diakritiky.
OK, díky.
Pokud bys trval na diakritice, musel bys poslat v mailu hlavičku definující kódování, nějak takto:
Mail si posielal ako text, takže ak je v prijatej správe bodka súčasťou odkazu, tak za to môže poštový klient, ktorý nesprávne rozoznáva adresy. Môžeš tomu zabrániť tak, že dáš adresu na samostatný riadok (bez bodky).
Kódovanie e-mailu sa nastavuje v hlavičke Content-Type, takže tam do jedného riadku doplníš ešte kódovanie napr. UTF-8:
Kódovanie predmetu (ak treba) musíš určiť priamo v hlavičke Subject (viď Google).
OK, díky všem.
Přece jenom ještě dotaz, teď spíš ze zvědavosti... co v tom kódu znamená to
Znamená to v tomto případě
že tyhle řádky mohu smazat, protože proměnná není nijak definována, nebo to platí pro celý dokument, tedy i později ve skriptu?
Ty řádky mají svůj význam, nemaž je. Obsah se do proměnné vloží na jiném místě skriptu.
Ano, to jsem chtěl vědět. Díky.