Comprehensive Documentation - Version 2.0
composer install to install dependencies..env file to configure environment and database settings.
database.default.hostname = localhost
database.default.database = igniter_cms_db
database.default.username = root
database.default.password = db_password
database.default.DBDriver = MySQLi
database.default.DBPrefix =
database.default.port = 3306
.env file. app.baseURL = 'http://localhost/igniter-cms/'php spark generate:key. This command will generate/update the application key (APP_KEY) in .env file.php spark migrate.https://localhost/igniter-cms/.
Note: To reset database you can use these commands php spark delete:tables and php spark migrate
htdocs, www, or public_html).
http://localhost/igniter-cms-installer/).
.env file, set up the database, install dependencies
/install folder should be deleted after installation. Note it would be automatically removed in "production" environment for security.
Ensure writable and public/uploads directories are writable by the web server.
The dashboard is the landing page of the backend and includes the following features:
The CMS module allows you to manage the website's content, including blogs, pages, and navigations.
Create, update, and remove blogs. Features include:
Manage blog categories. Features include:
Create, update, and remove pages. Features include:
Organize and manage structured data entries for various purposes. Features include:
Upload, manage, and organize files, including images and documents.
Manage application themes here. Add, Active or remove themes.
Edit theme files here. Uses code editor to edit file contents.
This is the module for managing your account details and changing passwords
Update your account information (name, bio, etc.).
Change your account password.
The Admin module provides features for managing users, system configurations, and website functionality.
Create, edit, and manage user accounts and their permissions.
| Module | Admin | Manager |
|---|---|---|
| Dashboard | ||
CMS
|
||
| File Manager | ||
Settings
|
||
Admin
|
||
| Manage Themes | ||
| Plugins | ||
| Documentation | ||
| AI Assistance |
Adjust application settings and configurations to suit your needs.
Edit header and footer JavaScript as well as custom CSS.
Generate and manage API keys for accessing CMS data via the API.
View a history of user actions and system events for tracking changes.
Track system events and actions with detailed logs. Features include:
Analyze website traffic statistics and view detailed analytics.
Manage and restrict access from unwanted IP addresses. Features include:
Allow specific IP addresses for privileged access. Features include:
Create and manage backups for the database and website files.
Edit theme files directly within the admin panel (use this feature with caution).
Manage installed plugins.
Manage plugin's configuration data.
Enhance productivity and streamline workflows with AI-powered features tailored for Igniter CMS.
Get instant AI-powered assistance for any questions related to Igniter CMS. Features include:
Generate content dynamically to improve site efficiency and SEO ranking. Features include:
Leverage AI to gain insights into site performance and operational data. Features include:
This section outlines various methods to deploy your Igniter CMS application to a live server. Regardless of the deployment method chosen, you will always need to create and restore your database on the server.
cPanel).Deploying via FTP involves manually transferring files and setting up your database.
cPanel).phpMyAdmin (or your preferred database management tool).phpMyAdmin in your hosting control panel and import the exported database file into the newly created database.FileZilla) with your FTP credentials.public_html or a subdirectory)..env file in your uploaded project root on the server and update the database connection details (database name, username, password).app/Config/Database.php on the server and ensure the database connection settings are correct.app/Config/App.php on the server and set the baseURL to your domain (e.g., https://your-domain.com/).This method leverages a Continuous Integration/Continuous Deployment pipeline using GitHub Actions for automated deployment.
.github/workflows/ directory in your local Igniter CMS project.main.yaml.txt to main.yaml.main.yaml file.# symbol from the beginning of relevant lines.server key with your FTP server address (e.g., server: ftp.your-domain.com).server-dir key with the path to your website's directory on the server (e.g., server-dir: /your-site-path).FTPUSERNAME and FTPPASSWORD, using your FTP account details..env file with the production database connection details.app/Config/Database.php with the production database connection settings.baseURL in your local app/Config/App.php to your domain.vendor folder (e.g., vendor.zip).vendor.zip to your server's deployment directory (e.g., using FTP or File Manager).vendor.zip file in the server's deployment directory. The vendor folder is typically not pushed to Git due to its size and dynamic nature..env File:
.env file directly on your server in the root of your deployed application directory. This file will not be pushed by Git. Configure it with your production environment variables, especially database credentials.main.yaml and updated configurations).cPanel).phpMyAdmin (or your preferred database management tool).phpMyAdmin in your hosting control panel and import the exported database file into the newly created database.This method utilizes your hosting provider's file manager to upload your entire project as a compressed archive.
.env file with the production database connection details.app/Config/Database.php with the production database connection settings.baseURL in your local app/Config/App.php to your domain.cPanel).phpMyAdmin (or your preferred database management tool).phpMyAdmin in your hosting control panel and import the exported database file into the newly created database.cPanel).public_html or a specific subdirectory).You can set the CMS as a headless CMS or use the Views to render data. To set the format for frontend, got the Admin > Configurations and search FrontEndFormat. Set it to either MVC or API
The app includes fetch-only APIs for retrieving CMS data.
/api/{api-key}/get-model-data?model=navigations&take=10&skip=0: Generic - Fetch navigations (10 items, skip 0)./api/{api-key}/get-model-data?model=categories&where_clause={"status":1}: Generic - Fetch filtered categories (e.g., status = 1)./api/{api-key}/get-model-data?model=blogs&where_clause={"blog_id":"{blog-id}"}: Generic - Fetch filtered blogs (e.g., blog_id = {blog-id})./api/{api-key}/get-model-data?model=blogs&where_clause={"blog_id":"{blog-id}","status":1}: Generic - Fetch multiple filtered blogs (e.g., blog_id = {blog-id} and status = 1)./api/{api-key}/get-all-blogs: Returns a complete list of all published blog posts./api/{api-key}/get-blog/{blog_id}: Fetches a specific blog post with detailed content, metadata, and related information./api/{api-key}/get-blogs?take=10&skip=0: Retrieves paginated blog posts with customizable limit and offset parameters./api/{api-key}/get-category/{category_id}: Retrieves detailed information about a specific content category./api/{api-key}/get-categories: Gets all available content categories./api/{api-key}/get-categories?take=10&skip=0: Returns a filtered list of categories with pagination./api/{api-key}/get-code/{code_id}: Fetches a specific code snippet or block with its metadata./api/{api-key}/get-codes: Retrieves all available code snippets and blocks./api/{api-key}/get-codes?take=10&skip=0: Gets a paginated list of code blocks with filtering options./api/{api-key}/get-content-block/{content_id}: Obtains a specific reusable content block./api/{api-key}/get-content-blocks: Returns all available content blocks./api/{api-key}/get-content-blocks?take=10&skip=0: Retrieves filtered content blocks with pagination./api/{api-key}/get-all-data-groups: Returns a complete list of all data groups./api/{api-key}/get-data-group/{group_id}: Fetches details for a specific data group, including metadata and associated entries./api/{api-key}/get-data-groups?take=10&skip=0: Retrieves paginated data groups with filtering options./api/{api-key}/get-navigation/{navigation_id}: Fetches a specific navigation menu structure and its items./api/{api-key}/get-navigations?take=10&skip=0: Returns a paginated list of navigation menus with their structures./api/{api-key}/get-all-pages: Retrieves all published static pages in the system./api/{api-key}/get-page/{page_id}: Obtains a specific static page with its full content and attributes./api/{api-key}/get-pages?take=10&skip=0: Gets a paginated list of static pages with filtering options./api/{api-key}/search-results?key=the: Performs a global search across all content types./api/{api-key}/model-search-results?type=blog&key=the: Searches within a specific content type./api/{api-key}/filter-search-results?type=author&key=admin: Performs a filtered search with specific criteria./api/{api-key}/get-theme/{theme_id}: Fetches information about a specific theme configuration./api/{api-key}/get-themes: Gets all available themes./api/{api-key}/get-themes?take=10&skip=0: Returns a paginated list of themes.| Model Name | Corresponding Model |
|---|---|
| blockedIPsModel | App\Models\BlockedIPsModel |
| blogs | App\Models\BlogsModel |
| categories | App\Models\CategoriesModel |
| codes | App\Models\CodesModel |
| contentBlocks | App\Models\ContentBlocksModel |
| dataGroupsModel | App\Models\DataGroupsModel |
| navigations | App\Models\NavigationsModel |
| pages | App\Models\PagesModel |
| themes | App\Models\ThemesModel |
| whitelistedIPsModel | App\Models\WhitelistedIPsModel |
| Model Name | Model Fields |
|---|---|
| BlogsModel |
blog_id(VARCHAR), title(VARCHAR), slug(VARCHAR), featured_image(VARCHAR), excerpt(VARCHAR),
content(TEXT), category(VARCHAR), tags(VARCHAR), is_featured(BOOLEAN), status(INT), meta_title(VARCHAR),
meta_description(TEXT), meta_keywords(TEXT), created_by(DATETIME), updated_by(DATETIME)
|
| BlockedIPsModel |
blocked_ip_id(VARCHAR), ip_address(VARCHAR), country(VARCHAR), block_start_time(DATETIME),
block_end_time(DATETIME), reason(VARCHAR), notes(VARCHAR), page_visited_url(VARCHAR)
|
| CategoriesModel |
category_id(VARCHAR), title(VARCHAR), description(VARCHAR), group(VARCHAR), parent(VARCHAR),
link(VARCHAR), new_tab(BOOLEAN), order(INT), status(INT), created_by(DATETIME), updated_by(DATETIME)
|
| CodesModel |
code_id(VARCHAR), code_for(VARCHAR), code(VARCHAR), deletable(VARCHAR),
created_by(DATETIME), updated_by(DATETIME)
|
| ContentBlocksModel |
content_id(VARCHAR), identifier(VARCHAR), author(VARCHAR), title(VARCHAR), description(VARCHAR),
content(TEXT), icon(VARCHAR), group(VARCHAR), image(VARCHAR), link(VARCHAR), new_tab(BOOLEAN),
order(INT), custom_field(VARCHAR), created_by(DATETIME), updated_by(DATETIME)
|
| DataGroupsModel |
data_group_id(VARCHAR), data_group_for(VARCHAR), data_group_list(VARCHAR),
deletable(VARCHAR), created_by(VARCHAR), updated_by(VARCHAR)
|
| ThemesModel |
theme_id(VARCHAR), name(VARCHAR), path(VARCHAR), primary_color(VARCHAR), secondary_color(VARCHAR), other_color(VARCHAR),
image(VARCHAR), theme_url(VARCHAR), footer_copyright(VARCHAR), category(VARCHAR), sub_category(VARCHAR), selected(BOOLEAN),
deletable(BOOLEAN), home_page(VARCHAR), created_by(DATETIME), updated_by(DATETIME)
|
| WhitelistedIPsModel |
whitelisted_ip_id(VARCHAR), ip_address(VARCHAR), reason(VARCHAR)
|
Customize the messages in the app in app/Config/CustomConfig.php.
class CustomConfig extends BaseConfig
{
#--------------------------------------------------------------------
# MESSAGES
#--------------------------------------------------------------------
public $wrongCredentialsMsg = 'Sign In Failed. The provided username/email or password is incorrect.';
public $loginSuccessMsg = 'Login successful.';
public $logoutSuccessMsg = 'You have been successfully logged out.';
public $pendingActivationMsg = 'Your account has not been activated yet or is no longer active. Please contact the administrator.';
public $tooManyFailedLogins = 'Too many failed login attempts. Your IP has been blocked for 1 hour.';
public $invalidAccessMsg = 'You do not have access to this area.';
public $createSuccessMsg = 'Record created successfully.';
public $editSuccessMsg = 'Record updated successfully.';
public $deleteSuccessMsg = 'Record removed successfully.';
public $missingRequiredInputsMsg = 'There are validation errors. Possible missing required inputs.';
public $sentContactMsg = 'Message sent successfully.';
public $failedContactMsg = 'Form submission failed.';
public $notFoundMsg = 'Record not found.';
public $alreadyExistMsg = '[Record] already exists in table.';
public $errorMsg = 'Oops! Something went wrong. Please try again later.';
public $resetLinkMsg = 'A password reset link has been sent to your email address. Please check your inbox and follow the instructions to reset your password. If you do not see the email in your inbox, please check your spam or junk folder.';
public $invalidResetLinkMsg = 'Invalid or expired password reset link.';
public $passwordResetRequiredMsg = 'For security reasons, you need to change your password before continuing. Your current password was either set by an administrator or is a default password.';
public $passwordResetSuccessfulMsg = 'Your password has been reset successfully. You can now log in with your new password.';
public $passwordResetFailedMsg = 'Unable to reset password. Please try again';
public $nonExistingResetEmailMsg = 'We are sorry, but the email address you entered is not associated with any account. Please check the email address and try again.';
public $exceptionMsg = 'There was an error processing your request. Please try again. If this error persists, please see or send an email to system administrator.';
public $contactMessageSuccessful = 'Your message has been sent successfully.';
public $contactMessageFailed = 'Oops! Something went wrong with your message submission. Please try again later.';
public $bookingSuccessful = 'Your booking has been made successfully.';
public $bookingFailed = 'Oops! Something went wrong with your booking submission. Please try again later.';
public $subscriptionSuccessful = 'You have successfully subscribed!';
public $subscriptionFailed = 'Sorry, something went wrong with your subscription. Please try again.';
#--------------------------------------------------------------------
# THEME CATEGORIES
#--------------------------------------------------------------------
public $themeCategories = [
'Business' => 'Business & Corporate',
'Ecommerce' => 'Ecommerce',
'Portfolio' => 'Portfolio & Resume',
'News' => 'Blog & News',
'Events' => 'Event & Booking Websites',
'Educational' => 'Educational & Membership Websites',
'Restaurant' => 'Restaurant & Hospitality Websites',
'Health' => 'Health & Wellness Websites',
'Directory' => 'Directory & Listing Websites',
'Entertainment' => 'Entertainment Websites',
'General' => 'General',
];
#--------------------------------------------------------------------
# USER ROLES
#--------------------------------------------------------------------
public $userRoles = [
'Admin' => 'Admin',
'Manager' => 'Manager',
'User' => 'User',
];
}
Customize the data for activity types in logs in app/Constants/ActivityTypes.php.
class ActivityTypes
{
//AUTH LOGS
const USER_REGISTRATION = 'user_registration';
const FAILED_USER_REGISTRATION = 'failed_user_registration';
const USER_LOGIN = 'user_login';
const USER_LOGOUT = 'user_logout';
const FAILED_USER_LOGIN = 'failed_user_login';
//CONTACT LOGS
const CONTACT_CREATION = 'contact_created';
const FAILED_CONTACT_CREATION = 'failed_contact_creation';
const CONTACT_UPDATE = 'contact_updated';
const FAILED_CONTACT_UPDATE = 'failed_contact_update';
const CONTACT_DELETION = 'contact_delete';
//USER LOGS
const USER_CREATION = 'user_created';
const FAILED_USER_CREATION = 'failed_user_creation';
const USER_UPDATE = 'user_updated';
const FAILED_USER_UPDATE = 'failed_user_update';
const USER_DELETION = 'user_delete';
.........................................................
/**
* Gets the description for a given activity type.
*
* @param string $type The activity type.
* @return string The description of the activity type, or "Unknown Activity" if not found.
*/
public static function getDescription($type)
{
$descriptions = [
//Auth
self::USER_REGISTRATION => 'User Registration',
self::FAILED_USER_REGISTRATION => 'User Registration Failed',
self::USER_LOGIN => 'User Login',
self::USER_LOGOUT => 'User Logout',
self::FAILED_USER_LOGIN => 'Failed User Login',
//Contact
self::CONTACT_CREATION => 'Contact Creation',
self::FAILED_CONTACT_CREATION => 'Contact Creation Failed',
self::CONTACT_UPDATE => 'Contact Update',
self::FAILED_CONTACT_UPDATE => 'Contact Update Failed',
self::CONTACT_DELETION => 'Contact Deletion',
//User
self::USER_CREATION => 'User Creation',
self::FAILED_USER_CREATION => 'User Creation Failed',
self::USER_UPDATE => 'User Update',
self::FAILED_USER_UPDATE => 'User Update Failed',
self::USER_DELETION => 'User Deletion',
.........................................................
];
return $descriptions[$type] ?? 'Unknown Activity';
}
}
Customize the files by going to app/Views/front-end/themes/{theme-folder}.
Copyright (c) 2025 Abdoulie Kassama
This project is licensed under the MIT License - see the LICENSE file for details.