Как правильно назначить переменные для зацикливания в шаблоне php в php8.2

Я пытаюсь сделать что-то столь же простое, как отображение 5 статей в шаблоне php. С кодом, который у меня есть, я могу отобразить 5 статей, но я также получаю 5 верхних и 5 нижних колонтитулов. Итак, что я действительно хочу, так это отправить данные на шаблон и выполнить там цикл foreach.

Если я попытаюсь поместить цикл «данные foreach как элемент» в шаблон, я получу «неопределенную переменную», что бы я ни называл массивом свойств.

Может ли кто-нибудь увидеть, что я делаю неправильно?

Вот что у меня есть:

function archive() {
   $tpl = new Template();
  // setting PDO to use buffered queries in mysql is
  // important if you plan on using multiple result cursors
  // in the template.
  $db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD , array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
     
  $results = $db->prepare("select * from articles");
  $results->execute();
  
  // assign to smarty

  $tpl->pageTitle = "Arkiv";
  while($row = $results->fetch(PDO::FETCH_ASSOC)){
  $tpl->properties['id'] = $row["id"];
  $tpl->properties['title'] = $row["title"];
  $tpl->properties['publicationDate'] = $row["publicationDate"];
  $tpl->properties['summary'] = $row["summary"];
  $tpl->properties['content'] = $row["content"];
  $tpl->properties['image'] = $row["image"];
  echo $tpl->render('/archive2.tpl');
}
}

И вот мой шаблон:

<?php include 'header.tpl'; ?>
     <article>
    <div class = "row">
         <div class = "col-md-6">
             <h1><?=$this->title;?></h1><br><?=$this->publicationDate;?>
         </div>
         <div class = "col-md-6">
             <img src = "images/<?=$this->image;?>" class = "img-responsive" />
         </div>
         <div class = "col-md-12">
            <?=$this->summary;?>
            <?=$this->content;?>
        
        <button class = "btn btn-success" style = "float: right;" onClick = "location.href='.?action=viewArticle&amp;articleId=<?=$this->id;?>'">Les mer...</button>
</div> 
</div>
</article>
<?php include 'footer.tpl';?>

А вот попытка без условия while, которую я использовал при попытке зациклиться в шаблоне

function archive() {
   $tpl = new Template();
  // setting PDO to use buffered queries in mysql is
  // important if you plan on using multiple result cursors
  // in the template.
  $db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD , array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
     
  $results = $db->prepare("select * from articles");
  $results->execute();
  
  // assign to smarty

  $tpl->pageTitle = " Arkiv";
  $row = $results->fetch(PDO::FETCH_ASSOC);

  $tpl->properties['id'] = $row["id"];
  $tpl->properties['title'] = $row["title"];
  $tpl->properties['publicationDate'] = $row["publicationDate"];
  $tpl->properties['summary'] = $row["summary"];
  $tpl->properties['content'] = $row["content"];
  $tpl->properties['image'] = $row["image"];
  echo $tpl->render('/archive.tpl');
}

И вот класс шаблона:

    class Template {
  private $_scriptPath=TEMPLATE_PATH;//comes from config.php
  public $properties;
  public function setScriptPath($scriptPath){
    $this->_scriptPath=$scriptPath;
  }
  public function __construct(){
      $this->properties = array();
  }
  public function render($filename){

   ob_start();
   if (file_exists($this->_scriptPath.$filename)){
     include($this->_scriptPath.$filename);
    } else throw new TemplateNotFoundException();
    return ob_get_clean();
  }
  public function __set($k, $v){
      $this->properties[$k] = $v;
  }
  public function __get($k){
      return $this->properties[$k];
  }
}

что такое Template, фреймворк?

Lawrence Cherone 19.04.2023 00:28

Я добавил класс шаблона

Wrangster 19.04.2023 00:38

Пожалуйста, уменьшите свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.

Community 19.04.2023 06:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Главный вопрос: зачем пытаться подражать смарту?

Однако ваша система также может работать. Чтобы отобразить более одной строки, вы можете вставить цикл в свой шаблон, но вы должны передать ему массив данных.

Таким образом, в вашем функциональном архиве вы можете прочитать данные (я предлагаю вам использовать режим PDO::FETCH_OBJ), а затем передать их в свой шаблон:

$results = $db->prepare('select * from articles');
$results->execute();
$rows = $results->fetchAll(PDO::FETCH_OBJ); // let's get it all

$tpl->properties['rows'] = $rows; // here we assign all the rows to the template 

Ваш шаблон будет выглядеть примерно так:

<?php include 'header.tpl'; ?>

<article>

    <?php foreach ($this->rows as $row): ?>

        <div class = "row">
    
            <div class = "col-md-6">
                <h1> <?= $row->title ?> </h1>
                <br> 
                <?= $row->publicationDate ?>
            </div>      
            
            <div class = "col-md-6">
                <img src = "images/<?= $row->image ?>" class = "img-responsive" />
            </div>
            
            <div class = "col-md-12">

                <?= $row->summary ?>
                <?= $row->content ?>

                <button class = "btn btn-success" style = "float: right;" 
                        onClick = "location.href='.?action=viewArticle&amp;articleId=<?= $row->id ?>'"
                >
                    Les mer...
                </button>
            
            </div> 

        </div>
        
    <?php endforeach; ?>
        
</article>

<?php include 'footer.tpl';?>

Вы должны иметь в виду, что:

  • Рядов данных теперь мало, когда у вас их много, вам придется строить систему пагинации.
  • Поскольку динамические свойства PHP 8.2 устарели, вам нужно будет определить свойство pageTitle в вашем классе Template.

Спасибо ОГРОМНОЕ!!! Ваше решение сработало идеально. Сначала я попробовал просто «foreach $rows as $row» и получил ту же «неопределенную переменную $rows в шаблоне», как и в 100 разных попытках раньше. Различие заключалось в «foreach $this->rows as $row». Причина, по которой я попробовал шаблоны php вместо smarty, заключается в том, что я хотел понять, что происходит. Smarty слишком большой и сложный для меня. Я недостаточно умен для умников. :) Еще раз спасибо!

Wrangster 19.04.2023 21:35

Другие вопросы по теме