Conteúdo condicional

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:

  1. Um bloco de código incorporado com um pacote carregado que envie progresso ou uma nota.
  2. Um identificador de simulação nesse bloco, único no conteúdo (minúsculas, algarismos e _, começando por uma letra, por exemplo sim_u1). A condição refere-se à simulação por esse identificador.
  3. 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, ending e kind), a Comparação e o Valor (uma caixa para verdadeiro ou falso, um número, um texto para ending e uma lista com good, mixed e bad para kind) 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

NomeO que contémTipo
gradeA classificação (0–100) que o pacote enviounúmero
scoreA pontuação que o pacote enviounúmero
maxScoreA pontuação máximanúmero
endingO identificador do final alcançadotexto
kindgood, mixed ou badtexto
qualquer outro nomeUma 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êComoExemplo
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.
  • true e false estã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; escreva sim_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:

  1. sim_u1.kind == "good" && sim_u1.trust >= 3 → felicitação
  2. sim_u1.kind == "good" → breve comentário positivo
  3. 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ê.

PDF

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:

ProblemaExemploCorreção
Texto comparado com um númerosim_u1.ending == 3sim_u1.ending == "agreement"
Número comparado com um textosim_u1.trust == "3"sim_u1.trust == 3
Variável de verdadeiro/falso comparada com um númerosim_u1.reused == 3sim_u1.reused
!, && ou || sobre um número, ou ordenar verdadeiro e falso!sim_u1.trustsim_u1.trust == 0
! sobre um texto!sim_u1.kindsim_u1.kind != "bad"
Comparação encadeada1 < sim_u1.trust < 3sim_u1.trust > 1 && sim_u1.trust < 3
Nem verdadeira nem falsasim_u1.trust + 1sim_u1.trust + 1 > 3
Simulação que não existe ou que está dentro de um ramosim_x.trustuse 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

Conteúdo condicional