ソースを参照

issue #68 WIP:
* twig extension for handy template procs
* new macros
* not all liks are processed yet
* no caching yet

Andrew Tch 13 年 前
コミット
c4d41c4fa6

+ 12 - 0
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -19,9 +19,21 @@ use Doctrine\ORM\EntityRepository;
  */
 class PackageRepository extends EntityRepository
 {
+    public function packageExists($package)
+    {
+        return in_array($package, $this->getPackageNames());
+    }
+    
     public function getPackageNames()
     {
+        //todo: caching
+        $names = array_map(function($value) {
+            return $value['name'];
+        }, $this->getEntityManager()
+                ->createQuery("SELECT p.name FROM Packagist\WebBundle\Entity\Package p")
+                ->getResult());
         
+        return $names;
     }
     
     public function getStalePackages()

+ 5 - 0
src/Packagist/WebBundle/Resources/config/services.yml

@@ -1 +1,6 @@
 services:
+  packagist.twig.extension:
+    class: Packagist\WebBundle\Twig\PackagistExtension
+    arguments: [@service_container]
+    tags:
+      - { name: twig.extension }

+ 3 - 1
src/Packagist/WebBundle/Resources/views/Web/viewPackage.html.twig

@@ -1,4 +1,5 @@
 {% extends "PackagistWebBundle::layout.html.twig" %}
+{% import "PackagistWebBundle::macros.html.twig" as packagist %}
 
 {% block scripts %}
     <script src="{{ asset('bundles/packagistweb/js/view.js?v=2')}}"></script>
@@ -80,7 +81,8 @@
                                             {% if version.require|length %}
                                                 <ul>
                                                     {%- for req in version.require -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>
+                                                            {{ packagist.package_link(req.packageName) }}: {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}

+ 14 - 0
src/Packagist/WebBundle/Resources/views/macros.html.twig

@@ -14,3 +14,17 @@
         {% endif %}
     </ul>
 {% endmacro %}
+
+{% macro package_link(package_name) %}
+    
+    {% if not packagist_is_package_name(package_name) %}
+        {{ package_name }}
+    {% else %}
+        {% if packagist_package_exists(package_name) %}
+            <a href="{{ path('view_package', { 'name': package_name }) }}">{{ package_name }}</a>
+        {% else %}
+            {{ package_name }}
+        {% endif %}
+    {% endif %}
+
+{% endmacro %}

+ 43 - 0
src/Packagist/WebBundle/Twig/PackagistExtension.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace Packagist\WebBundle\Twig;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class PackagistExtension extends \Twig_Extension
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+    
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+    
+    public function getFunctions()
+    {
+        return array('packagist_package_exists' => new \Twig_Function_Method($this, 'getPackageExists'),
+            'packagist_is_package_name' => new \Twig_Function_Method($this, 'validatePackageName'));
+    }
+    
+    public function getName()
+    {
+        return 'packagist';
+    }
+    
+    public function getPackageExists($package)
+    {
+        $doctrine = $this->container->get('doctrine');
+        /* @var $doctrine Symfony\Bundle\DoctrineBundle\Registry */
+        
+        return $doctrine->getRepository('PackagistWebBundle:Package')
+                ->packageExists($package);
+    }
+    
+    public function validatePackageName($package)
+    {
+        return preg_match('/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+/', $package);
+    }
+}