发新话题
打印

CakePHP指南 - Blog开发实例 [申请加精]

添加一个新的帖子:

app/controllers/posts_controller.php

<?php

class PostsController extends PostsHelper
{
       function index()
       {
       }

       function view($id)
       {
               $this->models['post']->setId($id);
               $this->set('data', $this->models['post']->read());
       }

       function add()
       {
               if (empty($this->params['data']))
               {
                       $this->render();
               }
               else
               {
                       if ($this->models['post']->save($this->params['data']))
                       {
                               $this->flash('Your post has been saved.','/posts');
                       }
                       else
                       {
                               $this->set('data', $this->params['data']);
                               $this->validateErrors($this->models['post']);
                               $this->render();
                       }
               }
       }
}

?>
同时行为的模版文件是:

app/views/posts/add.thtml

<h1>Add post to blog</h1>
<?php echo $html->formTag('/posts/add')?>
       <p>Title: <?php echo $html->inputTag('post/title', 40)?> <?php echo $html->tagErrorMsg('post/title', 'Title is required.') ?></p>
       <p>Body:  <?php echo $html->areaTag('body') ?> <?php echo $html->tagErrorMsg('post/body', 'Body is required.') ?></p>
       <p><?php echo $html->submitTag('Save') ?></p>
</form>
现在你可以通过地址"/cake/posts/add"来访问 add 页面page at the address "/cake/posts/add", 或者,我们可以在索引页面的底部放上一个快捷的“Add new post”连接:

app/views/posts/index.thtml

<h1>Blog posts</h1>
<table>
       <tr>
               <th>Id</th>
               <th>Title</th>
               <th>Created</th>
       </tr>
       <?php foreach ($this->post->findAll() as $post): ?>
       <tr>
               <td><?php echo $post['id']?></td>
               <td>
                       <?php echo $html->linkTo($post['title'], "/posts/view/{$post['id']}")?>
               </td>
               <td><?php echo $post['created']?></td>
       </tr>
       <?php endforeach; ?>
</table>

<?php echo $html->linkTo('Add new post', '/posts/add') ?>
现在让我们试试添加一些帖子。

像我这样没规矩的,添加了一个没有标题的帖子。当然,我们可以通过数据有效性检验(Data Validation)来避免这种不正确的行为。

TOP

数据有效性

数据有效性规则是放在数据模型中的。

app/models/post.php

<?php

class Post extends AppModel
{
       var $validate = array(
               'title'=>VALID_NOT_EMPTY,
               'body'=>VALID_NOT_EMPTY);
}

?>
了解API文档中更多关于有效检验器的内容。

TOP

删除一个帖子

app/controllers/posts_controller.php

<?php

class PostsController extends PostsHelper
{
       function index()
       {
       }

       function view($id)
       {
               $this->models['post']->setId($id);
               $this->set('data', $this->models['post']->read());
       }

       function add()
       {
               if (empty($this->params['data']))
               {
                       $this->render();
               }
               else
               {
                       if ($this->models['post']->save($this->params['data']))
                       {
                               $this->flash('Your post has been saved.','/posts');
                       }
                       else
                       {
                               $this->set('data', $this->params['data']);
                               $this->validateErrors($this->models['post']);
                               $this->render();
                       }
               }
       }

       function delete($id)
       {
               if ($this->models['post']->del($id))
               {
                       $this->flash('The post with id: '.$id.' has been deleted.', '/posts');
               }
       }
}

?>
delete 行为没有模版。在成功删除之后,我们只要显示一个快捷消息(所谓的“flash”),然后转回索引页面。

现在我们添加一个删除行为的连接到每一个blog帖子的视图中:

app/views/posts/index.thtml

<h1>Blog posts</h1>
<table>
       <tr>
               <th>Id</th>
               <th>Title</th>
               <th>Created</th>
       </tr>
       <?php foreach ($this->post->findAll() as $post): ?>
       <tr>
               <td><?php echo $post['id']?></td>
               <td>
                       <?php echo $html->linkTo($post['title'], "/posts/view/{$post['id']}")?>
                       <?php echo $html->linkTo('Delete',"/posts/delete/{$post['id']}", null, "Are you sure you want to delete post entitled \'{$post['title']}\'?")?>
               </td>
               <td><?php echo $post['created']?></td>
       </tr>
       <?php endforeach; ?>
</table>

<?php echo $html->linkTo('Add new post', '/posts/add') ?>
在完成它之后,我们就可以删除那些空白标题的帖子了。

TOP

编辑帖子

app/controllers/posts_controller.php

<?php

class PostsController extends PostsHelper
{
       function index()
       {
       }

       function view($id)
       {
               $this->models['post']->setId($id);
               $this->set('data', $this->models['post']->read());
       }

       function add()
       {
               if (empty($this->params['data']))
               {
                       $this->render();
               }
               else
               {
                       if ($this->models['post']->save($this->params['data']))
                       {
                               $this->flash('Your post has been saved.','/posts');
                       }
                       else
                       {
                               $this->set('data', $this->params['data']);
                               $this->validateErrors($this->models['post']);
                               $this->render();
                       }
               }
       }

       function delete($id)
       {
               if ($this->models['post']->del($id))
               {
                       $this->flash('The post with id: '.$id.' has been deleted.', '/posts');
               }
       }

       function edit($id=null)
       {
               if (empty($this->params['data']))
               {
                       $this->models['post']->setId($id);
                       $this->params['data']= $this->models['post']->read();
                       $this->render();
               }
               else
               {
                       $this->models['post']->set($this->params['data']);
                       if ( $this->models['post']->save())
                       {
                               $this->flash('Your post has been updated.','/posts');
                       }
                       else
                       {
                               $this->set('data', $this->params['data']);
                               $this->validateErrors($this->models['post']);
                               $this->render();
                       }
               }
       }
}

?>
app/views/posts/edit.thtml

<h1>Edit post to blog</h1>
<?php echo $html->formTag('/posts/edit')?>
       <input type="hidden" name="data[id]" value="<?php echo $html->tagValue('id')?>"/>
       <p>Title: <?php echo $html->inputTag('post/title', 40)?>
               <?php echo $html->tagErrorMsg('post/title', 'Title is required.') ?></p>
       <p><?php echo $html->areaTag('body') ?>
               <?php echo $html->tagErrorMsg('post/body', 'Body is required.') ?></p>
       <p><?php echo $html->submitTag('Save') ?></p>
</form>
你也可以在表单标签中用

<?php echo $html->hiddenTag('id')?>
来代替直接使用html的<input>标签。

同时, 在 index.thtml 中, 我们添加一个编辑连接:

<h1>Blog posts</h1>
<table>
       <tr>
               <th>Id</th>
               <th>Title</th>
               <th>Created</th>
       </tr>
       <?php foreach ($this->post->findAll() as $post): ?>
       <tr>
               <td><?php echo $post['id']?></td>
               <td>
                       <?php echo $html->linkTo($post['title'], "/posts/view/{$post['id']}")?>
                       <?php echo $html->linkTo('Delete',"/posts/delete/{$post['id']}", null, "Are you sure you want to delete post entitled \'{$post['title']}\'?")?>
                       <?php echo $html->linkTo('Edit',"/posts/edit/{$post['id']}")?>
               </td>
               <td><?php echo $post['created']?></td>
       </tr>
       <?php endforeach; ?>
</table>

<?php echo $html->linkTo('Add new post', '/posts/add') ?>

TOP

从视图中分离逻辑

让我们回头看一下 index.thtml 视图:

app/views/posts/index.thtml

...
<?php foreach ($this->post->findAll() as $post): ?>
...
我们应该从视图中删除 findAll() 的调用,然后把它放在控制器重。这可以建立一种更好的逻辑和视图的分离。然后我们从控制器重为视图获取数据。现在就让我们完成它吧。

在帖子的控制器中,我们从posts模型中获取所有的记录,并且储存在变量 data 中。

app/controllers/posts_controller.php

<?php
...
function index ()
{
       $this->set('data', $this->models['post']->findAll());
}
...
?>
同时在视图中,我们通过对每行数据的迭代,来全部显示他的内容。

app/views/posts/index.thtml

...
<?php foreach ($data as $post): ?>
...
这太简单了,不是么?

TOP

好了,到此结束,希望对大家有用。

TOP

太爱楼主

楼主加油!

TOP

没有下文了吗?

TOP

这不是官方的帮助吗~

TOP

正需要,谢谢

顶!正需要,谢谢

TOP

发新话题