# Views

Não é nada usual retornar uma simples string após receber uma requisição e por isso deve-se utilizar as views agregadas às rotas e controllers para tornar a resposta mais útil.

As views podem ser desenvolvidas em `/resources/views` e devem ser criadas em `.html`. É possível também receber variáveis que serão alteradas no conteúdo final:

```php
namespace App\Controllers\Pages;

use \App\Utils\View;

class Product {
    public static function getProduct($req, $res) {
        $content = View::render('pages/product', [
            'name' => "Produto nome",
            'description' => "Produto descrição"
        ]);
        return $res->send(200, $content);
    }
}
```

Arquivo `/resources/view/pages/product.html`:

```markup
<h1>{{name}}</h1>
<p>{{description}}</p>

<!-- <h1>Produto nome</h1> -->
<!-- <p>Produto descrição</p> -->
```

### Padronizando páginas

É possível utilizar a classe já criada `Page` para popular páginas com conteúdos padrões como o header, navbar e footer:

```php
namespace App\Controllers\Pages;

use \App\Utils\View;

class Product extends Page {
    public static function getProduct($req, $res) {
        $content = View::render('pages/product', [
            'name' => "Produto nome",
            'description' => "Produto descrição"
        ]);
        $content = parent::getPage("Produto Título", $content);
        
        return $res->send(200, $content);
    }
}
```

Com uso da classe `Page` o `$content` irá conter a junção dos arquivos `page.html`, `header.html` e `footer.html` (já existentes em `/resources/view/pages`).

É possíve também adicionar novos arquivos padrões para cabeçalho e rodapé, podendo por exemplo criar diferentes cabeçalhos para a área pública e área administrativa:

```php
$content = parent::getPage("Produto Título", $content, [
    'header' => 'header-admin',
    'footer' => 'footer-admin'
]);
```

Caso deseje que o header e footer não sejam inseridos, defina-os como `false`.

{% hint style="info" %}
Os arquivos devem ser criados em `resources/views/pages` para que sejam identificados na função `getPage()`.
{% endhint %}

### Variáveis padrões

O arquivo `define.php` define algumas variáveis padrões para uso nas views:

```php
View::define([
    'URL'     => URL,
    'PUBLIC'  => URL . '/public'
]);
```

{% hint style="info" %}
Adicione as variáveis padrões para utiliza-las em toda criação de view.
{% endhint %}

As variáveis padrões facilitam na inserção de dados importantes para usabilidade, por exemplo:

```markup
{{URL}} <!-- URL base do projeto -->
{{PUBLIC}} <!-- URL dos arquivos públicos -->
```

A inserção de uma mídia ou link pode ser feito da seguinte maneira:

```markup
<img src="{{PUBLIC}}/assets/img/php-logo.png" />

<a href="{{URL}}"><button>Início</button></a>
<a href="{{URL}}/products"><button>Produtos</button></a>
```
