ソースを参照

Add new list/show view - 'email'. (#3843)

Alexander 9 年 前
コミット
2003ed7384

+ 2 - 1
DependencyInjection/AbstractSonataAdminExtension.php

@@ -43,7 +43,7 @@ abstract class AbstractSonataAdminExtension extends Extension
                         'datetime' => 'SonataAdminBundle:CRUD:list_datetime.html.twig',
                         'text' => 'SonataAdminBundle:CRUD:list_string.html.twig',
                         'textarea' => 'SonataAdminBundle:CRUD:list_string.html.twig',
-                        'email' => 'SonataAdminBundle:CRUD:list_string.html.twig',
+                        'email' => 'SonataAdminBundle:CRUD:list_email.html.twig',
                         'trans' => 'SonataAdminBundle:CRUD:list_trans.html.twig',
                         'string' => 'SonataAdminBundle:CRUD:list_string.html.twig',
                         'smallint' => 'SonataAdminBundle:CRUD:list_string.html.twig',
@@ -64,6 +64,7 @@ abstract class AbstractSonataAdminExtension extends Extension
                         'time' => 'SonataAdminBundle:CRUD:show_time.html.twig',
                         'datetime' => 'SonataAdminBundle:CRUD:show_datetime.html.twig',
                         'text' => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
+                        'email' => 'SonataAdminBundle:CRUD:show_email.html.twig',
                         'trans' => 'SonataAdminBundle:CRUD:show_trans.html.twig',
                         'string' => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
                         'smallint' => 'SonataAdminBundle:CRUD:base_show_field.html.twig',

+ 6 - 0
Resources/doc/reference/action_list.rst

@@ -148,6 +148,12 @@ Available types and associated options
 +-----------+----------------+-----------------------------------------------------------------------+
 | datetime  | format         | A format understandable by Twig's ``date`` function.                  |
 +-----------+----------------+-----------------------------------------------------------------------+
+| email     | as_string      | Renders the email as string, without any link.                        |
++           +----------------+-----------------------------------------------------------------------+
+|           | subject        | Add subject parameter to email link.                                  |
++           +----------------+-----------------------------------------------------------------------+
+|           | body           | Add body parameter to email link.                                     |
++-----------+----------------+-----------------------------------------------------------------------+
 | percent   |                | Renders value as a percentage.                                        |
 +-----------+----------------+-----------------------------------------------------------------------+
 | string    |                | Renders a simple string.                                              |

+ 21 - 0
Resources/views/CRUD/_email_link.html.twig

@@ -0,0 +1,21 @@
+
+{%- if value is empty -%}
+     
+{%- elseif field_description.options.as_string is defined and field_description.options.as_string -%}
+    {{ value }}
+{%- else -%}
+    {% set parameters = {} %}
+    {% set subject = field_description.options.subject|default('') %}
+    {% set body = field_description.options.body|default('') %}
+
+    {% if subject is not empty %}
+        {% set parameters = parameters|merge({'subject': subject}) %}
+    {% endif %}
+    {% if body is not empty %}
+        {% set parameters = parameters|merge({'body': body}) %}
+    {% endif %}
+
+    <a href="mailto:{{ value }}{% if parameters|length > 0 %}?{{- parameters|url_encode -}}{% endif %}">
+        {{- value -}}
+    </a>
+{%- endif -%}

+ 16 - 0
Resources/views/CRUD/list_email.html.twig

@@ -0,0 +1,16 @@
+{#
+
+This file is part of the Sonata package.
+
+(c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+
+#}
+
+{% extends admin.getTemplate('base_list_field') %}
+
+{% block field %}
+    {% include 'SonataAdminBundle:CRUD:_email_link.html.twig' %}
+{% endblock %}

+ 5 - 0
Resources/views/CRUD/show_email.html.twig

@@ -0,0 +1,5 @@
+{% extends 'SonataAdminBundle:CRUD:base_show_field.html.twig' %}
+
+{% block field %}
+    {% include 'SonataAdminBundle:CRUD:_email_link.html.twig' %}
+{% endblock %}

+ 147 - 0
Tests/Twig/Extension/SonataAdminExtensionTest.php

@@ -265,6 +265,8 @@ class SonataAdminExtensionTest extends \PHPUnit_Framework_TestCase
                         return 'SonataAdminBundle:CRUD:list_currency.html.twig';
                     case 'percent':
                         return 'SonataAdminBundle:CRUD:list_percent.html.twig';
+                    case 'email':
+                        return 'SonataAdminBundle:CRUD:list_email.html.twig';
                     case 'choice':
                         return 'SonataAdminBundle:CRUD:list_choice.html.twig';
                     case 'array':
@@ -540,6 +542,70 @@ class SonataAdminExtensionTest extends \PHPUnit_Framework_TestCase
                 null,
                 array('currency' => 'GBP'),
             ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> &nbsp; </td>',
+                'email',
+                null,
+                array(),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> <a href="mailto:admin@admin.com">admin@admin.com</a> </td>',
+                'email',
+                'admin@admin.com',
+                array(),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> 
+                    <a href="mailto:admin@admin.com">admin@admin.com</a> </td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => false),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> admin@admin.com </td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345">  
+                    <a href="mailto:admin@admin.com?'.$this->buildTwigLikeUrl(array('subject' => 'Main Theme', 'body' => 'Message Body')).'">admin@admin.com</a>  </td>',
+                'email',
+                'admin@admin.com',
+                array('subject' => 'Main Theme', 'body' => 'Message Body'),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345">  
+                    <a href="mailto:admin@admin.com?'.$this->buildTwigLikeUrl(array('subject' => 'Main Theme')).'">admin@admin.com</a>  </td>',
+                'email',
+                'admin@admin.com',
+                array('subject' => 'Main Theme'),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345">  
+                    <a href="mailto:admin@admin.com?'.$this->buildTwigLikeUrl(array('body' => 'Message Body')).'">admin@admin.com</a>  </td>',
+                'email',
+                'admin@admin.com',
+                array('body' => 'Message Body'),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> admin@admin.com </td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true, 'subject' => 'Main Theme', 'body' => 'Message Body'),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> admin@admin.com </td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true, 'body' => 'Message Body'),
+            ),
+            array(
+                '<td class="sonata-ba-list-field sonata-ba-list-field-email" objectId="12345"> admin@admin.com </td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true, 'subject' => 'Main Theme'),
+            ),
             array(
                 '<td class="sonata-ba-list-field sonata-ba-list-field-array" objectId="12345">
                     [1 => First] [2 => Second]
@@ -1245,6 +1311,8 @@ EOT
                         return 'SonataAdminBundle:CRUD:show_currency.html.twig';
                     case 'percent':
                         return 'SonataAdminBundle:CRUD:show_percent.html.twig';
+                    case 'email':
+                        return 'SonataAdminBundle:CRUD:show_email.html.twig';
                     case 'choice':
                         return 'SonataAdminBundle:CRUD:show_choice.html.twig';
                     case 'array':
@@ -1577,6 +1645,66 @@ EOT
                     'identifier_parameter_name' => 'barId',
                 )),
             ),
+            array(
+                '<th>Data</th> <td> &nbsp;</td>',
+                'email',
+                null,
+                array(),
+            ),
+            array(
+                '<th>Data</th> <td> <a href="mailto:admin@admin.com">admin@admin.com</a></td>',
+                'email',
+                'admin@admin.com',
+                array(),
+            ),
+            array(
+                '<th>Data</th> <td> <a href="mailto:admin@admin.com?'.$this->buildTwigLikeUrl(array('subject' => 'Main Theme', 'body' => 'Message Body')).'">admin@admin.com</a></td>',
+                'email',
+                'admin@admin.com',
+                array('subject' => 'Main Theme', 'body' => 'Message Body'),
+            ),
+            array(
+                '<th>Data</th> <td> <a href="mailto:admin@admin.com?'.$this->buildTwigLikeUrl(array('subject' => 'Main Theme')).'">admin@admin.com</a></td>',
+                'email',
+                'admin@admin.com',
+                array('subject' => 'Main Theme'),
+            ),
+            array(
+                '<th>Data</th> <td> <a href="mailto:admin@admin.com?'.$this->buildTwigLikeUrl(array('body' => 'Message Body')).'">admin@admin.com</a></td>',
+                'email',
+                'admin@admin.com',
+                array('body' => 'Message Body'),
+            ),
+            array(
+                '<th>Data</th> <td> admin@admin.com</td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true, 'subject' => 'Main Theme', 'body' => 'Message Body'),
+            ),
+            array(
+                '<th>Data</th> <td> admin@admin.com</td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true, 'subject' => 'Main Theme'),
+            ),
+            array(
+                '<th>Data</th> <td> admin@admin.com</td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true, 'body' => 'Message Body'),
+            ),
+            array(
+                '<th>Data</th> <td> <a href="mailto:admin@admin.com">admin@admin.com</a></td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => false),
+            ),
+            array(
+                '<th>Data</th> <td> admin@admin.com</td>',
+                'email',
+                'admin@admin.com',
+                array('as_string' => true),
+            ),
             array(
                 '<th>Data</th> <td><p><strong>Creating a Template for the Field</strong> and form</p> </td>',
                 'html',
@@ -2002,6 +2130,25 @@ EOT
         $this->assertSame(1234567, $this->twigExtension->getUrlsafeIdentifier($entity, $this->adminBar));
     }
 
+    /**
+     * This method generates url part for Twig layout. Allows to keep BC for PHP 5.3.
+     *
+     * Remove this method for next major release only if PHP 5.3 support will be dropped.
+     *
+     * @param array $url
+     *
+     * @return string
+     */
+    private function buildTwigLikeUrl($url)
+    {
+        if (defined('PHP_QUERY_RFC3986')) {
+            // add htmlspecialchars because twig add it auto
+            return htmlspecialchars(http_build_query($url, '', '&', PHP_QUERY_RFC3986));
+        }
+
+        return htmlspecialchars(http_build_query($url, '', '&'));
+    }
+
     private function removeExtraWhitespace($string)
     {
         return trim(preg_replace(