2014-09-10 1 views
0

사용자 구성 요소 및 간단한보기에서 볼트 템플릿 엔진을 사용하는 것에 대한 질문이 있습니다.사용자 구성 요소 내에서 "보기 단순"볼트 템플릿 사용

사용자 구성 요소 (Phalcon \ Mvc \ User \ Component 형식으로 확장) 용 클래스를 작성했습니다.

public function renderPath() 
{ 
    $view = $this->getDi()->getView(); 

    $simpleView = new \Phalcon\Mvc\View\Simple; 
    $simpleView->setViewsDir($view->getViewsDir().'components/'); 

    $render = $simpleView->render($this->key.'/path'); 

    return $render; 
} 

그래서, 나는 그것이 viewsDir의 취득 및 간단한 뷰에 대한 경로로 사용하기 위해 현재보기의 구성 요소를 가져 오기 : 그것은 간단한 뷰를 렌더링하는 방법이있다.

이 초기화는 정상적으로 작동하지만 "* .volt"를 렌더링 할 수 있기를 원한다면 phtml 파일 렌더링 만 제공합니다.

볼트 템플릿 ($simpleView->registerEngines(['.volt' => 'volt']);) 용 엔진을 등록하면 Phalcon \ Mvc \ View \ Exception "응용 프로그램 서비스를 얻으려면 종속성 인젝터 컨테이너가 필요합니다."가 표시됩니다.

그러나 $simpleView->setDi($this->getDi());을 실행하여 뷰의 DI를 setDI로 변경하면 예외가 발생하지 않고 출력 ($ render === null)도 표시되지 않습니다. 그러나 캐시 디렉토리에서 볼트 템플릿이 컴파일 된 것을 볼 수 있습니다.

은 내가 사용하는이 코드 구성 요소를 등록하려면 다음

$di->set('catalogComponent', function() { 
     $component = new \ABLib\Components\CatalogComponent; 
     $component->setCatalogProvider(); 

     return $component; 
    }, true); 

및보기를 렌더링 : {{ this.catalogComponent.renderPath() }}

그래서, 문제는 내가 잘못 무엇인가? 내 구성 요소에서 볼트 템플릿 엔진을 어떻게 사용할 수 있습니까?

업데이트 :

이 문제를 해결하기 위해 관리. 불행히도, 나는 그것이 왜 작동하는지 전혀 모른다. 그래서, 내 응용 프로그램에서 나는 다음과 같은 코드를 사용 : 다음

$simpleView = new \Phalcon\Mvc\View\Simple; 
$simpleView->setDI($this->getDI()); 
$simpleView->registerEngines(array(
    '.volt' => function ($view, $di) { 
     $volt = new VoltEngine($view, $di); 
     $volt->setOptions(array(
      'compiledPath' => BASE_PATH.'/cache/', 
      'prefix' => 'volt_', 
     )); 

     return $volt; 
    } 
)); 

와보기를 렌더링하는 $simpleView->render()를 호출합니다. 이해할 수없는 것 - 서비스가있는 템플릿 엔진을 추가 할 때 왜 작동하지 않습니다. 그러나 새로운 정의를 추가하면 모든 작업이 시작됩니다.

+1

모두 읽지는 않았지만 마지막으로 생각합니다. '{{catalogComponent.renderPath()}}'('this'가없는) - 표준 볼트/뷰 설정을 사용할 때입니다. – jodator

+0

네, 맞습니다. 그것을 제거하십시오. – vansanblch

답변

1

볼트 렌더 엔진을 간단한보기에 연결하려고 할 때 같은 문제가 발생했습니다. 이전에 종속성 삽입 서비스에 등록한 볼트 인스턴스를 재사용하려고했을 때 이상한 결과를 얻었습니다. 이것은 볼트 엔진을 인스턴스화 할 때보기를 전달해야하기 때문입니다. 엔진은 볼트 엔진이 초기에 연결된보기와 단단히 결합되어야합니다. 결과적으로 Phalcon \ Mvc \ View보기에서 Phalcon \ Mvc \ View \ Simple보기와 동일한 결과를 얻지 못합니다. 나는 간단한 뷰를 렌더링 할 때만 사용하고자하는 추가 볼트 서비스를 선언함으로써이 문제를 극복했습니다. 두 서비스는 위의 동일하지만,보기 유형의 의존성 주입 보인다

// setup 'volt' engine 
$di->set('volt', function($view, $di) use ($config) { 
    $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di); 
    $volt->setOptions(
     array(
      'compiledPath'  => CACHE_PATH . '/views/', 
      'compiledExtension' => '.compiled', 
      'compiledSeparator' => '%%', 
      'compileAlways'  => true, // performance decrease 
      'stat'    => true, 
     ) 
    ); 
    return $volt; 
}, true); 

// setup 'simple_volt' engine for simple rendering 
$di->set('simple_volt', function($simple_view, $di) use ($config) { 
    $volt = new \Phalcon\Mvc\View\Engine\Volt($simple_view, $di); 
    $volt->setOptions(
     array(
      'compiledPath'  => CACHE_PATH . '/views/', 
      'compiledExtension' => '.compiled', 
      'compiledSeparator' => '%%', 
      'compileAlways'  => true, // performance decrease 
      'stat'    => true, 
     ) 
    ); 
    return $volt; 
}, true); 

어떻게 렌더링의 차이를 만들기 위해 : 나는 표준 뷰와 내 첫 번째 볼트 서비스와 간단한 전망을 내 두 번째 볼트 서비스를 사용 엔진이 작동합니다. 간단한보기를 렌더링하고 출력을 변수에 저장할 필요가있을 때 볼트 렌더 엔진의 간단한 버전으로 등록해야합니다.

// create a simple view to help render sections of the page 
$simple_view = new \Phalcon\Mvc\View\Simple(); 
$simple_view->setViewsDir(__DIR__ . '/../views/'); 
$simple_view->setDI($this->di); 
$simple_view->registerEngines(array(
    ".volt" => 'simple_volt' 
)); 

// use the simple view to generate some html 
$data_object = $my_data_model->getData(); 
$data_html = $simple_view->render('index/dataview',array('data_object'=>$data_object)); 

// pass the rendered simple view as a variable into the regular view 
$this->view->setVar('data_html',$data_html); 
관련 문제