/** * iterates through string to replace every * {placeholder} with posted data * @param string text to parse * @param array data to search for placeholders (default $_REQUEST) * @param bool if no data found for the place holder do we keep the {...} string in the message * @param bool add slashed to the text? * @param object user to use in replaceWithUserData (defaults to logged in user) */ public function parseMessageForPlaceHolder($msg, $searchData = null, $keepPlaceholders = true, $addslashes = false, $theirUser = null) { $this->_parseAddSlases = $addslashes; if ($msg == '' || is_array($msg) || strpos($msg, '{') === false) { return $msg; } $msg = str_replace(array('%7B', '%7D'), array('{', '}'), $msg); if (is_object($searchData)) { $searchData = JArrayHelper::fromObject($searchData); } //$post = JRequest::get('post'); //$$$ rob changed to allow request variables to be parsed as well. I have a sneaky feeling this // was set to post for a good reason, but I can't see why now. // $$$ hugh - for reasons I don't understand, merging request just doesn't seem to work // in some situations, so I'm adding a replaceRequest call here as a bandaid. // @TODO $$$ rob can you remember what those situations where? Because doing this is messing up form plugins (e.g redirect) when they do replace on getEmailData() // as having the line below commented in causes the request to be used before searchData. // FabrikWorker::replaceRequest($msg); $post = JRequest::get('request'); $this->_searchData = is_null($searchData) ? $post : array_merge($post, $searchData); $this->_searchData['JUtility::getToken'] = JUtility::getToken(); $msg = FabrikWorker::replaceWithUserData($msg); if (!is_null($theirUser)) { $msg = FabrikWorker::replaceWithUserData($msg, $theirUser, 'your'); } $msg = FabrikWorker::replaceWithGlobals($msg); $msg = preg_replace("/{}/", "", $msg); /* replace {element name} with form data */ $msg = preg_replace_callback("/{[^}\\s]+}/i", array($this, 'replaceWithFormData'), $msg); if (!$keepPlaceholders) { $msg = preg_replace("/{[^}\\s]+}/i", '', $msg); } return $msg; }
/** * Iterates through string to replace every * {placeholder} with row data * (added by hugh, does the same thing as parseMessageForPlaceHolder in parent * class, but for rows instead of forms) * * NOTE - I can't remember why I added this way back when in 2.x, instead of using the helper function, * I just know there was a good reason, to do with the helper func making assumptions about something * (I think to do with how form data is formatted) which weren't true when rendering list data. I have * a suspicion that in the intervening years, the helper func and the way we format data may now be * copacetic, and we could do away with this separation, and just use the normal helper func. Might be * worth testing, as this code looks like it has suffered bitrot, and doesn't do a number of things the main * helper func now does. * * @param string $msg text to parse * @param array &$row of row data * @param bool $addSlashes add slashes to the replaced data (default = false) set to true in fabrikcalc element * * @return string parsed message */ public function parseMessageForRowHolder($msg, &$row, $addSlashes = false) { $this->aRow = $row; if (!strstr($msg, '{')) { return $msg; } $this->parseAddSlases = $addSlashes; $msg = FabrikWorker::replaceWithUserData($msg); $msg = FabrikWorker::replaceWithGlobals($msg); $msg = preg_replace("/{}/", "", $msg); $this->rowIdentifierAdded = false; /* replace {element name} with form data */ /* $$$ hugh - testing changing the regex so we don't blow away PHP structures! Added the \s so * we only match non-space chars in {}'s. So unless you have some code like "if (blah) {foo;}", PHP * block level {}'s should remain unmolested. */ $msg = preg_replace_callback("/{[^}\\s]+}/i", array($this, 'replaceWithRowData'), $msg); $lang = $this->lang->getTag(); $lang = str_replace('-', '_', $lang); $msg = str_replace('{lang}', $lang, $msg); return $msg; }