2014-09-15 3 views
1

Я читаю документацию для Phalcon, пытаясь найти способ использования Assets Manager для добавления CSS или JS-файлов на каждую страницу по умолчанию. Мне не удалось найти какой-либо способ сделать это.Есть ли способ добавить актив к каждой странице в Phalcon?

Добавление актива в течение всего контроллера легко осуществить, выполнив:

public function initialize() { 
    $this->assets->addCss('css/global.css'); 
} 
  • Есть ли какой-то способ, которым я мог бы добавить актив на все контроллеры по умолчанию?

Идея заменить класс базового контроллера и затем расширить его контроллеры, но это напоминает немного неряшливо, и я хотел бы избежать этого, если это возможно.

Спасибо, оцените помощь.

ответ

1

Пока что это в базовом контроллере, кажется, лучший способ, хотя я согласен, что он немного пахнет. Хотя кажется, что такие активы, как 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'); 
} 
+0

Благодарим Вас за отзыв. Я полагаю, вы подтвердили, что расширение базового контроллера является моим единственным вариантом. Поскольку у меня нет желания добавлять какую-либо ненужную логику в представление, похоже, что я буду расширять базовый контроллер! Благодаря! – 2014-09-15 19:03:09

+0

@ Тайлер, проверьте обновление. –

+0

Ничего себе, это довольно иронично, lol. Это не произошло со мной ... замечательный момент. Спасибо за обновленный ответ, оцените его. – 2014-09-17 17:34:26

3

Вы также можете управлять менеджер активов в 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() ;.

Смежные вопросы