首页 \ 问答 \ ganesha < - > scorm 2004:choice controlmode?(ganesha <--> scorm 2004 : choice controlmode?)

ganesha < - > scorm 2004:choice controlmode?(ganesha <--> scorm 2004 : choice controlmode?)

我需要使用scorm 2004的选择控制模式,所以我做了这个非常基本的测试:

这是我的表现:

<?xml version="1.0" encoding="UTF-8"?>

<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:imsmd="http://ltsc.ieee.org/xsd/LOM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:imsss="http://www.imsglobal.org/xsd/imsss" xmlns:adlseq="http://www.adlnet.org/xsd/adlseq_v1p3" xmlns:adlnav="http://www.adlnet.org/xsd/adlnav_v1p3" identifier="MANIFEST-2F10A7A25FC691A6212BD9CB0B505D44" xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd http://ltsc.ieee.org/xsd/LOM lom.xsd http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd">
    <metadata>
        <schema>ADL SCORM</schema>
        <schemaversion>2004 3rd Edition</schemaversion>
    </metadata>
    <organizations default="ORG">
        <organization identifier="ORG" structure="hierarchical">
            <title>06 Navigation</title>
            <item identifier="page1" isvisible="true" identifierref="RES-page1">
                <title>page1</title>
                <item identifier="page2" isvisible="true" identifierref="RES-page2">
                    <title>page2</title>
                </item>
                <item identifier="page3" isvisible="true" identifierref="RES-page3">
                    <title>page3</title>
                </item>
                <imsss:sequencing>
                    <imsss:controlMode choice="true" choiceExit="false" flow="false" useCurrentAttemptObjectiveInfo="false" useCurrentAttemptProgressInfo="false"/>         
                </imsss:sequencing>
            </item>         
        </organization>
    </organizations>
    <resources>
        <resource identifier="RES-page1" adlcp:scormType="sco" type="webcontent" href="page1.html">
          <file href="page1.html" />
          <file href="js/jquery-1.8.3.min.js" />
          <file href="js/SCORM_API_wrapper.js" />
          <file href="js/lmsCommunication.js" />
        </resource>
        <resource identifier="RES-page2" adlcp:scormType="sco" type="webcontent" href="page2.html">
          <file href="page2.html" />
          <file href="js/jquery-1.8.3.min.js" />
          <file href="js/SCORM_API_wrapper.js" />
          <file href="js/lmsCommunication.js" />
        </resource>
        <resource identifier="RES-page3" adlcp:scormType="sco" type="webcontent" href="page3.html">
          <file href="page3.html" />
          <file href="js/jquery-1.8.3.min.js" />
          <file href="js/SCORM_API_wrapper.js" />
          <file href="js/lmsCommunication.js" />
        </resource>
    </resources>
</manifest>

在第1页,我连接到API并成功获取用户名。

点击后,我尝试使用此js代码转到第2页:

var scorm = pipwerks.SCORM;

$( document ).ready( init );

function init()
{
    scorm.version = "2004";

    connect();

    var learnerName = getValue( "cmi.learner_name" );

    $( "#Name" ).html( "Bonjour " + learnerName + " !!!" );

    $( "#goto2" ).click( goto2 );

    $( window ).unload( disconnect );
}

function goto2()
{
    if( getValue( "adl.nav.request_valid.choice.{target=page2}" ) == "true" )
    {
        setValue( 'adl.nav.request', '{target=page2}choice' );
        disconnect();
    }

    /* if( getValue( "adl.nav.request_valid.continue" ) == "true" )
    {
        setValue( 'adl.nav.request', 'continue' );
        disconnect();
    } */
}

function connect()
{
    if( !scorm.connection.isActive )
    {
        var isSuccess = scorm.init();               
        var msg = "Connexion : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function disconnect()
{
    if( scorm.connection.isActive )
    {
        var isSuccess = scorm.quit();               
        var msg = "Déconnexion : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function save()
{
    if( scorm.connection.isActive )
    {
        var isSuccess = scorm.save();               
        var msg = "Sauvegarde : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function getValue( parameter )
{
    var value = null;

    if( scorm.connection.isActive )
    {
        value = scorm.get( parameter );
        var msg = "Get " + parameter + " : " + ( ( value )? value : "échec" );
        var isSuccess = ( value )? true : false;
        log( msg, isSuccess );
    }

    return value;
}

function setValue( parameter, value )
{
    if( scorm.connection.isActive )
    {
        var isSuccess = scorm.set( parameter, value );
        var msg = "Set " + parameter + " = " + value + " : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function log( msg, isSuccess )
{
    $( "#console" ).append( "<div style=\"color:" + ( ( isSuccess )? "blue" : "orangered" ) + ";\">" + msg + "</div>" );
}

scorm.set('adl.nav.request','{target = page2} choice')不起作用,它返回一个空字符串。

为什么不起作用? 可能是js中的错误或清单中的错误树?

我没有成功找到好的语法,我不确定我的探索方式......


I need to use choice controlmode of scorm 2004, so I have done this very basic test :

This is my manifest :

<?xml version="1.0" encoding="UTF-8"?>

<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:imsmd="http://ltsc.ieee.org/xsd/LOM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:imsss="http://www.imsglobal.org/xsd/imsss" xmlns:adlseq="http://www.adlnet.org/xsd/adlseq_v1p3" xmlns:adlnav="http://www.adlnet.org/xsd/adlnav_v1p3" identifier="MANIFEST-2F10A7A25FC691A6212BD9CB0B505D44" xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd http://ltsc.ieee.org/xsd/LOM lom.xsd http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd">
    <metadata>
        <schema>ADL SCORM</schema>
        <schemaversion>2004 3rd Edition</schemaversion>
    </metadata>
    <organizations default="ORG">
        <organization identifier="ORG" structure="hierarchical">
            <title>06 Navigation</title>
            <item identifier="page1" isvisible="true" identifierref="RES-page1">
                <title>page1</title>
                <item identifier="page2" isvisible="true" identifierref="RES-page2">
                    <title>page2</title>
                </item>
                <item identifier="page3" isvisible="true" identifierref="RES-page3">
                    <title>page3</title>
                </item>
                <imsss:sequencing>
                    <imsss:controlMode choice="true" choiceExit="false" flow="false" useCurrentAttemptObjectiveInfo="false" useCurrentAttemptProgressInfo="false"/>         
                </imsss:sequencing>
            </item>         
        </organization>
    </organizations>
    <resources>
        <resource identifier="RES-page1" adlcp:scormType="sco" type="webcontent" href="page1.html">
          <file href="page1.html" />
          <file href="js/jquery-1.8.3.min.js" />
          <file href="js/SCORM_API_wrapper.js" />
          <file href="js/lmsCommunication.js" />
        </resource>
        <resource identifier="RES-page2" adlcp:scormType="sco" type="webcontent" href="page2.html">
          <file href="page2.html" />
          <file href="js/jquery-1.8.3.min.js" />
          <file href="js/SCORM_API_wrapper.js" />
          <file href="js/lmsCommunication.js" />
        </resource>
        <resource identifier="RES-page3" adlcp:scormType="sco" type="webcontent" href="page3.html">
          <file href="page3.html" />
          <file href="js/jquery-1.8.3.min.js" />
          <file href="js/SCORM_API_wrapper.js" />
          <file href="js/lmsCommunication.js" />
        </resource>
    </resources>
</manifest>

On page1, I connect to API and succeed to get username.

On click, I try to go to page 2 with this js code :

var scorm = pipwerks.SCORM;

$( document ).ready( init );

function init()
{
    scorm.version = "2004";

    connect();

    var learnerName = getValue( "cmi.learner_name" );

    $( "#Name" ).html( "Bonjour " + learnerName + " !!!" );

    $( "#goto2" ).click( goto2 );

    $( window ).unload( disconnect );
}

function goto2()
{
    if( getValue( "adl.nav.request_valid.choice.{target=page2}" ) == "true" )
    {
        setValue( 'adl.nav.request', '{target=page2}choice' );
        disconnect();
    }

    /* if( getValue( "adl.nav.request_valid.continue" ) == "true" )
    {
        setValue( 'adl.nav.request', 'continue' );
        disconnect();
    } */
}

function connect()
{
    if( !scorm.connection.isActive )
    {
        var isSuccess = scorm.init();               
        var msg = "Connexion : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function disconnect()
{
    if( scorm.connection.isActive )
    {
        var isSuccess = scorm.quit();               
        var msg = "Déconnexion : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function save()
{
    if( scorm.connection.isActive )
    {
        var isSuccess = scorm.save();               
        var msg = "Sauvegarde : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function getValue( parameter )
{
    var value = null;

    if( scorm.connection.isActive )
    {
        value = scorm.get( parameter );
        var msg = "Get " + parameter + " : " + ( ( value )? value : "échec" );
        var isSuccess = ( value )? true : false;
        log( msg, isSuccess );
    }

    return value;
}

function setValue( parameter, value )
{
    if( scorm.connection.isActive )
    {
        var isSuccess = scorm.set( parameter, value );
        var msg = "Set " + parameter + " = " + value + " : " + ( ( isSuccess )? "succès" : "échec" );
        log( msg, isSuccess );
    }
}

function log( msg, isSuccess )
{
    $( "#console" ).append( "<div style=\"color:" + ( ( isSuccess )? "blue" : "orangered" ) + ";\">" + msg + "</div>" );
}

the scorm.set( 'adl.nav.request', '{target=page2}choice' ) doesn't work, it return an empty string.

Why is it not working ? an error in js or a bad tree in manifest maybe ?

I'm not succeed to find the good syntax and I'm not sure anymore to what way I have explore...


原文:https://stackoverflow.com/questions/13503052
更新时间:2022-07-12 13:07

最满意答案

这是我在控制台应用程序中尝试过的,并按预期工作:

namespace Q7122388
{
    #region Imports

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity;
    using System.Linq;

    #endregion

    public class Product
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Category> Categories { get; set; }
    }

    public class Category
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }

    public class DatabaseContext : DbContext
    {
        public virtual DbSet<Product> Products { get; set; }
        public virtual DbSet<Category> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>()
                .HasMany<Category>(m => m.Categories)
                .WithMany().Map(m =>
                    m.MapLeftKey("ProductId")
                    .MapRightKey("CategoryId")
                    .ToTable("ProductCategories"));
            base.OnModelCreating(modelBuilder);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<DatabaseContext>());
            using (var context = new DatabaseContext())
                context.Database.Initialize(true);
        }
    }
}

This is what I've tried in a console application and works as expected :

namespace Q7122388
{
    #region Imports

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity;
    using System.Linq;

    #endregion

    public class Product
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Category> Categories { get; set; }
    }

    public class Category
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }

    public class DatabaseContext : DbContext
    {
        public virtual DbSet<Product> Products { get; set; }
        public virtual DbSet<Category> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>()
                .HasMany<Category>(m => m.Categories)
                .WithMany().Map(m =>
                    m.MapLeftKey("ProductId")
                    .MapRightKey("CategoryId")
                    .ToTable("ProductCategories"));
            base.OnModelCreating(modelBuilder);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<DatabaseContext>());
            using (var context = new DatabaseContext())
                context.Database.Initialize(true);
        }
    }
}

相关问答

更多
  • 是的,您可以通过SqlQuery执行任何SQL(包括存储过程)。 关于不支持SP的公告意味着您无法将SP过程映射到在EDMX中当前可能对您的实体执行的插入,更新,删除操作。 Yes you can execute any SQL (including stored procedures) by SqlQuery. The announcement about not supported SP means that you can't map SP procedures to Insert, Update, ...
  • 正如大家所提到的,你需要分析你的查询。 假设您使用的是SQL Server,那么您可以仅使用SQL Server Profiler并比较查询和执行计划。 与任何性能问题一样,您必须首先进行测量。 在你的情况下,你必须做更多。 你必须用每种技术测量两次,并确保你比较苹果和苹果。 如果您可以排除正在生成的sql,那么您将不得不测量应用程序代码,以便可能排除那里的瓶颈。 我怀疑这将是生成的查询。 As everyone has mentioned, you need to profile your queries ...
  • 直到您指示EF执行此操作后,它们才会映射到一张表中。 简单地定义你的类,如: public abstract class BaseSearchType { public int Id { get; set; } public string text { get; set; } public int value { get; set; } } public class BooleanSearchTypeTable : BaseSearchType { } public class ...
  • 这是我在控制台应用程序中尝试过的,并按预期工作: namespace Q7122388 { #region Imports using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Linq; #endregion public cla ...
  • Discriminator是在使用Table Per Hierarchy方法时添加到表中的列。 我认为你所寻找的是“每种类型的表(TPT)”。 按如下方式装饰您的EmployeeInfo类: [Table("EmployeeInfo")] public class EmployeeInfo : Employee 或者在下面添加OnModelCreating事件: protected override void OnModelCreating(DbModelBuilder modelBuilder) { ...
  • 不,这是不可能的,我怀疑它在SQL服务器中是否有效。 数据库关系要求一端变得依赖。 这意味着它引用了主端的主键(PK) - 我们称之为外键(FK)。 如果我们谈论一对一关系,则必须将FK标记为唯一,以便从属表中只有一个记录可以从主表中引用给定记录。 在这种情况下,唯一有效的关系是0..1 - 1,其中principal可以不依赖而存在,但依赖只能在与现有主体相关时才存在,因为它的FK值必须设置为主体的PK值。 从理论上讲,FK可以为空,但它取决于数据库如何实现唯一约束的方式。 如果数据库将null计为另一个 ...
  • public class NVarcharMaxAttribute : Attribute { } public class NVarcharMaxAttributeConvention : AttributeConfigurationConvention { public override void Apply(PropertyInfo memberInfo, Str ...
  • 这是正确的,并且不仅适用于Code-first。 如果您的加入表中有额外的字段,您将把它映射为实体。 反之亦然,如果您想在加入表中添加额外字段,则需要创建一个新实体,并为Teacher和Student实体提供零或一对多或一对多导航属性。 在任何情况下,您都无法访问Teacher.Students和Student.Teachers并且必须通过中间实体。 或者,您可以考虑以不同方式对数据库结构进行建模,并将额外信息提取到Teacher或Student或第四实体中。 但这完全取决于您的情况。 That's cor ...
  • 尝试在查询中使用“include”修饰符,例如: context ctx = new context()// context是这种情况下的实体上下文 var query = from c in ctx.posts.include(“tags.users”)其中p.tags.Followers.ID = TargetUserID 这应该涵盖它 (from p in db.Posts from t in p.Tags from f in t.Followers where f.Id == id select p ...
  • 这不是实体框架的问题,而是SQL服务器的问题。 我不认为异常实际上意味着循环级联删除。 它更可能意味着多个级联删除路径,因为连接表记录可以从类别和产品方面删除,因为从商店级联。 SQL服务器不允许这样做,因为它需要一些更复杂(和慢速)的算法来正确计算哪些记录以及何时必须在级联时删除。 简单地说,您必须打破这一点,这实际上意味着您必须在删除商店之前手动删除所有相关记录(类别或产品)。 这将需要存储过程(或直接SQL DELETE命令),否则您将必须首先加载所有这些并逐个删除它们。 编辑: 正如您在评论中指出的 ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)