General principles of models
Model in MV framework is PHP class and SQL table managed by this class.
Main rules of Model:
- The name of PHP class should start with the name of the model, for example: "pages.model.php", "gallery.model.php".
- The files of model classes should be located in "/models/" folder in the root of project.
- The PHP class of model should be inherited from "Model" class.
- The model class should have a property called "$name", which is the text name of model.
- The model class should have a property called "$model_elements", which is an array of the fields for this model, the same as fields of table in a database.
- Data types are the components which model fields from "$model_elements" property are based on.
- SQL table of the Model should have the same name as a model's class name but in lower registry, such as "pages", "gallery".
- The field names of the table are to be the same as model fields in "$model_elements" array (the field name in SQL table is 3rd element of an array).
- The SQL table should have an integer field called "id", which should be a primary key and has an "auto increment" attribute.
- To activate the model you should specify it in "config/models.php" file, where the model name should be added into "$mvActiveModels" array, after that the model becomes available both in admin interface and front-end part of the website.
Sample 1 Text blocks
"Blocks" PHP class located in "models/blocks.model.php" file.
<? class Blocks extends Model { protected $name = "Text blocks"; protected $model_elements = array( array("Activation", "bool", "active"), array("Name", "char", "name"), array("Content", "text", "content") ); } ?>
SQL table in database with the same name "blocks" (MySQL).
CREATE TABLE `blocks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `active` tinyint(4), `name` varchar(200), `content` text, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
After the installation of MV there are 3 pre-installed models:
- Pages (menu pages)
- Blocks (text blocks, fragments)
- SEO (data for seo optimization)
The database already contains all the required tables for these models. "Pages" table has a few record for a welcome page and some inside pages.
Unlike "Pages" and "Blocks", "SEO" model is a Simple Model, which contains data in a key-value pairs. Read more about this type of models in Simple Models section.
Sample 2 News
<? class News extends Model { protected $name = "News"; protected $model_elements = array( array("Active", "bool", "active"), array("Name", "char", "name", array("required" => true)), array("Section", "enum", "type", array("values_list" => array("politic" => "Politics", "economy" => "Economics", "sport" => "Sport", "culture" => "Culture"))), array("Date", "date", "date"), array("Text", "text", "content", array("rich_text" => true)), array("Comments", "many_to_one", "comments", array("related_model" => "News_Comments", "name_field" => "author")) ); } ?>
CREATE TABLE "news" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" VARCHAR, "type" VARCHAR, "date" VARCHAR, "active" INTEGER, "content" TEXT);
Sample 3 News comments
<? class News_Comments extends Model { protected $name = "News comments"; protected $model_elements = array( array("Author", "enum", "author", array("foreign_key" => "Authors", "name_field" => "email")), array("Date", "date_time", "date"), array("News", "enum", "news_id", array("foreign_key" => "News")), array("Text", "text", "content") ); protected $name_field = "author"; } ?>
CREATE TABLE "news_comments" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "author" INTEGER, "date" VARCHAR, "news_id" INTEGER, "content" TEXT);
Sample 4 Comments authors
<? class Authors extends Model { protected $name = "Comments authors"; protected $model_elements = array( array("Name", "char", "name", array("required" => true)), array("Email", "email", "email", array("required" => true, "unique" => true)), array("Password", "password", "password"), array("Comments", "many_to_one", "comments", array("related_model" => "News_Comments", "name_field" => "date")), array("Photos", "multi_images", "pictures"), array("About", "text", "about") ); } ?>
CREATE TABLE "authors" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" VARCHAR, "email" VARCHAR, "password" VARCHAR, "pictures" TEXT, "about" TEXT)
Previous section
System settings