创建一个静态新闻列表页面(最简单)
这个方案不依赖后台分类,直接在模板文件中硬编码新闻列表,适合展示几条固定的、重要的新闻。

(图片来源网络,侵删)
第1步:创建模板文件
- 找到模板目录:进入你的PHPWind根目录,找到
template/文件夹,然后进入你正在使用的模板文件夹(v9/或default/)。 - 创建新文件:在模板文件夹内,创建一个新文件,命名为
news.htm。
第2步:编写极简模板代码
打开刚刚创建的 news.htm 文件,粘贴以下代码,这是一个非常基础的HTML结构,只包含标题和新闻列表。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">网站新闻 - {PW::$setting['site_name']}</title>
<!-- 可以在这里引入你的CSS,比如极简的样式 -->
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 40px auto; padding: 0 20px; }
h1 { border-bottom: 1px solid #eee; padding-bottom: 10px; }
.news-list { list-style: none; padding: 0; }
.news-item { padding: 15px 0; border-bottom: 1px solid #f0f0f0; }
.news-item:last-child { border-bottom: none; }
.news-title { font-size: 1.2em; font-weight: bold; margin-bottom: 5px; }
.news-title a { text-decoration: none; color: #333; }
.news-title a:hover { color: #007bff; }
.news-meta { font-size: 0.9em; color: #888; }
</style>
</head>
<body>
<h1>网站新闻</h1>
<ul class="news-list">
<!-- 这里是新闻列表,我们将用PHP代码来填充 -->
{loop $newsList $news}
<li class="news-item">
<div class="news-title">
<a href="{$news.url}">{$news.subject}</a>
</div>
<div class="news-meta">
发布于 {date('Y-m-d H:i:s', $news.postdate)} | 作者:{$news.author}
</div>
</li>
{/loop}
</ul>
</body>
</html>
代码解释:
{PW::$setting['site_name']}:调用网站全局设置中的网站名称。{loop $newsList $news}:这是一个PHPWind的模板循环标签,它会遍历一个名为$newsList的PHP变量,每次循环将当前新闻数据赋值给$news变量。{$news.url}:新闻的链接地址。{$news.subject}:新闻的标题。{$news.postdate}:新闻的发布时间戳,我们用date()函数格式化它。{$news.author}:新闻的作者。
第3步:创建PHP控制器文件
模板文件本身无法获取数据,我们需要一个PHP文件来从数据库读取新闻数据,然后分配给模板。
-
找到控制器目录:进入
phpwind/apps/目录,找到你的应用(forum/)或者创建一个新的简单应用,为了简单起见,我们直接在forum应用下创建。
(图片来源网络,侵删) -
创建控制器文件:在
phpwind/apps/forum/controller/目录下,创建一个新文件NewsController.php。 -
编写PHP代码:在
NewsController.php中写入以下代码:
<?php
namespace PWForum\Control;
use Wind\Core\Controller as WindController;
use Wind\Dao\DaoHelper;
/**
* 新闻页面控制器
*/
class NewsController extends WindController {
public function run() {
// 1. 获取数据
// 我们从pw_posts表里获取最新的10条帖子作为新闻
// 注意:pw_posts表结构复杂,这里只做简单示例
$limit = 10;
$sql = "SELECT tid, subject, author, postdate FROM pw_threads WHERE fid = 0 AND ifcheck = 1 ORDER BY postdate DESC LIMIT {$limit}";
// 使用DaoHelper来执行查询,这是PW推荐的数据库操作方式
$threadDao = $this->getDao('forum.PwThread');
$newsList = $threadDao->fetchArray($sql);
// 2. 处理数据,为每条新闻生成链接
// PW的帖子链接规则,你可以根据自己需求修改
$urlHelper = $this->getHelper('url');
foreach ($newsList as &$news) {
// 生成帖子详情页的URL
$news['url'] = $urlHelper->thread($news['tid']);
}
unset($news); // 解除引用
// 3. 分配数据到模板
$this->setOutput($newsList, 'newsList');
// 4. 指定要渲染的模板文件
// 这个路径相对于你的模板目录,template/v9/news.htm
$this->setTemplate('news');
}
}
代码解释:
namespace PWForum\Control;:命名空间,确保控制器能被正确加载。use Wind\Core\Controller as WindController;:引入基础控制器类。$sql = "...":编写SQL查询语句,从pw_threads表(存放帖子的表)中获取最新的10条审核通过的帖子(ifcheck = 1)。$threadDao = $this->getDao('forum.PwThread');:获取帖子的数据访问对象(DAO)。$newsList = $threadDao->fetchArray($sql);:执行查询并获取结果数组。$urlHelper = $this->getHelper('url');:获取URL助手,用于生成符合PW规则的链接。$news['url'] = $urlHelper->thread($news['tid']);:为每条新闻生成详情页的URL。$this->setOutput($newsList, 'newsList');:将$newsList数组以newsList的名字传递给模板。$this->setTemplate('news');:指定渲染template/v9/news.htm这个模板文件。
第4步:配置路由(URL访问)
为了让用户能通过 你的域名/news 访问这个页面,你需要配置路由。

(图片来源网络,侵删)
- 找到路由配置文件:进入
phpwind/apps/forum/config/目录,打开route.php文件。 - 添加路由规则:在
$routeConfig数组中添加一行:
'news' => ['forum/News/run', 'ext' => 'htm'], // 添加这一行
解释:
'news':这是用户访问的URL路径。['forum/News/run', 'ext' => 'htm']:这表示访问forum应用的News控制器的run方法,并且URL后缀是.htm。
第5步:访问页面
清除一下PHPWind的缓存(在后台的“工具”->“更新缓存”),然后访问你的网站域名加上 /news,http://www.yourdomain.com/news,你应该就能看到一个极简风格的新闻列表页面了。
创建一个动态新闻分类页面(更推荐)
这个方案更接近实际应用,它允许你通过后台创建不同的“新闻分类”,然后在页面上展示某个分类下的新闻。
修改步骤
这个方案只需要修改 方案一 中的 第3步(PHP控制器) 和 第4步(路由配置)。
第3步(修改):创建PHP控制器文件
修改 NewsController.php,让它接受一个分类ID(fid)参数。
<?php
namespace PWForum\Control;
use Wind\Core\Controller as WindController;
use Wind\Dao\DaoHelper;
class NewsController extends WindController {
public function run() {
// 1. 获取URL中的分类ID参数,/news/1 表示ID为1的分类
$fid = $this->getInput('fid', 'get/int'); // 从GET请求中获取fid参数,并转为整数
// 如果没有提供fid,可以设置一个默认值,或者报错
if (!$fid) {
// 这里可以跳转到首页或显示错误页面
$this->showError('请指定新闻分类');
}
// 2. 获取数据
$limit = 10;
// SQL查询增加fid条件
$sql = "SELECT tid, subject, author, postdate FROM pw_threads WHERE fid = {$fid} AND ifcheck = 1 ORDER BY postdate DESC LIMIT {$limit}";
$threadDao = $this->getDao('forum.PwThread');
$newsList = $threadDao->fetchArray($sql);
// 3. 处理数据,生成链接
$urlHelper = $this->getHelper('url');
foreach ($newsList as &$news) {
$news['url'] = $urlHelper->thread($news['tid']);
}
unset($news);
// 4. 分配数据到模板
$this->setOutput($newsList, 'newsList');
// 5. 指定模板文件
$this->setTemplate('news');
}
}
第4步(修改):配置路由
修改 route.php,让路由可以接受一个参数。
// 将原来的静态路由改为动态路由 'news/:fid' => ['forum/News/run', 'ext' => 'htm'], // 注意这里的 :fid
解释:
news/:fid:fid是一个占位符,表示URL中/news/后面的部分将被作为fid参数传递给控制器。
如何使用?
- 在后台创建版块:登录PHPwind后台,进入“版块”管理,创建几个版块,公司新闻”、“产品动态”、“行业资讯”,记录下这些版块的ID(fid)。
- 访问URL:
- 访问
你的域名/news/1来查看ID为1的版块下的新闻。 - 访问
你的域名/news/2来查看ID为2的版块下的新闻。
- 访问
总结与优化建议
- 性能优化:对于新闻列表,建议使用PW的缓存机制,可以在控制器中给
$newsList设置一个缓存时间,$this->setOutput($newsList, 'newsList', 3600);,表示缓存1小时,减少数据库查询。 - 分页:如果新闻很多,需要实现分页功能,这需要在SQL中增加
LIMIT和OFFSET计算,并传递分页数据到模板,模板中再使用{if $pages}...{/if}等标签来生成分页链接。 - CSS美化:上面的CSS只是一个基础,你可以根据自己网站的VI设计,进一步美化
.news-item、.news-title等元素的样式,使其更符合“极简”或你自己的审美。 - 安全性:在SQL查询中,虽然我们用了
getInput来转换fid为整数,但更安全的做法是使用PDO的预处理语句来防止SQL注入,对于$fid这样的简单参数,转为整数已经足够安全。
这个教程为你提供了一个从零开始构建PHPWind 9.0新闻页面的完整流程,你可以根据自己的需求,在此基础上进行扩展和修改。
