Ver celdas

Muchas aplicaciones tienen pequeños fragmentos de vista que se pueden repetir de una página a otra o en diferentes lugares de las páginas. Suelen ser cuadros de ayuda, controles de navegación, anuncios, formularios de inicio de sesión, etc. Higgs le permite encapsular la lógica de estos bloques de presentación dentro de Ver celdas. Básicamente son minivistas que se pueden incluir en otras vistas. Pueden tener lógica incorporada para manejar cualquier lógica de visualización específica de la celda. Se pueden utilizar para hacer que sus vistas sean más legibles y fáciles de mantener separando la lógica de cada celda en su propia clase.

Células simples y controladas

Higgs admite dos tipos de celdas de visualización: simples y controladas.

Celdas de vista simple se pueden generar a partir de cualquier clase y método de su elección y no tiene que seguir ninguna regla, excepto que debe devolver una cadena.

Las celdas de vista controlada deben generarse a partir de una clase que extienda la clase Higgs\View\Cells\Cell, lo que proporciona capacidades adicionales que hacen que sus celdas de vista sean más flexibles y rápidas de usar.

Llamar a una celda de vista

No importa qué tipo de celda de vista esté utilizando, puede llamarla desde cualquier vista usando la función auxiliar view_cell().

El primer parámetro es (1) el nombre de la clase y el método (Celda simple) o (2) el nombre de la clase y el método opcional (Celda controlada) a llamar, y el segundo parámetro es una matriz o cadena de parámetros para pasar al método:

// In a View.

// Simple Cell
<?= view_cell('App\Cells\MyClass::myMethod', ['param1' => 'value1', 'param2' => 'value2']) ?>

// Controlled Cell
<?= view_cell('App\Cells\MyCell', ['param1' => 'value1', 'param2' => 'value2']) ?>

La cadena que devuelve la celda se insertará en la vista donde se encuentra Se llamó a la función view_cell().

Omisión del espacio de nombres

Nuevo en la versión 7.0.0.

Si no incluye el espacio de nombres completo para la clase, se asumirá que se puede encontrar en el espacio de nombres App\Cells. Entonces, el siguiente ejemplo intentaría encontrar la clase MyClass en app/Cells/MyClass.php. Si no se encuentra allí, se escanearán todos los espacios de nombres hasta encontrarlo, buscando dentro de un subdirectorio Células de cada espacio de nombres:

// In a View.
<?= view_cell('MyClass::myMethod', ['param1' => 'value1', 'param2' => 'value2']) ?>

Pasar parámetros como cadena clave/valor

También puede pasar los parámetros como una cadena de clave/valor:

// In a View.
<?= view_cell('MyClass::myMethod', 'param1=value1, param2=value2') ?>

Celdas simples

Las celdas simples son clases que devuelven una cadena del método elegido. Un ejemplo de una celda de mensaje de alerta simple podría verse así:

<?php

namespace App\Cells;

class AlertMessage
{
    public function show(array $params): string
    {
        return "<div class=\"alert alert-{$params['type']}\">{$params['message']}</div>";
    }
}

Lo llamarías desde una vista como:

// In a View.
<?= view_cell('AlertMessage::show', ['type' => 'success', 'message' => 'The user has been updated.']) ?>

Además, puede utilizar nombres de parámetros que coincidan con las variables de parámetros en el método para una mejor legibilidad. Cuando lo usas de esta manera, todos los parámetros siempre deben especificarse en la llamada de la celda de vista:

// In a View.
<?= view_cell('Blog::recentPosts', 'category=Higgs, limit=5') ?>
<?php

// In a Cell.

namespace App\Cells;

class Blog
{
    // ...

    public function recentPosts(string $category, int $limit): string
    {
        $posts = $this->blogModel->where('category', $category)
            ->orderBy('published_on', 'desc')
            ->limit($limit)
            ->get();

        return view('recentPosts', ['posts' => $posts]);
    }
}

Células controladas

Nuevo en la versión 7.0.0.

Las células controladas tienen dos objetivos principales: (1) hacer que la construcción de la célula sea lo más rápida posible y (2) proporcionar lógica adicional y flexibilidad a sus puntos de vista, si lo necesitan.

La clase debe extender Higgs\View\Cells\Cell. Deberían tener un archivo de vista. en la misma carpeta. Por convención, el nombre de la clase debe estar en PascalCase con el sufijo Cell y la vista debe ser la versión en formato serpiente del nombre de la clase, sin el sufijo. Por ejemplo, si tiene una clase MyCell, el archivo de vista debería ser mi.php.

Nota

Prior to v7.3.5, the generated view file ends with _cell.php. Though v7.3.5 and newer will generate view files sin el sufijo _cell, los archivos de vista existentes aún se ubicarán y cargarán.

Crear una celda controlada

En el nivel más básico, todo lo que necesitas implementar dentro de la clase son propiedades públicas. Estas propiedades estarán disponibles para el archivo de visualización automáticamente.

La implementación del AlertMessage desde arriba como una celda controlada se vería así:

<?php

// app/Cells/AlertMessageCell.php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class AlertMessageCell extends Cell
{
    public $type;
    public $message;
}
// app/Cells/alert_message.php
<div class="alert alert-<?= esc($type, 'attr') ?>">
    <?= esc($message) ?>
</div>
// Called in main View:
<?= view_cell('AlertMessageCell', 'type=warning, message=Failed.') ?>

Generando celda mediante comando

También puede crear una celda controlada mediante un comando integrado desde la CLI. El comando es php spark make:cell. Se necesita un argumento, el nombre de la celda a crear. El nombre debe estar en PascalCase y la clase se creará en el directorio app/Cells. El archivo de vista también se creará en el directorio app/Cells.

php spark make:celda AlertMessageCell

Usando una vista diferente

Puede especificar un nombre de vista personalizado configurando la propiedad view en la clase. La vista se ubicará como lo haría normalmente cualquier vista:

<?php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class AlertMessageCell extends Cell
{
    public $type;
    public $message;

    protected string $view = 'my/custom/view';
}

Personaliza el renderizado

Si necesita más control sobre la representación del HTML, puede implementar un método render(). Este método le permite realizar lógica adicional y pasar datos adicionales a la vista, si es necesario. El método render() debe devolver una cadena.

Para aprovechar todas las características de las celdas controladas, debe usar $this->view() en lugar de la función auxiliar normal view():

<?php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class AlertMessageCell extends Cell
{
    public $type;
    public $message;

    public function render(): string
    {
        return $this->view('my/custom/view', ['extra' => 'data']);
    }
}

Propiedades calculadas

Si necesita realizar lógica adicional para una o más propiedades, puede utilizar propiedades calculadas. Estos requieren configurar la propiedad como protegida o privada e implementar un método público cuyo nombre consiste en el nombre de la propiedad rodeado por get y Property:

// In a View. Initialize the protected properties.
<?= view_cell('AlertMessageCell', ['type' => 'note', 'message' => 'test']) ?>
<?php

// app/Cells/AlertMessageCell.php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class AlertMessageCell extends Cell
{
    protected $type;
    protected $message;
    private $computed;

    public function mount(): void
    {
        $this->computed = sprintf('%s - %s', $this->type, $this->message);
    }

    public function getComputedProperty(): string
    {
        return $this->computed;
    }

    public function getTypeProperty(): string
    {
        return $this->type;
    }

    public function getMessageProperty(): string
    {
        return $this->message;
    }
}
// app/Cells/alert_message.php
<div>
    <p>type - <?= esc($type) ?></p>
    <p>message - <?= esc($message) ?></p>
    <p>computed: <?= esc($computed) ?></p>
</div>

Importante

You can’t set properties that are declared as private during cell inicialización.

Métodos de presentación

A veces es necesario realizar lógica adicional para la vista, pero no desea pasarla como parámetro. Puede implementar un método que se llamará desde la propia vista de la celda. Esto puede ayudar a mejorar la legibilidad de sus vistas:

<?php

// app/Cells/RecentPostsCell.php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class RecentPostsCell extends Cell
{
    protected $posts;

    public function linkPost($post): string
    {
        return anchor('posts/' . $post->id, $post->title);
    }
}
// app/Cells/recent_posts.php
<ul>
    <?php foreach ($posts as $post): ?>
        <li><?= $this->linkPost($post) ?></li>
    <?php endforeach ?>
</ul>

Realizar la lógica de configuración

Si necesita realizar lógica adicional antes de que se represente la vista, puede implementar un método mount(). Este método se llamará justo después de crear una instancia de la clase y se puede utilizar para establecer propiedades adicionales o realizar otra lógica:

<?php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class RecentPostsCell extends Cell
{
    protected $posts;

    public function mount(): void
    {
        $this->posts = model('PostModel')->orderBy('created_at', 'DESC')->findAll(10);
    }
}

Puede pasar parámetros adicionales al método mount() pasándolos como una matriz a la función auxiliar view_cell(). Cualquiera de los parámetros enviados que coincidan con un nombre de parámetro del método mount() se pasará:

<?php

// app/Cells/RecentPostsCell.php

namespace App\Cells;

use Higgs\View\Cells\Cell;

class RecentPostsCell extends Cell
{
    protected $posts;

    public function mount(?int $categoryId): void
    {
        $this->posts = model('PostModel')
            ->when(
                $categoryId,
                static fn ($query, $categoryId) => $query->where('category_id', $categoryId)
            )
            ->orderBy('created_at', 'DESC')
            ->findAll(10);
    }
}
// Called in main View:
<?= view_cell('RecentPostsCell', ['categoryId' => 5]) ?>

Almacenamiento en caché de celdas

Puede almacenar en caché los resultados de la llamada de vista de celda pasando el número de segundos para almacenar en caché los datos como tercer parámetro. Esto utilizará el motor de caché actualmente configurado:

// Cache the view for 5 minutes
<?= view_cell('App\Cells\Blog::recentPosts', 'limit=5', 300) ?>

Puede proporcionar un nombre personalizado para usar en lugar del generado automáticamente si lo desea, pasando el nuevo nombre como cuarto parámetro:

// Cache the view for 5 minutes
<?= view_cell('App\Cells\Blog::recentPosts', 'limit=5', 300, 'newcacheid') ?>