Conteúdo condicional
Um bloco Conteúdo condicional (tipo CONDITIONAL) faz a lição adaptar-se ao formando. Agrupa blocos em ramos, e cada ramo tem uma condição sobre o que o formando fez numa simulação do mesmo conteúdo: quantos pontos obteve, a que final chegou, uma variável que a simulação guarda. O formando vê os blocos do primeiro ramo cuja condição se cumpre; se nenhuma se cumprir, vê os do ramo final, Senão.
Usos típicos: um texto de reforço só para quem terminou mal, uma felicitação para quem chegou ao melhor final, um passo seguinte diferente consoante uma decisão.
O que precisa primeiro
As condições leem simulações, pelo que o conteúdo precisa de pelo menos uma:
- Um bloco de código incorporado com um pacote carregado que envie progresso ou uma nota.
- Um identificador de simulação nesse bloco, único no conteúdo (minúsculas, algarismos e
_, começando por uma letra, por exemplosim_u1). A condição refere-se à simulação por esse identificador. - Essa simulação tem de estar fora de qualquer ramo. Uma simulação dentro de um ramo não pode ser nomeada, nem marcada como Avaliável (estaria oculta e nunca terminaria).
Montá-lo no editor
Criar o bloco
Na folha de inserção, Conteúdo condicional está na família Estrutura. Nasce com um ramo de condição vazio, que não se cumpre até escrever a sua condição, e o ramo Senão. Não é oferecido a partir do ponto de inserção de um ramo (só há um nível) nem no editor de exames ou de bancos.
O quadro e os seus ramos
Na tela, o bloco é um quadro. Em cima tem a etiqueta Conteúdo condicional e, ramo a ramo, o resumo da condição por palavras («Ramo 1: mostra-se se sim_u1.trust é maior ou igual a 3»). Por baixo há uma zona por ramo: os de condição pela sua ordem e Senão no fim, cada um com a sua etiqueta (Ramo 1, Ramo 2…, Senão) e os seus blocos.
- Adicionar um ramo, no pé do quadro, adiciona um ramo de condição (até 10).
- O cabeçalho de cada ramo de condição tem botões para o subir, descer e retirar. Reordenar muda o ramo que se verifica primeiro; nenhum bloco muda de ramo.
- Retirar um ramo vazio retira-o sem mais. Se tiver blocos, o editor pergunta: Retirar com os blocos ou Manter os blocos, que ficam na lição logo a seguir ao conteúdo condicional, sempre visíveis (nunca passam para outro ramo).
- Um ramo vazio mostra «Este ramo ainda não tem blocos» e o botão Adicionar um bloco. Cada ramo tem, além disso, o seu próprio ponto de inserção.
Pôr e tirar blocos
- A arrastar: largue um bloco sobre um bloco de um ramo para o pôr nesse sítio, ou sobre a zona de um ramo (mesmo vazio) para o pôr no fim. Ao arrastar o quadro move o conteúdo condicional com todos os seus ramos.
- Sem arrastar (com o teclado ou em ecrãs estreitos): na barra do bloco, Mover para… lista cada ramo de cada conteúdo condicional da lição (com o seu número se houver vários) e, a partir de um ramo, Fora do condicional, que o deixa logo a seguir. O bloco entra no fim do ramo.
- Subir e Descer movem um bloco dentro do seu ramo. Os blocos de um ramo são numerados por ramo: «Ações do bloco 2 (ramo 1)».
Eliminar, duplicar e modelos
- Eliminar o bloco num conteúdo condicional com blocos pergunta: Eliminar com os blocos ou Manter os blocos (ficam na lição, no seu sítio e sempre visíveis). As duas opções podem ser anuladas com Anular.
- Duplicar o bloco duplica o conteúdo condicional com todos os seus ramos e blocos. Um bloco duplicado dentro de um ramo fica nesse ramo.
- Ao escolher blocos para um modelo ou para a IA, o conteúdo condicional leva os seus blocos; um bloco de um ramo não se escolhe sozinho. Um modelo colado a partir de um ramo entra nesse ramo.
A condição de cada ramo
Editar o bloco abre o painel do conteúdo condicional, com uma parte por ramo de condição:
- O campo Condição do ramo N, onde se escreve a condição (consulte «Escrever uma condição» mais abaixo). Se não se entender, aparecem por baixo o motivo e o carácter onde a leitura parou, por exemplo «Não se esperava «)» no carácter 12»; se se entender, o resumo por palavras, o mesmo do cabeçalho do quadro.
- Os avisos desse ramo (consulte «Avisos» a seguir).
- Um assistente que a escreve por si. Escolha a Simulação (as desta lição e as das outras lições do conteúdo que estão fora de qualquer ramo), a Variável (as que o pacote declara, com o seu tipo, e as do resultado:
grade,score,maxScore,endingekind), a Comparação e o Valor (uma caixa para verdadeiro ou falso, um número, um texto paraendinge uma lista comgood,mixedebadparakind) e carregue em Adicionar à condição. Se já havia algo escrito, escolha antes se se une com e (&&, cumprem-se as duas) ou com ou (||, basta uma). Se o pacote não declarar as suas variáveis, pode escrever o nome à mão, com um aviso de que não é possível verificá-lo. O assistente escreve a comparação onde tem o cursor no campo (ou no lugar do texto selecionado), deixa o cursor logo a seguir e devolve-lhe o foco; se o campo ainda não teve o cursor, acrescenta-a no fim.
Avisos
O que faria com que um ramo nunca se mostrasse, ou que uma simulação não funcionasse, aparece como aviso no painel e em Verificações, com a etiqueta Conteúdo. Os avisos nunca impedem guardar, exportar nem partilhar:
- nenhum ramo tem blocos, nem «Senão»;
- um ramo não tem condição, ou tem uma que não se entende;
- uma condição lê uma simulação que não está no conteúdo (acontece ao copiar entre conteúdos) ou uma variável que o seu pacote não declara;
- uma condição lê variáveis de uma simulação cujo pacote não envia o seu estado (
state); - uma condição usa uma variável com um tipo que não admite essa operação, segundo o que o pacote declara (por exemplo, comparar com um número uma variável de verdadeiro ou falso);
- a simulação está depois do conteúdo condicional na ordem de leitura: quando o formando lá chega, ainda não a jogou;
- uma simulação Avaliável está dentro de um ramo, ou uma simulação de um ramo é lida por alguma condição.
Um assistente ligado por MCP recebe estes mesmos avisos em warnings ao criar o bloco, alterá-lo ou mover blocos.
Escrever uma condição
Uma condição é uma expressão curta que é verdadeira ou falsa. Lê variáveis escritas como simulação.nome:
sim_u1.reused
sim_u1.trust >= 3
sim_u1.kind == "good" && sim_u1.grade >= 70
!(sim_u1.reused) || sim_u2.ending == "agreement"
Variáveis
| Nome | O que contém | Tipo |
|---|---|---|
grade | A classificação (0–100) que o pacote enviou | número |
score | A pontuação que o pacote enviou | número |
maxScore | A pontuação máxima | número |
ending | O identificador do final alcançado | texto |
kind | good, mixed ou bad | texto |
| qualquer outro nome | Uma variável que o pacote guarda no seu estado (por exemplo trust) | número ou verdadeiro/falso |
grade, score, maxScore, ending e kind estão reservados: leem sempre o último resultado que o pacote enviou. Os restantes nomes são as variáveis que o pacote declara no seu slxd-embed.json; pergunte a quem construiu o pacote quais oferece.
Operadores
| O quê | Como | Exemplo |
|---|---|---|
| Comparar números | < <= > >= | sim_u1.trust >= 3 |
| Igual / diferente | == != | sim_u1.kind != "bad" |
| E | && | sim_u1.trust >= 3 && sim_u1.reused |
| Ou | || | sim_u1.kind == "good" || sim_u1.grade > 80 |
| Não | ! | !sim_u1.reused |
| Somar / subtrair | + - | sim_u1.score + sim_u2.score >= 10 |
| Agrupar | ( ) | (a.x || b.y) && c.z |
- Os números escrevem-se com um ponto decimal opcional (
3,2.5), sem expoente. Os negativos usam-. - Os textos vão entre aspas duplas:
"good". No interior, só\"e\\são especiais, e não há quebras de linha. trueefalseestão disponíveis como valores.- Não há conversões: não se pode comparar um número com um texto, e um texto só se compara com outro texto, com
==ou!=.sim_u1.trust == "3"é um erro. - As comparações não se encadeiam:
1 < sim_u1.trust < 3é um erro; escrevasim_u1.trust > 1 && sim_u1.trust < 3. &&e||param assim que a resposta é conhecida, como em JavaScript.- A expressão inteira tem de ser verdadeira ou falsa.
Limites
Uma condição tem no máximo 500 carateres. Se escrever algo que não se entende, o editor indica o carácter onde parou.
Vários ramos e «Senão»
Um bloco Conteúdo condicional pode ter até 10 ramos com condição, mais o ramo Senão, que existe sempre e não tem condição. Os ramos são verificados por ordem e ganha o primeiro cuja condição se cumpre; por isso, ponha primeiro o mais específico:
sim_u1.kind == "good" && sim_u1.trust >= 3→ felicitaçãosim_u1.kind == "good"→ breve comentário positivo- Senão → reforço
Os blocos dentro de um ramo são blocos normais: de qualquer tipo e em qualquer número. Regras a ter em conta:
- Um só nível: um bloco Conteúdo condicional não pode estar dentro de um ramo de outro.
- Uma condição pode nomear até 8 simulações diferentes.
- Um ramo pode estar vazio.
Nunca em exames nem em bancos de perguntas. O conteúdo condicional só está disponível em lições normais. O editor não o oferece em exames nem em bancos, uma lição que o contenha não pode ser convertida em exame nem movida para um banco, e o mesmo acontece por MCP.
O que vê o formando
O formando só vê os blocos do ramo que se aplica, no seu lugar, como se o bloco Conteúdo condicional não existisse. Os outros ramos não existem para ele: não contam para o progresso, não o travam e não enviam xAPI.
Alguns pormenores:
- Um ramo só pode cumprir-se quando as simulações que lê terminaram. Uma simulação termina quando o seu pacote avisa que acabou (
complete, ou um estado final). Até lá, essas condições são falsas e o formando vê o ramo seguinte ou Senão. Se uma variável ainda não existir, ou tiver outro tipo, essa condição também é falsa. - É reavaliado em direto. Se o formando repetir uma simulação e o resultado mudar, a lição atualiza-se. Os leitores de ecrã recebem um aviso cortês de que o conteúdo mudou; o foco não se move.
- O que já foi feito mantém-se. Se o ramo visível mudar acima de onde o formando está, um bloqueio pendente dentro do novo ramo continua a ter de ser cumprido, e o que já estava concluído continua concluído.
- Ao voltar (SCORM): se o formando deixou a lição dentro de um ramo que já não se aplica, retoma no início do ramo que se aplica, ou no bloco seguinte se estiver vazio.
- As variáveis do pacote são guardadas com o progresso do formando. Se o progresso não couber no espaço do LMS, o Creator protege as variáveis que as condições leem.
Pré-visualização
Os autores precisam de ver todos os ramos, não apenas o que corresponde ao seu teste.
- Na pré-visualização, numa versão (instantâneo) e na revisão, a barra tem o interruptor Mostrar todos os ramos. Ativado, o leitor mostra todos os ramos um a seguir ao outro, em ordem de leitura: os ramos do bloco condicional por ordem e depois Senão, sem aviso. Na revisão, abrir um comentário de uma lição que tenha conteúdo condicional ativa-o.
- Só nesta vista, cada ramo leva à frente uma etiqueta com o resumo por palavras da sua condição («Ramo 1: mostra-se se sim_u1.trust for pelo menos 3») ou Senão, e o ramo que o formando veria neste momento leva ainda uma linha que o diz. O formando nunca vê estas etiquetas.
- As ligações partilhadas não têm o interruptor: mostram o que o formando vê.
O PDF é material de consulta sem formando, pelo que imprime todos os ramos, em ordem de leitura. Antes do primeiro bloco de cada ramo imprime o rótulo «Mostrado se: …» com a condição escrita por extenso, no idioma do curso (por exemplo, sim.trust é maior ou igual a 3 e sim.reused é verdadeiro; se não puder ser lida, tal como a escreveu), e «Mostrado se nenhuma das condições anteriores se cumprir» antes de Senão. Os ramos vazios não são rotulados.
Perceber os erros de uma condição
O painel assinala uma condição que não se entende com o motivo e o carácter onde a leitura parou, e avisa de uma simulação que não existe no conteúdo. Quando um assistente escreve o bloco por MCP, a condição inteira é ainda verificada contra as regras acima antes de se guardar o que quer que seja. Erros típicos:
| Problema | Exemplo | Correção |
|---|---|---|
| Texto comparado com um número | sim_u1.ending == 3 | sim_u1.ending == "agreement" |
| Número comparado com um texto | sim_u1.trust == "3" | sim_u1.trust == 3 |
| Variável de verdadeiro/falso comparada com um número | sim_u1.reused == 3 | sim_u1.reused |
!, && ou || sobre um número, ou ordenar verdadeiro e falso | !sim_u1.trust | sim_u1.trust == 0 |
! sobre um texto | !sim_u1.kind | sim_u1.kind != "bad" |
| Comparação encadeada | 1 < sim_u1.trust < 3 | sim_u1.trust > 1 && sim_u1.trust < 3 |
| Nem verdadeira nem falsa | sim_u1.trust + 1 | sim_u1.trust + 1 > 3 |
| Simulação que não existe ou que está dentro de um ramo | sim_x.trust | use o identificador de uma simulação fora de qualquer ramo |
Se o pacote declara o tipo das suas variáveis (número ou verdadeiro/falso), o painel e o MCP verificam também que as usa com esse tipo: sim_u1.reused == 3 é um erro se reused for verdadeiro/falso. Uma variável que o pacote não declara não se pode verificar.
Próximos passos
- Pacotes incorporados e simulações: como um pacote envia o seu estado e a sua nota.
- Bricks de Conteúdo: o bloco de código incorporado e a sua nota.
- Servidor MCP: criar conteúdo condicional com um assistente.