我使用的是knpPaginatorBundle,我希望按国家名称(或翻译国家/地区名称,如果可能的话)对结果进行排序代码,因为名称根据区域设置" en,fr,de ..")进行了更改。
例如西班牙在英语中以 S 开头,在法语中以 Espagne 开头,以 E 开头,但是代码是" ES"它当然不会改变。有可能这样做吗?
这是我的代码:
枝条
<li class="sort-by-country {% if pagination.isSorted('t.country') %}active{% endif %}">{{ knp_pagination_sortable(pagination, 'Country', 't.country') }}</li>
控制器:
public function listAction($page, Request $request)
{
$em = $this->getDoctrine()->getManager();
$paginator = $this->get('knp_paginator');
$qb = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend();
$pagination = $paginator->paginate(
$qb,
$request->query->get('page', $page),10);
return $this->render('ProjectFrontendBundle:Travel:travel-list-view.html.twig',array(
'pagination' => $pagination,
));
}
存储库
//getListTravelsFrontend
public function getListTravelsFrontend()
{
$qb = $this->createQueryBuilder('t')
->leftJoin('t.image', 'i')
->addSelect('i')
->leftJoin('t.agence', 'a')
->addSelect('a')
->Where('t.enabled = 1');
return $qb;
}
实体:
class Travel
{
/**
* @ORM\Column(name="country", type="string", length=5, nullable=false)
*
* @Assert\Country
*/
protected $country;
这就是如何显示我使用此扩展程序的国家/地区的名称,并且它更加精简
namespace Project\TravelBundle\Twig;
class CountryExtension extends \Twig_Extension {
public function getFilters()
{
return array(
new \Twig_SimpleFilter('country', array($this, 'countryFilter')),
);
}
public function countryFilter($countryCode,$locale = "en")
{
$c = \Symfony\Component\Intl\Intl::getRegionBundle()->getCountryNames($locale);
return array_key_exists($countryCode, $c)
? $c[$countryCode]
: $countryCode;
}
public function getName()
{
return 'country_extension';
}
}
答案 0 :(得分:0)
看起来您必须将国家/地区加入您的查询构建器。但首先,您必须描述Travel和Country之间的关系(您可以在此处找到有关学说注释的更多信息:http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html)。设置映射后,添加到查询构建器:
->leftJoin('t.country', 'c')
然后在树枝上:
{{ knp_pagination_sortable(pagination, 'Country', 'c.code') }}
也许它会对您有所帮助:Sorting joined table with KnpPaginatorBundle,Sort over ManyToOne Relationship with KnpPaginatorBundle in Symfony2。