Enviar datos desde el controlador a phtml

22

Tengo este controlador:

...
public function insertAction() {
    $something = 'testcase';
    $this->loadLayout();
    $this->_title($this->__("the title"));
    $this->renderLayout();
}
...

Me gustaría acceder $somethingen mi documento .phtml, ¿cómo hago esto? (o para decirlo de otra manera: ¿cómo puedo acceder $somethingen mi archivo .phtml)

Bob van Luijt
fuente

Respuestas:

21

Hay un par de formas de hacer esto.

Asignar directamente al bloque:

$block->assign($var);

o

$block->assign(array('myvar'=>'value','anothervar'=>true));

Luego puede acceder a él en el archivo phtml de esta manera:

$this->myvar

Use el registro de Mage:

Mage::register('custom_var', $var);

y luego úsalo como:

$var = Mage::registry('custom_var');
philwinkle
fuente
2
has utilizado $block->assign($var)pero ¿cómo se recuperaría en el phtmlarchivo?
Mohammad Faisal
Usted podrá acceder a través $this->myvardel interior del archivo de plantilla
philwinkle
1
Creo que es Mage::register($key, $value, ...). Por lo tanto, Mage::register('custom_var', $var)?
musicliftsme
44
Debería ser $block->assign('myvar',$var);, ¿no?
fritzmg
@philwinkle ¿ Mage::register('custom_var', $var); Escribe el valor en la sesión y se puede acceder a este desde otro archivo de plantilla, excepto la plantilla de acción actual también?
Mariposa
18

Su phtml debe estar representado por un bloque. El bloque debe tener un nombre en el diseño.
Puedes hacer esto después de llamar$this->loadLayout();

$block = Mage::app()->getLayout()->getBlock('block_name_here')
if ($block){//check if block actually exists
   $block->setSomething($something);
}

Entonces puede obtener el valor en el phtmlarchivo como

$value = $this->getSomething();
//or 
$value = $this->getData('something');
Marius
fuente
esto no funciona para mí :(, tengo un controlador que devuelve la identificación del producto a través de AJAX, para una vista rápida de los productos.
Shathish
@Shathish. Este es un problema diferente. Puede procesar la respuesta como JSON y usar los valores en el controlador de respuestas AJAX.
Marius
Sí, estoy usando JSON para devolver el contenido del bloque (something.phtml) y actualizar el div con estos detalles en la página de lista, ¿cómo puedo pasar la variable de mi controlador a something.phtml? en realidad hago esto actualmente usando el método $ block-> asignar (), que creo que no es la forma correcta (ya que es un acoplamiento estrecho, corrígeme si estoy equivocado) o ¿publicaré esto como una pregunta?
Shathish
@ Shathish tal vez harías otra pregunta y espero que no se marque como duplicado.
Marius
3

En caso de que ustedes se hayan perdido, hay una forma más de hacer esto

usando sesiones

Mage::getSingleton('core/session')->setSomeSessionVar($data);// In the Controller
$data = Mage::getSingleton('core/session')->getSomeSessionVar(); // In the View;

fuente

epynic
fuente
Incluso si tiene los datos en la sesión para usarlos más tarde, le recomiendo usar $block->setSomething()o $block->assign(). Esto se siente como "demasiado código" y debe evitarse la mayor cantidad de php posible.
Fabian Blechschmidt
-1

Si estás dentro de tu controlador de bloque.

class module_namespace_Block_example extends Mage_Core_Block_Template 
{
      protected $_var;

     public function __construct(){

         $this->_var = "something"; 


     }
}

Luego en su archivo .phtml

   <?php 
        $variable = $this->_var;
        echo $variable; // prints "something"

   ?>

   <h1>You're inside your phtml file...... <?php echo $variable;  //prints "something" ?></h1>
Wolfgang
fuente
Lo que llamas "controlador de bloque" se llama simplemente "bloque" en Magento. La pregunta era sobre las acciones del controlador que se encuentran en el controllersdirectorio de un módulo.
Fabian Schmengler
-4

Es muy fácil enviar datos desde el controlador al archivo phtml.

Paso 1: - Primero crea la clase Modelo y se extiende desde Varien_Object

class Namespace_Modulename_Model_Modelfilename extends Varien_Object
{

}

Paso 2: - Ahora abre el archivo contoller y coloca el código en la función.

$name='gaurav';
$this->loadLayout();
Mage::getSingleton('Modulename/Modelfilename')->setData('name',$name);
$this->renderLayout();

Paso 3: - Abre el archivo phtml y pon el código.

echo $name=Mage::getSingleton('Modulename/Modelfilename')->getData('name');

Salida: - 'gaurav';

gaurav tyagi
fuente