xlabs / notifybundle
Live notifications bundle
Requires
- php: >=5.3.9
- knplabs/knp-paginator-bundle: ^2.6
- predis/predis: ^1.1
- symfony/symfony: ^2.8|^3.4
- wisembly/elephant.io: ~3.0
- xlabs/mmadminbundle: ^1.0
Requires (Dev)
- symfony/asset: ~2.7|~3.0.0
- symfony/console: ~2.8|~3.0.0
- symfony/expression-language: ~2.4|~3.0.0
- symfony/finder: ~2.3|~3.0.0
- symfony/form: ^2.8.23
- symfony/http-kernel: ~2.8|~3.0.0
- symfony/polyfill-intl-icu: ~1.0
- symfony/routing: ~2.2|~3.0.0
- symfony/security: ~2.6|~3.0.0
- symfony/security-acl: ~2.6|~3.0.0
- symfony/stopwatch: ~2.2|~3.0.0
- symfony/templating: ~2.1|~3.0.0
- symfony/translation: ~2.7|~3.0.0
- symfony/var-dumper: ~2.7.16|~2.8.9|~3.0.9
- symfony/yaml: ^2.0.5|~3.0.0
Suggests
- symfony/asset: For using the AssetExtension
- symfony/expression-language: For using the ExpressionExtension
- symfony/finder
- symfony/form: For using the FormExtension
- symfony/http-kernel: For using the HttpKernelExtension
- symfony/routing: For using the RoutingExtension
- symfony/security: For using the SecurityExtension
- symfony/stopwatch: For using the StopwatchExtension
- symfony/templating: For using the TwigEngine
- symfony/translation: For using the TranslationExtension
- symfony/var-dumper: For using the DumpExtension
- symfony/yaml: For using the YamlExtension
README
A redis driven like engine.
Installation
Install through composer: <!--
# Symfony 2.8
php -d memory_limit=-1 composer.phar require xlabs/notifybundle "~1.0"
# Symfony 3.4
php -d memory_limit=-1 composer.phar require xlabs/notifybundle "~2.0"
-->
php -d memory_limit=-1 composer.phar require xlabs/notifybundle
In your AppKernel
public function registerbundles()
{
return [
...
...
new XLabs\NotifyBundle\XLabsNotifyBundle(),
];
}
Routing
Append to main routing file:
# app/config/routing.yml
x_labs_notify:
resource: "@XLabsNotifyBundle/Resources/config/routing.yml"
prefix: /
Configuration sample
Default values are shown below:
# app/config/config.yml
x_labs_notify:
clients:
# many clients allowed; default is named "default"
notifier:
schema: https
ssl_key: /vagrant/sites/stiffia/ssl/wildcard.stiffia.com.key
ssl_cert: /vagrant/sites/stiffia/ssl/wildcard.stiffia.com.crt
host: notifications.stiffia.com
port: 3004
enabled: true
#track_online_users: true
# specify version 0.x for 0.* version and 1.x for 1.0 version
# to know socket.io version -> npm list socket.io
version: 1.x
# Storage
redis_settings:
host: 192.168.5.23
port: 6379
database_id: 8
_key_namespace: 'xlabs:notifications'
Make sure you update all assets:
php app/console assets:install --symlink
Usage
Append this before the end of body tag in your template:
{{ render(controller('XLabsNotifyBundle:Notifier:loader')) }}
For a full sample template, check:
XLabsFollowBundle:Follow:example.html.twig
Render user notifications
Append this anywhere in your template:
{% include 'XLabsNotifyBundle:Notifier:notifications.html.twig' with {
'max_results': <num_results>
} %}
Ajax driven pagination will be automatically added.
If you want to render notifications your own way, override the template by creating:
app/Resources/XLabsNotifyBundle/views/Notifier/notification.html.twig
To override the "no results" template:
app/Resources/XLabsNotifyBundle/views/Notifier/no_results.html.twig
To remove (ajax) a notification, add to your DOM element the following attribute:
'data-xlabs-notify-remove="<notification_id>"'
To remove (ajax) all notifications, add to your DOM element the following attribute:
'data-xlabs-notify-remove="all"'
To mark as read (ajax) a notification, add to your DOM element the following attribute:
'data-xlabs-notify-markAsRead="<notification_id>"'
You can also define a custom JS callback function for all these operations above by adding the following attribute, so it would be executed after the action:
'data-xlabs-callback="YOUR_JS_FUNCTION"'
Notifications cleanup
It´s strongly recommended that you create a daily cronjob to remove from user notifications all the items that have automatically expired. To do so:
$xlabs_storage = $container->get('xlabs_notifier_storage');
foreach($users as $user)
{
$xlabs_storage->clearExpiredUserNotifications($user->getId())
}
Requirements
The node js connection is made through a nginx reverse proxy. Make sure to set a nginx vhost:
server {
listen 443 ssl;
server_name <x_labs_chat.nodejs_settings.host>;
## SSL settings
ssl on;
ssl_certificate <x_labs_chat.nodejs_settings.ssl_cert>;
ssl_certificate_key <x_labs_chat.nodejs_settings.ssl_key>;
## SSL caching/optimization
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
keepalive_timeout 60;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
#proxy_set_header 'Access-Control-Allow-Origin' '*';
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Host $http_host;
#proxy_set_header X-NginX-Proxy true;
#proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_pass https://<your_internal_nodejs_server_ip>:<x_labs_chat.nodejs_settings.port>;
}
}