Layouts
v4O layout é a casca da página (menu, CSS, rodapé). O conteúdo da view entra em$content. A pasta no tema é _layouts/.
💡Underline = peça do tema
Pastas com _ no início são estrutura do tema, não páginas:_layouts (casca) e _components (pedaços reutilizáveis).
No handler
protected string $layout = '_layouts.app';
return $this->view('user.info', $data)->title('Minha Conta');_layouts.app vira themes/{tema}/_layouts/app.mucrm.php. Se o arquivo antigo layouts/ ainda existir, o engine também tenta esse caminho.
Layout mínimo
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title><?= title() ?></title>
<meta name="description" content="<?= description() ?>">
<link rel="stylesheet" href="<?= e(theme_src('css/style.css')) ?>">
<?= stack_styles() ?>
</head>
<body>
<?= view('_components.navigation') ?>
<main>
<?= $content ?? '' ?>
</main>
<?= stack_scripts() ?>
</body>
</html>title() e description() já vêm escapados. Defina no handler com ->title('Título', 'Descrição', $imagemOg).
CSS e JS extras
O layout imprime as pilhas. A view da página empilha o que for específico dela.
| Helper | Onde | Função |
|---|---|---|
| stack_styles() | Layout (<head>) | Imprime o CSS empilhado |
| stack_scripts() | Layout (fim do body) | Imprime o JS empilhado |
| push_style / push_script | View da página | Adiciona HTML na pilha |
| plug_style / plug_script | View do módulo | CSS/JS de app/modules/{mod}/views/assets/ |
<?php
push_style('<link rel="stylesheet" href="' . e(theme_src('css/pagina.css')) . '">');
push_script('<script src="' . e(src('js/pagina.js')) . '"></script>');
plug_style('shop', 'css/shop.css');
plug_script('shop', 'js/shop.js', ['defer' => 'defer']);
?>Layouts do projeto
| Alias | Arquivo |
|---|---|
| _layouts.app | themes/default/_layouts/app.mucrm.php |
| panels.admin._layouts.app | themes/panels/admin/_layouts/app.mucrm.php |
| panels.admin._layouts.auth | themes/panels/admin/_layouts/auth.mucrm.php (login) |