@kirillgenets

Шаблон в PHP не видит переменных, почему?

Здравствуйте!
Вот мой код шаблона:
<section class="promo">
    <h2 class="promo__title">Нужен стафф для катки?</h2>
    <p class="promo__text">На нашем интернет-аукционе ты найдёшь самое эксклюзивное сноубордическое и горнолыжное снаряжение.</p>
    <ul class="promo__list">
        <li class="promo__item promo__item--boards">
            <a class="promo__link" href="all-lots.html">Доски и лыжи</a>
        </li>
        <li class="promo__item promo__item--attachment">
            <a class="promo__link" href="all-lots.html">Крепления</a>
        </li>
        <li class="promo__item promo__item--boots">
            <a class="promo__link" href="all-lots.html">Ботинки</a>
        </li>
        <li class="promo__item promo__item--clothing">
            <a class="promo__link" href="all-lots.html">Одежда</a>
        </li>
        <li class="promo__item promo__item--tools">
            <a class="promo__link" href="all-lots.html">Инструменты</a>
        </li>
        <li class="promo__item promo__item--other">
            <a class="promo__link" href="all-lots.html">Разное</a>
        </li>
    </ul>
</section>
<section class="lots">
    <div class="lots__header">
        <h2>Открытые лоты</h2>
    </div>
    <ul class="lots__list">
        <?php foreach($lots as $key => $lot) { ?>
            <li class="lots__item lot">
                <div class="lot__image">
                    <img src="<?=$lot['image']?>" width="350" height="260" alt="<?=$lot['name']?>">
                </div>
                <div class="lot__info">
                    <span class="lot__category"><?=$lot['category']?></span>
                    <h3 class="lot__title"><a class="text-link" href="lot.html"><?=$lot['name']?></a></h3>
                    <div class="lot__state">
                        <div class="lot__rate">
                            <span class="lot__amount">Стартовая цена</span>
                            <span class="lot__cost"><?=format_sum($lot['price'])?></span>
                        </div>
                        <div class="lot__timer timer">

                        </div>
                    </div>
                </div>
            </li>
        <?php } ?>
    </ul>
</section>

А вот функция-шаблонизатор:
<?php

function render_template($template, $variables = []) {
  if (!file_exists($template)) return false;

  extract($variables);
  ob_start();
  require $template;

  return ob_get_clean();
}

Вот так я ее использую в коде:
<?php
require_once 'functions.php';

$is_auth = (bool) rand(0, 1);
$user_name = 'Константин';
$user_avatar = 'img/user.jpg';
$categories = ['Доски и лыжи', 'Крепления', 'Ботинки', 'Одежда', 'Инструменты', 'Разное'];
$lots = [
    [
        'name' => '2014 Rossingdol District Snowboard',
        'category' => 'Доски и лыжи',
        'price' => 10999,
        'image' => 'img/lot-1.jpg'
    ],
    [
        'name' => 'DC Ply Mens 2016/2017 Snowboard',
        'category' => 'Доски и лыжи',
        'price' => 159999,
        'image' => 'img/lot-2.jpg'
    ],
    [
        'name' => 'Крепления Union Contact Pro 2015 года размер L/XL',
        'category' => 'Крепления',
        'price' => 8000,
        'image' => 'img/lot-3.jpg'
    ],
    [
        'name' => 'Ботинки для сноуборда DC Mutiny Charocal',
        'category' => 'Ботинки',
        'price' => 10999,
        'image' => 'img/lot-4.jpg'
    ],
    [
        'name' => 'Куртка для сноуборда DC Mutiny Charocal',
        'category' => 'Одежда',
        'price' => 7500,
        'image' => 'img/lot-5.jpg'
    ],
    [
        'name' => 'Маска Oakley Canopy',
        'category' => 'Разное',
        'price' => 5400,
        'image' => 'img/lot-6.jpg'
    ],
];

function append_rubble($price) {
    return $price . ' ₽';
}

function format_sum($num) {
    return $num >= 1000 ? append_rubble(number_format($num, 0, '.', ' ')) : append_rubble($num);
}

$page_content = render_template('templates/layout.php', ['lots' => $lots]);
$layout_content = render_template('templates/index.php', [
    'content' => $page_content,
    'categories' => $categories,
    'title' => 'Yeticave'
]);

print($layout_content);

В итоге вижу такое сообщение на странице:
5e10cb96de1cd796547098.png
Почему такое может происходить? Почему он не видит эту переменную $lots?

upd1: если проверить значение переменной $lots в шаблоне через var_dump(), то в ответ приходит NULL.
upd2: $is_auth - это переменная, которая показывает, авторизованный пользователь или нет (рандом сейчас, т.к это просто заглушка, функционал еще не реализован этого).
она на этот шаблон никак не влияет, т.к. используется в другом месте.
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
@RivalCode
У вас путаница в шаблонах, код привели для templates/layout.php, но судя по ошибке его же и вызываете второй раз как templates/index.php (без ['lots' => $lots])
Возможно перепутаны местами layout и index
$page_content = render_template('templates/layout.php', ['lots' => $lots]); //тут ошибки нет
//ошибка возникает при следующем вызове
$layout_content = render_template('templates/index.php', [
    'content' => $page_content,
    'categories' => $categories,
    'title' => 'Yeticave'
]);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Потому, что $lots - многомерный массив.
Ответ написан
$is_auth = (bool) rand(0, 1);
Эт что такое?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы