2012-05-14 15 views
6

normalmente uso el Zend Framework y esto es algo que echo de menos en litio. Parciales. Hay un método de renderizado en la vista donde puedes usar 'elementos' que es lo más cercano que tengo.Parciales de litio

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

Esto funciona, sin embargo, requiere que el archivo form.html.php está en la carpeta/views/elements. ¿Es posible dejar que busque en otro camino? Me gusta/views/users/entonces obtiene el archivo /views/users/form.html.php.

He intentado el siguiente, desde que me enteré de que el render method sí acepta un argumento opciones en donde se puede especificar una ruta. Así que hice un Helper para solucionar este problema.

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 
    ); 
} 
} 

Sin embargo, solo sigue buscando en la carpeta/view/elements, no en la ruta especificada.

¿Hay algo que estoy haciendo mal?

Respuesta

2

arreglaron. Funciona de maravilla. Zend como parciales en litio.

<?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); 

    } 

} 

Se puede utilizar en las plantillas como:

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

Por qué el uso de plugins cuando este material se espera que puedan hacerse por Lithium :-)

No sé Zend, pero aquí es un exemple para configurar elementos rutas predeterminadas de manera diferente, a cargarlos desde el punto de vista relacionados carpeta, en lugar de una ruta compartida.

Y vamos a añadir una cosa más: queremos diferenciar los elementos/parciales de una vista normal, añadiendo subrayado la ONU para el nombre del archivo (rieles imitan parciales)

En primer lugar, volver a configurar los medios de comunicación durante el arranque proceso (config/bootstrap/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' 
     ) 
    ) 
)); 

Entonces, lo utilizan

Supongamos que un controlador Documents. Invocan una vista:

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

Este buscará un archivo dentro de views/documents/_foo.html.php y si no existe, vuelve a los /views/elements/foo.html.php

Este tipo de sencilla reconfiguración de incumplimientos marco, se puede hacer de litio para un grupo de cosas (rutas de controladores predeterminadas para crear espacios de nombres, rutas de vista, bibliotecas, etc.)

Un ejemplo más para volver a mapear las rutas de plantilla para que pueda tener cosas como pages/users_{username}.php en lugar del valor predeterminado de litio: https://gist.github.com/1854561

+0

Como es habitual la solución es más simple/más fácil y menos intrusivo que viene a la mente. :) – Oerd

+0

La clase de litio Media es una de sus características principales. Realmente es tan poderoso –