Skip to content

Commit

Permalink
[Shop] Tweak product reviews UI and routing
Browse files Browse the repository at this point in the history
  • Loading branch information
pjedrzejewski committed Oct 24, 2016
1 parent 71ecc80 commit 495dbbf
Show file tree
Hide file tree
Showing 17 changed files with 105 additions and 83 deletions.
2 changes: 1 addition & 1 deletion src/Sylius/Behat/Page/Shop/ProductReview/CreatePage.php
Expand Up @@ -23,7 +23,7 @@ class CreatePage extends SymfonyPage implements CreatePageInterface
*/
public function getRouteName()
{
return 'sylius_shop_product_reviews_create';
return 'sylius_shop_product_review_create';
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Sylius/Behat/Page/Shop/ProductReview/IndexPage.php
Expand Up @@ -23,7 +23,7 @@ class IndexPage extends SymfonyPage implements IndexPageInterface
*/
public function getRouteName()
{
return 'sylius_shop_product_reviews_index';
return 'sylius_shop_product_review_index';
}

/**
Expand Down
Expand Up @@ -24,15 +24,15 @@ class ProductReviewRepository extends EntityRepository implements ProductReviewR
/**
* {@inheritdoc}
*/
public function findLatestByProductId($productId)
public function findLatestByProductId($productId, $count = 3)
{
return $this->createQueryBuilder('o')
->where('o.reviewSubject = :productId')
->andWhere('o.status = :status')
->setParameter('productId', $productId)
->setParameter('status', ReviewInterface::STATUS_ACCEPTED)
->orderBy('o.createdAt', 'desc')
->setMaxResults(3)
->setMaxResults($count)
->getQuery()
->getResult()
;
Expand Down
3 changes: 2 additions & 1 deletion src/Sylius/Bundle/ShopBundle/Resources/config/routing.yml
Expand Up @@ -15,8 +15,9 @@ sylius_shop_taxon:
sylius_shop_product:
resource: "@SyliusShopBundle/Resources/config/routing/product.yml"

sylius_shop_product_reviews:
sylius_shop_product_review:
resource: "@SyliusShopBundle/Resources/config/routing/product_review.yml"
prefix: /products/{slug}/reviews

sylius_shop_provinces:
resource: "@SyliusShopBundle/Resources/config/routing/provinces.yml"
Expand Down
Expand Up @@ -5,6 +5,10 @@ sylius_shop_partial_product:
resource: "@SyliusShopBundle/Resources/config/routing/partial/product.yml"
prefix: /products

sylius_shop_partial_product_review:
resource: "@SyliusShopBundle/Resources/config/routing/partial/product_review.yml"
prefix: /products/{productId}/reviews

sylius_shop_partial_taxon:
resource: "@SyliusShopBundle/Resources/config/routing/partial/taxon.yml"
prefix: /taxons
Expand Down
Expand Up @@ -15,7 +15,7 @@ sylius_shop_partial_product_index_latest:
- $count

sylius_shop_partial_product_index_by_taxon_code:
path: /{code}
path: /by-taxon-code/{code}
methods: [GET]
defaults:
_controller: sylius.controller.product:indexAction
Expand All @@ -27,25 +27,13 @@ sylius_shop_partial_product_index_by_taxon_code:
parameters:
$code: $code

sylius_shop_partial_product_reviews_latest:
path: /latest-reviews/{productId}
methods: [GET]
defaults:
_controller: sylius.controller.product_review:indexAction
_sylius:
template: $template
repository:
method: findLatestByProductId
arguments:
- $productId

sylius_shop_product_simple_show:
path: /{slug}/simple-show
sylius_shop_partial_product_show:
path: /{slug}
methods: [GET]
defaults:
_controller: sylius.controller.product:showAction
_sylius:
template: SyliusShopBundle:Product:_simpleBox.html.twig
template: $template
repository:
method: findOneBySlugAndChannel
arguments:
Expand Down
@@ -0,0 +1,14 @@
sylius_shop_partial_product_review_latest:
path: /latest/{count}
methods: [GET]
defaults:
count: 3

_controller: sylius.controller.product_review:indexAction
_sylius:
template: $template
repository:
method: findLatestByProductId
arguments:
- $productId
- $count
@@ -1,5 +1,5 @@
sylius_shop_product_reviews_index:
path: /products/{slug}/reviews
sylius_shop_product_review_index:
path: /
methods: [GET]
defaults:
_controller: sylius.controller.product_review:indexAction
Expand All @@ -12,8 +12,8 @@ sylius_shop_product_reviews_index:
- '%locale%'
- 'expr:service("sylius.context.channel").getChannel()'

sylius_shop_product_reviews_create:
path: /products/{slug}/reviews/new
sylius_shop_product_review_create:
path: /new
methods: [GET, POST]
defaults:
_controller: sylius.controller.product_review:createAction
Expand Down

This file was deleted.

@@ -0,0 +1,20 @@
<div class="field">
<div class="ui huge star rating" data-rating="0" data-max-rating="5"></div>
<br/>
{{ form_errors(form.rating) }}
{{ form_widget(form.rating, {'attr': {'style': 'display: none'} }) }}
</div>
<div class="field">
{{ form_widget(form.title, {'attr': {'placeholder': 'sylius.ui.title'|trans} }) }}
{{ form_errors(form.title) }}
</div>
<div class="field">
{{ form_widget(form.comment, {'attr': {'placeholder': 'sylius.ui.write_your_own_review'|trans} }) }}
{{ form_errors(form.comment) }}
</div>
{% if not is_granted("IS_AUTHENTICATED_FULLY") %}
<div class="field">
{{ form_widget(form.author.email, {'attr': {'placeholder': 'sylius.ui.email'|trans}}) }}
{{ form_errors(form.author.email) }}
</div>
{% endif %}
Expand Up @@ -2,45 +2,32 @@

{% form_theme form 'SyliusUiBundle:Form:theme.html.twig' %}

{% set product = product_review.reviewSubject %}

{% block content %}
{% include '@SyliusShop/Product/Review/_breadcrumb.html.twig' %}
<div class="ui hidden divider"></div>

<div class="ui stackable grid" id="reviews">
<div class="four wide column">
{{ render(url('sylius_shop_product_simple_show', { 'slug': app.request.attributes.get('slug') })) }}
{{
render(url('sylius_shop_partial_product_show', {
'slug': app.request.attributes.get('slug'),
'template': '@SyliusShop/Product/_simpleBox.html.twig'
}))
}}
</div>
<div class="twelve wide column">
<div class="ui dividing header">
{{ 'sylius.ui.write_your_own_review'|trans }}
<div class="sub header">
{{ 'sylius.ui.you_are_reviewing'|trans }}: <strong>{{ product_review.reviewSubject.getName() }}</strong>
{{ 'sylius.ui.you_are_reviewing'|trans }} <strong>{{ product.name }}</strong>.
</div>
</div>
<form action="{{ path('sylius_shop_product_reviews_create', { 'slug': product_review.reviewSubject.getSlug() }) }}" method="POST" class="ui reply form" novalidate>
<div class="field">
<div class="ui huge star rating" data-rating="0" data-max-rating="5"></div>
<br/>
{{ form_errors(form.rating) }}
{{ form_widget(form.rating, { 'attr': { 'style': 'display: none' } }) }}
</div>
<div class="field">
{{ form_widget(form.title, { 'attr': { 'placeholder': 'sylius.ui.title'|trans } }) }}
{{ form_errors(form.title) }}
</div>
<div class="field">
{{ form_widget(form.comment) }}
{{ form_errors(form.comment) }}
</div>
{% if not is_granted("IS_AUTHENTICATED_FULLY") %}
<div class="field">
{{ form_widget(form.author.email, { 'attr': { 'placeholder': 'sylius.ui.author'|trans } }) }}
{{ form_errors(form.author.email) }}
</div>
{% endif %}
<form action="{{ path('sylius_shop_product_review_create', {'slug': product.slug}) }}" method="POST" class="ui reply form" novalidate>
{% include '@SyliusShop/Product/Review/_form.html.twig' %}
{{ form_row(form._token) }}
<button type="submit" class="ui blue labeled submit icon button">
<i class="icon edit"></i> {{ 'sylius.ui.add'|trans }}
<button type="submit" class="ui blue labeled large icon submit button">
<i class="icon check"></i> {{ 'sylius.ui.add'|trans }}
</button>
</form>
</div>
Expand Down
@@ -1,12 +1,16 @@
{% extends '@SyliusShop/layout.html.twig' %}

{% block content %}

<div class="ui hidden divider"></div>

<div class="ui stackable grid" id="reviews">
<div class="four wide column">
{{ render(url('sylius_shop_product_simple_show', { 'slug': app.request.attributes.get('slug') })) }}
{{
render(url('sylius_shop_partial_product_show', {
'slug': app.request.attributes.get('slug'),
'template': '@SyliusShop/Product/_simpleBox.html.twig'
}))
}}
</div>
<div class="twelve wide column">
{% include '@SyliusShop/Product/_reviews.html.twig' %}
Expand Down
@@ -1,9 +1,10 @@
<div class="ui bottom attached tab segment" data-tab="reviews">
{{ render(url('sylius_shop_partial_product_reviews_latest', { 'productId': product.id, 'template': '@SyliusShop/Product/_reviews.html.twig' })) }}
<a href="{{ path('sylius_shop_product_reviews_index', { 'slug': product.slug }) }}">
<div class="ui blue labeled icon button"><i class="icon list"></i> {{ 'sylius.ui.view_more'|trans }}</div>
{{ render(url('sylius_shop_partial_product_review_latest', {'productId': product.id, 'template': '@SyliusShop/Product/_reviews.html.twig'})) }}

<a href="{{ path('sylius_shop_product_review_index', {'slug': product.slug}) }}">
<div class="ui labeled icon button"><i class="icon list"></i> {{ 'sylius.ui.view_more'|trans }}</div>
</a>
<a href="{{ path('sylius_shop_product_reviews_create', { 'slug': product.slug }) }}">
<div class="ui green labeled icon button"><i class="icon plus"></i> {{ 'sylius.ui.new_review'|trans }}</div>
<a href="{{ path('sylius_shop_product_review_create', {'slug': product.slug}) }}">
<div class="ui blue labeled icon button"><i class="icon plus"></i> {{ 'sylius.ui.add_your_review'|trans }}</div>
</a>
</div>
@@ -1,8 +1,8 @@
<h1 id="sylius-product-name" class="ui monster header">{{ product.name }}</h1>
<h1 id="sylius-product-name" class="ui monster dividing header">{{ product.name }}</h1>
<div class="ui text menu">
<div class="item">
<div id="average-rating" class="ui star large rating" data-rating="{{ product.averageRating|round }}" data-max-rating="5" data-average-rating="{{ product.averageRating|round(2) }}" style="pointer-events: none;"></div>
</div>
<a href="{{ path('sylius_shop_product_reviews_index', { 'slug': product.slug }) }}" class="item">{{ product.reviews|length }} {{ 'sylius.ui.reviews'|trans }}</a>
<a href="{{ path('sylius_shop_product_reviews_create', { 'slug': product.slug }) }}" class="item">{{ 'sylius.ui.add_your_review'|trans }}</a>
<a href="{{ path('sylius_shop_product_review_index', {'slug': product.slug}) }}" class="item">{{ product.acceptedReviews|length }} {{ 'sylius.ui.reviews'|trans }}</a>
<a href="{{ path('sylius_shop_product_review_create', {'slug': product.slug}) }}" class="item">{{ 'sylius.ui.add_your_review'|trans }}</a>
</div>
@@ -1,3 +1,6 @@
{% import '@SyliusUi/Macro/messages.html.twig' as messages %}

{% if product_reviews|length > 0 %}
<div class="ui large comments">
{% for review in product_reviews %}
<div class="comment">
Expand All @@ -12,7 +15,8 @@
<div class="text">{{ review.comment }}</div>
</div>
</div>
{% else %}
{{ 'sylius.ui.there_are_no_reviews'|trans }}
{% endfor %}
</div>
{% else %}
{{ messages.info('sylius.ui.there_are_no_reviews'|trans) }}
{% endif %}
13 changes: 13 additions & 0 deletions src/Sylius/Component/Core/Model/Product.php
Expand Up @@ -13,6 +13,7 @@

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Sylius\Component\Channel\Model\ChannelInterface as BaseChannelInterface;
use Sylius\Component\Product\Model\Product as BaseProduct;
use Sylius\Component\Review\Model\ReviewInterface;
Expand Down Expand Up @@ -261,6 +262,18 @@ public function getReviews()
return $this->reviews;
}

/**
* {@inheritdoc}
*/
public function getAcceptedReviews()
{
$criteria = Criteria::create()
->where(Criteria::expr()->eq('status', ReviewInterface::STATUS_ACCEPTED))
;

return $this->reviews->matching($criteria);
}

/**
* {@inheritdoc}
*/
Expand Down
6 changes: 6 additions & 0 deletions src/Sylius/Component/Core/Model/ProductInterface.php
Expand Up @@ -13,6 +13,7 @@

use Sylius\Component\Channel\Model\ChannelsAwareInterface;
use Sylius\Component\Product\Model\ProductInterface as BaseProductInterface;
use Sylius\Component\Review\Model\ReviewInterface;
use Sylius\Component\Review\Model\ReviewableInterface;
use Sylius\Component\Shipping\Model\ShippingCategoryInterface;
use Sylius\Component\Taxonomy\Model\TaxonsAwareInterface;
Expand Down Expand Up @@ -100,4 +101,9 @@ public function getFirstVariant();
* @return int
*/
public function getPrice();

/**
* @return ReviewInterface[]
*/
public function getAcceptedReviews();
}

0 comments on commit 495dbbf

Please sign in to comment.