我试图进入无脂肪的PHP框架,它的工作方式就像一个魅力。有一些我无法弄清楚的事情。简而言之,这里有一个简单的例子:
问题:
当一个人在记录上点击时,会触发GET / view / @ id路由。如何在下一篇文章和上一篇文章的单一视图中实现导航。如果没有下一篇文章和Nr,则链接不应该是可见的。当前文章应该是namend。 (我已经阅读了如何关于游标,但无法弄清楚这一点)
如何在单个视图中使用所有找到的文章填充选择框?
我的设置:
index.php(我在下面的代码中踢了GET / route)
$f3 = require('lib/base.php');
$f3->set('DB',
new DB\SQL(
'mysql:host=localhost;port=3306;dbname=f3',
'root',
'root'
)
);
$f3->route('GET /view/@id',
function($f3) {
$id = $f3->get('PARAMS.id');
$article=new DB\SQL\Mapper($f3->get('DB'),'test');
$f3->set('list',$article->find(array('id=?',$id)));
echo template::instance()->render('single.htm');
}
);
$f3->run();
模板单一视图:
<repeat group="{{ @list }}" value="{{ @item }}">
<p>
{{ @item.name }}
{{ @item.text }}
{{ @item.age }}
</p>
</repeat>
<hr>
<a href="view/@item">prev</a> | <a href="view/@item">next</a> | <small>this is entry XX from XX</small>
<p> <small>Select Entry:</small></p>
<form action="/view" method="post">
<select name="goto">
<repeat group="{{ @list }}" value="{{ @item }}">
<option value="{{ @item.id }}">{{ @item.name }}</option>
</repeat>
</select>
<input type="submit">
</form>
SQL:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`text` text NOT NULL,
`age` text NOT NULL,
`rel` int(11) NOT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
INSERT INTO `test` (`id`, `name`, `text`, `age`, `rel`) VALUES
(1, 'a', 'hi', '20', 1),
(3, 'b', 'yes', '25', 1),
(4, 'c', 'why not', '30', 1),
(5, '1', 'why', '15', 2),
(6, '2', 'Ahoi', '35', 2),
(7, '3', 'ade', '40', 2);
非常感谢!
答案 0 :(得分:1)
到1:这种方式非常脏,但您可以进行两次额外查询,以查找ID更高或更低的文章。如果它返回另一个结果,您可以添加上一个或下一个链接。您应该通过在Stackoverflow上查找“分页”来找到更多示例。
到2:您必须使用数据库中的所有条目进行另一个查询以填充该框。
到3:要么为该表单操作创建新路由,要么将路由更改为:GET|POST /view/@id
但这意味着,您还必须将表单中的操作更改为确切的路由。因此,操作必须如下所示:action="{{(int) @PARAM.id}}"
(我添加了(int)
阻止跨站点脚本)
答案 1 :(得分:1)
为什么在其where条件中使用带有id条件的find(),这可能只返回1个结果然后遍历整个列表?这对我来说没什么意义。 使用findone()或load()方法...然后使用$ article-&gt; next() - &gt; dry();确定是否有另一条记录......相同的prev()/ skip(-2)