;

Vybíráme learning management system

21. 3. 2012
Doba čtení: 4 minuty

Sdílet

Autor: Fotolia © photogl
Průběžné vzdělávání pracovníků se stalo v dnešní době nutností a pojmy jako e-learning či blended learning se již pevně zakořenily v našich slovnících. V tomto textu se podíváme na aktuální požadavky kladené na learning management systémy.

Learning management system, zkráceně LMS, je on-line řešení studijního prostředí, sloužící pro zpřístupňování výukového obsahu. Běžně v sobě integruje různé druhy nástrojů pro komunikaci a řízení studia, kam patří např. nástěnka, diskuzní fórum, chat, tabule, evidence, hodnocení, testování, katalog výukových kurzů a objektů, správa práv, úložiště obsahu nebo správa studijních plánů. V podstatě lze prostřednictvím LMS řídit celé on-line vzdělávání společnosti, od studia přes procvičování až k testování nabytých znalostí. Statistiky četnosti spuštění kurzu, úspěšnosti studia nebo průměrné doby průchodu jsou již v těchto systémech samozřejmostí.

V rámci LMS mohou studenti rovněž přihlašovat i odhlašovat svou účast na jednotlivých kurzech. Pro jednodušší přehled nabízí systém možnosti nejrůznějších e-mailových notifikací, například o nově spuštěných či dosud nedokončených kurzech. V rámci LMS je většinou také integrován learning content management system (LCMS) neboli systém sloužící k tvorbě či sestavování výukového obsahu.

Trendem dneška je možnost tvorby vlastního obsahu i běžnému pracovníkovi HR oddělení nebo jakémukoliv zaměstnanci, který umí pracovat se základní sadou MS Office, a to bez nutnosti dalších znalostí. Takové opatření samo o sobě umožňuje snížit náklady na tvorbu jednotlivých kurzů, obvykle vytvářených externí společností, a rozšiřuje možnosti využití.

Pokročilé požadavky na LM systémy

Na trhu aktuálně nalezneme mnoho komerčních i nekomerčních LM systémů. Jaké jsou však dnešní požadavky tutorů a HR oddělení na jejich funkčnost?

LMS by měl společnosti nabídnout možnost uspořádat uživatele do větších celků (škol, tříd, skupin aj.), a zpřehlednit tak jejich správu, například v rámci stromové struktury. Jednotlivé požadavky a kurzy je pak možné přidělovat všem uživatelům v dané větvi. V rámci LMS lze tedy vytvořit vlastní strukturu firmy.

Dalším požadavkem by měla být možnost mít všechny strukturované i nestrukturované dokumenty uspořádané po skupinách (např. dokumenty pro výuku, testování či zadání úkolů). V rámci každé skupiny dokumentů pak vybírat ty, které mají být u konkrétní skupiny publikovány, a nastavovat u nich specifické vlastnosti, jako jsou datum zveřejnění, požadované datum dokončení, zaslání notifikací apod.

V případě, že společnost plánuje využívat LMS pro jednoduchou správu většího množství uživatelských skupin, měla by vybrat systém umožňující vytváření dalších instancí jednotlivých kurzů s možností modifikace jejich vlastností (termíny, názvy kurzů, názvy dokumentů v kurzech aj.) a možností přidávat a odebírat kurzy podle potřeby.

Dalším, často zmiňovaným požadavkem je varianta napojení samotného LM systému na interní systémy tak, aby bylo možné importovat seznamy uživatelů kupříkladu z HR modulu SAP, exportovat výsledky, případně je publikovat dále.

To, co HR oddělení jistě ocení, je možnost v rámci LMS řídit nejen on-line kurzy, ale všechna firmou organizovaná školení, tedy včetně in-class. HR oddělení pomocí této funkcionality může kompletně plánovat a kontrolovat odborný rozvoj jednotlivých pracovníků. Získá tak rovněž možnost rozesílat pozvánky na školení, na něž bude zaměstnanec upozorněn notifikací.

Příjemným benefitem pro pracovníky může být zpřístupnění nabídky obecných školení, tak aby si i liniový management mohl vybírat z volitelné nabídky kurzů, které společnost poskytuje.

Autorka pracuje jako sales & marketing specialist ve společnosti StringData.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »