├── cache └── .gitignore ├── .gitignore ├── web ├── favicon.ico ├── index.php └── css │ ├── main.css │ └── widget.css ├── src ├── config.php.dist ├── views │ ├── error.html.twig │ ├── widget_layout.html.twig │ ├── layout.html.twig │ ├── _ga.html.twig │ ├── widget_events.html.twig │ └── index.html.twig ├── Fbew │ ├── FacebookServiceProvider.php │ └── Twig │ │ └── FacebookEventExtension.php ├── app.php └── controllers.php ├── composer.json ├── LICENSE ├── README.md └── composer.lock /cache/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | src/config.php 2 | vendor/* 3 | 4 | -------------------------------------------------------------------------------- /web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmikola/fb-events-widget/HEAD/web/favicon.ico -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | run(); 9 | -------------------------------------------------------------------------------- /src/config.php.dist: -------------------------------------------------------------------------------- 1 | 7 |

Error

8 | 9 |
10 |

{{ error ? error|replace({"\n": '
' })|raw : 'An error occurred' }}

11 |
12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /src/views/widget_layout.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {% block content '' %} 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/views/layout.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% block title '' %} 7 | 8 | 9 | {% block head_javascripts '' %} 10 | {% include '_ga.html.twig' %} 11 | 12 | 13 | {% block content '' %} 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/views/_ga.html.twig: -------------------------------------------------------------------------------- 1 | {% if app['google.analytics.id']|default(false) and app['google.analytics.tld']|default(false) %} 2 | 11 | {% endif %} 12 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jmikola/fb-events-widget", 3 | "type": "silex-application", 4 | "description": "Embeddable widget for listing Facebook events.", 5 | "keywords": ["facebook", "events"], 6 | "homepage": "https://github.com/jmikola/fb-events-widget", 7 | "license": "MIT", 8 | "authors": [ 9 | { "name": "Jeremy Mikola", "email": "jmikola@gmail.com" } 10 | ], 11 | "require": { 12 | "php": ">=5.4.0", 13 | "facebook/php-sdk": "3.2.*", 14 | "silex/silex": "1.0.*@dev", 15 | "symfony/twig-bridge": "~2.1", 16 | "twig/twig": "~1.9" 17 | }, 18 | "autoload": { 19 | "psr-0": { 20 | "Fbew": "src/" 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Fbew/FacebookServiceProvider.php: -------------------------------------------------------------------------------- 1 | share(function() use ($app) { 13 | return new \Facebook(array( 14 | 'appId' => $app['facebook.app.id'], 15 | 'secret' => $app['facebook.app.secret'], 16 | 'cookie' => isset($app['facebook.app.cookie']) ? $app['facebook.app.cookie'] : null, 17 | 'domain' => isset($app['facebook.app.domain']) ? $app['facebook.app.domain'] : null, 18 | 'fileUpload' => isset($app['facebook.app.fileUpload']) ? $app['facebook.app.fileUpload'] : null, 19 | )); 20 | }); 21 | } 22 | 23 | public function boot(Application $app) 24 | { 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Jeremy Mikola 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so, 8 | subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 15 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 16 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 18 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 19 | -------------------------------------------------------------------------------- /src/app.php: -------------------------------------------------------------------------------- 1 | register(new FacebookServiceProvider()); 19 | $app->register(new UrlGeneratorServiceProvider()); 20 | $app->register(new TwigServiceProvider(), [ 21 | 'twig.options' => ['cache' => $app['twig.cache_dir']], 22 | 'twig.path' => __DIR__.'/views', 23 | ]); 24 | 25 | $app['twig'] = $app->share($app->extend('twig', function($twig, $app) { 26 | $twig->addExtension(new FacebookEventExtension()); 27 | 28 | return $twig; 29 | })); 30 | 31 | $app->error(function (\Exception $e, $code) use ($app) { 32 | if ($app['debug']) { 33 | return; 34 | } 35 | 36 | $error = 404 == $code ? $e->getMessage() : null; 37 | 38 | return new Response($app['twig']->render('error.html.twig', ['error' => $error]), $code); 39 | }); 40 | 41 | require_once __DIR__.'/controllers.php'; 42 | 43 | return $app; 44 | -------------------------------------------------------------------------------- /web/css/main.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | 5 | body { 6 | background-color: #eee; 7 | color: #333; 8 | font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; 9 | font-size: 18px; 10 | line-height: 1.5em; 11 | margin: 50px auto; 12 | min-height: 50%; 13 | padding: 0; 14 | width: 500px; 15 | } 16 | 17 | header h1 { 18 | font-family: "Paytone One", "Helvetica Neue", Arial, Helvetica, sans-serif; 19 | font-size: 32px; 20 | text-align: center; 21 | } 22 | 23 | label span { 24 | display: block; 25 | margin: 0 50px; 26 | text-align: center; 27 | } 28 | 29 | label input { 30 | border: 2px solid #bdc7d8; 31 | display: block; 32 | font-size: 18px; 33 | margin: 0 auto; 34 | padding: 3px; 35 | width: 65%; 36 | } 37 | 38 | label #error { 39 | background-color: #ff9494; 40 | border: 2px solid #a63232; 41 | margin-top: 5px; 42 | padding: 3px 5px; 43 | } 44 | 45 | input[type="submit"] { 46 | font-size: 18px; 47 | } 48 | 49 | #output { 50 | margin-top: 10px; 51 | } 52 | 53 | #code { 54 | border: 1px solid #bdc7d8; 55 | font-family: "lucida grande",tahoma,verdana,arial,sans-serif; 56 | font-size: 11px; 57 | padding: 3px; 58 | width: 392px; 59 | } 60 | 61 | #preview { 62 | margin-top: 10px; 63 | text-align: center; 64 | } 65 | -------------------------------------------------------------------------------- /src/views/widget_events.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'widget_layout.html.twig' %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Events

7 |
8 |
9 | {% for event in events %} 10 |
11 |
12 |

{{ event.name }}

13 |

14 |
15 |
16 | {% else %} 17 |
18 |

Why is this empty?

19 |

{% if profile %}{{ profile.name }}{% else %}The profile for this widget{% endif %} does not appear to have created any upcoming, public events.

20 |
21 | {% endfor %} 22 |
23 | 26 |
27 | {% endblock %} 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fb-events-widget 2 | 3 | An embeddable widget to display a feed of upcoming Facebook events. This project 4 | is built with [Silex][1] and uses [Composer][2] for its dependencies. 5 | 6 | ## Setup 7 | 8 | ### Install Dependencies 9 | 10 | $ composer.phar install 11 | 12 | ### Configuration 13 | 14 | The `src/` directory includes a `config.php.dist` file, which should be copied 15 | to `config.php` and customized. Currently, the following options are available: 16 | 17 | * `debug`: Enable verbose error reporting 18 | * `facebook.app.id`: Facebook application ID (required) 19 | * `facebook.app.secret`: Facebook application secret (required) 20 | * `google.analytics.id`: Google Analytics ID 21 | * `google.analytics.tld`: Google Analytics TLD 22 | * `twig.cache_dir`: Cache directory for Twig templates 23 | 24 | #### Cache Directory 25 | 26 | By default, the application will use `fbew-cache/` within the system's temporary 27 | directory. This path, which must be writable, may be customized via the 28 | `twig.cache_dir` configuration option. 29 | 30 | ### Web Server 31 | 32 | The application can be started using: 33 | 34 | $ php -S localhost:8080 -t web web/index.php 35 | 36 | Instructions for other web server configurations are outlined in the 37 | [Silex documentation][3]. 38 | 39 | [1]: http://silex.sensiolabs.org/ 40 | [2]: http://getcomposer.org/ 41 | [3]: http://silex.sensiolabs.org/doc/web_servers.html 42 | -------------------------------------------------------------------------------- /src/controllers.php: -------------------------------------------------------------------------------- 1 | get('/', function() use ($app) { 4 | return $app['twig']->render('index.html.twig', array( 5 | 'facebookAppId' => $app['facebook.app.id'], 6 | )); 7 | }); 8 | 9 | $app->get('/{profileId}', function($profileId) use ($app) { 10 | $fqlEvent = sprintf(' 11 | SELECT eid, name, host, description, start_time, end_time, location, venue 12 | FROM event 13 | WHERE 14 | eid IN (SELECT eid FROM event_member WHERE uid = %1$s) 15 | AND not(creator != %1$s) 16 | AND start_time > now() 17 | ORDER BY start_time ASC', 18 | $profileId 19 | ); 20 | 21 | $fqlProfile = sprintf(' 22 | SELECT id, name, url, type, username 23 | FROM profile 24 | WHERE id = %s', 25 | $profileId 26 | ); 27 | 28 | $result = $app['facebook']->api(array( 29 | 'method' => 'fql.multiquery', 30 | 'queries' => array( 31 | 'events' => $fqlEvent, 32 | 'profile' => $fqlProfile, 33 | ), 34 | )); 35 | 36 | $events = isset($result[0]['fql_result_set']) ? $result[0]['fql_result_set'] : array(); 37 | $profile = isset($result[1]['fql_result_set'][0]) ? $result[1]['fql_result_set'][0] : null; 38 | 39 | $timezone = new \DateTimeZone(ini_get('date.timezone')); 40 | 41 | return $app['twig']->render('widget_events.html.twig', array( 42 | 'events' => $events, 43 | 'profile' => $profile, 44 | 'timezone' => $timezone, 45 | )); 46 | })->assert('profileId', '\d+'); 47 | -------------------------------------------------------------------------------- /src/Fbew/Twig/FacebookEventExtension.php: -------------------------------------------------------------------------------- 1 | new \Twig_Filter_Method($this, 'prettyDate'), 14 | ); 15 | } 16 | 17 | /** 18 | * Formats a date in the style of Facebook's event times. 19 | * 20 | * @param string|DateTime $date 21 | * @param string|DateTimeZone $timezone 22 | * @return string 23 | */ 24 | public function prettyDate($date, $timezone = null) 25 | { 26 | $timezone = isset($timezone) ? ($timezone instanceof \DateTimeZone ? $timezone : new \DateTimeZone($timezone)) : null; 27 | 28 | if (!$date instanceof \DateTime) { 29 | $time = (ctype_digit($date) ? '@' : '') . $date; 30 | $date = $timezone ? new \DateTime($time, $timezone) : new \DateTime($time); 31 | } 32 | 33 | if ($timezone) { 34 | $date = clone $date; 35 | $date->setTimezone($timezone); 36 | } 37 | 38 | $diff = $date->diff(new \DateTime(), true); 39 | 40 | if ($diff->days == 0) { 41 | return 'Today '.$date->format('g:ia'); 42 | } elseif ($diff->days == 1) { 43 | return 'Tomorrow '.$date->format('g:ia'); 44 | } elseif ($diff->days <= 6) { 45 | return $date->format('l g:ia'); 46 | } else { 47 | return $date->format('l, F j \a\t g:ia'); 48 | } 49 | } 50 | 51 | /** 52 | * @see Twig_ExtensionInterface::getName() 53 | */ 54 | public function getName() 55 | { 56 | return 'facebook_event'; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /web/css/widget.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: transparent; 3 | color: #333; 4 | font-family: "lucida grande",tahoma,verdana,arial,sans-serif; 5 | font-size: 11px; 6 | margin: 0; 7 | overflow: hidden; 8 | padding: 0; 9 | text-align: left; 10 | } 11 | 12 | div.widget { 13 | background-color: #fff; 14 | border-color: #315c99 #aaa #aaa; 15 | border-style: solid; 16 | border-width: 1px; 17 | overflow: hidden; 18 | padding: 0; 19 | position: relative; 20 | } 21 | 22 | header.widget-header { 23 | background-color: #edeff4; 24 | border-color: #c6cedd; 25 | border-style: solid; 26 | border-width: 0 0 1px; 27 | color: #1c2a47; 28 | padding: 8px 10px 7px; 29 | } 30 | 31 | header.widget-header h1 { 32 | color: #333; 33 | font-weight: bold; 34 | font-size: 13px; 35 | margin: 0; 36 | } 37 | 38 | section { 39 | padding: 5px 5px 0; 40 | } 41 | 42 | section article { 43 | display: block; 44 | padding: 5px; 45 | } 46 | 47 | section article header.article-header h1 { 48 | font-size: 11px; 49 | font-weight: normal; 50 | margin: 0; 51 | } 52 | 53 | section article header.article-header h1 a { 54 | color: #3b5998; 55 | text-decoration: none; 56 | } 57 | 58 | section article header.article-header p { 59 | color: #808080; 60 | padding-top: 3px; 61 | margin: 0; 62 | } 63 | 64 | section div.widget-empty { 65 | padding: 5px; 66 | } 67 | 68 | footer { 69 | background-color: #fff; 70 | bottom: 0; 71 | position: absolute; 72 | width: 100%; 73 | } 74 | 75 | footer .inner { 76 | border-top: 1px solid #ccc; 77 | margin: 0 6px; 78 | padding: 4px 3px; 79 | } 80 | 81 | footer .inner a { 82 | color: #808080; 83 | font-size: 9px; 84 | text-decoration: none; 85 | } 86 | -------------------------------------------------------------------------------- /src/views/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block title 'Facebook Events Widget' %} 4 | 5 | {% block head_javascripts %} 6 | 7 | {% endblock %} 8 | 9 | {% block content %} 10 |
11 |

{{ block('title') }}

12 |
13 |
14 | 19 | 23 |
24 | 25 |
26 | 70 | 71 | Fork me on GitHub 72 | {% endblock %} 73 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "63d1951b147919468200d4a0db1a34fb", 3 | "packages": [ 4 | { 5 | "name": "facebook/php-sdk", 6 | "version": "v3.2.2", 7 | "source": { 8 | "type": "git", 9 | "url": "https://github.com/facebook/facebook-php-sdk.git", 10 | "reference": "v3.2.2" 11 | }, 12 | "dist": { 13 | "type": "zip", 14 | "url": "https://api.github.com/repos/facebook/facebook-php-sdk/zipball/v3.2.2", 15 | "reference": "v3.2.2", 16 | "shasum": "" 17 | }, 18 | "require": { 19 | "ext-curl": "*", 20 | "ext-json": "*", 21 | "php": ">=5.2.0" 22 | }, 23 | "type": "library", 24 | "autoload": { 25 | "classmap": [ 26 | "src" 27 | ] 28 | }, 29 | "notification-url": "https://packagist.org/downloads/", 30 | "license": [ 31 | "Apache2" 32 | ], 33 | "authors": [ 34 | { 35 | "name": "Facebook", 36 | "homepage": "https://github.com/facebook/facebook-php-sdk/contributors" 37 | } 38 | ], 39 | "description": "Facebook PHP SDK", 40 | "homepage": "https://github.com/facebook/facebook-php-sdk", 41 | "keywords": [ 42 | "facebook", 43 | "sdk" 44 | ], 45 | "time": "2013-01-15 21:37:15" 46 | }, 47 | { 48 | "name": "pimple/pimple", 49 | "version": "v1.0.2", 50 | "source": { 51 | "type": "git", 52 | "url": "https://github.com/fabpot/Pimple.git", 53 | "reference": "v1.0.2" 54 | }, 55 | "dist": { 56 | "type": "zip", 57 | "url": "https://api.github.com/repos/fabpot/Pimple/zipball/v1.0.2", 58 | "reference": "v1.0.2", 59 | "shasum": "" 60 | }, 61 | "require": { 62 | "php": ">=5.3.0" 63 | }, 64 | "type": "library", 65 | "extra": { 66 | "branch-alias": { 67 | "dev-master": "1.0.x-dev" 68 | } 69 | }, 70 | "autoload": { 71 | "psr-0": { 72 | "Pimple": "lib/" 73 | } 74 | }, 75 | "notification-url": "https://packagist.org/downloads/", 76 | "license": [ 77 | "MIT" 78 | ], 79 | "authors": [ 80 | { 81 | "name": "Fabien Potencier", 82 | "email": "fabien@symfony.com" 83 | } 84 | ], 85 | "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", 86 | "homepage": "http://pimple.sensiolabs.org", 87 | "keywords": [ 88 | "container", 89 | "dependency injection" 90 | ], 91 | "time": "2013-03-08 08:21:40" 92 | }, 93 | { 94 | "name": "psr/log", 95 | "version": "1.0.0", 96 | "source": { 97 | "type": "git", 98 | "url": "https://github.com/php-fig/log", 99 | "reference": "1.0.0" 100 | }, 101 | "dist": { 102 | "type": "zip", 103 | "url": "https://github.com/php-fig/log/archive/1.0.0.zip", 104 | "reference": "1.0.0", 105 | "shasum": "" 106 | }, 107 | "type": "library", 108 | "autoload": { 109 | "psr-0": { 110 | "Psr\\Log\\": "" 111 | } 112 | }, 113 | "notification-url": "https://packagist.org/downloads/", 114 | "license": [ 115 | "MIT" 116 | ], 117 | "authors": [ 118 | { 119 | "name": "PHP-FIG", 120 | "homepage": "http://www.php-fig.org/" 121 | } 122 | ], 123 | "description": "Common interface for logging libraries", 124 | "keywords": [ 125 | "log", 126 | "psr", 127 | "psr-3" 128 | ], 129 | "time": "2012-12-21 11:40:51" 130 | }, 131 | { 132 | "name": "silex/silex", 133 | "version": "dev-master", 134 | "source": { 135 | "type": "git", 136 | "url": "https://github.com/fabpot/Silex.git", 137 | "reference": "803f809cdaa409e5769b24db952655d7e9187677" 138 | }, 139 | "dist": { 140 | "type": "zip", 141 | "url": "https://api.github.com/repos/fabpot/Silex/zipball/803f809cdaa409e5769b24db952655d7e9187677", 142 | "reference": "803f809cdaa409e5769b24db952655d7e9187677", 143 | "shasum": "" 144 | }, 145 | "require": { 146 | "php": ">=5.3.3", 147 | "pimple/pimple": "1.*", 148 | "symfony/event-dispatcher": ">=2.1,<2.3-dev", 149 | "symfony/http-foundation": ">=2.1,<2.3-dev", 150 | "symfony/http-kernel": ">=2.1,<2.3-dev", 151 | "symfony/routing": ">=2.1,<2.3-dev" 152 | }, 153 | "require-dev": { 154 | "doctrine/dbal": ">=2.2.0,<2.4.0-dev", 155 | "swiftmailer/swiftmailer": "4.2.*", 156 | "symfony/browser-kit": ">=2.1,<2.3-dev", 157 | "symfony/config": ">=2.1,<2.3-dev", 158 | "symfony/css-selector": ">=2.1,<2.3-dev", 159 | "symfony/dom-crawler": ">=2.1,<2.3-dev", 160 | "symfony/finder": ">=2.1,<2.3-dev", 161 | "symfony/form": ">=2.1.4,<2.3-dev", 162 | "symfony/locale": ">=2.1,<2.3-dev", 163 | "symfony/monolog-bridge": ">=2.1,<2.3-dev", 164 | "symfony/options-resolver": ">=2.1,<2.3-dev", 165 | "symfony/process": ">=2.1,<2.3-dev", 166 | "symfony/security": ">=2.1,<2.3-dev", 167 | "symfony/serializer": ">=2.1,<2.3-dev", 168 | "symfony/translation": ">=2.1,<2.3-dev", 169 | "symfony/twig-bridge": ">=2.1,<2.3-dev", 170 | "symfony/validator": ">=2.1,<2.3-dev", 171 | "twig/twig": ">=1.8.0,<2.0-dev" 172 | }, 173 | "suggest": { 174 | "symfony/browser-kit": ">=2.1,<2.3-dev", 175 | "symfony/css-selector": ">=2.1,<2.3-dev", 176 | "symfony/dom-crawler": ">=2.1,<2.3-dev", 177 | "symfony/form": "To make use of the FormServiceProvider, >= 2.1.4 is required" 178 | }, 179 | "type": "library", 180 | "extra": { 181 | "branch-alias": { 182 | "dev-master": "1.0.x-dev" 183 | } 184 | }, 185 | "autoload": { 186 | "psr-0": { 187 | "Silex": "src/" 188 | } 189 | }, 190 | "notification-url": "https://packagist.org/downloads/", 191 | "license": [ 192 | "MIT" 193 | ], 194 | "authors": [ 195 | { 196 | "name": "Fabien Potencier", 197 | "email": "fabien@symfony.com" 198 | }, 199 | { 200 | "name": "Igor Wiedler", 201 | "email": "igor@wiedler.ch", 202 | "homepage": "http://wiedler.ch/igor/" 203 | } 204 | ], 205 | "description": "The PHP micro-framework based on the Symfony2 Components", 206 | "homepage": "http://silex.sensiolabs.org", 207 | "keywords": [ 208 | "microframework" 209 | ], 210 | "time": "2013-04-01 08:47:32" 211 | }, 212 | { 213 | "name": "symfony/event-dispatcher", 214 | "version": "v2.2.0", 215 | "target-dir": "Symfony/Component/EventDispatcher", 216 | "source": { 217 | "type": "git", 218 | "url": "https://github.com/symfony/EventDispatcher.git", 219 | "reference": "v2.2.0-RC3" 220 | }, 221 | "dist": { 222 | "type": "zip", 223 | "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/v2.2.0-RC3", 224 | "reference": "v2.2.0-RC3", 225 | "shasum": "" 226 | }, 227 | "require": { 228 | "php": ">=5.3.3" 229 | }, 230 | "require-dev": { 231 | "symfony/dependency-injection": ">=2.0,<3.0" 232 | }, 233 | "suggest": { 234 | "symfony/dependency-injection": "2.2.*", 235 | "symfony/http-kernel": "2.2.*" 236 | }, 237 | "type": "library", 238 | "extra": { 239 | "branch-alias": { 240 | "dev-master": "2.2-dev" 241 | } 242 | }, 243 | "autoload": { 244 | "psr-0": { 245 | "Symfony\\Component\\EventDispatcher\\": "" 246 | } 247 | }, 248 | "notification-url": "https://packagist.org/downloads/", 249 | "license": [ 250 | "MIT" 251 | ], 252 | "authors": [ 253 | { 254 | "name": "Fabien Potencier", 255 | "email": "fabien@symfony.com" 256 | }, 257 | { 258 | "name": "Symfony Community", 259 | "homepage": "http://symfony.com/contributors" 260 | } 261 | ], 262 | "description": "Symfony EventDispatcher Component", 263 | "homepage": "http://symfony.com", 264 | "time": "2013-02-11 11:26:43" 265 | }, 266 | { 267 | "name": "symfony/http-foundation", 268 | "version": "v2.2.0", 269 | "target-dir": "Symfony/Component/HttpFoundation", 270 | "source": { 271 | "type": "git", 272 | "url": "https://github.com/symfony/HttpFoundation.git", 273 | "reference": "v2.2.0" 274 | }, 275 | "dist": { 276 | "type": "zip", 277 | "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/v2.2.0", 278 | "reference": "v2.2.0", 279 | "shasum": "" 280 | }, 281 | "require": { 282 | "php": ">=5.3.3" 283 | }, 284 | "type": "library", 285 | "extra": { 286 | "branch-alias": { 287 | "dev-master": "2.2-dev" 288 | } 289 | }, 290 | "autoload": { 291 | "psr-0": { 292 | "Symfony\\Component\\HttpFoundation\\": "" 293 | }, 294 | "classmap": [ 295 | "Symfony/Component/HttpFoundation/Resources/stubs" 296 | ] 297 | }, 298 | "notification-url": "https://packagist.org/downloads/", 299 | "license": [ 300 | "MIT" 301 | ], 302 | "authors": [ 303 | { 304 | "name": "Fabien Potencier", 305 | "email": "fabien@symfony.com" 306 | }, 307 | { 308 | "name": "Symfony Community", 309 | "homepage": "http://symfony.com/contributors" 310 | } 311 | ], 312 | "description": "Symfony HttpFoundation Component", 313 | "homepage": "http://symfony.com", 314 | "time": "2013-02-26 09:42:13" 315 | }, 316 | { 317 | "name": "symfony/http-kernel", 318 | "version": "v2.2.0", 319 | "target-dir": "Symfony/Component/HttpKernel", 320 | "source": { 321 | "type": "git", 322 | "url": "https://github.com/symfony/HttpKernel.git", 323 | "reference": "v2.2.0" 324 | }, 325 | "dist": { 326 | "type": "zip", 327 | "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.2.0", 328 | "reference": "v2.2.0", 329 | "shasum": "" 330 | }, 331 | "require": { 332 | "php": ">=5.3.3", 333 | "psr/log": ">=1.0,<2.0", 334 | "symfony/event-dispatcher": ">=2.1,<3.0", 335 | "symfony/http-foundation": ">=2.2,<2.3-dev" 336 | }, 337 | "require-dev": { 338 | "symfony/browser-kit": "2.2.*", 339 | "symfony/class-loader": ">=2.1,<3.0", 340 | "symfony/config": ">=2.0,<3.0", 341 | "symfony/console": "2.2.*", 342 | "symfony/dependency-injection": ">=2.0,<3.0", 343 | "symfony/finder": ">=2.0,<3.0", 344 | "symfony/process": ">=2.0,<3.0", 345 | "symfony/routing": ">=2.2,<2.3-dev", 346 | "symfony/stopwatch": ">=2.2,<2.3-dev" 347 | }, 348 | "suggest": { 349 | "symfony/browser-kit": "2.2.*", 350 | "symfony/class-loader": "2.2.*", 351 | "symfony/config": "2.2.*", 352 | "symfony/console": "2.2.*", 353 | "symfony/dependency-injection": "2.2.*", 354 | "symfony/finder": "2.2.*" 355 | }, 356 | "type": "library", 357 | "extra": { 358 | "branch-alias": { 359 | "dev-master": "2.2-dev" 360 | } 361 | }, 362 | "autoload": { 363 | "psr-0": { 364 | "Symfony\\Component\\HttpKernel\\": "" 365 | } 366 | }, 367 | "notification-url": "https://packagist.org/downloads/", 368 | "license": [ 369 | "MIT" 370 | ], 371 | "authors": [ 372 | { 373 | "name": "Fabien Potencier", 374 | "email": "fabien@symfony.com" 375 | }, 376 | { 377 | "name": "Symfony Community", 378 | "homepage": "http://symfony.com/contributors" 379 | } 380 | ], 381 | "description": "Symfony HttpKernel Component", 382 | "homepage": "http://symfony.com", 383 | "time": "2013-03-01 06:52:29" 384 | }, 385 | { 386 | "name": "symfony/routing", 387 | "version": "v2.2.0", 388 | "target-dir": "Symfony/Component/Routing", 389 | "source": { 390 | "type": "git", 391 | "url": "https://github.com/symfony/Routing.git", 392 | "reference": "v2.2.0-RC3" 393 | }, 394 | "dist": { 395 | "type": "zip", 396 | "url": "https://api.github.com/repos/symfony/Routing/zipball/v2.2.0-RC3", 397 | "reference": "v2.2.0-RC3", 398 | "shasum": "" 399 | }, 400 | "require": { 401 | "php": ">=5.3.3" 402 | }, 403 | "require-dev": { 404 | "doctrine/common": ">=2.2,<3.0", 405 | "psr/log": ">=1.0,<2.0", 406 | "symfony/config": ">=2.2,<2.3-dev", 407 | "symfony/yaml": ">=2.0,<3.0" 408 | }, 409 | "suggest": { 410 | "doctrine/common": "~2.2", 411 | "symfony/config": "2.2.*", 412 | "symfony/yaml": "2.2.*" 413 | }, 414 | "type": "library", 415 | "extra": { 416 | "branch-alias": { 417 | "dev-master": "2.2-dev" 418 | } 419 | }, 420 | "autoload": { 421 | "psr-0": { 422 | "Symfony\\Component\\Routing\\": "" 423 | } 424 | }, 425 | "notification-url": "https://packagist.org/downloads/", 426 | "license": [ 427 | "MIT" 428 | ], 429 | "authors": [ 430 | { 431 | "name": "Fabien Potencier", 432 | "email": "fabien@symfony.com" 433 | }, 434 | { 435 | "name": "Symfony Community", 436 | "homepage": "http://symfony.com/contributors" 437 | } 438 | ], 439 | "description": "Symfony Routing Component", 440 | "homepage": "http://symfony.com", 441 | "time": "2013-02-11 11:24:47" 442 | }, 443 | { 444 | "name": "symfony/twig-bridge", 445 | "version": "v2.2.0", 446 | "target-dir": "Symfony/Bridge/Twig", 447 | "source": { 448 | "type": "git", 449 | "url": "https://github.com/symfony/TwigBridge.git", 450 | "reference": "v2.2.0" 451 | }, 452 | "dist": { 453 | "type": "zip", 454 | "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/v2.2.0", 455 | "reference": "v2.2.0", 456 | "shasum": "" 457 | }, 458 | "require": { 459 | "php": ">=5.3.3", 460 | "twig/twig": ">=1.11.0,<2.0" 461 | }, 462 | "require-dev": { 463 | "symfony/form": "2.2.*", 464 | "symfony/http-kernel": ">=2.2,<2.3-dev", 465 | "symfony/routing": ">=2.2,<2.3-dev", 466 | "symfony/security": ">=2.0,<2.3-dev", 467 | "symfony/templating": ">=2.1,<3.0", 468 | "symfony/translation": ">=2.0,<2.3-dev", 469 | "symfony/yaml": ">=2.0,<3.0" 470 | }, 471 | "suggest": { 472 | "symfony/form": "2.2.*", 473 | "symfony/http-kernel": "2.2.*", 474 | "symfony/routing": "2.2.*", 475 | "symfony/security": "2.2.*", 476 | "symfony/templating": "2.2.*", 477 | "symfony/translation": "2.2.*", 478 | "symfony/yaml": "2.2.*" 479 | }, 480 | "type": "symfony-bridge", 481 | "extra": { 482 | "branch-alias": { 483 | "dev-master": "2.2-dev" 484 | } 485 | }, 486 | "autoload": { 487 | "psr-0": { 488 | "Symfony\\Bridge\\Twig\\": "" 489 | } 490 | }, 491 | "notification-url": "https://packagist.org/downloads/", 492 | "license": [ 493 | "MIT" 494 | ], 495 | "authors": [ 496 | { 497 | "name": "Fabien Potencier", 498 | "email": "fabien@symfony.com" 499 | }, 500 | { 501 | "name": "Symfony Community", 502 | "homepage": "http://symfony.com/contributors" 503 | } 504 | ], 505 | "description": "Symfony Twig Bridge", 506 | "homepage": "http://symfony.com", 507 | "time": "2013-03-01 06:43:14" 508 | }, 509 | { 510 | "name": "twig/twig", 511 | "version": "v1.12.2", 512 | "source": { 513 | "type": "git", 514 | "url": "git://github.com/fabpot/Twig.git", 515 | "reference": "v1.12.2" 516 | }, 517 | "dist": { 518 | "type": "zip", 519 | "url": "https://api.github.com/repos/fabpot/Twig/zipball/v1.12.2", 520 | "reference": "v1.12.2", 521 | "shasum": "" 522 | }, 523 | "require": { 524 | "php": ">=5.2.4" 525 | }, 526 | "type": "library", 527 | "extra": { 528 | "branch-alias": { 529 | "dev-master": "1.12-dev" 530 | } 531 | }, 532 | "autoload": { 533 | "psr-0": { 534 | "Twig_": "lib/" 535 | } 536 | }, 537 | "notification-url": "https://packagist.org/downloads/", 538 | "license": [ 539 | "BSD-3" 540 | ], 541 | "authors": [ 542 | { 543 | "name": "Fabien Potencier", 544 | "email": "fabien@symfony.com" 545 | }, 546 | { 547 | "name": "Armin Ronacher", 548 | "email": "armin.ronacher@active-4.com" 549 | } 550 | ], 551 | "description": "Twig, the flexible, fast, and secure template language for PHP", 552 | "homepage": "http://twig.sensiolabs.org", 553 | "keywords": [ 554 | "templating" 555 | ], 556 | "time": "2013-02-09 18:21:53" 557 | } 558 | ], 559 | "packages-dev": [ 560 | 561 | ], 562 | "aliases": [ 563 | 564 | ], 565 | "minimum-stability": "stable", 566 | "stability-flags": { 567 | "silex/silex": 20 568 | }, 569 | "platform": { 570 | "php": ">=5.4.0" 571 | }, 572 | "platform-dev": [ 573 | 574 | ] 575 | } 576 | --------------------------------------------------------------------------------