Merge branch 'master' of github.com:gergelypolonkai/gergelypolonkaiweb
Conflicts: composer.lock src/GergelyPolonkai/FrontBundle/Resources/views/Default/front_base.html.twig
This commit is contained in:
commit
f1e0205232
@ -1,13 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>{% block title %}Welcome!{% endblock %}</title>
|
||||
{% block stylesheets %}{% endblock %}
|
||||
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
|
||||
</head>
|
||||
<body>
|
||||
{% block body %}{% endblock %}
|
||||
{% block javascripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
@ -45,9 +45,6 @@
|
||||
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
|
||||
]
|
||||
},
|
||||
"config": {
|
||||
"bin-dir": "bin"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"extra": {
|
||||
"symfony-app-dir": "app",
|
||||
|
452
composer.lock
generated
452
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -55,7 +55,7 @@ class AdminController extends Controller
|
||||
* @Route("/blog/post/{id}", name="GergelyPolonkaiFrontBundle_adminEditBlogPost", defaults={"id": null})
|
||||
* @Template
|
||||
*/
|
||||
public function newBlogPostAction($id = null)
|
||||
public function editBlogPostAction($id = null)
|
||||
{
|
||||
if (is_numeric($id)) {
|
||||
$post = $this->getDoctrine()->getRepository('GergelyPolonkaiFrontBundle:Post')->findOneById($id);
|
||||
@ -73,8 +73,8 @@ class AdminController extends Controller
|
||||
if ($request->getMethod() === 'POST') {
|
||||
$form->bind($request);
|
||||
if ($form->isValid()) {
|
||||
$tagManager = $this->get('fpn_tag.tag_manager');
|
||||
if (($tags = $form->get('tags')->getData()) != '') {
|
||||
$tagManager = $this->get('fpn_tag.tag_manager');
|
||||
$tagNames = $tagManager->splitTagNames($tags);
|
||||
$tagList = $tagManager->loadOrCreateTags($tagNames);
|
||||
$tagManager->addTags($tagList, $post);
|
||||
|
@ -4,9 +4,11 @@ namespace GergelyPolonkai\FrontBundle\Controller;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
use Doctrine\ORM\Tools\Pagination\Paginator;
|
||||
|
||||
use GergelyPolonkai\FrontBundle\Entity\Post;
|
||||
use GergelyPolonkai\FrontBundle\Entity\Tag;
|
||||
|
||||
/**
|
||||
* Description of BlogController
|
||||
@ -17,6 +19,9 @@ use GergelyPolonkai\FrontBundle\Entity\Post;
|
||||
*/
|
||||
class BlogController extends Controller
|
||||
{
|
||||
// TODO: Make this a config parameter
|
||||
private $postsPerPage = 10;
|
||||
|
||||
/**
|
||||
* @Route("/", name="GergelyPolonkaiFrontBundle_blogListing")
|
||||
* @Route("/page/{cPage}", name="GergelyPolonkaiFrontBundle_blogListingPage", requirements={"cPage": "\d+"})
|
||||
@ -24,16 +29,14 @@ class BlogController extends Controller
|
||||
*/
|
||||
public function listAction($cPage = 1)
|
||||
{
|
||||
// TODO: Make this a config parameter
|
||||
$postsPerPage = 10;
|
||||
--$cPage;
|
||||
|
||||
$query = $this
|
||||
->getDoctrine()
|
||||
->getEntityManager()
|
||||
->createQuery("SELECT p FROM GergelyPolonkaiFrontBundle:Post p WHERE p.draft = FALSE ORDER BY p.createdAt DESC")
|
||||
->setFirstResult($cPage * $postsPerPage)
|
||||
->setMaxResults($postsPerPage);
|
||||
->setFirstResult($cPage * $this->postsPerPage)
|
||||
->setMaxResults($this->postsPerPage);
|
||||
|
||||
$paginator = new Paginator($query, $fetchJoinCollection = true);
|
||||
$tagManager = $this->get('fpn_tag.tag_manager');
|
||||
@ -42,13 +45,13 @@ class BlogController extends Controller
|
||||
}
|
||||
|
||||
$count = $paginator->count();
|
||||
$pageCount = ceil($count / $postsPerPage);
|
||||
$pageCount = ceil($count / $this->postsPerPage);
|
||||
|
||||
return array(
|
||||
'cpage' => $cPage,
|
||||
'count' => $pageCount,
|
||||
'posts' => $paginator,
|
||||
'perPage' => $postsPerPage,
|
||||
'perPage' => $this->postsPerPage,
|
||||
);
|
||||
}
|
||||
|
||||
@ -93,4 +96,43 @@ class BlogController extends Controller
|
||||
'posts' => $posts,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/tag/{name}/", name="GergelyPolonkaiFrontBundle_blogTagList")
|
||||
* @Route("/tag/{name}/page/{cPage}", name="GergelyPolonkaiFrontBundle_blogTagListingPage", requirements={"cPage": "\d+"})
|
||||
* @Template("GergelyPolonkaiFrontBundle:Blog:list.html.twig")
|
||||
* @ParamConverter("tag")
|
||||
*/
|
||||
public function tagListAction(Tag $tag, $cPage = 1)
|
||||
{
|
||||
$tagRepository = $this->getDoctrine()->getRepository('GergelyPolonkaiFrontBundle:Tag');
|
||||
|
||||
$ids = $tagRepository->getResourceIdsForTag('gergelypolonkaifront_post', $tag->getName());
|
||||
|
||||
--$cPage;
|
||||
|
||||
$query = $this
|
||||
->getDoctrine()
|
||||
->getEntityManager()
|
||||
->createQuery("SELECT p FROM GergelyPolonkaiFrontBundle:Post p WHERE p.draft = FALSE AND p.id IN (:idList) ORDER BY p.createdAt DESC")
|
||||
->setParameter('idList', $ids)
|
||||
->setFirstResult($cPage * $this->postsPerPage)
|
||||
->setMaxResults($this->postsPerPage);
|
||||
|
||||
$paginator = new Paginator($query, $fetchJoinCollection = true);
|
||||
$tagManager = $this->get('fpn_tag.tag_manager');
|
||||
foreach ($paginator as $post) {
|
||||
$tagManager->loadTagging($post);
|
||||
}
|
||||
|
||||
$count = $paginator->count();
|
||||
$pageCount = ceil($count / $this->postsPerPage);
|
||||
|
||||
return array(
|
||||
'cpage' => $cPage,
|
||||
'count' => $pageCount,
|
||||
'posts' => $paginator,
|
||||
'perPage' => $this->postsPerPage,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -94,4 +94,13 @@ class DefaultController extends Controller
|
||||
'code_chunk' => $codeChunk,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/google150e54bda5f96d97.html")
|
||||
* @Template
|
||||
*/
|
||||
public function webmasterToolsAction()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ use FPN\TagBundle\Entity\Tag as BaseTag;
|
||||
*
|
||||
* @author polesz
|
||||
*
|
||||
* @ORM\Entity
|
||||
* @ORM\Entity(repositoryClass="DoctrineExtensions\Taggable\Entity\TagRepository")
|
||||
* @ORM\Table(name="tags")
|
||||
*/
|
||||
class Tag extends BaseTag
|
||||
|
@ -71,18 +71,44 @@ body {
|
||||
}
|
||||
|
||||
#menu {
|
||||
background-color: #f18137;
|
||||
height: 39px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
#tagcloud-button {
|
||||
float: left;
|
||||
padding-top: 2px;
|
||||
padding-left: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#menu ul {
|
||||
margin: 0;
|
||||
margin: 8px;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
text-align: right;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#menu ul li {
|
||||
display: inline;
|
||||
float: right;
|
||||
margin-top: 1px;
|
||||
margin-bottom: 10px;
|
||||
margin-left: 1em;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
#menu ul li.active {
|
||||
background-image: url('../images/arrow-up.png');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center bottom;
|
||||
}
|
||||
|
||||
#menu ul li a {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#content {
|
||||
@ -165,4 +191,49 @@ dd p {
|
||||
#more-posts {
|
||||
margin-top: 1em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#tag-cloud {
|
||||
position: absolute;
|
||||
width: 600px;
|
||||
padding: 8px;
|
||||
border: 1px solid black;
|
||||
background-color: #303030;
|
||||
margin-left: 5px;
|
||||
margin-top: 2px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#tag-cloud a {
|
||||
color: #b3b3b3;
|
||||
text-decoration: none;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
#tag-cloud .size0 {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
#tag-cloud .size1 {
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
#tag-cloud .size2 {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
#tag-cloud .size3 {
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
#tag-cloud .size4 {
|
||||
font-size: 130%;
|
||||
}
|
||||
|
||||
#tag-cloud .size5 {
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear: both;
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 228 B |
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
@ -19,7 +19,7 @@
|
||||
<link>{{ app.request.scheme }}://{{app.request.host }}{{ path('GergelyPolonkaiFrontBundle_blogViewPost', {year: post.createdAt|date('Y'), month: post.createdAt|date('m'), day: post.createdAt|date('d'), slug: post.slug }) }}</link>
|
||||
<comments>{{ app.request.scheme }}://{{app.request.host }}{{ path('GergelyPolonkaiFrontBundle_blogViewPost', {year: post.createdAt|date('Y'), month: post.createdAt|date('m'), day: post.createdAt|date('d'), slug: post.slug }) }}#comments</comments>
|
||||
<pubDate>{{ post.createdAt|date('r') }}</pubDate>
|
||||
<description><![CDATA[{{post.content}}]]></description>
|
||||
<description><![CDATA[{{ post.content|remove_code_chunks }}]]></description>
|
||||
<guid>{{ app.request.scheme }}://{{app.request.host }}{{ path('GergelyPolonkaiFrontBundle_blogViewPost', {year: post.createdAt|date('Y'), month: post.createdAt|date('m'), day: post.createdAt|date('d'), slug: post.slug }) }}</guid>
|
||||
{#
|
||||
<category><![CDATA[Cat1]]></category>
|
||||
|
@ -26,6 +26,9 @@
|
||||
|
||||
{% block content %}
|
||||
{{ block('paginator') }}
|
||||
{% if posts|length == 0 %}
|
||||
No posts found.
|
||||
{% endif %}
|
||||
{% for post in posts %}
|
||||
{% include 'GergelyPolonkaiFrontBundle:Blog:postViewer.html.twig' with {'post': post, 'title_links': true} %}
|
||||
{% endfor %}
|
||||
|
@ -5,7 +5,7 @@
|
||||
{% if post.tags|length > 0 %}
|
||||
<p class="article-tags">Tags:
|
||||
{% for tag in post.tags %}
|
||||
{{ tag.name }}
|
||||
<a href="{{ path('GergelyPolonkaiFrontBundle_blogTagList', { name: tag.name }) }}">{{ tag.name }}</a>
|
||||
{% endfor %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
@ -4,4 +4,5 @@
|
||||
<h3>Disclaimer</h3>
|
||||
<p>The articles and thoughts on this site all originate from me, unless otherwise stated. Please use them with this statement in your mind. If you use anything, please put a backlink on your site to the given article(s) or the main page.</p>
|
||||
<p>The social media icons on the right are from <a href="http://komodomedia.com/"><img src="{{ asset('bundles/gergelypolonkaifront/images/komodomedia_azure_16.png') }}" alt="komodomedia.com" target="_blank" /> komodomedia.com</a>.</p>
|
||||
<p>Some design ideas, like the arrows under the menu items are from a friend, <a href="http://www.d4untless.com/">Judit Pásti</a>.
|
||||
{% endblock content %}
|
||||
|
@ -2,6 +2,7 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Gergely Polonkai{% block title %}{% endblock %}</title>
|
||||
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
|
||||
{% stylesheets 'bundles/gergelypolonkaifront/css/*' filter='cssrewrite' output='css/gergelypolonkaiweb.css' %}
|
||||
@ -23,7 +24,7 @@
|
||||
<a href="http://www.linkedin.com/in/gergelypolonkai" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/linkedin_16.png') }}" alt="LinkedIn profile" /></a>
|
||||
<a href="skype:w00dhun" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/skype_16.png') }}" alt="Skype" /></a>
|
||||
<a href="http://facebook.com/Polesz" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/facebook_16.png') }}" alt="Facebook profile" /></a>
|
||||
<a href="/https://plus.google.com/u/1/105740970718293884702about" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/google_plus_16.png') }}" alt="Google+ profile" /></a>
|
||||
<a href="https://plus.google.com/u/1/105740970718293884702/about" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/google_plus_16.png') }}" alt="Google+ profile" /></a>
|
||||
<a href="gtalk:chat?jid=gergely@polonkai.eu" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/googletalk_16.png') }}" alt="Google Talk" /></a>
|
||||
<a href="http://twitter.com/W00d5t0ck" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/twitter_16.png') }}" alt="Twitter" /></a>
|
||||
<a href="http://tumblr.w00d5t0ck.info" target="_blank"><img src="{{ asset('bundles/gergelypolonkaifront/images/tumblr_16.png') }}" alt="Tumblr" /></a>
|
||||
@ -32,15 +33,24 @@
|
||||
<a href="{{ path('GergelyPolonkaiFrontBundle_blogFeed') }}"><img src="{{ asset('bundles/gergelypolonkaifront/images/rss_16.png') }}" alt="RSS Feed" /></a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content-padding"></div>
|
||||
<div id="menu">
|
||||
<div id="tagcloud-button"><img alt="" src="{{ asset('bundles/gergelypolonkaifront/images/tagcloud.png') }}" /></div>
|
||||
<ul>
|
||||
<li {% if currentMenu == 'resume' %} class="active"{% endif %}><a href="{{ path('GergelyPolonkaiFrontBundle_resume', { _format: 'html' }) }}">Resume</a></li>
|
||||
<li {% if currentMenu == 'blog' %} class="active"{% endif %}><a href="{{ path('GergelyPolonkaiFrontBundle_blogListing') }}">Blog</a></li>
|
||||
<li {% if currentMenu == 'about' %} class="active"{% endif %}><a href="{{ path('GergelyPolonkaiFrontBundle_about') }}">About me</a></li>
|
||||
</ul>
|
||||
<br class="clear" />
|
||||
</div>
|
||||
{% if tagCloud|length > 0 %}
|
||||
<div id="tag-cloud">
|
||||
{% for cloudItem in tagCloud %}
|
||||
<a href="{{ path('GergelyPolonkaiFrontBundle_blogTagList', { name: cloudItem.name }) }}" class="size{{ cloudItem.size }}">{{ cloudItem.name }}</a>{% if not loop.last %} | {% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div id="content">
|
||||
<div id="content-padding"></div>
|
||||
<div id="menu">
|
||||
<ul>
|
||||
<li><a href="{{ path('GergelyPolonkaiFrontBundle_about') }}">About me</a></li>
|
||||
<li><a href="{{ path('GergelyPolonkaiFrontBundle_blogListing') }}">Blog</a></li>
|
||||
<li><a href="{{ path('GergelyPolonkaiFrontBundle_resume', { _format: 'html' }) }}">Resume</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{% block content %}{% endblock content %}
|
||||
</div>
|
||||
</div>
|
||||
@ -53,20 +63,26 @@
|
||||
<a href="https://github.com/gergelypolonkai" id="github-ribbon" target="_blank"><img style="position: absolute; top: 0; left: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_left_orange_ff7600.png" alt="Fork me on GitHub"></a>
|
||||
<iframe src="http://githubbadge.appspot.com/badge/gergelypolonkai?s=1&a=0" style="border: 0; height: 142px; width: 200px; overflow: hidden; display: none; position: absolute; top: 100px; left: 100px;" frameBorder="0" id="github-badge"></iframe>
|
||||
<script type="text/javascript">
|
||||
$('.at-obfuscation').html('@');
|
||||
$(document).ready(function() {
|
||||
$('.at-obfuscation').html('@');
|
||||
|
||||
$('#github-ribbon').mouseover(function() {
|
||||
$('#github-badge').fadeIn();
|
||||
});
|
||||
$('#tagcloud-button').click(function() {
|
||||
$('#tag-cloud').toggle('slow');
|
||||
});
|
||||
|
||||
$('#github-ribbon').mouseout(function() {
|
||||
$('#github-badge').fadeOut();
|
||||
});
|
||||
$('#github-ribbon').mouseover(function() {
|
||||
$('#github-badge').fadeIn();
|
||||
});
|
||||
|
||||
$(document).mousemove(function(e) {
|
||||
$('#github-badge').css({
|
||||
top: e.pageY + 5,
|
||||
left: e.pageX + 5
|
||||
$('#github-ribbon').mouseout(function() {
|
||||
$('#github-badge').fadeOut();
|
||||
});
|
||||
|
||||
$(document).mousemove(function(e) {
|
||||
$('#github-badge').css({
|
||||
top: e.pageY + 5,
|
||||
left: e.pageX + 5
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
google-site-verification: google150e54bda5f96d97.html
|
@ -46,6 +46,7 @@ class CodeChunk extends \Twig_Extension
|
||||
{
|
||||
return array(
|
||||
'insert_code_chunks' => new \Twig_Filter_Method($this, 'insertCodeChunks', array('is_safe' => array('html'))),
|
||||
'remove_code_chunks' => new \Twig_Filter_Method($this, 'removeCodeChunks', array('is_safe' => array('html'))),
|
||||
);
|
||||
}
|
||||
|
||||
@ -106,6 +107,40 @@ class CodeChunk extends \Twig_Extension
|
||||
return $string;
|
||||
}
|
||||
|
||||
public function removeCodeChunks($string)
|
||||
{
|
||||
$m = array();
|
||||
$chunkRepo = $this->doctrine->getRepository('GergelyPolonkaiFrontBundle:CodeChunk');
|
||||
|
||||
while (
|
||||
preg_match(
|
||||
'/\\[\\$ code:([^:]+):([^ ]+) \\$\\]/i',
|
||||
$string, $m, PREG_OFFSET_CAPTURE)
|
||||
) {
|
||||
$start = $m[0][1];
|
||||
$fullTag = $m[0][0];
|
||||
$len = strlen($fullTag);
|
||||
$replacement = '';
|
||||
|
||||
$string = substr_replace($string, $replacement, $start, $len);
|
||||
}
|
||||
|
||||
while (
|
||||
preg_match(
|
||||
'/\\[\\$ code:([^:]+):(.+?) \\$\\]/is',
|
||||
$string, $m, PREG_OFFSET_CAPTURE)
|
||||
) {
|
||||
$start = $m[0][1];
|
||||
$fullTag = $m[0][0];
|
||||
$len = strlen($fullTag);
|
||||
$replacement = '';
|
||||
|
||||
$string = substr_replace($string, $replacement, $start, $len);
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return "code_chunk";
|
||||
|
55
src/GergelyPolonkai/FrontBundle/Twig/CurrentMenu.php
Normal file
55
src/GergelyPolonkai/FrontBundle/Twig/CurrentMenu.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
namespace GergelyPolonkai\FrontBundle\Twig;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use JMS\DiExtraBundle\Annotation as DI;
|
||||
|
||||
/**
|
||||
* Description of CurrentMenu
|
||||
*
|
||||
* @author Gergely Polonkai
|
||||
*
|
||||
* @DI\Service
|
||||
* @DI\Tag(name="twig.extension")
|
||||
*/
|
||||
class CurrentMenu extends \Twig_Extension
|
||||
{
|
||||
/**
|
||||
* @var Symfony\Component\DependencyInjection\ContainerInterface $container
|
||||
*/
|
||||
private $container;
|
||||
|
||||
/**
|
||||
* @DI\InjectParams({
|
||||
* "container" = @DI\Inject("service_container")
|
||||
* })
|
||||
*/
|
||||
public function __construct(ContainerInterface $container)
|
||||
{
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
public function getGlobals()
|
||||
{
|
||||
$controller = $this->container->get('request')->get('_controller');
|
||||
$route = $this->container->get('request')->get('_route');
|
||||
|
||||
$currentMenu = 'none';
|
||||
if (preg_match('/BlogController/', $controller)) {
|
||||
$currentMenu = 'blog';
|
||||
} elseif (preg_match('/_homepage$/', $route)) {
|
||||
$currentMenu = 'blog';
|
||||
} elseif (preg_match('/_resume$/', $route)) {
|
||||
$currentMenu = 'resume';
|
||||
} elseif (preg_match('/_about$/', $route)) {
|
||||
$currentMenu = 'about';
|
||||
}
|
||||
return array(
|
||||
'currentMenu' => $currentMenu,
|
||||
);
|
||||
}
|
||||
public function getName()
|
||||
{
|
||||
return 'gergelypolonkaifront_currentmenu';
|
||||
}
|
||||
}
|
62
src/GergelyPolonkai/FrontBundle/Twig/TagCloud.php
Normal file
62
src/GergelyPolonkai/FrontBundle/Twig/TagCloud.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
namespace GergelyPolonkai\FrontBundle\Twig;
|
||||
|
||||
use Symfony\Bridge\Doctrine\RegistryInterface;
|
||||
use JMS\DiExtraBundle\Annotation as DI;
|
||||
|
||||
/**
|
||||
* Description of tagCloud
|
||||
*
|
||||
* @author polesz
|
||||
*
|
||||
* @DI\Service
|
||||
* @DI\Tag("twig.extension")
|
||||
*/
|
||||
class TagCloud extends \Twig_Extension
|
||||
{
|
||||
/**
|
||||
* @var Symfony\Bridge\Doctrine\RegistryInterface $doctrine
|
||||
*/
|
||||
private $doctrine;
|
||||
|
||||
/**
|
||||
* @DI\InjectParams()
|
||||
*/
|
||||
public function __construct(RegistryInterface $doctrine)
|
||||
{
|
||||
$this->doctrine = $doctrine;
|
||||
}
|
||||
|
||||
protected function orderTags($a, $b)
|
||||
{
|
||||
return strcasecmp($a['name'], $b['name']);
|
||||
}
|
||||
|
||||
public function getGlobals()
|
||||
{
|
||||
$tagCloudQuery = $this->doctrine->getEntityManager()->createQuery('SELECT t, count(tg) ct FROM GergelyPolonkaiFrontBundle:Tag t LEFT JOIN t.tagging tg GROUP BY t.id ORDER BY ct DESC');
|
||||
$tagCloudList = $tagCloudQuery->getResult();
|
||||
$tagCloud = array();
|
||||
if (count($tagCloudList) > 0) {
|
||||
$tMax = $tagCloudList[0]['ct'];
|
||||
$tMin = 1;
|
||||
}
|
||||
foreach ($tagCloudList as $cloudElement) {
|
||||
$tag = $cloudElement[0];
|
||||
$tagCount = $cloudElement['ct'];
|
||||
if ($tagCount >= $tMin) {
|
||||
$size = floor((5.0 * ($tagCount - $tMin)) / ($tMax - $tMin));
|
||||
$tagCloud[] = array('name' => $tag->getName(), 'size' => $size);
|
||||
}
|
||||
}
|
||||
usort($tagCloud, array($this, 'orderTags'));
|
||||
|
||||
return array(
|
||||
'tagCloud' => $tagCloud,
|
||||
);
|
||||
}
|
||||
|
||||
public function getName() {
|
||||
return 'gergelypolonkaifront_tagcloud';
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user