1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-21 06:30:10 -07:00

Ajax load tabs in Set detail template

This commit is contained in:
David Hübner 2017-04-28 16:06:16 +02:00
parent f0318ac661
commit bdddd5a7b4
20 changed files with 537 additions and 378 deletions

View File

@ -0,0 +1,13 @@
$(document).ready(function () {
$('.ajax-load').each(function () {
$self = $(this);
$.ajax({
dataType: "json",
url: $self.data('src'),
context: $self
}).done(function(data) {
$(this).html(data);
});
})
});

View File

@ -1,4 +1,4 @@
$(document).ready(function () { $(document).bind('ready ajaxComplete', function(){
$('.ui.dropdown') $('.ui.dropdown')
.dropdown() .dropdown()
; ;

View File

@ -0,0 +1,10 @@
{% import 'macros/blocks.html.twig' as blocks %}
{% import 'macros/elements.html.twig' as elements %}
{% for label, flashes in app.session.flashbag.all %}
{% for flash in flashes %}
{{ elements.flash(label,flash) }}
{% endfor %}
{% endfor %}
{% block content %}{% endblock %}

View File

@ -1,58 +0,0 @@
{% extends 'base.html.twig' %}
{% block content %}
{{ form_start(form) }}
<div class="four fields">
{{ form_row(form.theme) }}
{{ form_row(form.subtheme) }}
{{ form_row(form.years) }}
<div class="field">
<label>submit</label>
<input type="submit" class="ui button">
</div>
</div>
{{ form_end(form) }}
<h3>{{ sets|length }}</h3>
<div class="ui seven column grid">
<div class="row">
{% for set in sets %}
<div class="column">
<a href="{{ url('set_detail', {'number': set.number~'-'~set.numberVariant, 'name' : set.name|escape('url') }) }}">
<img style="width: 100%" src="{{ set.legoSetID|setImage|imagine_filter('rebrickable_set_min') }}">
<p>{{ set.LegoSetID }} - {{ set.name }}</p>
</a>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script>
var $theme = $('#filter_set_theme');
$theme.change(function() {
var $form = $(this).closest('form');
var data = {};
data[$theme.attr('name')] = $theme.val();
$.ajax({
url : $form.attr('action'),
type: $form.attr('method'),
data : data,
success: function(html) {
$('#filter_set_subtheme').replaceWith(
$(html).find('#filter_set_subtheme')
);
$('#filter_set_years').replaceWith(
$(html).find('#filter_set_years')
);
}
});
});
</script>
{% endblock %}

View File

@ -0,0 +1,9 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if description|length %}
{{ description|raw }}
{% else %}
{{ blocks.empty('empty.description'|trans) }}
{% endif %}
{% endblock %}

View File

@ -1,3 +1,7 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if images|length %}
<div class="ui six doubling cards"> <div class="ui six doubling cards">
{% for image in images %} {% for image in images %}
<div class="card"> <div class="card">
@ -7,3 +11,7 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% else %}
{{ blocks.empty('empty.images') }}
{% endif %}
{% endblock %}

View File

@ -1,3 +1,6 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if instructions|length != 0 %} {% if instructions|length != 0 %}
<p> <p>
{{ 'set.instructions.text' | trans }} {{ 'set.instructions.text' | trans }}
@ -22,7 +25,6 @@
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<h2 class="ui center aligned icon"> {{ blocks.empty('empty.instructions') }}
<i class="circular warning icon"></i>
</h2>
{% endif %} {% endif %}
{% endblock %}

View File

@ -1,12 +1,16 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if reviews|length != 0 %}
<div class="ui comments"> <div class="ui comments">
{% for review in reviews|slice(0, 3) %} {% for review in reviews %}
<div class="comment"> <div class="comment">
<a class="avatar"> <a class="avatar">
{#<img src="/images/avatar/small/matt.jpg">#}
</a> </a>
<div class="content"> <div class="content">
<div class="header"> <div class="header">
<h4>{{ review.title }}</h4> <h2>{{ review.title }}</h2>
</div> </div>
<span class="author">{{ review.author }}</span> {{ review.hTML }} <span class="author">{{ review.author }}</span> {{ review.hTML }}
<div class="metadata"> <div class="metadata">
@ -20,8 +24,14 @@
Overall rating <div class="ui star rating" data-rating="{{ review.overallRating }}" data-max-rating="5"></div> Overall rating <div class="ui star rating" data-rating="{{ review.overallRating }}" data-max-rating="5"></div>
Value for money <div class="ui star rating" data-rating="{{ review.valueForMoney }}" data-max-rating="5"></div> Value for money <div class="ui star rating" data-rating="{{ review.valueForMoney }}" data-max-rating="5"></div>
Playability <div class="ui star rating" data-rating="{{ review.playability }}" data-max-rating="5"></div> Playability <div class="ui star rating" data-rating="{{ review.playability }}" data-max-rating="5"></div>
Parts <div class="ui star rating" data-rating="{{ review.parts }}" data-max-rating="5"></div>
Building experience <div class="ui star rating" data-rating="{{ review.buildingExperience }}" data-max-rating="5"></div>
</div> </div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% else %}
{{ blocks.empty('empty.reviews') }}
{% endif %}
{% endblock %}

View File

@ -0,0 +1,43 @@
{% macro modelImageMin(model, color) %}
<div class="image load">
<img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ asset('/images/'~color~'/'~model.number~'.png') | imagine_filter('media_min') }}" class="transition visible">
</div>
{% endmacro %}
{% macro modelImageLarge(model, color) %}
<div class="image">
<img src="{{ asset('/images/'~color~'/'~model.number~'.png')|imagine_filter('media_large') }}">
</div>
{% endmacro %}
{% macro model(model, quantity) %}
<div class="column">
<div class="ui bordered fluid image">
<a href="{{ url('model_detail', {'number': model.number})}}">
{% import _self as blocks %}
{{ blocks.modelImageMin(model, -1) }}
<div class="ui bottom attached label">{{ quantity }}x {{ model.number }}</div>
</a>
</div>
</div>
{% endmacro %}
{% macro part(part, quantity, color = -1) %}
<div class="column">
<div class="ui bordered fluid image">
<a href="{{ url('reb_part_detail', {'number': part.number})}}">
{% import _self as blocks %}
{#{{ blocks.partImage(part.number, -1) }}#}
<div class="ui bottom attached label">{{ quantity }}x {{ part.number }}</div>
</a>
</div>
</div>
{% endmacro %}
{% macro empty(message) %}
<p class="ui center aligned icon header"><i class="circular frown icon"></i>{{ message }}</p>
{% endmacro %}
{% macro ccal2_license(title,author) %}
"{{ title }}" by {{ author }}, used under <a href="https://creativecommons.org/licenses/by/2.0/">CC BY 2.0</a> / Converted to stl from original
{% endmacro %}

View File

@ -1,16 +1,3 @@
{% macro part(model) %}
<div class="column">
<div class="ui bordered fluid image">
<a href="{{ url('model_detail', {'number': model.number})}}">
<div class="image load">
<img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ asset('/images/-1/'~model.number~'.png') | imagine_filter('model_min') }}" class="transition visible">
</div>
<div class="ui bottom attached label {% if model.parts|length == 0 %}black{% endif %}">{{ model.number }}</div>
</a>
</div>
</div>
{% endmacro %}
{% macro flash(type,message) %} {% macro flash(type,message) %}
{% if type == 'error' %} {% if type == 'error' %}
{% set icon = 'ban' %} {% set icon = 'ban' %}
@ -26,7 +13,6 @@
{% set title = 'flash.info.title' %} {% set title = 'flash.info.title' %}
{% endif %} {% endif %}
<div class="ui icon {{ type ? type : '' }} message"> <div class="ui icon {{ type ? type : '' }} message">
<i class="{{ icon }} icon"></i> <i class="{{ icon }} icon"></i>
<i class="close icon"></i> <i class="close icon"></i>

View File

@ -1,16 +0,0 @@
<h4 class="ui horizontal divider header">Sets</h4>
<div class="ui seven column grid">
<div class="row">
{% for set in inventorySets %}
<div class="column">
<a href="{{ url('set_detail', {'number': set.set.number}) }}">
<div class="ui bordered image medium">
<img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ set.set.number|setImage|imagine_filter('rebrickable_set_min') }}" class="transition visible">
</div>
<p>{{ set.set.number }} - {{ set.set.name }}</p>
<p>{{ set.quantity}}</p>
</a>
</div>
{% endfor %}
</div>
</div>

View File

@ -0,0 +1,20 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if colors|length > 0 %}
{% for color in colors %}
<h5 style="color: #{{ color['color'].rgb }}" class="ui horizontal divider header">
{{ color['color'].name }} ({{ color['quantity'] }})
</h5>
<div class="segment vertical">
<div class="ui ten column grid">
{% for model in color['models'] %}
{{ blocks.model(model['model'],model['quantity']) }}
{% endfor %}
</div>
</div>
{% endfor %}
{% endif %}
{% endblock %}

View File

@ -1,8 +1,8 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block title %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name }}{% endblock %} {% block title %}{{ set ? set.number }} {{ set ? set.name }}{% endblock %}
{% block header %}{{ rbset ? rbset.number }} {{ rbset ? rbset.name | escape('html') }}{% endblock %} {% block header %}{{ set ? set.number }} {{ set ? set.name | escape('html') }}{% endblock %}
{% block content %} {% block content %}
@ -11,66 +11,66 @@
<div class="image bordered ui big"> <div class="image bordered ui big">
{% if brset %} {% if brset %}
<img class="big" src="{{ ('/sets/images/'~brset.legoSetID~'.jpg')|imagine_filter('brickset_large') }}"> <img class="big" src="{{ ('/sets/images/'~brset.legoSetID~'.jpg')|imagine_filter('brickset_large') }}">
{% elseif rbset %} {% else %}
<img class="big" src="{{ rbset.number|setImage|imagine_filter('rebrickable_large') }}"> <img class="big" src="{{ set.number|setImage|imagine_filter('rebrickable_large') }}">
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="column seven wide"> <div class="column seven wide">
<div class="item-info black ui"> <div class="item-info ui">
<table class="ui very basic table"> <table class="ui very basic table">
<tr> <tr>
<td>number</td><td>{{ brset ? brset.legoSetID : rbset ? rbset.number : null}}</td> <td>{{ 'set.number' | trans }}</td><td>{{ brset ? brset.legoSetID : set ? set.number : null}}</td>
</tr> </tr>
<tr> <tr>
<td>name</td><td>{{ brset ? brset.name : rbset ? rbset.name : null}}</td> <td>{{ 'set.name' | trans }}</td><td>{{ brset ? brset.name : set ? set.name : null}}</td>
</tr> </tr>
<tr> <tr>
<td>year</td><td>{{ brset ? brset.year : rbset ? rbset.year : null}}</td> <td>{{ 'set.year' | trans }}</td><td>{{ brset ? brset.year : set ? set.year : null}}</td>
</tr> </tr>
<tr> <tr>
<td>theme</td> <td>{{ 'set.theme' | trans }}</td>
{% if rbset %} {% if set %}
<td><a href="#">{{ rbset.theme.parent ? rbset.theme.parent.name }}</a> <a href="#">{{ rbset.theme.name }}</a> </td> <td><a href="#">{{ set.theme.parent ? set.theme.parent.name }}</a> <a href="#">{{ set.theme.name }}</a> </td>
{% elseif brset %} {% elseif brset %}
<td>{{ brset.theme }}</td> <td>{{ brset.theme }}</td>
{% endif %} {% endif %}
</tr> </tr>
<tr> <tr>
<td>parts</td><td> <td>{{ 'set.parts' | trans }}</td><td>
{{ rbset ? rbset.partCount }} {{ brset ? '('~brset.pieces~')' }} {{ set ? set.partCount }} {{ brset ? '('~brset.pieces~')' }}
</td> </td>
</tr> </tr>
{% if brset %} {% if brset %}
<tr> <tr>
<td></td> <td>{{ 'set.minifigs' | trans }}</td>
<td><a class="brickset link" href="{{ brset.bricksetURL }}">Brickset</a></td> <td>{{ brset.minifigs }}</td>
</tr>
<tr>
<td>{{ 'set.rating' | trans }}</td>
<td>
{{ brset.rating }}/5
</td>
</tr> </tr>
{% endif %} {% endif %}
{% if rbset %}
<tr> <tr>
<td></td> <td></td>
<td><a class="rebrickable link" href="http://rebrickable.com/sets/{{ rbset ? rbset.number }}">Rebrickable</a></td> <td>
</tr> <a class="rebrickable link" href="http://rebrickable.com/sets/{{ set ? set.number }}">Rebrickable</a>
{% if brset %}
<a class="brickset link" href="{{ brset.bricksetURL }}">Brickset</a>
{% endif %} {% endif %}
</td>
</tr>
</table> </table>
{#{% if brset is not null %}#}
{#<dl>#}
{#<dt>themegroup:</dt><dd>{{ brset.themeGroup }}</dd>#}
{#<dt>theme:</dt><dd>{{ brset.theme }}</dd>#}
{#<dt>subtheme:</dt><dd>{{ brset.subtheme }}</dd>#}
{#<dt>count of parts:</dt><dd>{{ brset.pieces }}</dd>#}
{#<dt>minifigs:</dt><dd>{{ brset.minifigs }}</dd>#}
{#</dl>#}
{#{% endif %}#}
</div> </div>
</div> </div>
</div> </div>
<div class="ui segment vertical item-info"> <div class="ui segment vertical item-info">
<div class="ui tabular pointing secondary menu"> <div class="ui tabular pointing secondary menu">
<a class="item active" data-tab="parts"><i class="cubes icon"></i> Parts ({{ rbset ? rbset.partCount : 0}})</a> <a class="item active" data-tab="parts"><i class="cubes icon"></i> Inventory ({{ set ? set.partCount : 0}})</a>
{% if brset %} {% if brset %}
<a class="item" data-tab="description"><i class="info icon"></i> Description</a> <a class="item" data-tab="description"><i class="info icon"></i> Description</a>
<a class="item" data-tab="images"> <i class="image icon"></i> Images ({{ brset.additionalImageCount }})</a> <a class="item" data-tab="images"> <i class="image icon"></i> Images ({{ brset.additionalImageCount }})</a>
@ -80,61 +80,26 @@
</div> </div>
<div class="ui vertical segment"> <div class="ui vertical segment">
<div class="ui tab active" data-tab="parts"> <div class="ui tab active" data-tab="parts">
{% if rbset %} <div class="ajax-load" data-src="{{ path('set_models', { 'number': set.number }) }}">
<div class="ui active centered inline loader"></div>
</div>
{#<div class="ajax-load" id="parts" data-src="{{ path('rebrickable_set_parts', { 'number': rbset.number }) }}"></div>#} {#{{ render(path('set_colors', {number: set.number})) }}#}
{{ render(controller('AppBundle:Rebrickable/Set:parts', { 'number': rbset.number })) }}
{% endif %}
</div> </div>
{% if brset %} {% if brset %}
<div class="ui tab" data-tab="images"> <div class="ui tab ajax-load" data-tab="description" data-src="{{ path('brickset_description', { 'id': brset.setID }) }}">
{#<div class="ajax-load" id="images" data-src="{{ path('brickset_images', { 'id': brset.setID }) }}"></div>#} <div class="ui active centered inline loader"></div>
{{ render(controller('AppBundle:Brickset/Set:images', { 'id': brset.setID })) }}
</div> </div>
<div class="ui tab" data-tab="instructions"> <div class="ui tab ajax-load" data-tab="images" data-src="{{ path('brickset_images', { 'id': brset.setID }) }}">
{#<div class="ajax-load" id="instructions" data-src="{{ path('brickset_instructions', { 'id': brset.setID }) }}"></div>#} <div class="ui active centered inline loader"></div>
{{ render(controller('AppBundle:Brickset/Set:instructions', { 'id': brset.setID })) }}
</div> </div>
<div class="ui tab" data-tab="reviews"> <div class="ui tab ajax-load" data-tab="instructions" data-src="{{ path('brickset_instructions', { 'id': brset.setID }) }}">
{#<div class="ajax-load" id="reviews" data-src="{{ path('brickset_reviews', { 'id': brset.setID }) }}"></div>#} <div class="ui active centered inline loader"></div>
{{ render(controller('AppBundle:Brickset/Set:reviews', { 'id': brset.setID })) }}
</div> </div>
<div class="ui tab" data-tab="description"> <div class="ui tab ajax-load" data-tab="reviews" data-src="{{ path('brickset_reviews', { 'id': brset.setID }) }}">
{{ brset.description|raw }} <div class="ui active centered inline loader"></div>
</div> </div>
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block javascripts %}
{{ parent() }}
<script type="text/javascript">
$(document).ready(function () {
// $('.ajax-load').each(function () {
// $self = $(this);
//
//
// $.ajax({
// type: "POST",
// dataType: 'json',
// url: $self.data('src'),
// async: true, //you won't need that if nothing in your following code is dependend of the result
// success: function(response){
// $self.html(response); //Change the html of the div with the id = "your_div"
// }
// })
// })
})
</script>
{% endblock %}

View File

@ -32,21 +32,20 @@
</form> </form>
</div> </div>
<div class="column twelve wide"> <div class="column twelve wide">
<div class="segment vertical">
<div class="ui six column doubling grid"> <div class="ui six column doubling grid">
<div class="row"> <div class="row">
{% for set in sets %} {% for set in sets %}
<div class="column"> <div class="column">
<a href="{{ url('set_detail', {'number': set.number}) }}"> <a href="{{ url('set_detail', {'number': set.number}) }}">
<img class="ui bordered image medium" src="{{ set.number|setImage|imagine_filter('rebrickable_set_min') }}"> <img class="ui bordered image medium" src="{{ set.number|setImage|imagine_filter('rebrickable_min') }}">
<p>{{ set.number }} - {{ set.name }}</p> <p>{{ set.number }} - {{ set.name }}</p>
</a> </a>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div>
<p>{{ sets.getTotalItemCount }}</p>
{{ knp_pagination_render(sets) }} {{ knp_pagination_render(sets) }}
</div> </div>
@ -57,4 +56,6 @@
{% block javascripts %} {% block javascripts %}
{{ parent() }} {{ parent() }}
{% endblock %} {% endblock %}

View File

@ -0,0 +1,37 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if regularParts|length > 0 %}
<h4 class="ui horizontal divider header">
Regular parts
</h4>
<div class="ui ten column grid">
{% for inventoryPart in regularParts %}
{{ blocks.part(inventoryPart.part,inventoryPart.quantity, inventoryPart.color) }}
{% endfor %}
</div>
{% endif %}
{% if missing|length > 0 %}
<h4 class="ui horizontal divider header">
Missing models
</h4>
<div class="ui ten column grid">
{% for inventoryPart in missing %}
{{ blocks.part(inventoryPart.part,inventoryPart.quantity, inventoryPart.color) }}
{% endfor %}
</div>
{% endif %}
{% if spareParts|length > 0 %}
<h4 class="ui horizontal divider header">
Spare parts
</h4>
<div class="ui ten column grid">
{% for inventoryPart in spareParts %}
{{ blocks.part(inventoryPart.part,inventoryPart.quantity, inventoryPart.color) }}
{% endfor %}
</div>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,56 @@
{% extends 'ajax.html.twig' %}
{% block content %}
{% if models|length > 0 %}
<h4 class="ui horizontal divider header">
Regular parts
</h4>
<div class="ui segment vertical">
<div class="ui ten column grid">
{% for model in models %}
{{ blocks.model(model['model'],model['quantity']) }}
{% endfor %}
</div>
</div>
{% endif %}
{% if missing|length > 0 %}
<h4 class="ui horizontal divider header">
Missing regular models
</h4>
<div class="ui segment vertical">
<div class="ui ten column grid">
{% for inventoryPart in missing %}
{{ blocks.part(inventoryPart.part,inventoryPart.quantity) }}
{% endfor %}
</div>
</div>
{% endif %}
{% if spareModels|length > 0 %}
<h4 class="ui horizontal divider header">
Spare parts
</h4>
<div class="ui segment vertical">
<div class="ui ten column grid">
{% for model in spareModels %}
{{ blocks.model(model['model'],model['quantity']) }}
{% endfor %}
</div>
</div>
{% endif %}
{% if missingSpare|length > 0 %}
<h4 class="ui horizontal divider header">
Missing spare models
</h4>
<div class="ui segment vertical">
<div class="ui ten column grid segment">
{% for inventoryPart in missingSpare %}
{{ blocks.part(inventoryPart.part,inventoryPart.quantity) }}
{% endfor %}
</div>
</div>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends 'ajax.html.twig' %}
{% block content %}
<h4 class="ui horizontal divider header">Sets</h4>
<div class="ui seven column grid">
<div class="row">
{% for set in inventorySets %}
<div class="column">
<a href="{{ url('set_detail', {'number': set.set.number}) }}">
<div class="ui bordered image medium">
<img src="{{ asset('resources/images/unknown_image.png') }}" data-src="{{ set.set.number|setImage|imagine_filter('rebrickable_set_min') }}" class="transition visible">
</div>
<p>{{ set.set.number }} - {{ set.set.name }}</p>
<p>{{ set.quantity}}</p>
</a>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@ -4,49 +4,16 @@ namespace AppBundle\Controller\Brickset;
use AppBundle\Api\Exception\EmptyResponseException; use AppBundle\Api\Exception\EmptyResponseException;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Entity\Rebrickable\Theme;
use AppBundle\Form\FilterSetType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/** /**
* @Route("/brickset/sets") * @Route("/brickset/sets")
*/ */
class SetController extends Controller class SetController extends Controller
{ {
/**
* @Route("/", name="brickset_browse")
*/
public function browseAction(Request $request)
{
$form = $this->createForm(FilterSetType::class);
$form->handleRequest($request);
$sets = [];
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$sets = $this->get('api.client.brickset')->getSets([
'theme' => $data['theme'] ? $data['theme']->getTheme() : '',
'subtheme' => $data['subtheme'] ? $data['subtheme']->getSubtheme() : '',
'year' => $data['years'] ? $data['years']->getYear() : '',
]);
} catch (EmptyResponseException $e) {
$this->addFlash('warning', 'No set found on '.$e->getService());
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
}
return $this->render('brickset/browse.html.twig', [
'form' => $form->createView(),
'sets' => $sets,
]);
}
/** /**
* @Route("/{id}/instructions", name="brickset_instructions") * @Route("/{id}/instructions", name="brickset_instructions")
*/ */
@ -61,9 +28,19 @@ class SetController extends Controller
$this->addFlash('error', $e->getMessage()); $this->addFlash('error', $e->getMessage());
} }
return $this->render('brickset/instructions.html.twig', [ $template = $this->render('brickset/instructions.html.twig', [
'instructions' => $instructions, 'instructions' => $instructions,
]); ]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
} }
/** /**
@ -80,9 +57,19 @@ class SetController extends Controller
$this->addFlash('error', $e->getMessage()); $this->addFlash('error', $e->getMessage());
} }
return $this->render('brickset/reviews.html.twig', [ $template = $this->render('brickset/reviews.html.twig', [
'reviews' => $reviews, 'reviews' => $reviews,
]); ]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
} }
/** /**
@ -99,8 +86,47 @@ class SetController extends Controller
$this->addFlash('error', $e->getMessage()); $this->addFlash('error', $e->getMessage());
} }
return $this->render('brickset/images.html.twig', [ $template = $this->render('brickset/images.html.twig', [
'images' => $images, 'images' => $images,
]); ]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
}
/**
* @Route("/{id}/description", name="brickset_description")
*/
public function descriptionAction(Request $request, $id)
{
$desription = null;
try {
$desription = $this->get('api.manager.brickset')->getSetById($id)->getDescription();
} catch (EmptyResponseException $e) {
// $this->addFlash('warning', 'No description found on Brickset.com');
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
$template = $this->render('brickset/description.html.twig', [
'description' => $desription,
]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
} }
} }

View File

@ -1,92 +0,0 @@
<?php
namespace AppBundle\Controller\Rebrickable;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Color;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
/**
* @Route("/rebrickable/sets")
*/
class SetController extends Controller
{
/**
* @Route("/{number}/parts", name="rebrickable_set_parts")
*/
public function partsAction(Set $set)
{
$em = $this->getDoctrine()->getManager();
$em->getRepository(Color::class)->findAll();
$em->getRepository(Part::class)->findAllBySetNumber($set->getNumber());
$regularParts = $em->getRepository(Inventory_Part::class)->findAllRegularBySetNumber($set->getNumber());
$spareParts = $em->getRepository(Inventory_Part::class)->findAllSpareBySetNumber($set->getNumber());
$models = $em->getRepository(Model::class)->findAllBySetNumber($set->getNumber());
$template = $this->render('rebrickable/set/inventory.html.twig', [
'regularParts' => $regularParts,
'spareParts' => $spareParts,
'models' => $models,
]);
// $json = json_encode($template->getContent());
// $response = new Response($json, 200);
// $response->headers->set('Content-Type', 'application/json');
//
// return $response;
return $template;
}
/**
* @Route("/{number}/models", name="rebrickable_set_models")
*/
public function modelsAction(Set $set)
{
$models = null;
try {
$this->get('repository.ldraw.model')->findAllBySetNumber($set->getNumber());
$models = $this->get('service.set')->getModels($set);
$spareModels = $this->get('service.set')->getSpareModels($set);
// $models = $this->get('repository.ldraw.model')->findAllRegularBySetNumber($set->getNumber());
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
return $this->render('rebrickable/set/models.html.twig', [
'set' => $set,
'models' => $models,
'spareModels' => $spareModels
]);
}
/**
* @Route("/{number}/sets", name="rebrickable_set_sets")
*/
public function setsAction(Set $set)
{
$em = $this->getDoctrine()->getManager();
$inventorySets = $em->getRepository(Inventory_Set::class)->findAllBySetNumber($set->getNumber());
$template = $this->render('rebrickable/set/sets.html.twig', [
'inventorySets' => $inventorySets,
]);
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}

View File

@ -4,7 +4,7 @@ namespace AppBundle\Controller;
use AppBundle\Api\Exception\ApiException; use AppBundle\Api\Exception\ApiException;
use AppBundle\Api\Exception\EmptyResponseException; use AppBundle\Api\Exception\EmptyResponseException;
use AppBundle\Entity\Rebrickable\Inventory_Part; use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Form\Filter\Set\SetFilterType; use AppBundle\Form\Filter\Set\SetFilterType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
@ -52,19 +52,13 @@ class SetController extends Controller
/** /**
* @Route("/{number}", name="set_detail") * @Route("/{number}", name="set_detail")
*/ */
public function detailAction(Request $request, $number) public function detailAction(Request $request, Set $set)
{ {
$rebrickableSet = null;
$bricksetSet = null; $bricksetSet = null;
$colors = null; $colors = null;
try { try {
if (($rebrickableSet = $this->get('repository.rebrickable.set')->find($number)) == null) { $bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($set->getNumber());
$this->addFlash('warning', 'Set not found in Rebrickable database');
}
$bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($number);
} catch (EmptyResponseException $e) { } catch (EmptyResponseException $e) {
$this->addFlash('warning', 'Set not found in Brickset database'); $this->addFlash('warning', 'Set not found in Brickset database');
} catch (ApiException $e) { } catch (ApiException $e) {
@ -73,13 +67,138 @@ class SetController extends Controller
$this->addFlash('error', $e->getMessage()); $this->addFlash('error', $e->getMessage());
} }
if (!$rebrickableSet && !$bricksetSet) {
return $this->render('error/error.html.twig');
}
return $this->render('set/detail.html.twig', [ return $this->render('set/detail.html.twig', [
'rbset' => $rebrickableSet, 'set' => $set,
'brset' => $bricksetSet, 'brset' => $bricksetSet,
]); ]);
} }
/**
* @Route("/{number}/parts", name="set_parts")
*/
public function partsAction(Request $request, Set $set)
{
$inventoryPartRepository = $this->get('repository.rebrickable.inventorypart');
$regularParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, true);
$spareParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), true);
$missing = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, false);
$template = $this->render('set/inventory.html.twig', [
'regularParts' => $regularParts,
'missing' => $missing,
'spareParts' => $spareParts,
]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
}
/**
* @Route("/{number}/models", name="set_models")
*/
public function modelsAction(Request $request, Set $set)
{
$models = null;
$spareModels = null;
$missing = null;
$missingSpare = null;
try {
$models = $this->get('service.set')->getModels($set, false);
$spareModels = $this->get('service.set')->getModels($set, true);
$missing = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), false, false);
$missingSpare = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), true, false);
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
$template = $this->render('set/models.html.twig', [
'set' => $set,
'missing' => $missing,
'models' => $models,
'spareModels' => $spareModels,
'missingSpare' => $missingSpare,
]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
}
/**
* @Route("/{number}/colors", name="set_colors")
*/
public function colorsAction(Request $request, Set $set)
{
$colors = null;
try {
$colors = $this->get('service.set')->getModelsGroupedByColor($set, false);
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
$template = $this->render('set/colors.html.twig', [
'set' => $set,
'colors' => $colors,
]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
}
/**
* @Route("/{number}/sets", name="set_sets")
*/
public function setsAction(Request $request, Set $set)
{
$em = $this->getDoctrine()->getManager();
$inventorySets = $em->getRepository(Inventory_Set::class)->findAllBySetNumber($set->getNumber());
$template = $this->render('set/sets.html.twig', [
'inventorySets' => $inventorySets,
]);
if ($request->isXmlHttpRequest()) {
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
return $template;
}
/**
* @Route("/{number}/zip", name="set_zip")
*/
public function zipAction(Request $request, Set $set)
{
$sorted = $request->query->get('sorted') == 1 ? true : false;
$this->get('service.zip')->createFromSet($set, $sorted);
}
} }