Mols
Новичок
для того, чтобы с минимумом кода получить доступ к сырым данным, обеспечив при этом автоматический эскейп по дефолту.а можно спросить - зачем это всё делать?
Если двумя словами - для удобства.
для того, чтобы с минимумом кода получить доступ к сырым данным, обеспечив при этом автоматический эскейп по дефолту.а можно спросить - зачем это всё делать?
Это тебе не надо. Ты нарушаешь инкапсуляцию своим экранированием вне шаблона. Данные могут экранироваться по-разному в зависимости от контекста в шаблоне: обычное HTML-экранирование и JS-экранирование, например.НЕ НАДО это делать. Ни в твиге, ни в native-php.
Всё верно, для искейпинга - неважно.И не важно, были ли в этой переменной теги, или нет.
Good {
protected $id;
protected $title;
protected $price;
protected $description;
public function getId() {}
public function getTitle() {}
public function getPrice() {}
public function getDescription() {}
public static find() {}
}
GoodController {
$id = $request->getId;
$view->good = Good::find($id);
}
<title><?= $this->good->getTitle() ?></title>
<body>
<div id="good-<?= $this->good->getId() ?>">
<span><?= $this->good->getTitle() ?></span>
<span><?= $this->good->getPrice() ?></span>
<p>
<?= $this->good->getDescription() ?>
</p>
</div>
</body>
<p>
<?= $this->escape($this->good->getDescription()) ?>
</p>
Это ты загнул, малость, по-моему.Экранирование должно быть в геттерах модели?
Вот на конкретном приведённом мной примере покажите, как это должно работать.Объект, переданный в шаблон почти всегда — модель. Ее надо будет тоже научить автоэскейпингу.
View->row()
GoodController {
$id = $request->getId;
$view->good = Good::find($id);
$view->assignRow('unescapedDescription', $good->getDescription());
}
Good {
public static find() {}
}
GoodController {
$id = $request->getId;
$data = Good::find($id);
$data['link'] = $this->makeUrl($id);
$data['pic'] = $this->makePic($id);
$view->setTemplate('good.tpl.php');
$view->setRaw('description');
return $data;
}
<title><?= $title ?></title>
<body>
<div id="good-<?= $id ?>">
<a href=<?=$link?>><img src=<?=$pic?>></a>
<span><?= $title ?></span>
<span><?= $price ?></span>
<p>
<?=$description ?>
</p>
</div>
</body>
И может забыть.Верстальщик — знает.
Большинство так не считает. Включая главного авторитета(рельсы), с которого все берут пример.Лично я считаю, что модели делать во вью нечего.
Удобнее, безусловно, использовать нечто вроде twig, но кому-то религия не позволяет.Как ее удобнее решить?
class Boom
{
public $tim = '<tim>';
public function tom()
{
return '<tom> ';
}
}
class Wrapper
{
private $_obj;
public function __construct($obj)
{
$this->_obj = $obj;
}
public function raw()
{
return $this->_obj;
}
public function __get($name)
{
return isset($this->_obj->$name) ? $this->e($this->_obj->$name) : "Error: unknown property '$name'";
}
public function __call($name, $arguments)
{
if (method_exists($this->_obj, $name))
return $this->e($this->_obj->$name());
return "Error: unknown method '$name'";
}
protected function e($v)
{
return htmlspecialchars($v);
}
}
$varWrapper = new Wrapper(new Boom());
echo $varWrapper->tom(), "\t", $varWrapper->tim
, PHP_EOL
,$varWrapper->tomo(), "\t", $varWrapper->timo
, PHP_EOL
, $varWrapper->raw()->tom(), "\t", $varWrapper->raw()->tim;