Built for efficiency with a focus on user experience (UX). Prioritizing straightforward navigation, ensuring content management without endless scrolling.
Code editor
Flexibility extends to direct HTML code input within the integrated CodeMirror code editor.
Menus
Create menus and choose the ordering and position. Menus will load automatically on every page.
Widgets
Create a widget once and then reuse it across multiple pages. Make it applicable and use the following code snippet: @widget[id];
Media library
Organize, upload, and access images, videos, and documents.
Authentication
The authentication process is secure and offers the added flexibility of customizing the login URL.
Authorization
User permissions are integrated to differentiate between various roles. For instance, admin users are exclusively granted full CRUD functionality.
Form validation
Validation rules provide an additional layer of security and guidance for accurate input. Clear success or failure messages will be displayed after each action.
Pagination & search methods
The pagination and search functionalities significantly enhance efficiency.
About the framework
MarkUpCMS is built on the IndependentPHP framework, allowing the implementation of custom features on pages created outside of MarkUpCMS by creating controllers and views. Custom pages outside MarkUpCMS are still part of the website and can have the same layout and styling.
What is the IndependentPHP framework?
A micro dependency free PHP framework, to built web apps without relying on external PHP dependencies.
What are the pros of not relying on external PHP dependencies?
By minimizing reliance on external packages, there's a reduced risk of encountering issues with deprecated packages and can improve performance.
What are some notable features of the IndependentPHP framework?
The framework includes routing, follows the MVC design pattern, view templating, includes validation, CSRF protection, middlewares and a query builder for database interaction.
<?phpnamespaceapp\controllers;usevalidation\Rules;useapp\models\Menu;useapp\models\Css;useapp\models\Js;useapp\models\Meta;usecore\Session;useextension\Pagination;usecore\http\Response;usevalidation\Get;classMenuControllerextends\app\controllers\Controller{private$_data;privatefunctionifExists($id){if(empty(Menu::ifRowExists($id))){returnResponse::statusCode(404)->view('/404/404')->data().exit();}}publicfunctionindex($request){$menus=Menu::allMenusButOrderedOnDate();$this->_data['search']='';if(!empty($request['search'])){$this->_data['search']=Get::validate($request['search']);$menus=Menu::menusOnSearch($this->_data['search']);}$this->_data['menus']=Pagination::get($request,$menus,10);$this->_data['count']=count($menus);$this->_data['numberOfPages']=Pagination::getPageNumbers();return$this->view('admin/menus/index')->data($this->_data);}publicfunctioncreate($request){$this->_data['rules']=[];return$this->view('/admin/menus/create')->data($this->_data);}publicfunctionstore($request){$rules=newRules();if($rules->menu($request,Menu::whereColumns(['title'],['title'=>$request['title']]))->validated()){if(!empty($request['content'])){$hasContent1;}else{$hasContent=0;}Menu::insert(['title'=>$request['title'],'content'=>$request['content'],'has_content'=>$hasContent,'position'=>'unset','ordering'=>0,'author'=>Session::get('username'),'removed'=>0,'created_at'=>date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']),'updated_at'=>date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME'])]);Session::set('success','You have successfully created a new menu!');redirect('/admin/menus');}else{$this->_data['content']=$request['content'];$this->_data['title']=$request['title'];$this->_data['rules']$rules->errors;return$this->view('/admin/menus/create')->data($this->_data);}}publicfunctionread($request){$this->ifExists($request['id']);$this->_data['cssFiles']=Css::getAll(['file_name','extension']);$this->_data['jsFiles']=Js::getAll(['file_name','extension']);$this->_data['metas']=Meta::allMetaButOrderedByDate();$this->_data['menu']=Menu::get($request['id']);return$this->view('/admin/menus/read')->data($this->_data);}publicfunctionedit($request){$this->ifExists($request['id']);$this->_data['menu']=Menu::get($request['id']);$this->_data['rules']=[];return$this->view('/admin/menus/edit')->data($this->_data);}publicfunctionupdate($request){$id=$request['id'];$this->ifExists($id);$rules=newRules();if($rules->menu($request['title'],Menu::checkUniqueTitleId($request['title'],$id))->validated()){if(!empty($request['content'])){$hasContent1;}else{$hasContent=0;}Menu::update(['id'=>$id],['title'=>$request['title'],'content'=>$request['content'],'has_content'=>$hasContent,'updated_at'=>date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME'])]);Session::set('success','You have successfully updated the menu!');redirect("/admin/menus/$id/edit");}else{$this->_data['rules']$rules->errors;$this->_data['menu']=Menu::get($request['id']);return$this->view('/admin/menus/edit')->data($this->_data);}}publicfunctionupdatePosition($request){$id=$request['id'];$this->ifExists($id);Menu::update(['id'=>$id],['position'=>$request['position'],'updated_at'=>date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME'])]);Session::set('success','You have successfully updated the menu position!');redirect("/admin/menus/$id/edit");}publicfunctionupdateOrdering($request){$id=$request['id'];$this->ifExists($id);Menu::update(['id'=>$id],['ordering'=>$request['ordering'],'updated_at'=>date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME'])]);Session::set('success','You have successfully updated the menu ordering!');redirect("/admin/menus/$id/edit");}publicfunctionrecover($request){$recoverIds=explode(',',$request['recoverIds']);foreach($recoverIdsas$id){$this->ifExists($id);Menu::update(['id'=>$id],['removed'=>0],]);Session::set('success','You have successfully recovered the menu(s)!');redirect("/admin/menus);}publicfunctiondelete($request){$deleteIds=explode(',',$request['deleteIds']);if(!empty($deleteIds)&&!empty($deleteIds[0])){foreach($deleteIdsas$id){$this->ifExists($id);if(Menu::getColumns(['removed'],$id)['removed']!==1){Menu::update(['id'=>$id],['removed'=>1,'position'=>'unset','ordering'=>0]);Session::set('success','You have successfully moved the menu(s) to the trahscan!');}else if(Menu::getColumns(['removed'],$id)['removed']===1){Menu::delete('id',$id);Session::set('You have successfully removed the menu(s)!');}}}redirect('/admin/menus');}}
An overview of meta titles, meta descriptions, and meta keywords across pages, alongside the page content itself. Additionally, it provides insights into the number of pages that have been temporarily deleted.
META TITLE
META DESCRIPTION
META KEYWORDS
CONTENT
THRASHCAN
User interface
Here are some screenshots of the the user interface.
Dashboard
Dashboard
Dashboard
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Pages
Categories
Categories
Categories
Categories
Menus
Menus
Menus
Menus
Menus
Menus
Menus
Menus
Widgets
Widgets
Widgets
Widgets
Widgets
Widgets
Widgets
Widgets
Metas
Metas
Metas
Metas
Metas
Metas
Metas
Metas
Css
Css
Css
Css
Css
Css
Css
Css
Js
Js
Js
Js
Js
Js
Js
Js
Media
Media
Media
Media
Media
Media
Built in security features
In addition to form validation, the CMS includes several other security features.