Added templates, routings, translations and fixtures for contact

This commit is contained in:
michalmarcinkowski 2014-09-29 12:49:22 +02:00
parent 9896c640fc
commit 92ac6b84f4
24 changed files with 555 additions and 2 deletions

View file

@ -0,0 +1,31 @@
@contact
Feature: Contact requesting
In order to get help from customer support
As a visitor
I want to send message to store owner
Background:
Given there is default currency configured
And there are following contact topics:
| title |
| Order return |
| Delivery |
| Product information |
And I am logged in as administrator
Scenario: Submitting the form without the required fields fails
Given I am on the contact page
When I press "Send"
Then I should still be on the contact page
And I should see "Please enter first name."
Scenario: Submitting contact form
Given I am on the contact page
When I fill in "First name" with "John"
And I fill in "Last name" with "Doe"
And I fill in "Email" with "john@doe.com"
And I fill in "Message" with "Hello!"
And I select "Delivery" from "Topic"
And I press "Send"
Then I should be on the contact page
And I should see "Contact has been successfully sent."

View file

@ -5,5 +5,6 @@ sylius:
last_name: Last name
email: Email
message: Message
topic: Topic
contact_topic:
title: Title

View file

@ -0,0 +1,53 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\FixturesBundle\DataFixtures\ORM;
use Doctrine\Common\Persistence\ObjectManager;
use Sylius\Bundle\FixturesBundle\DataFixtures\DataFixture;
/**
* Default contact request fixtures.
*
* @author Michał Marcinkowski <michal.marcinkowski@lakion.com>
*/
class LoadContactRequestData extends DataFixture
{
/**
* {@inheritdoc}
*/
public function load(ObjectManager $manager)
{
$contactRequestRepository = $this->getContactRequestRepository();
for ($i = 0; $i < 20; $i++) {
$contactRequest = $contactRequestRepository->createNew();
$contactRequest->setFirstName($this->faker->firstName());
$contactRequest->setLastName($this->faker->lastName());
$contactRequest->setEmail($this->faker->email());
$contactRequest->setMessage($this->faker->paragraph());
$contactRequest->setTopic($this->getReference('Sylius.ContactTopic.' . rand(0, 4)));
$manager->persist($contactRequest);
}
$manager->flush();
}
/**
* {@inheritdoc}
*/
public function getOrder()
{
return 2;
}
}

View file

@ -0,0 +1,51 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\FixturesBundle\DataFixtures\ORM;
use Doctrine\Common\Persistence\ObjectManager;
use Sylius\Bundle\FixturesBundle\DataFixtures\DataFixture;
/**
* Default contact topic fixtures.
*
* @author Michał Marcinkowski <michal.marcinkowski@lakion.com>
*/
class LoadContactTopicData extends DataFixture
{
/**
* {@inheritdoc}
*/
public function load(ObjectManager $manager)
{
$contactTopicRepository = $this->getContactTopicRepository();
for ($i = 0; $i < 5; $i++) {
$contactTopic = $contactTopicRepository->createNew();
$contactTopic->setTitle($this->faker->sentence());
$manager->persist($contactTopic);
$this->setReference('Sylius.ContactTopic.' . $i, $contactTopic);
}
$manager->flush();
}
/**
* {@inheritdoc}
*/
public function getOrder()
{
return 1;
}
}

View file

@ -0,0 +1,47 @@
# This file is part of the Sylius package.
# (c) Paweł Jędrzejewski
sylius_backend_contact_request_index:
path: /
methods: [GET]
defaults:
_controller: sylius.controller.contact_request:indexAction
_sylius:
template: SyliusWebBundle:Backend/ContactRequest:index.html.twig
sortable: true
paginate: false
sylius_backend_contact_request_create:
path: /new
methods: [GET, POST]
defaults:
_controller: sylius.controller.contact_request:createAction
_sylius:
template: SyliusWebBundle:Backend/ContactRequest:create.html.twig
redirect: sylius_backend_contact_request_index
sylius_backend_contact_request_update:
path: /{id}/edit
methods: [GET, PUT]
defaults:
_controller: sylius.controller.contact_request:updateAction
_sylius:
template: SyliusWebBundle:Backend/ContactRequest:update.html.twig
redirect: sylius_backend_contact_request_index
sylius_backend_contact_request_delete:
path: /{id}
methods: [DELETE]
defaults:
_controller: sylius.controller.contact_request:deleteAction
_sylius:
template: SyliusWebBundle:Backend/Misc:delete.html.twig
redirect: sylius_backend_contact_request_index
sylius_backend_contact_request_show:
path: /{id}
methods: [GET]
defaults:
_controller: sylius.controller.contact_request:showAction
_sylius:
template: SyliusWebBundle:Backend/ContactRequest:show.html.twig

View file

@ -0,0 +1,39 @@
# This file is part of the Sylius package.
# (c) Paweł Jędrzejewski
sylius_backend_contact_topic_index:
path: /
methods: [GET]
defaults:
_controller: sylius.controller.contact_topic:indexAction
_sylius:
template: SyliusWebBundle:Backend/ContactTopic:index.html.twig
sortable: true
paginate: false
sylius_backend_contact_topic_create:
path: /new
methods: [GET, POST]
defaults:
_controller: sylius.controller.contact_topic:createAction
_sylius:
template: SyliusWebBundle:Backend/ContactTopic:create.html.twig
redirect: sylius_backend_contact_topic_index
sylius_backend_contact_topic_update:
path: /{id}/edit
methods: [GET, PUT]
defaults:
_controller: sylius.controller.contact_topic:updateAction
_sylius:
template: SyliusWebBundle:Backend/ContactTopic:update.html.twig
redirect: sylius_backend_contact_topic_index
sylius_backend_contact_topic_delete:
path: /{id}
methods: [DELETE]
defaults:
_controller: sylius.controller.contact_topic:deleteAction
_sylius:
template: SyliusWebBundle:Backend/Misc:delete.html.twig
redirect: sylius_backend_contact_topic_index

View file

@ -132,6 +132,14 @@ sylius_backend_api_client:
resource: @SyliusWebBundle/Resources/config/routing/backend/api_client.yml
prefix: /api-clients
sylius_backend_contact_topic:
resource: @SyliusWebBundle/Resources/config/routing/backend/contact_topic.yml
prefix: /contact-topics
sylius_backend_contact_request:
resource: @SyliusWebBundle/Resources/config/routing/backend/contact_request.yml
prefix: /contact-requests
sylius_backend_settings:
resource: @SyliusWebBundle/Resources/config/routing/backend/settings.yml
prefix: /settings

View file

@ -0,0 +1,7 @@
sylius_contact:
path: /
defaults:
_controller: sylius.controller.contact_request:createAction
_sylius:
template: SyliusWebBundle:Frontend:contact.html.twig
redirect: sylius_contact

View file

@ -38,3 +38,7 @@ sylius_cart_save:
_controller: sylius.controller.cart:saveAction
_sylius:
template: SyliusWebBundle:Frontend/Cart:summary.html.twig
sylius_contact:
resource: @SyliusWebBundle/Resources/config/routing/frontend/contact.yml
prefix: /contact

View file

@ -106,6 +106,11 @@ sylius:
customers: Customers
dashboard: Dashboard
edit: Edit
contact_request:
index: Contact requests
show: Contact request
contact_topic:
index: Contact topics
currency:
index: Currencies
general_settings: General Settings
@ -753,3 +758,26 @@ sylius:
scope: Scope
zone_member:
members: Members
contact_topic:
create: Create contact topic
create_header: New contact topic
id: ID
title: Title
index_header: Contact topics
no_results: There are no contact topics to display.
update_header: Editing contact topic
updated_at: Last update
contact_request:
create: Create contact request
create_header: New contact request
id: ID
firstName: First name
lastName: Last name
email: Email
message: Message
topic: Topic
index_header: Contact requests
no_results: There are no contact requests to display.
update_header: Editing contact request
updated_at: Last update
show_header: Contact request details

View file

@ -0,0 +1,11 @@
{% form_theme form 'SyliusWebBundle::forms.html.twig' %}
{{ form_errors(form) }}
{{ form_row(form.topic) }}
{{ form_row(form.firstName) }}
{{ form_row(form.lastName) }}
{{ form_row(form.email) }}
{{ form_row(form.message) }}
{{ form_rest(form) }}

View file

@ -0,0 +1,24 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% from 'SyliusResourceBundle:Macros:actions.html.twig' import create %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li><a href="{{ path('sylius_backend_contact_request_index') }}">{{ 'sylius.breadcrumb.contact_request.index'|trans }}</a></li>
<li>{{ 'sylius.breadcrumb.new'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<h1><i class="glyphicon glyphicon-plus-sign"></i> {{ 'sylius.contact_request.create_header'|trans|raw }}</h1>
</div>
{{ form_errors(form) }}
<form action="{{ path('sylius_backend_contact_request_create') }}" method="post" class="form-horizontal" novalidate>
{% include 'SyliusWebBundle:Backend/ContactRequest:_form.html.twig' %}
{{ create() }}
</form>
{% endblock %}

View file

@ -0,0 +1,23 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% import 'SyliusResourceBundle:Macros:buttons.html.twig' as buttons %}
{% from 'SyliusWebBundle:Backend/ContactRequest:macros.html.twig' import list %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li>{{ 'sylius.breadcrumb.contact_request.index'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<div class="actions-menu">
{{ buttons.create(path('sylius_backend_contact_request_create'), 'sylius.contact_request.create'|trans) }}
</div>
<h1><i class="fa fa-comments"></i> {{ 'sylius.contact_request.index_header'|trans|raw }}</h1>
</div>
{{ list(contact_requests) }}
{% endblock %}

View file

@ -0,0 +1,39 @@
{% macro list(contact_requests) %}
{% import 'SyliusResourceBundle:Macros:buttons.html.twig' as buttons %}
{% import 'SyliusWebBundle:Backend/Macros:alerts.html.twig' as alerts %}
{% if contact_requests|length > 0 %}
<table class="table table-hover">
<thead>
<tr>
<th>{{ sylius_resource_sort('firstName', 'sylius.contact_request.firstName'|trans) }}</th>
<th>{{ sylius_resource_sort('lastName', 'sylius.contact_request.lastName'|trans) }}</th>
<th>{{ sylius_resource_sort('email', 'sylius.contact_request.email'|trans) }}</th>
<th>{{ sylius_resource_sort('topic', 'sylius.contact_request.topic'|trans) }}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for contact_request in contact_requests %}
<tr id="{{ contact_request.id }}">
<td>{{ contact_request.firstName }}</td>
<td>{{ contact_request.lastName }}</td>
<td>{{ contact_request.email }}</td>
<td>{{ contact_request.topic }}</td>
<td>
<div class="pull-right">
{{ buttons.show(path('sylius_backend_contact_request_show', {'id': contact_request.id})) }}
{{ buttons.edit(path('sylius_backend_contact_request_update', {'id': contact_request.id})) }}
{{ buttons.delete(path('sylius_backend_contact_request_delete', {'id': contact_request.id})) }}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
{{ alerts.info('sylius.contact_request.no_results'|trans) }}
{% endif %}
{% endmacro %}

View file

@ -0,0 +1,23 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li><a href="{{ path('sylius_backend_contact_request_index') }}">{{ 'sylius.breadcrumb.contact_request.index'|trans }}</a></li>
<li>{{ contact_request.id }}</li>
<li>{{ 'sylius.breadcrumb.contact_request.show'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<h1><i class="fa fa-life-ring"></i> {{ 'sylius.contact_request.show_header'|trans|raw }}</h1>
</div>
{{ contact_request.firstName }} <br/>
{{ contact_request.lastName }} <br/>
{{ contact_request.email }} <br/>
{{ contact_request.topic }} <br/>
{{ contact_request.message }}
{% endblock %}

View file

@ -0,0 +1,26 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% from 'SyliusResourceBundle:Macros:actions.html.twig' import update %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li><a href="{{ path('sylius_backend_contact_request_index') }}">{{ 'sylius.breadcrumb.contact_request.index'|trans }}</a></li>
<li>{{ contact_request.id }}</li>
<li>{{ 'sylius.breadcrumb.edit'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<h1><i class="glyphicon glyphicon-pencil"></i> {{ 'sylius.contact_request.update_header'|trans|raw }}</h1>
</div>
{{ form_errors(form) }}
<form action="{{ path('sylius_backend_contact_request_update', {'id': contact_request.id}) }}" method="post" class="form-horizontal" novalidate>
<input type="hidden" name="_method" value="PUT">
{% include 'SyliusWebBundle:Backend/ContactRequest:_form.html.twig' %}
{{ update() }}
</form>
{% endblock %}

View file

@ -0,0 +1,7 @@
{% form_theme form 'SyliusWebBundle::forms.html.twig' %}
{{ form_errors(form) }}
{{ form_row(form.title, {'attr': {'class': 'input-lg'}}) }}
{{ form_rest(form) }}

View file

@ -0,0 +1,24 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% from 'SyliusResourceBundle:Macros:actions.html.twig' import create %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li><a href="{{ path('sylius_backend_contact_topic_index') }}">{{ 'sylius.breadcrumb.contact_topic.index'|trans }}</a></li>
<li>{{ 'sylius.breadcrumb.new'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<h1><i class="glyphicon glyphicon-plus-sign"></i> {{ 'sylius.contact_topic.create_header'|trans|raw }}</h1>
</div>
{{ form_errors(form) }}
<form action="{{ path('sylius_backend_contact_topic_create') }}" method="post" class="form-horizontal" novalidate>
{% include 'SyliusWebBundle:Backend/ContactTopic:_form.html.twig' %}
{{ create() }}
</form>
{% endblock %}

View file

@ -0,0 +1,23 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% import 'SyliusResourceBundle:Macros:buttons.html.twig' as buttons %}
{% from 'SyliusWebBundle:Backend/ContactTopic:macros.html.twig' import list %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li>{{ 'sylius.breadcrumb.contact_topic.index'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<div class="actions-menu">
{{ buttons.create(path('sylius_backend_contact_topic_create'), 'sylius.contact_topic.create'|trans) }}
</div>
<h1>{{ 'sylius.contact_topic.index_header'|trans|raw }}</h1>
</div>
{{ list(contact_topics) }}
{% endblock %}

View file

@ -0,0 +1,32 @@
{% macro list(contact_topics) %}
{% import 'SyliusResourceBundle:Macros:buttons.html.twig' as buttons %}
{% import 'SyliusWebBundle:Backend/Macros:alerts.html.twig' as alerts %}
{% if contact_topics|length > 0 %}
<table class="table table-hover">
<thead>
<tr>
<th>{{ sylius_resource_sort('title', 'sylius.contact_topic.title'|trans) }}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for contact_topic in contact_topics %}
<tr id="{{ contact_topic.id }}">
<td>{{ contact_topic.title }}</td>
<td>
<div class="pull-right">
{{ buttons.edit(path('sylius_backend_contact_topic_update', {'id': contact_topic.id})) }}
{{ buttons.delete(path('sylius_backend_contact_topic_delete', {'id': contact_topic.id})) }}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
{{ alerts.info('sylius.contact_topic.no_results'|trans) }}
{% endif %}
{% endmacro %}

View file

@ -0,0 +1,26 @@
{% extends 'SyliusWebBundle:Backend:layout.html.twig' %}
{% from 'SyliusResourceBundle:Macros:actions.html.twig' import update %}
{% block topbar %}
<ol class="breadcrumb">
<li>{{ 'sylius.breadcrumb.configuration'|trans }}</li>
<li><a href="{{ path('sylius_backend_contact_topic_index') }}">{{ 'sylius.breadcrumb.contact_topic.index'|trans }}</a></li>
<li>{{ contact_topic.title }}</li>
<li>{{ 'sylius.breadcrumb.edit'|trans }}</li>
</ol>
{% endblock %}
{% block content %}
<div class="page-header">
<h1><i class="glyphicon glyphicon-pencil"></i> {{ 'sylius.contact_topic.update_header'|trans|raw }}</h1>
</div>
{{ form_errors(form) }}
<form action="{{ path('sylius_backend_contact_topic_update', {'id': contact_topic.id}) }}" method="post" class="form-horizontal" novalidate>
<input type="hidden" name="_method" value="PUT">
{% include 'SyliusWebBundle:Backend/ContactTopic:_form.html.twig' %}
{{ update() }}
</form>
{% endblock %}

View file

@ -0,0 +1,26 @@
{% extends 'SyliusWebBundle:Frontend:layout.html.twig' %}
{% form_theme form 'SyliusWebBundle::forms.html.twig' %}
{% block content %}
<div class="page-header">
<h1>Contact</h1>
</div>
<form action="{{ path('sylius_contact') }}" method="post" class="form-horizontal" novalidate>
{{ form_errors(form) }}
{{ form_row(form.topic) }}
{{ form_row(form.firstName) }}
{{ form_row(form.lastName) }}
{{ form_row(form.email) }}
{{ form_row(form.message) }}
<input type="submit" value="Send" class="btn btn-primary" />
{{ form_rest(form) }}
</form>
{% endblock %}

View file

@ -146,7 +146,7 @@ class ContactRequest implements ContactRequestInterface
/**
* {@inheritdoc}
*/
public function setTopic(ContactTopicInterface $topic)
public function setTopic(ContactTopicInterface $topic = null)
{
$this->topic = $topic;

View file

@ -68,5 +68,5 @@ interface ContactRequestInterface extends TimestampableInterface
/**
* @param ContactTopicInterface $topic
*/
public function setTopic(ContactTopicInterface $topic);
public function setTopic(ContactTopicInterface $topic = null);
}