Compare commits
8 Commits
ef1b7b8a9e
...
feature/or
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e4c79c87a | ||
| 6246ad8692 | |||
|
|
d18abc6159 | ||
| 5832ac583f | |||
|
|
8f87a6bbf0 | ||
|
|
c947e470af | ||
|
|
8eeba225ed | ||
|
|
9b6bcd22be |
@@ -2,7 +2,9 @@
|
||||
|
||||
namespace Krzysiej\RyobiCrawler\Controller;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Twig\Environment;
|
||||
use Illuminate\Database\Capsule\Manager as Capsule;
|
||||
|
||||
@@ -17,4 +19,19 @@ class BaseController extends AbstractController
|
||||
$capsule->setAsGlobal();
|
||||
$capsule->bootEloquent();
|
||||
}
|
||||
|
||||
protected function handleOrderProducts(Builder $builder, Request $request): Builder
|
||||
{
|
||||
$builder->orderByDesc('starred')->orderByDesc('created_by');
|
||||
if ($request->query->get('order')) {
|
||||
$orderField = $request->query->get('order');
|
||||
$direction = 'desc';
|
||||
if (str_starts_with($orderField, '-')) {
|
||||
$direction = 'asc';
|
||||
}
|
||||
$builder->orderBy($request->query->get('order'), $direction);
|
||||
}
|
||||
|
||||
return $builder;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,18 +3,17 @@
|
||||
namespace Krzysiej\RyobiCrawler\Controller;
|
||||
|
||||
use Krzysiej\RyobiCrawler\Models\Product;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
|
||||
final class IndexController extends BaseController
|
||||
{
|
||||
#[Route('/', name: 'app_home')]
|
||||
public function __invoke(): Response
|
||||
public function __invoke(Request $request): Response
|
||||
{
|
||||
$products = Product::with(['currentStock', 'price'])
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('created_by')
|
||||
->get();
|
||||
$products = Product::with(['currentStock', 'price', 'currentPrice']);
|
||||
$products = $this->handleOrderProducts($products, $request)->get();
|
||||
return $this->render('productList.html.twig', ['products' => $products]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ final class NewController extends BaseController
|
||||
{
|
||||
$products = Product::where('created_at', '>', now()->modify('-30 days')->format('Y-m-d'))
|
||||
->orderByDesc('starred')
|
||||
->orderByDesc('name')
|
||||
->orderByDesc('created_by')
|
||||
->with(['currentPrice'])
|
||||
->get();
|
||||
|
||||
@@ -1,57 +1,60 @@
|
||||
{% extends "template.html.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<table class='table table-hover'>
|
||||
<tr>
|
||||
<td class="align-middle font-weight-bold h3"><a class="text-warning text-decoration-none"
|
||||
href="{{ path('app_star', {'productId': product.id}) }}">{% if product.starred %}★{% else %} ☆ {% endif %}</a></td>
|
||||
<td><img src='{{ product.image }}&width=150' class='border rounded p-1' alt='{{ product.name }}'/></td>
|
||||
<td>
|
||||
<a href='{{ path('app_product', {'productId': product.id}) }}' class="text-decoration-none">{{ product.name }}</a>
|
||||
<span class="badge text-bg-light">{{ product.subTitle }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<nav aria-label="breadcrumb" style="--bs-breadcrumb-divider: '>';" >
|
||||
<ol class="breadcrumb">
|
||||
{% for category in product.categories %}
|
||||
<li class="breadcrumb-item" aria-current="page"><a class="breadcrumb-item text-decoration-none" href="{{ path('app_category', {'category': category}) }}">{{ category }}</a></li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</nav>
|
||||
</td>
|
||||
<td><a href='https://pl.ryobitools.eu/{{ product.url }}'>link</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<div style="width: 800px;">
|
||||
<canvas id="price"></canvas>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<table class='table table-hover table-sm mb-0'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>price</th>
|
||||
<th>lowest product price in 30 days</th>
|
||||
<th colspan='2'>standard price</th>
|
||||
<th>Stock</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{% for price in product.price %}
|
||||
<div class="table-responsive">
|
||||
<table class='table table-hover'>
|
||||
<tr>
|
||||
<td class="align-middle font-weight-bold h3"><a class="text-warning text-decoration-none"
|
||||
href="{{ path('app_star', {'productId': product.id}) }}">{% if product.starred %}★{% else %} ☆ {% endif %}</a></td>
|
||||
<td><img src='{{ product.image }}&width=150' class='border rounded p-1' alt='{{ product.name }}'/></td>
|
||||
<td>
|
||||
<a href='{{ path('app_product', {'productId': product.id}) }}' class="text-decoration-none">{{ product.name }}</a>
|
||||
<span class="badge text-bg-light">{{ product.subTitle }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<nav aria-label="breadcrumb" style="--bs-breadcrumb-divider: '>';">
|
||||
<ol class="breadcrumb">
|
||||
{% for category in product.categories %}
|
||||
<li class="breadcrumb-item" aria-current="page"><a class="breadcrumb-item text-decoration-none"
|
||||
href="{{ path('app_category', {'category': category}) }}">{{ category }}</a></li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</nav>
|
||||
</td>
|
||||
<td><a href='https://pl.ryobitools.eu/{{ product.url }}'>link</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<div style="width: 800px;">
|
||||
<canvas id="price"></canvas>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<table class='table table-hover table-sm mb-0'>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>{{ price.price | format_currency('PLN', {}, 'pl') }}</td>
|
||||
<td>{{ price.lowestProductPrice30Days | format_currency('PLN', {}, 'pl') }}</td>
|
||||
<td>{{ price.productStandardPrice | format_currency('PLN', {}, 'pl') }}</td>
|
||||
<td>{{ price.created_at }}</td>
|
||||
<td>{{ (product.stock | findByCreatedAtDate(price.created_at | slice(0,10))).stock ?? '' }}</td>
|
||||
<th>price</th>
|
||||
<th>lowest product price in 30 days</th>
|
||||
<th colspan='2'>standard price</th>
|
||||
<th>Stock</th>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</thead>
|
||||
{% for price in product.price %}
|
||||
<tr>
|
||||
<td>{{ price.price | format_currency('PLN', {}, 'pl') }}</td>
|
||||
<td>{{ price.lowestProductPrice30Days | format_currency('PLN', {}, 'pl') }}</td>
|
||||
<td>{{ price.productStandardPrice | format_currency('PLN', {}, 'pl') }}</td>
|
||||
<td>{{ price.created_at }}</td>
|
||||
<td>{{ (product.stock | findByCreatedAtDate(price.created_at | slice(0,10))).stock ?? '' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
{% extends "template.html.twig" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="table-responsive">
|
||||
{{ app.request.get('order') }}
|
||||
<table class='table table-hover'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th>Name</th>
|
||||
<th><a href="{{ path( app.request.get('_route') , {'order': app.request.get('order') is same as('-name')?'name':'-name'|default('-name')}) }}">Name</a></th>
|
||||
<th>Categories</th>
|
||||
<th></th>
|
||||
<th>Price</th>
|
||||
<th><a href="{{ path( app.request.get('_route') , {'order': app.request.get('order') is same as('-price')?'price':'-price'|default('-price')}) }}">Price</a></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -55,4 +57,5 @@
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -5,8 +5,8 @@
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>Ryobi crawler</title>
|
||||
<link href="templates/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="templates/js/script.js" defer></script>
|
||||
<link href="/templates/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<script src="/templates/js/script.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg sticky-top bg-body-tertiary border-bottom border-secondary border-1">
|
||||
|
||||
Reference in New Issue
Block a user