2012-05-14 9 views
6

Zwykle używam Zend Framework i jest to coś, czego brakuje mi w literze. Częściowe. W widoku jest metoda renderowania, w której możesz użyć elementów, które są najbliżej.Części w licie

<?php $this->_render('element', 'form); ?> 

To działa, jednak wymaga, aby plik form.html.php znajdował się w folderze/views/elements. Czy można pozwolić mu szukać innej ścieżki? Podobnie jak/views/users /, więc dostaje plik /views/users/form.html.php.

Próbowałem następujące, ponieważ dowiedziałem się, że render method przyjmuje argument opcji, w którym można określić ścieżkę. Zrobiłem więc pomocnika, aby rozwiązać ten problem dla mnie.

namespace app\extensions\helper; 
use lithium\template\TemplateException; 

class Partial extends \lithium\template\Helper 
{ 
public function render($name, $folder = 'elements', $data = array()) 
{ 
    $path = LITHIUM_APP_PATH . '/views/' . $folder;  
    $options['paths']['element'] = '{:library}/views/' . $folder . '/{:template}.{:type}.php'; 

    return $this->_context->view()->render(
     array('element' => $name), 
     $data, 
     $options 
    ); 
} 
} 

Jednak nadal wyszukuje tylko w folderze/view/elements, a nie w podanej ścieżce.

Czy jest coś, co robię źle?

Odpowiedz

2

Naprawiono. Działa jak marzenie. Zend like Partials in Lithium.

<?php 

namespace app\extensions\helper; 

use lithium\template\View; 

class Partial extends \lithium\template\Helper 
{ 

    public function render($name, $folder = 'elements', array $data = array()) 
    { 

     $view = new View(array(
      'paths' => array(
       'template' => '{:library}/views/' . $folder . '/' . $name . '.{:type}.php' 
      ) 
     )); 

     return $view->render('all', $data); 

    } 

} 

Może być stosowany w szablonach jak:

<?php echo $this->partial->render('filename', 'foldername', compact('foo', 'bar')); ?> 
11

Dlaczego przy użyciu wtyczek, gdy te rzeczy można zrobić z nadzieją przez Lithium :-)

nie wiem Zend, ale tutaj jest exemple do skonfigurowania domyślnych elementów ścieżki w różny sposób, aby załadować je z odpowiedniego widoku folder, zamiast udostępnionej ścieżki.

A dodajmy jeszcze jedno: chcemy odróżnić elementy/partials od normalnego widzenia, przez dodanie un podkreślenia do nazwy pliku (mimiczne Rails partials)

Pierwsze, rekonfiguracji medialne bootstrap proces (konfiguracja/ładujący/media.php)

Media::type('default', null, array(
    'view' => 'lithium\template\View', 
    'paths' => array(
     'layout' => '{:library}/views/layouts/{:layout}.{:type}.php', 
     'template' => '{:library}/views/{:controller}/{:template}.{:type}.php', 
     'element' => array(
      '{:library}/views/{:controller}/_{:template}.{:type}.php', 
      '{:library}/views/elements/{:template}.{:type}.php' 
     ) 
    ) 
)); 

Następnie, należy to

Załóżmy kontroler Documents. Zadzwoń na widoku:

<?= $this->_render('element', 'foo', $data, array('controller' => 'documents')); ?> 

to będzie szukał pliku wewnątrz views/documents/_foo.html.php a jeśli nie istnieje, awaryjne do /views/elements/foo.html.php

Ten rodzaj prostego ponownej konfiguracji domyślnych ramowych, można zrobić w Lithium na kilka plików (domyślne ścieżki kontrolerów do tworzenia przestrzeni nazw, ścieżek widoków, bibliotek itp.)

Kolejny przykład na ponowne odwzorowanie ścieżek szablonów, dzięki czemu możesz mieć takie rzeczy jak pages/users_{username}.php zamiast domyślnego Litu: https://gist.github.com/1854561

+0

Jak zwykle, rozwiązanie jest prostsze/łatwiejsze i mniej inwazyjne niż to przychodzi na myśl. :) – Oerd

+0

Lithium Media klasy jest jedną z jego głównych funkcji. To naprawdę jest tak potężne –