Я пытаюсь сделать что-то столь же простое, как отображение 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&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];
}
}
Я добавил класс шаблона
Пожалуйста, уменьшите свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.
Главный вопрос: зачем пытаться подражать смарту?
Однако ваша система также может работать. Чтобы отобразить более одной строки, вы можете вставить цикл в свой шаблон, но вы должны передать ему массив данных.
Таким образом, в вашем функциональном архиве вы можете прочитать данные (я предлагаю вам использовать режим 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&articleId=<?= $row->id ?>'"
>
Les mer...
</button>
</div>
</div>
<?php endforeach; ?>
</article>
<?php include 'footer.tpl';?>
Вы должны иметь в виду, что:
Спасибо ОГРОМНОЕ!!! Ваше решение сработало идеально. Сначала я попробовал просто «foreach $rows as $row» и получил ту же «неопределенную переменную $rows в шаблоне», как и в 100 разных попытках раньше. Различие заключалось в «foreach $this->rows as $row». Причина, по которой я попробовал шаблоны php вместо smarty, заключается в том, что я хотел понять, что происходит. Smarty слишком большой и сложный для меня. Я недостаточно умен для умников. :) Еще раз спасибо!
что такое
Template
, фреймворк?