2014-09-15 4 views
1

Phalcon이 Assets Manager을 사용하여 기본적으로 모든 단일 페이지에 CSS 또는 JS 파일을 추가하는 방법을 찾는 데 대한 설명서를 읽었습니다. 나는 이것을하는 어떤 방법을 찾는데 실패했다. 전체 컨트롤러 자산을 추가 팔콘의 모든 단일 페이지에 애셋을 추가 할 수있는 방법이 있습니까?

쉽게 수행하여 이루어집니다

public function initialize() { 
    $this->assets->addCss('css/global.css'); 
} 
  • 나는 기본적으로 모든 컨트롤러에 자산을 추가 할 수있는 몇 가지 방법이 있나요?

기본 컨트롤러 클래스를 덮어 쓴 다음 내 컨트롤러를 확장하는 아이디어가 있지만 마음에 들지는 않지만 가능한 경우이를 피하고 싶습니다.

감사합니다. 도움에 감사드립니다.

답변

1

지금까지 기본 컨트롤러에서하는 것이 가장 좋은 방법 인 것처럼 보이지만 조금은 냄새가 난다는 것에 동의합니다. 자산이 css와 js와 같이보기 권한의 일부로 여겨지고 다른 곳에서 건드려서는 안되는 것처럼 느껴지 긴하지만 실생활에서는 그렇지 않습니다. 먼저 컨트롤러에서 뷰를 구성하고 거기에 어떤 매개 변수가 들어가는지 지정하고 개별 뷰 특정 애셋 등을 지정합니다. 기본 컨트롤러에 global.css을 제공하지 않아야하는 이유는 없습니다.

유일하게 내가보기 싫은 것은 독립적 인 견해가 있으며 실제로는 결합되어야하는 독립 자산 관리자가 있으며 특정보기에서 설정 한 자산은 해당보기에만 관련되어야한다는 것입니다. 다른 모든 것과 독립적으로 뷰를 렌더링하고 기본 뷰에서 자체 자산을 사용하려는 경우가 있습니다 (예 : 등록 후 환영 전자 메일 템플릿을 렌더링). 현재의 구현으로 이것은 상당한 양의 로직을 덮어 씀으로써 만 가능합니다.

또는 하나의 파일로 축소하지 않으면 해당 스타일을 템플릿에 직접 첨부 할 수 있습니다. 또한 assets.addCss('css/global.css')으로보기에서 직접 자산을 추가 할 수도 있습니다. 볼트가 도우미 기능을 통해 이것을 수행하면 바로 작동하지 않을 수 있습니다.이 경우 자체 기능을 먼저 구현해야합니다. 그러나 이것은 뷰에 로직을 추가하는 것을 의미합니다. 뷰를 사용하지 않고서는 살 수 없다면 결코 좋은 일이 아닙니다. 따라서 기본 컨트롤러 방식을 고수하십시오.

편집 : 아이러니하게도, 일년이 지난 후에 나는 1 년 이상 사용 후 initialize() 이벤트 처리기를 통해이 문제를 발견했습니다.

한 컨트롤러에서 다른 컨트롤러로 전달할 때 전달한 컨트롤러도 초기화됩니다. 즉, 동일한 애셋이 두 번 더 추가되고, 하나의 파일로 연결되면 신이 어떻게 될지를 알 수 있습니다 ... CSS의 경우에는 문제가 적지 만 크기가 커지면 JS가 깨지기 쉽습니다. 어떤 표시. 당신은 또한 DI의 자산 관리자를 조작 할 수

public function afterExecuteRoute() 
{ 
    parent::afterExecuteRoute(); 

    if (!$this->dispatcher->isFinished()) { 
     return; 
    } 

    $this->assets->addCss('css/custom.css'); 
} 
+0

의견에 감사드립니다. 기본 컨트롤러를 확장하는 것이 유일한 방법이라는 것을 확인했다고 가정합니다. 뷰에 불필요한 로직을 추가 할 의사가 없기 때문에 기본 컨트롤러를 확장하는 것처럼 보입니다! 감사! –

+0

@Tyler, 업데이트를 확인하십시오. –

+0

와우, 그건 꽤 아이러니합니다. 롤. 그건 나에게 발생하지 않았다 ... 위대한 요점. 업데이트 된 답변을 주셔서 감사합니다, 그것을 감사드립니다. –

3

: 그냥이와이 메소드를 오버라이드 (override)

public function afterExecuteRoute() 
{ 

    // If dispatcher hasn't finished dispatching we shouldn't enter. 

    if (!$this->dispatcher->isFinished()) { 
     return; 
    } 

    $this->assets->addCss('css/global.css'); 
} 

귀하의 상속보기에서이 쉽게 디스패처 상태 체크와 컨트롤러 afterExecuteRoute() 핸들러를 사용하여 고정됩니다 .

$di->setShared("assets", function() { 

    $assetManager = new \Phalcon\Assets\Manager(); 
    $assetManager->addJs('/path/to/some/js/file'); 

    return $assetManager; 

}); 

이렇게하면 js 파일이 항상로드됩니다. 동적으로 만들기위한 구성을 전달할 수 있습니다. $ app-> handle() -> getContent();를 실행하기 전에 index.php의 어딘가에 등록하십시오.

관련 문제