Bonjour à tous,

Je suis entrain de développer une site en utilisant le modèle MVC. Je me posais la question si il existe une façon plus "intelligente" d'inclure ma barre de naviguation que celle que j'utilise en ce moment. Effectivement cette navbar sera appelé dans près de 80% de mes contrôleurs, mais elle nécesssite l'utilisation d'un modèle pour la charger en fonction des langues. Car les données sont dans une table MySQL.

config.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
<?php
	// DB Params
	define('DB_HOST', 'localhost');
	define('DB_USER', 'root');
	define('DB_PASS', '123456');
	define('DB_NAME', 'urbanride');
 
	//app root
	define('APPROOT', dirname(dirname(__file__)));
	// URL Root
	define('URLROOT', 'http://localhost/urbanride'); //remove ending slash
	//Site Name
	define('SITENAME', 'urbanride');
	define('WEB_EXTENSION', '.ch');
 
	//table for all languages
	define('DB_TABLE_TEXTLANG', 'displaytext');
 
	//App version
	define('APPVERSION', '1.1.0');
 
	//Website language should at least have one language, and each language are separated by "_" used in the core.php class
	define('LANGUAGES', 'en_fr');
	define('LANGUAGES_DEFAULT', 'en');
homePages controller
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
 
Class homePages extends controller{
 
	public function __construct(){
		$this->homePage = $this->model('homePage');
	}
 
	public function index(){		
		$data = [
			'navbar' => $this->homePage->getNavBar(),
			'title' => 'Welcome',
			'description' => 'this is a website'
		];
 
		$this->view('HomePage/index', $data);
	}
 
}
homePage.php modèle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
 
class homePage{
 
	public function __construct(){
		$this->db = new Database;
    }
 
	public function getNavBar(){
 
		$this->db->query('SELECT * FROM ' . DB_TABLE_TEXTLANG . ' WHERE controller=:controllerRequested');
		$this->db->bind(':controllerRequested','navbar');
		$results = $this->db->resultSet();
 
		return $results;
 
	}
 
}
navBar to include dans les différentes views
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
<nav class="navbar navbar-dark navbar-expand-lg" style="background-color: rgba(0,0,0,0.93);" >
  <div class="container">
 
    <a class="navbar-brand" href="#">
          <img src="<?php echo URLROOT ?>/public/img/logoUrbanride.png" alt="" width="" height="" class="d-inline-block align-text-top">
        </a>
 
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
 
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ms-auto mb-2 mb-lg-0">
        <li class="nav-item">
        </li>
        <?php var_dump($data['navbar']); ?>
          <?php foreach($data['navbar'] as $navbar) : ?>
            <li class="nav-item">
              <a class="nav-link" href="#">
                <?php echo $navbar->{'value_' . $_SESSION['lang']} ?>
              </a>
            </li>
          <?php endforeach; ?>  
    </div>
  </div>
</nav>
Voilà, donc en fait ce qui me chagrine c'est que je vais devoir avant chaque vue ajouter ce bout de code 'navbar'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
		$data = [
			'navbar' => $this->homePage->getNavBar(),
			'title' => 'Welcome',
			'description' => 'this is a website'
		];
Idem dans le modèle, avec la fonction navbar.

modèle
homePage.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
	public function getNavBar(){
 
		$this->db->query('SELECT * FROM ' . DB_TABLE_TEXTLANG . ' WHERE controller=:controllerRequested');
		$this->db->bind(':controllerRequested','navbar');
		$results = $this->db->resultSet();
 
		return $results;
 
	}
Je suis sûr qu'il est possible de faire mieux, mais je bloque un peu. J'espère avoir été aussi clair que possible, si ce n'est pas le cas hesitez pas.

Merci aux personnes qui prendront le temps de répondre.