2017-10-04 3 views
0

Ma question est de savoir si oui ou non ce que j'essaie de faire est même possible. Je suis soit en train de faire quelque chose de mal, soit je rêve de trop gros ... (Insérer un disclaimer de concepteur php non professionnel ici). Je crée un système d'emailing automatique. J'ai la mise en page de mon email stocké dans un fichier texte. Les informations que je voulais écrire dynamiquement sont représentées par ce que j'appelle des étiquettes (c'est-à-dire [DATE], [CUSTNAME], [MESSAGE] ...).Quelle est une alternative (ou la bonne façon) d'appeler une fonction PHP avec str_replace() (Tout contenu dans une fonction)?

Lorsqu'un email est créé et livré, les variables sont passées à une fonction de ma page d'index, j'inclue simplement le fichier texte en remplaçant mes balises par du contenu dynamique. Cela fonctionne magnifiquement pour moi, jusqu'à ce que je voulais renforcer le contenu de la newsletter. Maintenant, je veux ajouter dans une section qui est appelée à partir d'une fonction indépendante. Cela a fait que ma fonction Email affiche le contenu de la fonction appelée 3 fois au lieu de terminer la fonction de prise de vue et de redirection si nécessaire.

Mon code (contenu à l'intérieur d'une fonction) avant la mise à jour (travail pour moi):

$EmailBodyTEXT = addslashes($EmailBody); 
$EmailBody = 
str_replace('[YEAR]', date(Y), 
str_replace('[SUBJECT]', $EmailSubject, 
str_replace('[DATE]', date('l, F j, Y'), 
str_replace('[MESSAGE]', $EmailBody, file_get_contents($url . 'newsletter_BLANK.txt'))))); 

Mon code après la mise à jour (échec):

$EmailBodyTEXT = addslashes($EmailBody); 
$EmailBody = 
str_replace('[YEAR]', date(Y), 
str_replace('[SUBJECT]', $EmailSubject, 
str_replace('[DATE]', date('l, F j, Y'), 
str_replace('[MESSAGE]', $EmailBody, 
str_replace('[PHOTOSTREAM]', PhotoStream(CUST), file_get_contents($url . 'newsletter_BLANK.txt')))))); 

Pour ce qu'il vaut la peine, j'ai essayé pour 'charger' la deuxième fonction dans une variable $ et remplacé l'appel de fonction avec la variable, exactement le même résultat, comme je l'avais prévu.

Comment dois-je appeler cette fonction pour ne pas «exécuter» sur place, mais continuer avec le processus de la fonction contenant, qui transmettrait ce contenu dans l'email en cours de création et de livraison? Suis-je simplement incorrect en pensant qu'il existe un moyen de charger une fonction à partir du processus str_replace? Existe-t-il une manière plus évidente d'essayer de faire ceci (fondamentalement une fonction de fusion et publipostage)?

S'il vous plaît laissez-moi savoir vos pensées et si plus de code est nécessaire de moi.

Voici le Photostream():

function PhotoStream($DispTo) { 
global $url, $uri, $urp, $locurl; 

if(empty($DispTo)) { echo 'unconfigured'; continue; } else { 

if($DispTo == 'CUST') { $DispTo = urlencode('$redacted'); } else { $DispTo = '$redacted'; } 

} 

if($getPics = mysql_query("SELECT pid, px, title FROM photos ORDER BY pubdate DESC LIMIT 6")) { 

echo '<fieldset><div id="wrapNL">'; 

while($gPics = mysql_fetch_array($getPics)) { 

$pid = $gPics{'pid'}; 
$pex = $gPics{'px'}; 
$ptl = $gPics{'title'}; 

echo '<div id="pthumbs"><a href="' . $uri . $DispTo . '&PID=' . $pid . $locurl . '">'; 
echo '<img src="' . $urp . 'uploads/' . $pid . '.' . $pex . '" alt="' . $ptl . '" title="' . $ptl . '">'; 
echo '</a></div>'; 

} 

echo '</div></fieldset>'; 

} 

} 
+0

Que fait votre fonction 'PhotoStream'? Est-ce que ça fait écho à quelque chose, ou le renvoyer? – rickdenhaan

+0

Vous pouvez simplement passer des tableaux aux 1er et 2e paramètres de 'str_replace' au lieu de chaîner les appels' str_replace'. Par exemple: 'str_replace (array ('[YEAR]', '[SUBJECT]'), array (date ('Y'), $ EmailSubject), $ EmailBody)'. – ccKep

+0

J'ai ajouté le PhotoStream(). ça fait écho. – BJC

Répondre

1

Je pense que vous ce surcharger.

Si vous souhaitez remplacer plusieurs aleurs dans une chaîne, vous pouvez utiliser la fonction strtr. Il prend 2 arguments, le premier est la chaîne pour remplacer les valeurs dans et le second est un tableau d'associes de clés représentant des remplacements et des valeurs représentant la valeur pour les remplacer.

Essayez quelque chose de similaire à ce qui suit:

<?php 

$emailBody = strtr($emailBodyRaw, array(
    '[TOKEN]' => 'token value', 
    '[ANOTHER]' => 'another value', 
    //More replacements here 
)); 

Vos remplacements plus complexes peuvent être effectuées en dehors de cet extrait et en tant substitué seule variable.


EDIT: Vous souhaitez mettre à jour votre fonction Photostream à retour une valeur plutôt que de l'écho aswell.Vous pouvez toujours faire écho ce qui est retourné si nécessaire un autre endroit au sein de votre application


EDIT 2: Capture sortie d'écho Photostream dans une variable

En utilisant une méthode connue sous le nom tampon de sortie vous pouvez utiliser votre fonction Photostream dans son état actuel en faisant quelque chose de semblable à ce qui suit:

<?php 

ob_start(); 
PhotoStream($DispTo) 
$photo = ob_get_clean(); 
ob_end_clean() 

$emailBody = strtr($emailBodyRaw, array(
    '[PHOTO]' => $photo 
    //More replacements here 
)); 

ce faisant, vous capturer ce Photostream d'écho et de la stocker dans une variable.

Pour utiliser la fonction directement dans la matrice de remplacement, vous devrez la refactoriser pour renvoyer le code HTML plutôt que de l'afficher en écho.

+0

Je pense que vous avez probablement raison ... mais serais-je en mesure de remplacer [ATAG] avec => aFunction()? – BJC

+0

Cela fonctionnerait bien, tant que vous renvoyez une valeur de votre fonction plutôt que de l'écho. – JParkinson1991

+0

Mise à jour de ma réponse pour montrer comment vous pouvez capturer la sortie d'écho de votre fonction PhotoStream et l'utiliser comme remplacement. J'espère que cela pourra aider! – JParkinson1991