Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
67 / 67 |
CategoryRepository | |
100.00% |
1 / 1 |
|
100.00% |
7 / 7 |
21 | |
100.00% |
67 / 67 |
setApplication | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getTotalCount | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
getList | |
100.00% |
1 / 1 |
4 | |
100.00% |
25 / 25 |
|||
up | |
100.00% |
1 / 1 |
3 | |
100.00% |
0 / 0 |
|||
down | |
100.00% |
1 / 1 |
3 | |
100.00% |
0 / 0 |
|||
save | |
100.00% |
1 / 1 |
5 | |
100.00% |
24 / 24 |
|||
delete | |
100.00% |
1 / 1 |
4 | |
100.00% |
16 / 16 |
<?php | |
/* | |
* This file is part of EC-CUBE | |
* | |
* Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved. | |
* | |
* http://www.lockon.co.jp/ | |
* | |
* This program is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU General Public License | |
* as published by the Free Software Foundation; either version 2 | |
* of the License, or (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License | |
* along with this program; if not, write to the Free Software | |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
*/ | |
namespace Eccube\Repository; | |
use Doctrine\ORM\EntityRepository; | |
use Eccube\Application; | |
use Eccube\Entity\Category; | |
/** | |
* CategoryRepository | |
* | |
* This class was generated by the Doctrine ORM. Add your own custom | |
* repository methods below. | |
*/ | |
class CategoryRepository extends EntityRepository | |
{ | |
/** | |
* @var \Eccube\Application | |
*/ | |
protected $app; | |
public function setApplication(Application $app) | |
{ | |
$this->app = $app; | |
} | |
/** | |
* 全カテゴリの合計を取得する. | |
* | |
* @return int 全カテゴリの合計数 | |
*/ | |
public function getTotalCount() | |
{ | |
$qb = $this | |
->createQueryBuilder('c') | |
->select('count(c.id)') | |
->where('c.del_flg = 0'); | |
$count = $qb->getQuery() | |
->getSingleScalarResult(); | |
return $count; | |
} | |
/** | |
* カテゴリ一覧を取得する. | |
* | |
* 引数 $Parent を指定した場合は, 指定したカテゴリの子以下を取得する. | |
* | |
* @param \Eccube\Entity\Category|null $Parent 指定の親カテゴリ | |
* @param bool $flat trueの場合, 階層化されたカテゴリを一つの配列にまとめる | |
* | |
* @return \Eccube\Entity\Category[] カテゴリの配列 | |
*/ | |
public function getList(Category $Parent = null, $flat = false) | |
{ | |
$options = $this->app['config']['doctrine_cache']; | |
$lifetime = $options['result_cache']['lifetime']; | |
$qb = $this->createQueryBuilder('c1') | |
->select('c1, c2, c3, c4, c5') | |
->leftJoin('c1.Children', 'c2') | |
->leftJoin('c2.Children', 'c3') | |
->leftJoin('c3.Children', 'c4') | |
->leftJoin('c4.Children', 'c5') | |
->orderBy('c1.rank', 'DESC') | |
->addOrderBy('c2.rank', 'DESC') | |
->addOrderBy('c3.rank', 'DESC') | |
->addOrderBy('c4.rank', 'DESC') | |
->addOrderBy('c5.rank', 'DESC'); | |
if ($Parent) { | |
$qb->where('c1.Parent = :Parent')->setParameter('Parent', $Parent); | |
} else { | |
$qb->where('c1.Parent IS NULL'); | |
} | |
$Categories = $qb->getQuery() | |
->useResultCache(true, $lifetime) | |
->getResult(); | |
if ($flat) { | |
$array = array(); | |
foreach ($Categories as $Category) { | |
$array = array_merge($array, $Category->getSelfAndDescendants()); | |
} | |
$Categories = $array; | |
} | |
return $Categories; | |
} | |
/** | |
* カテゴリの順位を1上げる. | |
* | |
* @param \Eccube\Entity\Category $Category カテゴリ | |
* @return boolean 成功した場合 true | |
* | |
* @deprecated since 3.0.0, to be removed in 3.1 | |
*/ | |
public function up(\Eccube\Entity\Category $Category) | |
{ | |
$em = $this->getEntityManager(); | |
$em->getConnection()->beginTransaction(); | |
try { | |
$rank = $Category->getRank(); | |
$Parent = $Category->getParent(); | |
if ($Parent) { | |
$CategoryUp = $this->createQueryBuilder('c') | |
->where('c.rank > :rank AND c.Parent = :Parent') | |
->setParameter('rank', $rank) | |
->setParameter('Parent', $Parent) | |
->orderBy('c.rank', 'ASC') | |
->setMaxResults(1) | |
->getQuery() | |
->getSingleResult(); | |
} else { | |
$CategoryUp = $this->createQueryBuilder('c') | |
->where('c.rank > :rank AND c.Parent IS NULL') | |
->setParameter('rank', $rank) | |
->orderBy('c.rank', 'ASC') | |
->setMaxResults(1) | |
->getQuery() | |
->getSingleResult(); | |
} | |
$this_count = $Category->countBranches(); | |
$up_count = $CategoryUp->countBranches(); | |
$Category->calcChildrenRank($em, $up_count); | |
$CategoryUp->calcChildrenRank($em, $this_count * -1); | |
$em->flush(); | |
$em->getConnection()->commit(); | |
} catch (\Exception $e) { | |
$em->getConnection()->rollback(); | |
return false; | |
} | |
return true; | |
} | |
/** | |
* カテゴリの順位を1下げる. | |
* | |
* @param \Eccube\Entity\Category $Category カテゴリ | |
* @return boolean 成功した場合 true | |
* | |
* @deprecated since 3.0.0, to be removed in 3.1 | |
*/ | |
public function down(\Eccube\Entity\Category $Category) | |
{ | |
$em = $this->getEntityManager(); | |
$em->getConnection()->beginTransaction(); | |
try { | |
$rank = $Category->getRank(); | |
$Parent = $Category->getParent(); | |
if ($Parent) { | |
$CategoryDown = $this->createQueryBuilder('c') | |
->where('c.rank < :rank AND c.Parent = :Parent') | |
->setParameter('rank', $rank) | |
->setParameter('Parent', $Parent) | |
->orderBy('c.rank', 'DESC') | |
->setMaxResults(1) | |
->getQuery() | |
->getSingleResult(); | |
} else { | |
$CategoryDown = $this->createQueryBuilder('c') | |
->where('c.rank < :rank AND c.Parent IS NULL') | |
->setParameter('rank', $rank) | |
->orderBy('c.rank', 'DESC') | |
->setMaxResults(1) | |
->getQuery() | |
->getSingleResult(); | |
} | |
$this_count = $Category->countBranches(); | |
$down_count = $CategoryDown->countBranches(); | |
$Category->calcChildrenRank($em, $down_count * -1); | |
$CategoryDown->calcChildrenRank($em, $this_count); | |
$em->flush(); | |
$em->getConnection()->commit(); | |
} catch (\Exception $e) { | |
$em->getConnection()->rollback(); | |
return false; | |
} | |
return true; | |
} | |
/** | |
* カテゴリを保存する. | |
* | |
* @param \Eccube\Entity\Category $Category カテゴリ | |
* @return boolean 成功した場合 true | |
*/ | |
public function save(\Eccube\Entity\Category $Category) | |
{ | |
$em = $this->getEntityManager(); | |
$em->getConnection()->beginTransaction(); | |
try { | |
if (!$Category->getId()) { | |
$Parent = $Category->getParent(); | |
if ($Parent) { | |
$rank = $Parent->getRank() - 1; | |
} else { | |
$rank = $this->createQueryBuilder('c') | |
->select('MAX(c.rank)') | |
->getQuery() | |
->getSingleScalarResult(); | |
} | |
if (!$rank) { | |
$rank = 0; | |
} | |
$Category->setRank($rank + 1); | |
$Category->setDelFlg(0); | |
$em->createQueryBuilder() | |
->update('Eccube\Entity\Category', 'c') | |
->set('c.rank', 'c.rank + 1') | |
->where('c.rank > :rank') | |
->setParameter('rank', $rank) | |
->getQuery() | |
->execute(); | |
} | |
$em->persist($Category); | |
$em->flush(); | |
$em->getConnection()->commit(); | |
} catch (\Exception $e) { | |
$em->getConnection()->rollback(); | |
return false; | |
} | |
return true; | |
} | |
/** | |
* カテゴリを削除する. | |
* | |
* @param \Eccube\Entity\Category $Category 削除対象のカテゴリ | |
* @return boolean 成功した場合 true, 子カテゴリが存在する場合, 商品カテゴリが紐づいている場合は false | |
*/ | |
public function delete(\Eccube\Entity\Category $Category) | |
{ | |
$em = $this->getEntityManager(); | |
$em->getConnection()->beginTransaction(); | |
try { | |
if ($Category->getChildren()->count() > 0 || $Category->getProductCategories()->count() > 0) { | |
throw new \Exception(); | |
} | |
$rank = $Category->getRank(); | |
$em->createQueryBuilder() | |
->update('Eccube\Entity\Category', 'c') | |
->set('c.rank', 'c.rank - 1') | |
->where('c.rank > :rank') | |
->setParameter('rank', $rank) | |
->getQuery() | |
->execute(); | |
$Category->setDelFlg(1); | |
$em->persist($Category); | |
$em->flush(); | |
$em->getConnection()->commit(); | |
} catch (\Exception $e) { | |
$em->getConnection()->rollback(); | |
return false; | |
} | |
return true; | |
} | |
} |