Employees often need to complete onboarding, safety, or compliance videos. In this tutorial, we will build a training video tracker that resumes each video from the saved position, allows rewinding, prevents users from skipping unwatched sections, and records completion.
The same approach works in PHPRunner and ASPRunner.NET. The browser-side code is the same in both products, while the server-side examples are provided separately in PHP and C#.
1. Creating the required tables
This example uses the employees table for application login. Its key field is EmployeeID. The sample project uses FirstName as the username field and LastName as the password field. Create the three tables below.
MySQL
The two position fields serve different purposes. last_position is where playback resumes. max_watched is the furthest point the employee has reached and therefore the furthest position to which the player may seek.
Add both tables to the project. Configure employees as the login table and make sure EmployeeID is available through the current user data.
2. Configuring video upload and playback
Open the videos table and configure video_file as follows:
1. On the Add and Edit pages, set ‘Edit as’ to ‘Document upload’.
2. On the View page, set ‘View as’ to ‘Video file’.
3. Set the video player size. The sample project uses 600 by 400 pixels.
4. Include title, description, and video_file on the View page.
5. Remove duration from the Add and Edit pages. The application will save it automatically when the video is played.
The generated application uses the browser’s HTML5 video player, so no additional video library is required.
3. Processing progress requests on the server
The video page sends three AJAX requests: load the current progress, save the video duration, and save the current playback position.
Open Events – Global events – After App Init and add the version for your product.
PHP
C#
The handler always obtains employee_id from the logged-in user’s record. It never accepts an employee ID from the browser. A session token protects the update requests, and the server records completion only when the player reaches the end of the video.
If your login table uses a different key field, replace EmployeeID in this code.
4. Tracking playback on the View page
Open the videos View page and add the following code to its JavaScript OnLoad event:
Progress is saved every five seconds during playback, when the video is paused, and when it ends. A completed video can be played or searched normally. For an unfinished video, the user may rewind but cannot seek beyond max_watched.
This browser-side restriction is suitable for ordinary training workflows. Like any client-side playback control, it should not be treated as tamper-proof compliance evidence against a user deliberately modifying browser requests.
5. Opening the video from the List page
Open the videos List page in Page Designer. Select the grid row and configure its click action to open the View page in the same browser window.
Users can now click anywhere on a video row to open the player. This uses the built-in row click action and does not require additional JavaScript.
6. Showing progress with row colors
Open the videos List page and add the appropriate code to After record processed.
PHP
C#
Pink rows have not been started, yellow rows are in progress, and green rows are complete. The query uses the logged-in employee’s ID, so every employee sees their own progress.
7. Testing the completed application
Build the project and log in as an employee. Open a video, watch part of it, pause, and leave the page. When you return, playback should resume from the saved position. Rewinding should work, while attempts to seek beyond the furthest watched position should return the player to that position.
After the video reaches the end, its List-page row should change to green. Log in as another employee to confirm that progress is stored separately for each user.
PakarPBN
A Private Blog Network (PBN) is a collection of websites that are controlled by a single individual or organization and used primarily to build backlinks to a “money site” in order to influence its ranking in search engines such as Google. The core idea behind a PBN is based on the importance of backlinks in Google’s ranking algorithm. Since Google views backlinks as signals of authority and trust, some website owners attempt to artificially create these signals through a controlled network of sites.
In a typical PBN setup, the owner acquires expired or aged domains that already have existing authority, backlinks, and history. These domains are rebuilt with new content and hosted separately, often using different IP addresses, hosting providers, themes, and ownership details to make them appear unrelated. Within the content published on these sites, links are strategically placed that point to the main website the owner wants to rank higher. By doing this, the owner attempts to pass link equity (also known as “link juice”) from the PBN sites to the target website.
The purpose of a PBN is to give the impression that the target website is naturally earning links from multiple independent sources. If done effectively, this can temporarily improve keyword rankings, increase organic visibility, and drive more traffic from search results.
Comments are closed, but trackbacks and pingbacks are open.