今天我们将创建分页类像我们第二天所描述的那样:“用户可以看到按类别和日期排序并且分页的所有工作的列表,每页有20个职位。”
首先我们要为分类页添加一个好看的路由,打开路由文件,并在开头写上:
#src/Ens/JobeetBundle/Resources/config/routing.yml
EnsJobeetBundle_category:
pattern: /category/{slug}
defaults: { _controller: EnsJobeetBundle:Category:show }
为了得到slug 我们要将getSlug()方法添加到category类中:
// src/Ens/JobeetBundle/Entity/Category.php
// ...
use Ens\JobeetBundle\Utils\Jobeet;
class Category
{
// ...
public function getSlug()
{
return Jobeet::slugify($this->getName());
}
// ...
}
打开index.html.twig并添加分类页的链接:
<!-- src/Ens/JobeetBundle/Resources/views/Job/index.html.twig -->
<!-- some HTML code -->
<h1><a href="{{ path('EnsJobeetBundle_category', { 'slug': category.slug }) }}">{{ category.name }}</a></h1>
<!-- some HTML code -->
</table>
{% if category.morejobs %}
<div class="more_jobs">
and <a href="{{ path('EnsJobeetBundle_category', { 'slug': category.slug }) }}">{{ category.morejobs }}</a>
more...
</div>
{% endif %}
</div>
{% endfor %}
</div>
{% endblock %}
在模板中我们需要使用category.morejobs,现在然我们来定义一下:
// src/Ens/JobeetBunlde/Entity/Category.php
// ...
private $more_jobs;
// ...
public function setMoreJobs($jobs)
{
$this->more_jobs = $jobs >= 0 ? $jobs : 0;
}
public function getMoreJobs()
{
return $this->more_jobs;
}
// ...
more_jobs属性是指所有该分类的有效职位数量减去在首页列表中已显示的该分类的职位数量。具体看代码:
// src/Ens/JobeetBundle/Controller/JobController.php
// ...
public function indexAction()
{
$em = $this->getDoctrine()->getEntityManager();
$categories = $em->getRepository('EnsJobeetBundle:Category')->getWithJobs();
foreach($categories as $category)
{
$category->setActiveJobs($em->getRepository('EnsJobeetBundle:Job')->getActiveJobs($category->getId(), $this->container->getParameter('max_jobs_on_homepage')));
$category->setMoreJobs($em->getRepository('EnsJobeetBundle:Job')->countActiveJobs($category->getId()) - $this->container->getParameter('max_jobs_on_homepage'));
}
return $this->render('EnsJobeetBundle:Job:index.html.twig', array(
'categories' => $categories
));
}
// ...
接着在JobRepository里面添加countActiveJobs方法:
// src/Ens/JobeetBundle/Repository/JobRepository.php
// ...
public function countActiveJobs($category_id = null)
{
$qb = $this->createQueryBuilder('j')
->select('count(j.id)')
->where('j.expires_at > :date')
->setParameter('date', date('Y-m-d H:i:s', time()));
if($category_id)
{
$qb->andWhere('j.category = :category_id')
->setParameter('category_id', $category_id);
}
$query = $qb->getQuery();
return $query->getSingleScalarResult();
}
// ...
现在打开浏览器刷新之后就可以看到如下效果:
现在是时候创建category 控制器了。打开Controller文件夹并在其中新建一个CategoryController.php文件
// src/Ens/JobeetBundle/Controller/CategoryController
namespace Ens\JobeetBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Ens\JobeetBundle\Entity\Category;
/**
* Category controller.
*
*/
class CategoryController extends Controller
{
}
当然我们此时也可以使用doctrine:generate:crud命令来创建基本的操作,但其中90%的代码我们并不需要,所以我们只要手动创建一个控制器即可
我们需要在category表中添加slug列并将其添加到lifecycle中,使其能在插入时自动填充
#src/Ens/JobeetBundle/Resources/config/doctrine/Category.orm.yml
Ens\JobeetBundle\Entity\Category:
type: entity
repositoryClass: Ens\JobeetBundle\Repository\CategoryRepository
table: category
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
name:
type: string
length: 255
unique: true
slug:
type: string
length: 255
unique: true
oneToMany:
jobs:
targetEntity: Job
mappedBy: category
category_affiliates:
targetEntity: CategoryAffiliate
mappedBy: category
lifecycleCallbacks:
prePersist: [ setSlugValue ]
preUpdate: [ setSlugValue ]
移除我们稍早之前在Category entity (src/Ens/JobeetBundle/Entity/Category.php
)中创建的getSlug方法,并执行如下命令更新Category entity类
php app/console doctrine:generate:entities EnsJobeetBundle
现在我们再看Category.php就能看到被添加的方法
// srr/Ens/JobeetBundle/Entity/Category.php
// ...
/**
* @var string $slug
*/
private $slug;
/**
* Set slug
*
* @param string $slug
*/
public function setSlug($slug)
{
$this->slug = $slug;
}
/**
* Get slug
*
* @return string
*/
public function getSlug()
{
return $this->slug;
}
/**
* @ORM\prePersist
*/
public function setSlugValue()
{
$this->slug = Jobeet::slugify($this->getName());
}
我们现在不得不删除数据库并创建一个新的列在category表中,并加载数据:
php app/console doctrine:database:drop --force
php app/console doctrine:database:create
php app/console doctrine:schema:update --force
php app/console doctrine:fixtures:load
现在我们可将如下代码添加到CategoryController.php中的showAction()方法中
// src/Ens/JobeetBundle/Controller/CategoryController.php
// ...
public function showAction($slug)
{
$em = $this->getDoctrine()->getEntityManager();
$category = $em->getRepository('EnsJobeetBundle:Category')->findOneBySlug($slug);
if (!$category) {
throw $this->createNotFoundException('Unable to find Category entity.');
}
$category->setActiveJobs($em->getRepository('EnsJobeetBundle:Job')->getActiveJobs($category->getId()));
return $this->render('EnsJobeetBundle:Category:show.html.twig', array(
'category' => $category,
));
}
// ...
接下来创建show.html.twig模板:
{% extends 'EnsJobeetBundle::layout.html.twig' %}
{% block title %}
Jobs in the {{ category.name }} category
{% endblock %}
{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" href="{{ asset('bundles/ensjobeet/css/jobs.css') }}" type="text/css" media="all" />
{% endblock %}
{% block content %}
<div class="category">
<div class="feed">
<a href="">Feed</a>
</div>
<h1>{{ category.name }}</h1>
</div>
<table class="jobs">
{% for entity in category.activejobs %}
<tr class="{{ cycle(['even', 'odd'], loop.index) }}">
<td class="location">{{ entity.location }}</td>
<td class="position">
<a href="{{ path('ens_job_show', { 'id': entity.id, 'company': entity.companyslug, 'location': entity.locationslug, 'position': entity.positionslug }) }}">
{{ entity.position }}
</a>
</td>
<td class="company">{{ entity.company }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
现在我们已经看到我们从job的index.html.twig模板中复制了一份
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。