Exemplos de `BOUCLE(DATA)`

Alguns exemplos de loops (DATA) permitidos pelos iteradores do SPIP.

  • Apparu en : SPIP 3.0

Fazer loop numa matriz

Pode-se executar um loop arbitrariamente numa matriz, como as devolvidas pelas seguintes tags: #ARRAY, #GET, #SESSION etc.

Loop nos dados da sessão do utente logado:

<BOUCLE_session(DATA){source table,#SESSION}>
#CLE: #VALEUR <br>
</BOUCLE_session> 

Loop numa matriz contendo palavras definidas com #SET / #GET [1] :

<BOUCLE_palavra(DATA){source table,#GET{mots}}>
#VALEUR 
</BOUCLE_palavra>

Loop em qualquer matriz contendo cores:

<BOUCLE_cores(DATA)
  {tabela fonte,#ARRAY{0,#ARRAY{cor,verde},1,#ARRAY{cor,azul}}}
  {"<br>"}
>
  [(#VALEUR{cor})] est équivalent à [(#COR)]
</BOUCLE_cores>

Resultado:

verde é equivalente a verde
azul é equivalente a azul

Nota: quando #VALEUR é uma matriz, pode-se aceder a #VALEUR{minha_chave} que é equivalente a #MINHA_CHAVE

Listar os plugins ativos

O formato da fonte plugins não requer um conjunto de dados de entrada.

Loop:

<BOUCLE_pl(DATA){source plugins}>
#VALEUR
</BOUCLE_pl>

Resultado:

crayons memoization icalendar

Filtrar os dados com {cle==...}

Vamos iterar sobre a tag #CONFIG que contém todos os elementos de configuração do site registados na tabela spip_meta.

Como a tag #CONFIG é uma matriz de dados, vamos empregar o formato table. Um critério {cle==version} filtra a matriz retendo apenas os valores de configuração cuja chave contenha a palavra «versão».

Loop:

<BOUCLE_cfg(DATA){source table, #CONFIG*}{cle==versão}>
  <dt>#CLE</dt>
  <dd>#VALEUR</dd>
</BOUCLE_cfg>

Resultado:

versão_instalada
16428
revisões_base_versão
1.1
indexação_base_versão
0.4
...

Listar o conteúdo de um diretório

A função glob() do PHP permite listar os arquivos correspondentes a uma máscara; ela foi transposta pelo loop (DATA).

Loop que lista por ordem alfabética os subdiretórios de IMG:

<BOUCLE_diretorios(DATA){source ls, #CHEMIN{IMG}/*/}{par basename}>
    [(#VAL{Y-m-d H:i:s}|date{#MTIME})] - [(#FILE)] - [(#FILENAME)]<br>
</BOUCLE_diretorios>

Resultado:

2018-02-28 17:33:25 - IMG/gif
2018-02-28 18:44:14 - IMG/jpg
2018-02-28 17:33:20 - IMG/png

Loop que lista por data inversa os 3 ficheiros mais recentes de IMG/jpg:

<BOUCLE_ficheiros(DATA){source ls, #CHEMIN{IMG}/jpg/*.jpg}
    {!par mtime}
    {0,3}
>
    [(#VAL{Y-m-d H:i:s}|date{#MTIME})] - [(#FILE)] <br>
</BOUCLE_ficheiros>

Resultado:

2018-02-28 18:45:39 - IMG/jpg/IMG011.jpg
2018-02-23 12:22:15 - IMG/jpg/IMG003.jpg
2018-02-23 12:21:47 - IMG/jpg/IMG004.jpg 

Listar os ficheiros correspondentes a uma máscara

A função preg_files do SPIP permite listar os ficheiros segundo uma expressão regular e hierarquicamente. [2]

Exemplo: os ficheiros plugin.xml do site.

Loop:

<BOUCLE_xml(DATA){source pregfiles, #EVAL{_DIR_RACINE}, plugin.xml$, 5}>
#VALEUR[ - (#VAL{Y-m-d H:i:s}|date{#VALEUR|filemtime})]
</BOUCLE_xml>

Resultado:

../plugins/a2a/plugin.xml - 2011-04-16 20:47:02
../extensions/simplog/plugin.xml - 2010-09-05 16:08:39
../extensions/vertebres/plugin.xml - 2011-03-19 16:49:51
../extensions/z-core/plugin.xml - 2010-09-05 16:08:47

Ler um ficheiro CSV

Vamos agora exibir um ficheiro no formato CSV que se encaontra no nosso disco duro. O ficheiro moradas.csv contém um catálogo de moradas:

Fil,Philippe,fil@rezo.net,http://rezo.net/
Marcimat,Matthieu,marcimat@rezo.net,http://marcimat.magraine.net/

Loop:

<BOUCLE_csv(DATA){source csv, moradas.csv}
{par /3}
{"<br>"}>
#VALEUR{0} : #VALEUR{3}
</BOUCLE_csv>

Resultado:

Marcimat: http://marcimat.magraine.net/
Fil: http://rezo.net/

Nota: o critério de ordenação {par /3} permite ordenar pela coluna n° 3, contendo as moradas web. O / inicial é obrigatório no caso duma ordenação por uma chave numérica ou iniciando por um número.

Na demonstração de CSV fornecida com o plugin iteradores, encontra-se um exemplo bem mais completo que permite gerir corretamente as chaves do ficheiro CSV, e mesmo de ordenar ou de fundir nestas chaves.

Um documento Google (spreadsheet)

No Google Documents é possível «Partilhar > Publicar um documento». Uma vez isso feito, pode-se recuperar a morada do documento no formato CSV e exibí-lo no formato de uma tabela HTML.

Boucle :

#SET{key,0AolUP3c6K9JodGwxRjJzb2hyTGZLU29qRVItRXk1VXc}
<B_csv>
<table border="1">
<BOUCLE_csv(DATA){source csv, https://spreadsheets.google.com/pub?key=#GET{key}&hl=en&dsds&output=csv}
>
<tr>
<td>#VALEUR{0}</td>
<td>#VALEUR{1}</td>
<td>#VALEUR{2}</td>
</tr>
</BOUCLE_csv>
</table>
</B_csv>

Resultado:

País PIB População
Remitânia 12 1
Baldoguistão 23 2
Repúblicas Unidas 43 3
Diloduristão 12 4
Zarlátia 9 5

Outros modos de extração são possíveis, notadamente sob a forma de lista ou de células:

Lista:

Remitânia  pib: 12, população: 1
Baldoguistão  pib: 23, população: 2
...

Células:

A2: Remitânia
B2: 12
C2: 1
A3: Baldoguistão
B3: 23
C3: 2
...

Uma página HTML

Ler uma página HTML, isolar uma linha com uma determinada marcação e selecionar um valor interessante para exibí-lo corretamente? É possível! Vamos exibir o número de seguidores numa conta twitter.

Boucle :

#SET{followers,'data-nav="followers"'}
<BOUCLE_followers(DATA){source file, https://twitter.com/spip}{valeur == #GET{followers}}>
[<span title="[(#VALEUR|match{title="(.*)",1}|strtolower)]">(#VALEUR|match{title="(.*)",1}|replace{ seguidores}|trim|replace{ \d+$, k})</span>]
</BOUCLE_followers>

Resultado:
1 k

Um serviço web no formato YAML

O site http://per.sonn.es/ oferece uma API que permite ler cada perfil no formato YAML. Vamos interrogar o site sobre um dos seus perfis e percorrer o resultado para exibir a lista de amigos da pessoa em causa.

Comecemos por analizar o meu perfil (na morada http://per.sonn.es/Fil.yaml) :

name: Fil
sex: F
birthday: '1966-08-17'
job: Calorifugeur
friends:
  - 'Maude Guérin'
  - 'Zohra Robin'
  - 'Pierre-Yves Philippe'
  - 'Lauriane Bertin'
  - 'Jeannine Pichon'
  - 'Vanessa Michel'
  - 'Wendy Allard'
...
city: 'Mouxy (Rhone-Alpes)'

Se carregarmos esta morada com o formato yaml, obtemos uma matriz de dados um pouco mais complexa que no exemplo precedente. Com efeito, certos itens são strings de caracteres, outros, como a lista de amigos, são listas de strings.

(name => Fil, sex => F, friends => ( Maude Guérin, Zohra Robin, ...), ... ).

Vamos percorrer estes dados:

Boucle :

<BOUCLE_yaml(DATA){source yaml, http://per.sonn.es/Fil.yaml}>
<dt>#CLE</dt>
<dd>[(#VALEUR|print)]</dd>
</BOUCLE_yaml>

Resultado:

name
Fil
sex
F
birthday
1966-08-17
job
Calorifugeur
friends
Maude Guérin, Zohra Robin, Pierre-Yves Philippe, Lauriane Bertin, Jeannine Pichon, Vanessa Michel, Wendy Allard, Sylvie Michaud, Gwenaël Voisin, Paule Mary, Maia Ribeiro, Josianne François, Lucas Fernandes
...

Agora, queremos fazer um loop nos amigos do Fil. Para isso, há duas possibilidades. A primeira consiste em recuperar os dados com o nosso loop (DATA) no formato yaml e, em seguida, armazenar a matriz de amigos numa variável que iremos percorrer com um outro loop (DATA), desta vez no formato table:

Loop:

<BOUCLE_yaml2(DATA){source yaml, http://per.sonn.es/Fil.yaml}{cle=friends}>
  <BOUCLE_friends(DATA){source table, #VALEUR}{" - "}>
    #VALEUR
  </BOUCLE_friends>
</BOUCLE_yaml2>

Resultado:

Maude Guérin - Zohra Robin - Pierre-Yves Philippe - Lauriane Bertin - Jeannine Pichon - Vanessa Michel - Wendy Allard - Sylvie Michaud - Gwenaël Voisin - Paule Mary - Maia Ribeiro

O critério {datapath ...}

Percebemos no exemplo acima que, quanto mais a matriz de dados é complexa, mais difícil será codificar os loops que terão que ser aninhados. É aqui que entra o critério {datapath ...}, que permite indicar ao loop (DATA) o caminho (no sentido de Xpath) para a matriz de dados que nos interessa [3].

Com esta tag, a nossa lista de amigos é obtida com um único loop (e podemos aproveitar para incluir uma paginação):

Loop:

<BOUCLE_yaml3(DATA)
  {source yaml, http://per.sonn.es/Fil.yaml}
  {datapath friends}
  {" - "}{pagination 10}
>
  #VALEUR
</BOUCLE_yaml3>
#PAGINATION
</B_yaml3>

Resultado:

Maude Guérin - Zohra Robin - Pierre-Yves Philippe - Lauriane Bertin - Jeannine Pichon - Vanessa Michel - Wendy Allard - Sylvie Michaud - Gwenaël Voisin - Paule Mary
0 | 10 | 20 | 30 | 40 | ...

Uma API em json

Para exibir miniaturas do Instagram (do tempo em que o Instagram oferecia uma API json, mas esta funcionalidade foi removida):

<BOUCLE_instagram(DATA)
  {source json, https://www.instagram.com/explore/tags/squirrel/?__a=1}
  {datapath graphql/hashtag/edge_hashtag_to_media/edges}
>
  <BOUCLE_images(DATA){source table,#VALEUR}{!par taken_at_timestamp}>
    <a href="#DISPLAY_URL">[(#THUMBNAIL_SRC|balise_img)]</a>
  </BOUCLE_images>
</BOUCLE_instagram>

Resultado:

Um ficheiro XML

O plugin «citations aléatoires» do SPIP-Zone contém um ficheiro de citações, no formato XML (http://zone.spip.org/trac/spip-zone/browser/_plugins_/citation_aleatoire/trunk/citations/citations_fr.xml). O loop (DATA) permite explorá-lo diretamente:

Loop:

[(#REM) Recuperar o ficheiro em formatotxt da zona - é melhor gravá-lo localmente no servidor]
[(#SET{c,http://zone.spip.org/trac/spip-zone/browser/_plugins_/citation_aleatoire/trunk/citations/citations_fr.xml?format=txt})]

<dl>
<BOUCLE_cite(DATA)
{source xml, #GET{c}}
{par hasard}{0,1}
>
[<dt>(#VALEUR{0/auteur/0})</dt>]
[<dd>(#VALEUR{0/texte/0})</dd>]
</BOUCLE_cite>
</dl>

Resultado (aleatório):

O ideal, quando se quer ser admirado, é estar morto.
(Michel Audiard)

Usar um serviço web como YQL — Yahoo Query Language)

YQL é um serviço web que permite interrogar de modo simples diversos sites como google, twitter, flickr etc. Com o loop (DATA), o SPIP facilita grandemente a sua integração sob a forma de loops Consulte http://zzz.rezo.net/Exemples-de-bou....

Os iteradores PHP

O SPIP é capaz de usar os iteradores padrão do PHP. É conveniente consultar a documentação do PHP, que é normalmente bem sucinta, e verificar se os iteradores em questão estão disponíveis no seu sistema.

Notemos, por exemplo, DirectoryIterator, que permite listar os ficheiros de um diretório:

Loop:

<pre>
<BOUCLE_ls(php:DirectoryIterator){args IMG/jpg/}
  {pagination 10}
  {valeur!==^\.}{valeur==\.jpg$}
>[(#VAL{Y-m-d H:i:s}|date{#GETMTIME})] / #VALEUR
</BOUCLE_ls>
</pre>
#PAGINATION
</B_ls>

Resultado:

2008-02-01 23:27:23 / arton2135.jpg
2008-08-21 11:12:58 / DSC03420.jpg
2008-08-21 11:13:11 / DSC03421.jpg
2009-08-27 11:20:11 / hash-1.jpg
2009-08-27 11:20:04 / hash.jpg

Convém indicar ao SPIP que se trata de um iterador PHP, indicando (php:...) antes do nome do iterador

O critério {args xx,yy} define os argumentos que serão passados ao iterador na sua inicialização. Para o DirectoryIterator, trata-se do caminho do diretório a listar.

Os métodos deste iterador (ver a classe DirectoryIterator) estão disponíveis no formato de loops (aqui, #GETMTIME).

Nota: para listar o conteúdo do diretório, o formato glob do loop (DATA) é sem dúvida mais fácil de usar do que este iterador PHP.
<BOUCLE_ls(DATA){source ls, IMG/jpg/*.jpg} {!par mtime}> ...

Um calendário no formato iCalendar/ics

Esta funcionalidade requer a ativação do plugin iCalendar. É possível iterar sobre os eventos de um calendário publicado no formato iCalendar/ics. A matéria dedicada, no SPIP-Contrib em plugin icalendar oferece um exemplo completo.

Notas

[1Ver: #SET e #GET

[2Mais versátil mas mais lenta que glob.

[3Para ajudá-lo a determinar o datapath, você pode visualizar a matriz de dados inserindo o código [<pre>(#VALEUR|print_r{1})</pre>] no seu loop data/

Autor Ricardo Porto Publié le :

Traductions : English, français, Nederlands, Português