Я читаю документацию для Phalcon, пытаясь найти способ использования Управляющий активами добавить файлы CSS или JS на каждую страницу по умолчанию. Мне не удалось найти какой-либо способ сделать это.
Добавление ресурса для всего контроллера легко выполняется с помощью:
public function initialize() {
$this->assets->addCss('css/global.css');
}
Идея переписать базовый класс контроллеров и затем расширить мои контроллеры, которая приходит на ум, но это звучит немного небрежно, и я хотел бы избежать этого, если это возможно.
Спасибо, благодарю за помощь.
Пока что делать это в базовом контроллере кажется лучшим способом, хотя я согласен, что он пахнет немного неаккуратно. Хотя кажется, что такие активы, как css и js, как предполагается, являются частью авторитета представления и не должны затрагиваться откуда-то еще, в реальной жизни это не так. Прежде всего, вы конфигурируете свои представления из контроллеров, вы указываете, какие параметры вводятся там, и вы указываете отдельные ресурсы для конкретных представлений и т. Д. Нет причин, по которым вы не должны предоставлять global.css
с ним в базовом контроллере.
Единственное, что я нахожу действительно небрежным, — это то, что существует независимое представление и существует независимый управляющий активами, который на самом деле должен быть связан вместе, и активы, которые вы устанавливаете для определенного представления, должны относиться только к этому представлению. Бывают случаи, когда вы хотите визуализировать представление независимо от всего остального и использовать его собственные ресурсы из представления по умолчанию, например, вывести шаблон приветствия по электронной почте после регистрации. В текущей реализации это может быть достигнуто только путем перезаписи достаточного количества логики.
В качестве альтернативы вы можете прикрепить этот стиль непосредственно в шаблон, если вы не сводите их в один файл. Вы также можете попробовать добавить актив прямо в вашем представлении с assets.addCss('css/global.css')
— это может не сработать сразу, если вольт делает это через вспомогательные функции, и в этом случае вы должны сначала реализовать свою собственную. Это, однако, подразумевает добавление логики к представлению, которое никогда не бывает хорошим, если вы не можете жить без него. Итак, придерживайтесь подхода базового контроллера.
Редактировать: по иронии судьбы, через день я обнаружил проблему с этим через initialize()
обработчик событий после использования его более года.
Когда вы пересылаете данные с одного контроллера на другой, контроллер, куда вы пересылаете данные, также инициализируется. Это означает, что один и тот же ресурс добавляется дважды, и если они объединяются в один файл, бог знает, что произойдет … Это меньше проблем для css (только увеличенный размер), но JS, скорее всего, сломается, часто без любая индикация. Это легко исправить с помощью afterExecuteRoute()
обработчик в контроллере с проверкой состояния диспетчера:
public function afterExecuteRoute()
{
// If dispatcher hasn't finished dispatching we shouldn't enter.
if (!$this->dispatcher->isFinished()) {
return;
}
$this->assets->addCss('css/global.css');
}
В вашем наследующем представлении просто переопределите это с помощью этого:
public function afterExecuteRoute()
{
parent::afterExecuteRoute();
if (!$this->dispatcher->isFinished()) {
return;
}
$this->assets->addCss('css/custom.css');
}
Вы также можете управлять менеджером активов в DI.
$di->setShared("assets", function() {
$assetManager = new \Phalcon\Assets\Manager();
$assetManager->addJs('/path/to/some/js/file');
return $assetManager;
});
Это позволит всегда загружать файлы js. Вы можете передать ему конфигурацию, чтобы сделать его динамичным. Просто зарегистрируйте это где-нибудь в вашем index.php перед запуском $ app-> handle () -> getContent () ;.