2013-03-24 11 views
13

Ho un modello rametto dove vorrei verificare se un elemento inizia con un certo valore"Inizia con" in Twig modello

{% if item.ContentTypeId == '0x0120' %} 
    <td><a href='?parentId={{ item.Id }}'>{{ item.BaseName }}</a><br /></td> 
{% else %} 
    <td><a href='?{{ item.UrlPrefix }}'>{{ item.LinkFilename }}</a></td> 
{% endif %} 

Il 0x0120 può guardare così o essere più complesso come questo 0x0120D52000D430D2B0D8DD6F4BBB16123680E4F78700654036413B65C740B168E780DA0FB4BX. L'unica cosa che voglio fare è assicurarmi che inizi con 0x0120.

La soluzione ideale sarebbe quella di risolvere questo utilizzando regex ma non sono a conoscenza se Twig supporta questo?

Grazie

risposta

18

Sì, Ramoscello supporta le espressioni regolari in paragoni: http://twig.sensiolabs.org/doc/templates.html#comparisons

Nel tuo caso sarebbe:

{% if item.ContentTypeId matches '/^0x0120.*/' %} 
    ... 
{% else %} 
    ... 
{% endif %} 
+0

Cool! C'è un modo per recuperare tutti gli elementi dell'array che corrispondono a un'espressione regolare? witout {% per l'elemento nell'array%} ?? – juanmf

+6

Questo non è corretto; questo dovrebbe essere ''/^0x0120. * /'' o simile. La stringa viene passata direttamente a 'preg_match' di PHP, che si aspetta quei delimitatori extra. – Timwi

+0

Puoi usare 'inizia con' ora, vedi risposta sotto. – benske

1

si può sempre fare il proprio filtro che esegue il confronto necessario.

Come per il docs:

Quando chiamato da Twig, PHP callable riceve il lato sinistro del filtro (prima che il tubo |) come primo argomento e gli argomenti extra passati al filtro (entro parentesi()) come argomenti aggiuntivi.

Quindi, ecco un esempio modificato.

Creazione di un filtro è semplice come l'associazione di un nome con un PHP callable:

// an anonymous function 
$filter = new Twig_SimpleFilter('compareBeginning', function ($longString, $startsWith) { 
    /* do your work here */ 
}); 

Quindi, aggiungere il filtro per l'ambiente di Twig:

$twig = new Twig_Environment($loader); 
$twig->addFilter($filter); 

E ecco come usarlo in un modello:

{% if item.ContentTypeId | compareBeginning('0x0120') == true %} 
{# not sure of the precedence of | and == above, may need parentheses #} 

Io non sono un ragazzo di PHP, quindi non so come PHP fa regex, ma la funzione anonima sopra è stato progettato per restituire true se $longString inizia con $startsWith. Sono sicuro che lo troveresti banale da implementare.

6

È possibile utilizzare semplicemente il filtro slice.Semplicemente fare:

{% if item.ContentTypeId[:6] == '0x0120' %} 
{% endif %} 
66

è possibile farlo direttamente in Twig ora:

{% if 'World' starts with 'F' %} 
{% endif %} 

"End with with" è supportato anche:

Esistono anche
{% if 'Hello' ends with 'n' %} 
{% endif %} 

Altre parole chiave a portata di mano:

complessi confronti di stringhe:

{% if phone matches '{^[\\d\\.]+$}' %} {% endif %} 

(Nota: doppi backslash vengono convertiti in una barra rovesciata dal ramoscello)

String contiene:

{{ 'cd' in 'abcde' }} 
{{ 1 in [1, 2, 3] }} 

Vedere ulteriori informazioni qui: http://twig.sensiolabs.org/doc/templates.html#comparisons