šablony – case insensitive replace

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MzK
Člen | 127
+
0
-

Potřeboval bych nahrazovat, ale helper replace mi nestačí, tak si zaregistroval nový:
$this->template->registerHelper('ireplace', 'str_ireplace');
Ale to mi nefunguje:
Šablona:

<?php
<td>{!$d->domena|ireplace:$searchString:'<span style="background-color:yellow;">'.$searchString.'</span>'}</td>
?>

Po zkompilování to je:

<?php
echo $template->ireplace($d->domena, $searchString, '<span style="background-color:yellow;">'.$searchString.'</span>')
?>

Což by mělo být dobře? Bohužel to udělá to, že to nahradí všechno cokoliv výrazem <span style="background-color:yellow;">'.$searchString.'</span> I když se to neschoduje…

Napadlo mě ještě použít replacere, ale regulární výrazy neumím a v tomto případě jsou zbytečné…
Otázkou tedy je, jak v šabloně nahradit hledaný výraz výrazem, aby nezáleželo na velikosti písmen..
str_ireplace

MzK
Člen | 127
+
0
-

Po zkompilování by to mělo vypadat takto:

<?php
echo str_ireplace($searchString, '<span style="background-color:yellow;">'.$searchString.'</span>', $d->domena); ?>
?>

Takže je tam trochu jiné pořadí parametrů, ale já neumím nějak docílit správného pořadí, rád bych aby bylo stejné, jako u |replace tak i u |ireplace.

MzK
Člen | 127
+
0
-

Jak na to, nechci do šablony psát přímo PHP, určitě ten helper nějak zaregistrovat půjde…

Aurielle
Člen | 1281
+
0
-

Namapuj si funkci která ti to pořadí přeháže:

public function ireplace($string, $search, $replace)
{
	return str_ireplace($search, $replace, $string);
}
MzK
Člen | 127
+
0
-

A jak si takovou funkci zaregistruji do šablony?
$this->template->registerHelper('ireplace', 'ireplace');

Pokud je ta funkce součástí třídy tak to ireplace nenajde → Callback ‚ireplace‘ is not callable.

MzK
Člen | 127
+
0
-

VYŘEŠENO:

<?php
<td>{!$d->domena|ireplace:$searchString:'<span style="background-color:yellow;">'.$searchString.'</span>'}</td>
vs
<td>{!$searchString|ireplace:'<span style="background-color:yellow;">'.$searchString.'</span>':$d->domena}</td>
?>

Šlo jen o prohození těch parametrů…
Blbý je, že u ireplace to funguje normálně takto:

<?php
<td>{!$d->domena|replace:$searchString:'<span style="background-color:yellow;">'.$searchString.'</span>'}</td>
?>
toka
Člen | 253
+
0
-

Vlož ji tak, aby ji nalezl RobotLoader, např. takto:

<?php
class MyHelper {
  public static function ireplace($string, $search, $replace) {
    return str_ireplace($search, $replace, $string);
  }
}

A pak mám v BasePresenter.php toto:

...
protected function createTemplate() {
  $template = parent::createTemplate();
  $template->registerHelper('ireplace', 'MyHelper::ireplace');
  return $template;
}
...

Opět se nechám poučit od zkušenějších, pokud dělám něco špatně – ale funguje to :-)

Majkl578
Moderator | 1364
+
0
-

Sláva Closurám!

$template->registerHelper('ireplace', function ($string, $search, $replace)
{
        return str_ireplace($search, $replace, $string);
});

Ve starém PHP (<5.3) je bohužel třeba použít verzi, kterou napsal toka.

Editoval Majkl578 (24. 3. 2010 19:46)