Ir al contenido
Docs

Guía para desarrolladores

Sintaxis de plantillas v2

Las plantillas v2 son la sintaxis de plantillas recomendada en Zittme. Suma funciones propias de Zittme a las directivas estilo Blade y es compatible con la sintaxis v1 dentro del mismo archivo.

Declaración de versión

  • Archivos .html: @version(2) en la primera línea (o <config version="2" />)
  • Archivos .blade.php: v2 automáticamente (tu IDE puede resaltar la sintaxis)
@version(2)
<div class="my-skin">
	<h1>{{ $title }}</h1>
</div>

Salida

SintaxisSignificado
{{ $var }}Imprime con escape HTML (predeterminado)
{!! $var !!}Imprime tal cual, sin escape
{$var}Salida compatible con v1

Usa {!! !!} solo con HTML que el núcleo ya sanitizó, como el cuerpo del editor. Si imprimes la entrada del usuario tal cual, abres la puerta a XSS. El escape reconoce el contexto (HTML/JS) y se aplica automáticamente.

Filtros

Puedes encadenar |filtro a la salida, y conectar varios.

{{ $title|upper }}
{{ $timestamp|date:'Y-m-d' }}
{{ $price|number_format }}
{{ $tags|join:', ' }}

Filtros principales: autoescape escape noescape escapejs json strip_tags trim urlencode lower upper nl2br join:separator date:format number_format:decimals number_shorten link

Condiciones

@if ($is_logged)
	...
@elseif ($guest_allowed)
	...
@else
	...
@endif

También hay directivas de condición específicas.

DirectivaSignificado
@isset($var) ~ @endissetSi la variable existe
@empty($var) ~ @endemptySi está vacía
@admin ~ @endadminSi es el administrador principal
@auth ~ @endauthSi hay sesión iniciada (@auth('manager') es permiso de administración)
@guest ~ @endguestSi no hay sesión iniciada
@can('view') ~ @endcanSi tiene ese permiso (también se admiten @cannot y @canany([...]))
@desktop / @mobileDistinción por dispositivo

Bucles

@foreach ($list as $key => $item)
	<li>{{ $item->title }}</li>
@endforeach

@forelse ($list as $item)
	<li>{{ $item->title }}</li>
@empty
	<li>항목이 없습니다</li>
@endforelse

También se admiten @for @while @switch/@case/@break/@default @continue.

Dentro de un bucle puedes usar la variable $loop: $loop->index (desde 0) $loop->iteration (desde 1) $loop->count $loop->first $loop->last $loop->even $loop->odd $loop->depth $loop->parent

@foreach ($list as $item)
	<li class="@if ($loop->first) is-first @endif">{{ $loop->iteration }}. {{ $item->title }}</li>
@endforeach

Ayudantes de atributos HTML

<div @class(['base', 'is-on' => $active, 'is-mine' => $item->mine])>...</div>
<div @style(['color: red', 'display: none' => $hidden])>...</div>
<input type="checkbox" @checked($is_checked) />
<option value="1" @selected($val == 1)>하나</option>
<input @disabled($locked) @readonly($readonly) @required($must) />

La notación v1 checked="checked"|cond="..." sigue funcionando.

Código PHP

@php
$count = count($list);
$first = $count ? reset($list) : null;
@endphp

{@ $total = $count + 1; }
  • Las variables de plantilla son, por defecto, un estado compartido que hace referencia a Context. Si les antepones una barra invertida, como \$var, se vuelven variables locales solo de esa plantilla. En los parámetros de closures y en los enlaces use también se usa \$.
  • Dentro de {@ ... } también puedes abrir y cerrar bloques con el estilo foreach (...): / endforeach;.

Comentarios

{{-- 템플릿 주석: 출력에서 제거됩니다 --}}
<!--// v1 스타일 주석: 역시 제거됩니다 -->
<!-- 일반 HTML 주석: 출력에 남습니다 -->

Atención: escribe siempre los comentarios {{-- --}} en una sola línea. Si ocupan varias líneas, el parser no puede eliminarlos por completo y puede producirse un error del servidor (500). Hubo caídas reales por este problema. Para explicaciones de varias líneas, usa comentarios HTML (<!-- -->).

Incluir otras plantillas

@include('_header')
@include('sub/box')
@include('_card', ['title' => $t, 'body' => $b])   {{-- 변수 전달 --}}

<include src="_promo" if="$show_promo" />          {{-- 조건부 포함 --}}
<include src="_banner" unless="$is_admin" />
  • Si pasas variables, la plantilla incluida usa solo las variables recibidas en lugar de Context (funciona como un componente).
  • La inclusión condicional se hace con los atributos if / when / cond / unless de la etiqueta <include>.
  • El <include target="..." /> de v1 también funciona.

Cargar recursos: @load

@load('css/skin.css')
@load('css/skin.scss', $vars)            {{-- SCSS 변수 전달 --}}
@load('js/skin.js')
@load('js/lazy.js', 'body')              {{-- body 끝에서 로드 --}}
@load('^/common/js/plugins/URI.js')      {{-- ^ 는 사이트 루트 --}}
@load('../lang/')                        {{-- 언어 파일 디렉터리 --}}
@unload('foo/bar.js')                    {{-- 로드 취소 --}}

Como argumentos adicionales puedes indicar media y orden para CSS, y head/body y orden para JS.

Generar URLs

<a href="@url('act', 'dispMemberInfo')">내 정보</a>
<a href="{{ getUrl('', 'mid', $mid, 'act', 'dispBoardWrite') }}">글쓰기</a>

@url(...) y getUrl(...) hacen lo mismo. Recuerda una sola regla.

  • Enlaces que solo cambian parámetros de la página actual (paginación, orden): sin primer argumento, getUrl('page', $n)
  • Enlaces a otra pantalla: pasa siempre '' como primer argumento para construir desde una URL vacía. Si no, se arrastran todos los parámetros de la solicitud actual.

Si la acción tiene una ruta declarada, se genera automáticamente una dirección corta.

Otras directivas

DirectivaSignificado
@csrfInserta el campo del token CSRF dentro del formulario
@json($array)Salida JSON segura para JS (reconoce el contexto automáticamente)
@lang('key')Imprime una cadena de idioma (@lang('module.key'))
@use('Namespace\Class', 'Alias')Declara un alias de clase. Después, {{ Alias::method() }}
@widget('widget_name', $args)Inserta un widget
@once ~ @endonceSe ejecuta una sola vez, incluso dentro de un bucle
@verbatim ~ @endverbatimEn este tramo no se interpreta la sintaxis de plantillas
@dump($var) / @dd($var)Salida de depuración (dd se detiene después de imprimir)
@push('name') ~ @endpush / @stack('name')Reúne contenido y lo imprime en un solo lugar
@error('validator_id') ~ @enderrorMuestra errores de validación del formulario

Lo que v2 no admite

  • La herencia de plantillas de Blade (@extends @yield @section) y los slots (@slot @inject)
  • La etiqueta <block> de v1 y los atributos loop/cond en etiquetas arbitrarias (excepto los atributos de condición de <include>)

Los archivos existentes que necesitan la sintaxis v1 puedes dejarlos como están. Evita mezclar las dos generaciones de sintaxis en un mismo archivo.

Trampas frecuentes en la práctica

Estos puntos salen de casos reales de fallas.

  • Prohibidos los comentarios {{-- --}} de varias líneas (consulta la sección de comentarios arriba). Son una causa habitual de errores 500 del servidor.
  • Para llamar directamente a un método estático desde la plantilla, declara un alias con @use y llama por el alias. Si llamas con la ruta completa del espacio de nombres dentro de un valor de atributo, la compilación puede fallar y producir enlaces rotos como %7B...%7D. Lo más seguro es pasar el valor desde el controlador con Context::set().
  • Context::set() sobrescribe la variable de solicitud del mismo nombre. Al leer valores de formulario en una acción proc, es más seguro leer $_POST directamente.
  • Especificidad de los selectores CSS: .wrap a { color: inherit } del CSS común es más fuerte que un simple .my-link nuevo. Si el color del enlace no se aplica, sube la especificidad, por ejemplo con .wrap a.my-link.