mremi / contactbundle Goto Github PK
View Code? Open in Web Editor NEWProvides a contact form for a Symfony project.
Provides a contact form for a Symfony project.
Hi there, I'm trying to override the default layout for your bundle but I can't since I'm still getting the same layout all the time. This is what I did:
Create a folder inside app/Resources
and call it ContactBundle
and create the structure as picture below shows:
Then in index.html.twig
I want to extends from MopaBootstrapBundle::base.html.twig
so I override the template by changing this:
{% extends 'MopaBootstrapBundle::base.html.twig' %}
{% trans_default_domain 'MremiContactBundle' %}
{% block content %}
<div class="col-sm-9">
{% block content_content %}
{{ form_start(form, {'action': path('mremi_contact_form')}) }}
<fieldset>
<legend>{{ 'mremi_contact.form_title'|trans }}</legend>
{{ form_widget(form) }}
</fieldset>
{{ form_end(form) }}
{% endblock content_content %}
</div>
{% endblock content %}
But content still showing with the default template:
What I'm doing wrong? Did I miss something?
It's possible to remove fields like for example title and add new ones like phone and company? How I do that and where? In ContactType.php
?
Hello,
I have this error after submitting the form
Block "subject" on template "MremiContactBundle:Contact:email.txt.twig" does not exist in "MremiContactBundle:Contact:email.txt.twig".
hi thank for this bundle 👍
All are in the sujet. i want to Override txt message send?
Merci.
It should be noted that the MremiBootstrapBundle
has to be added to the AppKernel
too:
new Genemu\Bundle\FormBundle\GenemuFormBundle(),
new Mremi\BootstrapBundle\MremiBootstrapBundle(),
new Mremi\ContactBundle\MremiContactBundle(),
in order to get the bootstrap assets installed and that it is auto-installed with the bundle.
Alternatively the Bootstrap Bundle could be moved to a separate bundle for optional usage to inform users that already have Bootstrap included e.g. via SonataAdminBundle
.
i deed this :
use Mremi\ContactBundle\Entity\Contact as BaseContact; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="contact") */ class Contact extends BaseContact { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; }
and delete contact.orm.xml.
Hi, I'm using your bundle but I didn't get any contact email on my inbox or I don't know where this emails is going to. This is how the bundle is configure at config.yml
:
mremi_contact:
store_data: false
contact_class: Tanane\FrontendBundle\Model\TananeContact
form:
type: tanane_contact
name: contact_form
validation_groups: [TananeValidation]
subject_provider: mremi_contact.subject_provider.noop
captcha_disabled: true
captcha_type: genemu_captcha
email:
mailer: mremi_contact.mailer.twig_swift
recipient_address: [email protected]
template: MremiContactBundle:Contact:email.txt.twig
It's not suposse that those emails are going to [email protected]
? Why I can't see it?
hi i'm trying to surcharge the ContactController
but i deed not success.
how do you do the surcharge of ContactController
?
i wanted to include same ajax.
Thank
Hi i have same problemes to send in production mode, but only on my server "gandi".
i try in local and both work well i mean dev and prod, i take the same projet install on my "gandi2 server and there it pass all validation and give the confimation and never recieve any email !??
can you help?
the vers: "symfony/symfony": "2.6.6", "mremi/contact-bundle": "v1.1.0",
thank
config :
mailer_transport: smtp
mailer_host: mail.gandi.net
mailer_user: [email protected]
mailer_password: ------
mailer_port: 465
mailer_encrypt: ssl
mremi_contact:
store_data: true
contact_class: Neo\ContactBundle\Entity\Contact
form:
type: mremi_contact
name: contact_form
validation_groups: [Default]
subject_provider: mremi_contact.subject_provider.noop
# captcha_type: ~ # or genemu_recaptcha
email:
mailer: mremi_contact.mailer.twig_swift
recipient_address: [email protected]
# from: []
# to:
# - { address: [email protected], name: "Webmaster" }
template: MremiContactBundle:Contact:email.txt.twig
I've seen many Symfony2 bundles that are removing their Javascript and Style dependencies and leave it up to the developer to include their favorite libraries.
Personally I already use Bootstrap. Since Symfony 2.6 a form theme has been added for twig:
http://symfony.com/blog/new-in-symfony-2-6-bootstrap-form-theme
I removed the MremiContactBundle:Contact:bootstrap_form_theme.html.twig
:
https://github.com/mremi/ContactBundle/blob/master/Resources/views/Contact/index.html.twig#L16
My bootstrap styles for instance already come with the SonataCodeBundle
:
<link rel="stylesheet" href="{{ asset('/bundles/sonatacore/vendor/bootstrap/dist/css/bootstrap.min.css') }}">
so I could remove the bundles/mremibootstrap/css
too:
https://github.com/mremi/ContactBundle/blob/master/Resources/views/Contact/index.html.twig#L20-23
Enable the twig form theme:
# app/config.yml
twig:
form:
resources:
- 'bootstrap_3_layout.html.twig'
and the Contact Form looks just fine.
What do you think about it, @mremi ?
Related issues:
Hello, I have everytime this error on all the pages of my project :
CRITICAL - Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function format() on a non-object" at /home/tbredillet/www/website/sf_test/vendor/mremi/contact-bundle/Mremi/ContactBundle/Model/Contact.php line 252
Even when I have create a new clear project and install just MremiContactBundle()
Please help me :)
Error with form submitting
stack trace:
InvalidArgumentException:
Invalid title mremi_contact.form.title_mr, possible values are: mr, mrsat vendor/mremi/contact-bundle/Mremi/ContactBundle/Model/Contact.php:197
at Mremi\ContactBundle\Model\Contact->setTitle('mremi_contact.form.title_mr')
(vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php:623)
at Symfony\Component\PropertyAccess\PropertyAccessor->writeProperty(array(object(Contact), object(Contact)), 'title', 'mremi_contact.form.title_mr')
(vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php:217)
at Symfony\Component\PropertyAccess\PropertyAccessor->setValue(object(Contact), object(PropertyPath), 'mremi_contact.form.title_mr')
(vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php:85)
at Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper->mapFormsToData(object(RecursiveIteratorIterator), object(Contact))
(vendor/symfony/symfony/src/Symfony/Component/Form/Form.php:628)
at Symfony\Component\Form\Form->submit(array(), true)
(vendor/symfony/symfony/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php:108)
at Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler->handleRequest(object(Form), object(Request))
(vendor/symfony/symfony/src/Symfony/Component/Form/Form.php:498)
at Symfony\Component\Form\Form->handleRequest(object(Request))
(vendor/mremi/contact-bundle/Mremi/ContactBundle/Controller/ContactController.php:100)
at Mremi\ContactBundle\Controller\ContactController->indexAction(object(Request))
(vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:151)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:68)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:200)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(web/app_dev.php:29)
at require('/var/www/contactsf3/web/app_dev.php')
(vendor/symfony/symfony/src/Symfony/Bundle/WebServerBundle/Resources/router.php:42)
Hi
it was working well.
i deed update and i get this error : and now whem i go on url ``mremi_contact_form` i get this
Warning: imagettfbbox(): Could not read font in D:\Programmation\Web\root_www\neo.app\vendor\genemu\form-bundle\Genemu\Bundle\FormBundle\Gd\Filter\Text.php line 73
all the reste how work with GenemuBundle work find in the site (ckeditor, ReCaptcha, datepicker ...)
when i want to use the form in my project, i get an error Variable "form" does not exist in MremiContactBundle:Contact:index.html.twig at line 16,
what's the problem? thanks
Hi, thanks for the bundle.
Can you add some refactoring ?
I followed the config in issue #7:
mremi_contact:
form:
captcha_disabled: true
captcha_type: genemu_captcha
Still the Captcha appears in dev
.
Checking $this->captchaDisabled
in
https://github.com/mremi/ContactBundle/blob/master/Form/Type/ContactType.php#L91
returns false
via VarDumper
.
The last time I worked on the project it seemed to work. I recently updated to Symfony 2.6 - mabye it has changed since this update.
it may be good to add in the entity at the same of the presit the status Send/NotSend?
Many Thank.
Hi,
I see that the last version is not working with symfony 3.0. Will you add a new version soon?
thank you for all your work
Hi,
I've removed genemu enum from configuration and tried it with ewz recaptcha bundle. Looks like working.
I propose to remove genemu as composer dependency and hardcoded configuration.
Anyway it's required to go to genemu docs for it configuration reference, might as well knowingly install it.
Hello,
got an error since the last update.
My updated config :
mremi_contact:
store_data: true
contact_class: Application\Mremi\ContactBundle\Entity\Contact
form:
type: mremi_contact
name: contact_form
validation_groups: [Default]
subject_provider: mremi_contact.subject_provider.noop
captcha_disabled: true
captcha_type: genemu_captcha # or genemu_recaptchae
Few days ago captcha_type was ~ and worked.
Now I have to give one even if I disabled it ?
the error I have :
Updating the "app/config/parameters.yml" file
[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
Unrecognized option "captcha_disabled" under "mremi_contact.form"
I'm able to send emails but the message content is always: mremi_contact.email_message_html
I overrode the bundle, maybe I missed something. I didn't knew how to remove the title so I just hided it.
config.yml
mremi_contact:
store_data: false
form:
type: contact_type
name: contact
validation_groups: [Default]
subject_provider: mremi_contact.subject_provider.noop
email:
mailer: mremi_contact.mailer.twig_swift
from: []
to:
- { address: [email protected], name: "Admin" } # Required
template: MremiContactBundle:Contact:email.txt.twig
services.yml
contact.form.registration:
class: ContactBundle\Form\Type\ContactType
tags:
- { name: form.type, alias: contact_type }
ContactType
<?php
namespace ContactBundle\Form\Type;
use Mremi\ContactBundle\Model\Contact;
use Mremi\ContactBundle\Provider\SubjectProviderInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
/**
* Contact type class
*
* @author Rémi Marseille <[email protected]>
*/
class ContactType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'hidden', array(
'data'=> 'mr',
))
->add('firstName', 'text', array('label' => 'mremi_contact.form.first_name'))
->add('lastName', 'text', array('label' => 'mremi_contact.form.last_name'))
->add('email', 'email', array('label' => 'mremi_contact.form.email'))
->add('subject', 'text', array('label' => 'mremi_contact.form.subject'))
->add('message', 'textarea', array('label' => 'mremi_contact.form.message'));
//$builder->add('save', 'submit', array('label' => 'mremi_contact.form_submit'));
}
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'intention' => 'contact',
'translation_domain' => 'MremiContactBundle',
));
}
public function getName()
{
return 'contact_type';
}
}
I need to override the TwigSwiftMailer
:
https://github.com/mremi/ContactBundle/blob/master/Mailer/TwigSwiftMailer.php
At the moment I have to create my own class and add the properties in order to implement the MailerInterface
:
use Mremi\ContactBundle\Mailer\MailerInterface;
use Mremi\ContactBundle\Model\ContactInterface;
class TwigSwiftMailer implements MailerInterface
{
/**
* @var \Swift_Mailer
*/
private $mailer;
/**
* @var \Twig_Environment
*/
private $twig;
/**
* @var string
*/
private $recipientAddress;
/**
* @var string
*/
private $template;
/**
* Constructor
*
* @param \Swift_Mailer $mailer A mailer instance
* @param \Twig_Environment $twig A Twig instance
* @param string $recipientAddress The recipient email
* @param string $template The template used for email content
*/
public function __construct(\Swift_Mailer $mailer, \Twig_Environment $twig, $recipientAddress, $template)
{
$this->mailer = $mailer;
$this->twig = $twig;
$this->recipientAddress = $recipientAddress;
$this->template = $template;
}
/**
* {@inheritdoc}
*/
public function sendMessage(ContactInterface $contact)
{
}
}
It would be easier if the properties were protected
in order to extend the existing TwigSwiftMailer
and simply change the sendMessage
method:
use Mremi\ContactBundle\Mailer\TwigSwiftMailer as MremiTwigSwiftMailer;
class TwigSwiftMailer extends MremiTwigSwiftMailer
{
/**
* {@inheritdoc}
*/
public function sendMessage(ContactInterface $contact)
{
}
}
Do you agree, should I create a PR?
In addition I have problems to set $recipientAddress
and $template
to the constructor:
# app/config.yml
mremi_contact:
email:
# mailer: mremi_contact.mailer.twig_swift
mailer: acme.mailer.twig_swift
recipient_address: [email protected]
template: MremiContactBundle:Contact:email.txt.twig
My service:
<service id="acme.mailer.twig_swift" class="Acme\AppBundle\Mailer\TwigSwiftMailer" public="false">
<argument type="service" id="mailer" />
<argument type="service" id="twig" />
<argument />
<argument />
</service>
And I override the template inside app/Resources/MremiContactBundle/views/Contact/email.txt.twig
which works fine with the original mailer.
The error:
Unable to find template "".
The same will happen for $recipientAddress
when trying to send the To
will be empty:
Address in mailbox given [] does not comply with RFC 2822, 3.6.2.
Where am I missing the injection?
Or could this be a problem after updating to Symfony 2.6 like in issue #18 which makes config vars unavailable?
In my final step I would like to save my custom entity:
mremi_contact:
store_data: true
# contact_class: Mremi\ContactBundle\Model\Contact
contact_class: Acme\AppBundle\Entity\ContactRequest
My entity uses a custom table structure and has no fields like title
or firstName
.
But the ContactEvent
requires me to implement the Mremi\ContactBundle\Model\ContactInterface
that forces me to write all the abstract methods and extend Serializable
.
What is the best way to implement my own custom save
method for the manager?
Is it easier to override the doctrine mapping resp. disable to use my annotations only?
https://github.com/mremi/ContactBundle/blob/master/Resources/config/doctrine/Contact.orm.xml
In the end, when adding all abstract methods, I can not save the form:
The form's view data is expected to be an instance of class Mremi\ContactBundle\Model\Contact, but is an instance of class Acme\AppBundle\Entity\ContactRequest.
And I really think this is related to the Symfony update issue again since he should adapt my config value for the contact_class
.
I don't achieve to overload the Controller...
My controller :
<?php
/*
* This file is part of the Mremi\ContactBundle Symfony bundle.
*
* (c) Rémi Marseille <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace MB\ContactBundle\Controller;
use Mremi\ContactBundle\ContactEvents;
use Mremi\ContactBundle\Event\ContactEvent;
use Mremi\ContactBundle\Event\FilterContactResponseEvent;
use Mremi\ContactBundle\Event\FormEvent;
use Mremi\ContactBundle\Form\Factory\FormFactory;
use Mremi\ContactBundle\Model\ContactManagerInterface;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Mremi\ContactBundle\Controller\ContactController as ContactsController;
/**
* Contact controller class.
*
* @author Rémi Marseille <[email protected]>
*/
class ContactController extends ContactsController
{
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var FormFactory
*/
private $formFactory;
/**
* @var ContactManagerInterface
*/
private $contactManager;
/**
* @var RouterInterface
*/
private $router;
/**
* @var SessionInterface
*/
private $session;
/**
* @var EngineInterface
*/
private $templating;
/**
* Constructor.
*
* @param EventDispatcherInterface $eventDispatcher An event dispatcher instance
* @param FormFactory $formFactory A form factory instance
* @param ContactManagerInterface $contactManager A contact manager instance
* @param RouterInterface $router A router instance
* @param SessionInterface $session A session instance
* @param EngineInterface $templating A templating instance
*/
public function __construct(EventDispatcherInterface $eventDispatcher, FormFactory $formFactory, ContactManagerInterface $contactManager, RouterInterface $router, SessionInterface $session, EngineInterface $templating)
{
parent::__construct($eventDispatcher, $formFactory, $router, $session, $templating);
}
/**
* Index action in charge to render the form.
*
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response|RedirectResponse
*/
public function indexAction(Request $request)
{
$contact = $this->contactManager->create();
$this->eventDispatcher->dispatch(ContactEvents::FORM_INITIALIZE, new ContactEvent($contact, $request));
$form = $this->formFactory->createForm($contact);
$form->handleRequest($request);
if ($form->isValid()) {
$event = new FormEvent($form, $request);
$this->eventDispatcher->dispatch(ContactEvents::FORM_SUCCESS, $event);
if (null === $response = $event->getResponse()) {
$response = new RedirectResponse($this->router->generate('mremi_contact_confirmation'));
}
$this->contactManager->save($contact, true);
$this->session->set('mremi_contact_data', $contact);
$this->eventDispatcher->dispatch(ContactEvents::FORM_COMPLETED, new FilterContactResponseEvent($contact, $request, $response));
return $response;
}
return $this->templating->renderResponse('MremiContactBundle:Contact:index.html.twig', array(
'form' => $form->createView(),
));
}
/**
* Confirm action in charge to render a confirmation message.
*
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws AccessDeniedException If no contact stored in session
*/
public function confirmAction()
{
$contact = $this->session->get('mremi_contact_data');
if (!$contact) {
throw new AccessDeniedException('Please fill the contact form');
}
return $this->templating->renderResponse('MremiContactBundle:Contact:confirm.html.twig', array(
'contact' => $contact,
));
}
}
My MB\ContactBundle :
<?php
namespace MB\ContactBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MBContactBundle extends Bundle
{
public function getParent()
{
return 'MremiContactBundle';
}
}
Thanks for helping me
Hi. Can you please add posibility to change the route that used to submit the form? I mean, I can alter controller and view for the contact form, but your factory does not provide a way to pass my own action URL.
'createForm' method in 'Mremi\ContactBundle\Form\Factory\FormFactory' looks like this
public function createForm($data = null)
{
return $this->formFactory->createNamed($this->name, $this->type, $data, array(
'validation_groups' => $this->validationGroups,
));
}
Or I can make a PR, that is not so complex change.
Bonjour,
à priori il n’est pas possible pour le moment de surcharger l’émetteur du mail, ce qui est dommage dans mon cas, car je ne peux pas permettre à n'importe quelle adresse mail d'envoyer un mail sur mon serveur il me faut utiliser une adresse mail spéciale. Sinon a part ça le Bundle est top. Bravo.
Serait il possible de prévoir cette surcharge dans le config.yml pour une prochaine évolution?
Cordialement.
Désolé je préfère ne pas traduire ma demande pour qu'elle reste claire.
Hi, how i can embend contact form in my other page in twig ?
Hi,
i have my owne systeme of messaging error and it work well, but i cant change the style in the field :
for exemple if i make mistek on recapcha it will return on show in my systeme and on your systeme. it show too errors!
Merci
Hi,
I don't manage to make it work on my website, I configured correctly the smtp for our company, and then I looked at the config. What do the "to" and "from" represent? I mean I understand the "from" which should lead to the sender (the webmaster), but what does the "to" leaves to?
Thank you very much in advance,
Matthieu
I'm installing the bundle from scratch and get
Unable to find template "::base.html.twig"
Is line 12 used to extend any default twig template? Is it a wrong short syntax?
https://github.com/mremi/ContactBundle/blob/master/Resources/views/Contact/index.html.twig#L12
Or do I HAVE TO OVERRIDE the template?
Hi remi, je I would like remove the fields "title" of your bundle in override the Type but it doesn't works and I'm blocked since few days
# app/config/config.yml
mremi_contact:
store_data: false
contact_class: Mremi\ContactBundle\Model\Contact
form:
type: mb_contact
name: contact_form
validation_groups: [Default]
subject_provider: mremi_contact.subject_provider.noop
email:
mailer: mremi_contact.mailer.twig_swift
from: [ address: [email protected]]
to: [ address: [email protected]]
template: MremiContactBundle:Contact:email.txt.twig
// src/MB/ContactBundle/MBContactBundle
<?php
namespace MB\ContactBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MBContactBundle extends Bundle
{
public function getParent()
{
return 'MremiContactBundle';
}
}
// src/MB/ContactBundle/Form/Type/ContactType.php
<?php
namespace MB\ContactBundle\Form\Type;
use Mremi\ContactBundle\Form\Type\ContactType as ContactTypeMremi;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ContactType extends ContactTypeMremi
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->remove('title');
}
public function getName()
{
return 'mb_contact';
}
}
Thank you for helping me !
i want to storage all send mail.
so i deed this
mremi_contact: store_data: true contact_class: Neo\ContactBundle\Model\Contact
<entity name="Neo\ContactBundle\Entity\Contact"
table="contact">
<id name="id" column="id" type="integer">
<generator strategy="AUTO" />
</id>
</entity>
and i created and copy your entity, model . change the name space
but i still get error
The class 'Neo\ContactBundle\Model\Contact' was not found in the chain configured namespaces Sonata\MediaBundle\Entity, Mremi\ContactBundle\Entity, Application\Sonata\MediaBundle\Entity, Neo\ContactBundle\Entity, Neo\ArticleBundle\Entity, Neo\UserBundle\Entity, FOS\UserBundle\Model
#config.yml
mremi_contact:
store_data: false
contact_class: Mremi\ContactBundle\Model\Contact
form:
type: mremi_contact
name: contact_form
validation_groups: [Default]
subject_provider: mremi_contact.subject_provider.noop
captcha_type: captcha
email:
mailer: mremi_contact.mailer.twig_swift
from:
- { address: [email protected], name: "Contact depuis le site" }
to:
- { address: [email protected], name: "Administrateur" }
template: MremiContactBundle:Contact:email.txt.twig
# Swiftmailer Configuration
swiftmailer:
sender_address: [email protected]
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
spool: { type: memory }
any suggestion ?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.