O framework PHP por trás do SitioYa

Documentação do Koshkil

Núcleo

Views, temas e widgets

Temas

Um tema é uma pasta de webroot/themes/ com os templates Smarty e os recursos de uma aparência. O site público usa o definido em Templates.Theme; o painel usa inspinia (definido pelo AdminSuperController).

webroot/themes/<tema>/
├── css/  js/  img/             recursos (Koshkil::getThemePath('css/theme.css'))
└── templates/
    ├── front/                  templates do site ($templateFolder = "front")
    │   ├── main.tpl            layout
    │   ├── index/index.tpl     IndexController::index()
    │   └── cuentas/…
    ├── admin/                  templates do painel
    ├── widgets/
    │   └── front/header.tpl    widget THeader do grupo "front"
    └── error/                  error.tpl, error404.tpl, error4xx.tpl, error500.tpl

Para criar um tema novo, copie um existente (por exemplo brillare) e altere Templates.Theme na configuração do domínio.

Onde os templates são procurados

A view procura primeiro em templates/<templateFolder>/ e depois em templates/. Assim, index/index.tpl é resolvido em templates/front/index/index.tpl, e error/error404.tpl em templates/error/. Dentro de um plugin, são usados os templates de plugins/<plugin>/webroot/templates/.

Os templates compilados ficam em tmp/cache/view/<tema>/.

O layout

Controller::$templateFile (normalmente main.tpl) é a página completa. Recebe em $template o template da ação e o inclui:

{* templates/front/main.tpl *}
<!DOCTYPE html>
<html lang="pt">
<head>
  <meta charset="utf-8">
  <title>{if $webpageTitle}{$webpageTitle} · {/if}{Configure::read('Web.SiteName')}</title>
  <link rel="stylesheet" href="{Koshkil::getThemePath('css/theme.css')}">
  {foreach Configure::read('styles') as $style}<link rel="stylesheet" href="{$style}">{/foreach}
  <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  <script>var MAIN_URL='{Koshkil::GetLink('/')}';</script>
</head>
<body>
  {html_widget type="front.header"}
  <main{if $data_controller} data-controller="{$data_controller}"{/if}>
    {html_include file="{$template}"}
  </main>
  {html_widget type="front.footer"}
  {html_widget type="front.scripts"}
</body>
</html>

Nos templates estão disponíveis todas as variáveis definidas com $this->set(), além de $usuario (se houver sessão), $Response e $_SERVER. As classes estáticas podem ser chamadas diretamente: {Koshkil::getLink('/')}, {Configure::read('Web.SiteName')}.

Scripts e estilos por página

O controlador adiciona arquivos que o layout e o widget de scripts imprimem:

WebElements::addScript(Koshkil::getThemePath('js/productos.js'));
WebElements::addScript('https://www.google.com/recaptcha/api.js');
WebElements::addScript('/js/primeiro.js', true);   // no início da lista
WebElements::addStyle('/css/plugins/datatables.css');

Eles se acumulam em Configure::read('scripts') e Configure::read('styles') sem duplicados. Com Debug.Javascript em false, se existir arquivo.min.js, essa versão é usada.

Widgets

Um widget é um componente de interface com lógica e template próprios: cabeçalho, rodapé, menu, busca…

{html_widget type="front.header"}
{html_widget type="admin.uploads" name="galeria"}
{html_widget type="plugins.noticias.front.noticias"}   {* widget de um plugin *}
type Classe Arquivo Template
front.header THeader src/Widgets/front/THeader.php templates/widgets/front/header.tpl
admin.uploads TUploads src/Widgets/admin/TUploads.php templates/widgets/admin/uploads.tpl
plugins.noticias.front.noticias TNoticias plugins/noticias/src/Widgets/Front/TNoticias.php plugins/noticias/webroot/templates/widgets/front/noticias.tpl
<?php
// src/Widgets/front/TDestacados.php
Koshkil::Uses('sys.web.TWidget');
Koshkil::UsesModel('productos');

class TDestacados extends TWidget {
    public function run() {
        $quantidade = intval($this->parameters['cantidad'] ?? 4);
        $this->set([
            'destacados' => TMProductos::where('prd_destacado', '1')->take($quantidade)->get(),
        ]);
    }
}
{html_widget type="front.destacados" cantidad=6}

O widget executa create(), init() e run(); init() configura as pastas de templates, então, se sobrescrevê-lo, chame parent::init(). Os parâmetros da tag chegam em $this->parameters, e o template também recebe todas as variáveis do controlador.

Plugins de Smarty incluídos

Ficam em src/Smarty/plugins/ e são registrados automaticamente.

Tag Tipo Uso
{html_include file="…"} função Inclui um template relativo à pasta do tema; se não existir, exibe error/error404.tpl. Aceita plugin="nome".
{html_widget type="…"} função Executa um widget.
{t key="…" domain="…"} função Tradução (veja Internacionalização).
{trans}chave{/trans} bloco Tradução em bloco.
{rule_or_role roles="…" rules="…"}…{/rule_or_role} bloco Exibe o conteúdo somente se o usuário tiver o papel ou a regra.
{field_maxlength model="…" field="…"} função Imprime maxlength="N" de acordo com o tamanho da coluna.
{call_method name="…"} função Chama um método público do controlador.
{include_plugins folder="…"} função Inclui os templates dessa pasta de todos os plugins ativos.
{include_plugins_scripts file="…"} função Imprime o <script> desse arquivo em todos os plugins ativos.
|t modificador Tradução: {'save'|t} (domínio common).
|formatdate:"DD/MM/YYYY" modificador Formato de data com nomes em espanhol (DDDD, MMMM, HH, mm…).
|elapsed modificador Tempo decorrido desde uma data.
|excerpt:120 modificador Resumo de um texto.
|slug modificador Texto próprio para URL.
|decamelize, |php_strtolower, |php_ucwords, |replace_str modificadores Utilitários de texto.
|php_json_encode, |php_base64_encode modificadores Codificação.
|gravatar modificador URL do avatar Gravatar de um e-mail.

Para adicionar os seus, crie src/Smarty/plugins/function.minhafuncao.php (ou modifier., block.) com a função smarty_function_minhafuncao($params, $template).

Escape o que vem do usuário

O Smarty não escapa por padrão. Use {$variavel|escape} para todo texto digitado por usuários.