BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > Bgmvc > Görüntü (View) sınıfı

Görüntü (View) sınıfı

Görüntü sınıfı oluşturma

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);
        }
    }
}

Görüntü sınıfı kullanımı

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:

  1. C:\wamp\www\bgmvc\app\views\home\index.php
  2. C:\wamp\www\bgmvc\app\views\layouts\default.php

index.php görüntü dosyası

  • View sınıfı içindeki start() fonksiyonu 'content' parametresi ile çağrılarak, ob_start() PHP fonksiyonu ile, $this->start('content') ve end() fonksiyonları arasında yer alan verileri aktarmak için, bir tampon bellek oluşturulur.
  • default.php şablon dosyasında $this->content('content') fonksiyonu ile eklenecek ifadeler yazılır.
  • View sınıfı içindeki end() fonksiyonu ile, oluşturulan tampon bellek içeriği, ob_get_clean() PHP fonksiyonu ile View sınıfı içindeki _content dizisine aktarılır.

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(); ?>

default.php dosyası

Bu dosya web sitesinin temel HTML dosyasıdır.

Dosya içinde, aşağıdaki işlemler sırasıyla gerçekleştirilir:

  1. .css dosyaları sisteme dahil edilir.
  2. Görüntü dosyası index.php içinde setSiteTitle() fonksiyonu ile belirlenen içerik, $this->content('head'); ifadesinin yerini alır.
  3. main_menu.php dosyası dahil edilir.
  4. Session sınıfındaki display_session_alerts() fonksiyonu ile, eğer varsa, oturum uyarı mesajları ekrana yazılır.
  5. content() fonksiyonu 'content' parametresi ile çağrılarak ($this->content('content')), _content dizisi içeriği, ekrana yazılır.
  6. default.php şablon dosyasında $this->content('content') fonksiyonu ile eklenecek ifadeler yazılır.
  7. View sınıfı içindeki end() fonksiyonu ile, oluşturulan tampon bellek içeriği, ob_get_clean() PHP fonksiyonu ile View sınıfı içindeki _content dizisine aktarılır.
  8. Javascript dosyaları sisteme dahil edilir.

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>

Menü dosyası

default.php dosyasından çağrılan main_menu.php dosyasında:

  1. Router::get_menu('menu_acl') fonksiyonu ile menu_acl.json dosyası okunur.
  2. Elde edilen menü ile navigasyon çubuğu oluşturulur.

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>

Menü json dosyası

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.