Controller.php içindeki Controller sınıfından türetilen herhangi bir denetleyici sınıfı içindeki bir hareket fonksiyonundan, yapılan görüntü işlemlerini gerçekleştirmek için, View.php dosyasında tanımlı View sınıfı oluşturulur.
<?php
namespace Core;
use Core\{Config, Router};
class View {
public $articles, $total, $heading;
public $errors, $user, $header, $users, $article;
public $msg, $msg_txt, $limit, $page, $url;
private $_site_title = '', $_content = [], $_current_content, $_buffer, $_layout;
private $_default_view_path;
public function __construct($path = '') {
$this->_default_view_path = $path;
$this->_site_title = Config::get('default_site_title');
}
public function set_layout($layout) {
$this->_layout = $layout;
}
public function set_site_title($title) {
$this->_site_title = $title;
}
public function get_site_title() {
return $this->_site_title;
}
public function render($path = '') {
if(empty($path)) {
$path = $this->_default_view_path;
}
$layout_path = FROOT . DS . 'app' . DS . 'views' . DS . 'layouts' . DS . $this->_layout . '.php';
$full_path = FROOT . DS . 'app' . DS . 'views' . DS . $path . '.php';
if(!file_exists($full_path)) {
Router::redirect('exceptions/index/noview');
}
if(!file_exists($layout_path)) {
Router::redirect('exceptions/index/notemplate');
}
include($full_path);
include($layout_path);
}
public function start($key) {
if(empty($key)) {
Router::redirect('exceptions/index/nokey');
}
$this->_buffer = $key;
ob_start();
}
public function end() {
if(empty($this->_buffer)) {
Router::redirect('exceptions/index/nostart');
}
$this->_content[$this->_buffer] = ob_get_clean();
$this->_buffer = null;
}
public function content($key) {
if(array_key_exists($key, $this->_content)) {
echo $this->_content[$key];
}
else {
echo '';
}
}
public function inc($path) {
$full_path = FROOT . DS . 'app' . DS . 'views' . DS . $path . '.php';
if(file_exists($full_path)) {
include($full_path);
}
}
}
1. Controller.php içindeki Controller sınıfından türetilen herhangi bir denetleyici sınıfı içindeki bir hareket fonksiyonundan, Controller sınıfı içinde tanmlı view değişkeni yoluyla, View.php dosyasında tanımlı View sınıfı içindeki render() fonksiyonu çağrılır.
$this->view->render('home/index');
2. render() fonksiyonu, kendisine geçirilen parametre değerine (home/index) karşılık gelen dosya ile şablon dosyası mevcut ise, sırayla görünüme dahil eder:
C:\wamp\www\bgmvc\app\views\home\index.php
<?php
use Core\{H, Config};
use App\Models\{Users};
?>
<?php $this->start('content'); ?>
<?php
if(Config::get('main_slide')) {
$this->inc('inc/main_slide');
}
?>
<div class="p-3">
<nav class="navbar navbar-expand-lg bg-header">
<div class="container-fluid p-2">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#MainNavbar" aria-controls="MainNavbar" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="MainNavbar">
<ul class="navbar-nav">
<li><?=$this->heading?></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0 bg-fontsm">
<?php // Sayfada gösterilecek kayıt sayısı seçimi ?>
<form class="mt-2" action="<?=ROOT?><?=H::get_action()?>" method="post">
<label class="me-2" for="records_limit">Kayıt sayısı</label>
<select name="records_limit" id="records_limit" class="custom-select">
<?php foreach([4, 6, 8, 10] as $limit) : ?>
<option
<?php if(isset($_SESSION['records_limit']) && $_SESSION['records_limit'] == $limit) echo 'selected'; ?>
value="<?= $limit; ?>">
<?= $limit; ?>
</option>
<?php endforeach; ?>
</select>
</form>
</ul>
</div>
</div>
</nav>
<?php // Makalelerin gösterimi ?>
<div class="row row-cols-1 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 row-cols-xxl-6 g-4">
<?php foreach($this->articles as $article): ?>
<div class="col">
<div class="card h-100 shadow">
<div class="card-body">
<h5 class="card-title"><?= $article->title ?></h5>
<div class="bg-card-text mb-2"><?= html_entity_decode($article->body) ?></div>
<a href="<?=ROOT?>home/details/<?=$article->id?>" class="text-info">Detaylar</a>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php // Sayfa yapısı oluşturma ?>
<?php $this->inc('inc/pager'); ?>
</div>
<?php $this->end(); ?>
Bu dosya web sitesinin temel HTML dosyasıdır.
Dosya içinde, aşağıdaki işlemler sırasıyla gerçekleştirilir:
C:\wamp\www\bgmvc\app\views\layouts\default.php
<?php use Core\{Config, Session}; ?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= $this->get_site_title(); ?></title>
<link rel="stylesheet" href="<?=ROOT?>public/css/bootstrap.min.css" media="screen" title="no title" charset="utf-8">
<link href="<?=ROOT?>public/css/main.css?v=<?=Config::get('version');?>" rel="stylesheet" type="text/css" media="screen" title="no title" charset="utf-8">
<?php $this->content('head'); ?>
</head>
<body>
<?php $this->inc('inc/main_menu'); ?>
<div class="container-fluid p-0">
<?=Session::display_session_alerts(); ?>
<?php $this->content('content'); ?>
</div>
<script src="<?=ROOT?>public/js/jquery-3.7.1.min.js"></script>
<script src="<?=ROOT?>public/js/popper.min.js"></script>
<script src="<?=ROOT?>public/js/bootstrap.bundle.min.js"></script>
<script src="<?=ROOT?>public/js/main.js"></script>
</body>
</html>
default.php dosyasından çağrılan main_menu.php dosyasında:
C:\wamp\www\bgmvc\app\views\layouts\main_menu.php
<?php
use Core\{H, Router};
use App\Models\{Users};
global $current_user;
$menu = Router::get_menu('menu_acl');
?>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark p-4">
<div class="container-fluid">
<a class="navbar-brand" href="<?=ROOT?>">BG MVC</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#TopNavbar2" aria-controls="TopNavbar2" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="TopNavbar2">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<?php foreach($menu as $key => $val) :
if(is_array($val)): ?>
<li class="<?php echo H::active_class($key,'nav-item dropdown'); ?>">
<a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false"><?=$key?></a>
<ul class="dropdown-menu">
<?php foreach($val as $k => $v):
echo H::nav_item($v, $k, true);
endforeach;
?>
</ul>
</li>
<?php else:
echo H::nav_item($val, $key);
endif;
?>
<?php endforeach; ?>
</ul>
<ul class="navbar-nav d-flex">
<?php if(!$current_user): ?>
<?= H::nav_item('register/login', 'Giriş yap'); ?>
<?php endif; ?>
<?php if($current_user): ?>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Merhaba <?= $current_user->fname;?></a>
<ul class="dropdown-menu dropdown-menu-right">
<?= H::nav_item('register/logout', 'Çıkış', true); ?>
</ul>
</li>
<?php endif; ?>
</ul>
</div>
</div>
</nav>
main_menu.php dosyasından çağrılan menu_acl.json dosyasındaki içerik çağrılan kod satırına dahil edilir.
C:\wamp\www\bgmvc\app\menu_acl.json
{
"Ana sayfa" : "home",
"Faaliyetlerimiz" : {
"Yazılım" : "activities/software",
"Kodlama" : "activities/code",
"Tasarım" : "activities/design"
},
"Kod örnekleri" : "codes",
"Hakkımızda" : "about"
}
Bu durumda, Controller.php içindeki Controller sınıfından türetilen herhangi bir denetleyici sınıfına ait $this değişkeni View ve Request sınıflarının içindeki tüm değişken ve fonksiyonlara doğrudan veya dolaylı olarak erişim sağlar.