Compare commits
8 Commits
6ef6930766
...
1974d44a35
| Author | SHA1 | Date | |
|---|---|---|---|
| 1974d44a35 | |||
| f336917b62 | |||
| 4ccb8ac05e | |||
| a6a7fbade6 | |||
| 9a3d2da412 | |||
| 81a88b93d5 | |||
| b854c92377 | |||
| 3f67fe27d0 |
@ -2,9 +2,40 @@
|
|||||||
|
|
||||||
namespace Lycoreco\Apps\Index\Controllers;
|
namespace Lycoreco\Apps\Index\Controllers;
|
||||||
|
|
||||||
|
use Lycoreco\Apps\Recipes\Models\CategoryModel;
|
||||||
|
use Lycoreco\Apps\Recipes\Models\RecipeModel;
|
||||||
|
use Lycoreco\Apps\Recipes\Models\RecipeUserMenu;
|
||||||
use Lycoreco\Includes\BaseController;
|
use Lycoreco\Includes\BaseController;
|
||||||
|
|
||||||
|
require_once(INCLUDES_PATH . '/Const/recipes.php');
|
||||||
|
|
||||||
class HomepageController extends BaseController
|
class HomepageController extends BaseController
|
||||||
{
|
{
|
||||||
protected $template_name = APPS_PATH . '/Index/Templates/index.php';
|
protected $template_name = APPS_PATH . '/Index/Templates/index.php';
|
||||||
|
|
||||||
|
public function get_context_data() {
|
||||||
|
$context = parent::get_context_data();
|
||||||
|
|
||||||
|
$context['latest_recipes'] = RecipeModel::filter(array(
|
||||||
|
[
|
||||||
|
'name' => 'obj.status',
|
||||||
|
'type' => '=',
|
||||||
|
'value' => 'publish'
|
||||||
|
]),
|
||||||
|
['-obj.created_at'],
|
||||||
|
3
|
||||||
|
);
|
||||||
|
$context['categories'] = CategoryModel::filter();
|
||||||
|
$dayNumber = date("w");
|
||||||
|
$dayofweek = DAYS_OF_WEEK[$dayNumber];
|
||||||
|
|
||||||
|
if(CURRENT_USER) {
|
||||||
|
$context['usermenu_recipe_prefetch'] = RecipeUserMenu::get_prefetch_recipes(CURRENT_USER, $dayofweek);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$context['usermenu_recipe_prefetch'] = [ ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $context;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
<?php the_header(
|
<?php
|
||||||
|
require_once APPS_PATH . '/Recipes/components.php';
|
||||||
|
the_header(
|
||||||
'Welcome',
|
'Welcome',
|
||||||
"Discover delicious recipes using the ingredients you already have. Fridgebites helps you create tasty meals with what's in your fridge",
|
"Discover delicious recipes using the ingredients you already have. Fridgebites helps you create tasty meals with what's in your fridge",
|
||||||
'frontpage',
|
'frontpage',
|
||||||
@ -32,42 +34,21 @@
|
|||||||
<!-- Additional required wrapper -->
|
<!-- Additional required wrapper -->
|
||||||
<div class="swiper-wrapper">
|
<div class="swiper-wrapper">
|
||||||
<!-- Slides -->
|
<!-- Slides -->
|
||||||
|
|
||||||
|
<?php foreach($context['latest_recipes'] as $recipe): ?>
|
||||||
<div class="swiper-slide">
|
<div class="swiper-slide">
|
||||||
<a href="#" class="recent-recipe hover-anim">
|
<a href="<?= $recipe->get_absolute_url() ?>" class="recent-recipe hover-anim">
|
||||||
<div class="recipe-img">
|
<div class="recipe-img">
|
||||||
<img src="media/recipe1.png" alt="Recipe 1" class="recipe-img__img">
|
<img src="<?= $recipe->get_image_url() ?>" alt="Recipe 1" class="recipe-img__img">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="recipe-info">
|
<div class="recipe-info">
|
||||||
<p class="recipe-info__title">Spaghetti Bolognese</p>
|
<p class="recipe-info__title"><?= $recipe->field_title ?></p>
|
||||||
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> GreenDavid004</p>
|
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> <?= $recipe->author_username ?></p>
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="recent-recipe hover-anim">
|
|
||||||
<div class="recipe-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="Recipe 1" class="recipe-img__img">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="recipe-info">
|
|
||||||
<p class="recipe-info__title">Spaghetti Bolognese</p>
|
|
||||||
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> GreenDavid004</p>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="recent-recipe hover-anim">
|
|
||||||
<div class="recipe-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="Recipe 1" class="recipe-img__img">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="recipe-info">
|
|
||||||
<p class="recipe-info__title">Spaghetti Bolognese</p>
|
|
||||||
<p class="recipe-info__meta"><i class="fa-solid fa-user"></i> GreenDavid004</p>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- If we need pagination -->
|
<!-- If we need pagination -->
|
||||||
@ -86,87 +67,14 @@
|
|||||||
|
|
||||||
<div class="swiper categories-swiper">
|
<div class="swiper categories-swiper">
|
||||||
<div class="swiper-wrapper">
|
<div class="swiper-wrapper">
|
||||||
|
<?php foreach($context['categories'] as $cat): ?>
|
||||||
<div class="swiper-slide">
|
<div class="swiper-slide">
|
||||||
<a href="#" class="category hover-anim">
|
<a href="<?= get_permalink('recipes:catalog') . '?category=' . $cat->get_id() ?>" class="category hover-anim">
|
||||||
<!-- <div class="category-img">
|
<p class="category-title"><?= $cat->field_name ?></p>
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="swiper-slide">
|
|
||||||
<a href="#" class="category hover-anim">
|
|
||||||
<!-- <div class="category-img">
|
|
||||||
<img src="media/category1.png" alt="Category 1" class="category-img__img">
|
|
||||||
</div> -->
|
|
||||||
<p class="category-title">Mexican</p>
|
|
||||||
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="swiper-button-prev"></div>
|
<div class="swiper-button-prev"></div>
|
||||||
@ -278,137 +186,18 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<?php if(CURRENT_USER): ?>
|
||||||
<div class="daily-meals">
|
<div class="daily-meals">
|
||||||
<h2 class="title">Your Menu for Monday</h2>
|
<h2 class="title">Your Menu for <?= date("l"); ?></h2>
|
||||||
<div class="daily-meals-grid">
|
<div class="daily-meals-grid">
|
||||||
<a href="#" class="daily-meal hover-anim">
|
<?php
|
||||||
<div class="meal-img">
|
foreach ($context['usermenu_recipe_prefetch'] as $recipe_pref) {
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
the_product_recipes_item($recipe_pref['origin'], $recipe_pref['relations']);
|
||||||
</div>
|
}
|
||||||
<div class="daily-meal-info">
|
?>
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ use Lycoreco\Apps\Recipes\Models\{
|
|||||||
};
|
};
|
||||||
use Lycoreco\Includes\BaseController;
|
use Lycoreco\Includes\BaseController;
|
||||||
|
|
||||||
define('CATALOG_MAX_RECIPES', 20);
|
define('CATALOG_MAX_RECIPES', 10);
|
||||||
|
|
||||||
class CatalogController extends BaseController
|
class CatalogController extends BaseController
|
||||||
{
|
{
|
||||||
@ -45,10 +45,12 @@ class CatalogController extends BaseController
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$context['recipes_count'] = RecipeModel::count($fields);
|
||||||
$context['recipes'] = RecipeModel::filter(
|
$context['recipes'] = RecipeModel::filter(
|
||||||
$fields,
|
$fields,
|
||||||
['-obj.created_at'],
|
['-obj.created_at'],
|
||||||
CATALOG_MAX_RECIPES
|
CATALOG_MAX_RECIPES,
|
||||||
|
offset: calc_page_offset(CATALOG_MAX_RECIPES, $context['page'])
|
||||||
);
|
);
|
||||||
|
|
||||||
return $context;
|
return $context;
|
||||||
|
|||||||
@ -2,12 +2,26 @@
|
|||||||
|
|
||||||
namespace Lycoreco\Apps\Recipes\Controllers;
|
namespace Lycoreco\Apps\Recipes\Controllers;
|
||||||
|
|
||||||
|
use Lycoreco\Apps\Recipes\Models\RecipeUserMenu;
|
||||||
use Lycoreco\Includes\BaseController;
|
use Lycoreco\Includes\BaseController;
|
||||||
|
|
||||||
|
require_once(INCLUDES_PATH . '/Const/recipes.php');
|
||||||
|
|
||||||
class DailyMealsController extends BaseController
|
class DailyMealsController extends BaseController
|
||||||
{
|
{
|
||||||
protected $template_name = APPS_PATH . '/Recipes/Templates/daily-meals.php';
|
protected $template_name = APPS_PATH . '/Recipes/Templates/daily-meals.php';
|
||||||
|
|
||||||
|
protected $allow_role = 'user';
|
||||||
|
|
||||||
|
function get_context_data() {
|
||||||
|
$context = parent::get_context_data();
|
||||||
|
|
||||||
|
$context['weeks'] = array();
|
||||||
|
|
||||||
|
foreach (DAYS_OF_WEEK as $week) {
|
||||||
|
$context['weeks'][$week] = RecipeUserMenu::get_prefetch_recipes(CURRENT_USER, $week);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $context;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -2,24 +2,48 @@
|
|||||||
|
|
||||||
namespace Lycoreco\Apps\Recipes\Controllers;
|
namespace Lycoreco\Apps\Recipes\Controllers;
|
||||||
|
|
||||||
|
use Lycoreco\Apps\Recipes\Models\FavoriteModel;
|
||||||
use Lycoreco\Apps\Recipes\Models\RecipeModel;
|
use Lycoreco\Apps\Recipes\Models\RecipeModel;
|
||||||
use Lycoreco\Includes\BaseController;
|
use Lycoreco\Includes\BaseController;
|
||||||
|
|
||||||
define('FAVORITES_MAX_RECIPES', 20);
|
define('FAVORITES_MAX_RECIPES', 500);
|
||||||
|
|
||||||
class FavoritesController extends BaseController
|
class FavoritesController extends BaseController
|
||||||
{
|
{
|
||||||
protected $template_name = APPS_PATH . '/Recipes/Templates/favorites.php';
|
protected $template_name = APPS_PATH . '/Recipes/Templates/favorites.php';
|
||||||
|
protected $allow_role = 'user';
|
||||||
|
|
||||||
public function get_context_data()
|
public function get_context_data()
|
||||||
{
|
{
|
||||||
$context = parent::get_context_data();
|
$context = parent::get_context_data();
|
||||||
|
|
||||||
|
$favorite_recipes = FavoriteModel::filter(array(
|
||||||
|
[
|
||||||
|
'name' => 'obj.user_id',
|
||||||
|
'type' => '=',
|
||||||
|
'value' => CURRENT_USER->get_id()
|
||||||
|
]
|
||||||
|
));
|
||||||
|
$fav_ids = array_map(function($recipe) {
|
||||||
|
return $recipe->field_recipe_id;
|
||||||
|
}, $favorite_recipes);
|
||||||
|
|
||||||
$context['recipes'] = RecipeModel::filter(
|
if(!empty($fav_ids)) {
|
||||||
[],
|
$context['recipes'] = RecipeModel::filter(
|
||||||
['-obj.created_at'],
|
array(
|
||||||
FAVORITES_MAX_RECIPES
|
[
|
||||||
);
|
'name' => 'obj.id',
|
||||||
|
'type' => 'IN',
|
||||||
|
'value' => $fav_ids
|
||||||
|
]
|
||||||
|
),
|
||||||
|
['-obj.created_at'],
|
||||||
|
FAVORITES_MAX_RECIPES
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$context['recipes'] = [];
|
||||||
|
}
|
||||||
|
|
||||||
return $context;
|
return $context;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,7 +16,9 @@ class RecipeModel extends BaseModel
|
|||||||
public $field_created_at;
|
public $field_created_at;
|
||||||
|
|
||||||
public $category_name;
|
public $category_name;
|
||||||
|
public $author_username;
|
||||||
public $is_in_favorite = 0;
|
public $is_in_favorite = 0;
|
||||||
|
public $in_usermenu = false;
|
||||||
|
|
||||||
const STATUS = [['publish', 'Publish'], ['pending', 'Pending']];
|
const STATUS = [['publish', 'Publish'], ['pending', 'Pending']];
|
||||||
|
|
||||||
@ -30,6 +32,12 @@ class RecipeModel extends BaseModel
|
|||||||
],
|
],
|
||||||
'join_table' => 'categories tb1 ON tb1.id = obj.category_id'
|
'join_table' => 'categories tb1 ON tb1.id = obj.category_id'
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'field' => [
|
||||||
|
'us.username AS author_username'
|
||||||
|
],
|
||||||
|
'join_table' => 'users us ON us.id = obj.author_id'
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'field' => [
|
'field' => [
|
||||||
|
|
||||||
@ -63,6 +71,16 @@ class RecipeModel extends BaseModel
|
|||||||
]
|
]
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
if(CURRENT_USER) {
|
||||||
|
$add_fields = array_merge($add_fields, array(
|
||||||
|
[
|
||||||
|
"field" => [
|
||||||
|
"MAX(m.dayofweek) AS in_usermenu"
|
||||||
|
],
|
||||||
|
"join_table" => "recipe_usermenu m ON m.recipe_id = obj.id AND m.user_id = " . CURRENT_USER->get_id()
|
||||||
|
]
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
return $add_fields;
|
return $add_fields;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace Lycoreco\Apps\Recipes\Models;
|
namespace Lycoreco\Apps\Recipes\Models;
|
||||||
|
|
||||||
|
use Lycoreco\Apps\Users\Models\UserModel;
|
||||||
use Lycoreco\Includes\Model\BaseModel;
|
use Lycoreco\Includes\Model\BaseModel;
|
||||||
|
|
||||||
class RecipeUserMenu extends BaseModel
|
class RecipeUserMenu extends BaseModel
|
||||||
@ -39,7 +40,7 @@ class RecipeUserMenu extends BaseModel
|
|||||||
{
|
{
|
||||||
require_once INCLUDES_PATH . '/Const/recipes.php';
|
require_once INCLUDES_PATH . '/Const/recipes.php';
|
||||||
|
|
||||||
if(!in_array($this->field_dayofweek, DAYS_OF_WEEK))
|
if (!in_array($this->field_dayofweek, DAYS_OF_WEEK))
|
||||||
return ['Day of Week is not valid'];
|
return ['Day of Week is not valid'];
|
||||||
|
|
||||||
$recipe = RecipeModel::get(array(
|
$recipe = RecipeModel::get(array(
|
||||||
@ -49,9 +50,44 @@ class RecipeUserMenu extends BaseModel
|
|||||||
'value' => $this->field_recipe_id
|
'value' => $this->field_recipe_id
|
||||||
]
|
]
|
||||||
));
|
));
|
||||||
if(!$recipe)
|
if (!$recipe)
|
||||||
return ['Recipe does not exist'];
|
return ['Recipe does not exist'];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public static function get_prefetch_recipes(UserModel $user, string $week) {
|
||||||
|
$usermenus = RecipeUserMenu::filter(array(
|
||||||
|
[
|
||||||
|
'name' => 'obj.user_id',
|
||||||
|
'type' => '=',
|
||||||
|
'value' => $user->get_id(),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'obj.dayofweek',
|
||||||
|
'type' => '=',
|
||||||
|
'value' => $week
|
||||||
|
]
|
||||||
|
), count: 100);
|
||||||
|
|
||||||
|
if(empty($usermenus))
|
||||||
|
return [];
|
||||||
|
|
||||||
|
$usermenu_ids = array_map(function($usermenu) {
|
||||||
|
return $usermenu->field_recipe_id;
|
||||||
|
}, $usermenus);
|
||||||
|
|
||||||
|
|
||||||
|
$recipes = RecipeModel::filter(array(
|
||||||
|
[
|
||||||
|
'name' => 'obj.id',
|
||||||
|
'type' => 'IN',
|
||||||
|
'value' => $usermenu_ids
|
||||||
|
]
|
||||||
|
));
|
||||||
|
|
||||||
|
$prefetch_recipes_ings = prefetch_related($recipes, 'Recipes:IngredientInRecipeModel', 'recipe_id');
|
||||||
|
|
||||||
|
return $prefetch_recipes_ings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -13,12 +13,15 @@ the_header(
|
|||||||
?>
|
?>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="catalog">
|
<div class="catalog">
|
||||||
<div class="catalog-items">
|
<div class="catalog-items__inner">
|
||||||
<?php
|
<div class="catalog-items">
|
||||||
foreach ($context['recipes'] as $recipe) {
|
<?php
|
||||||
the_product_item($recipe);
|
foreach ($context['recipes'] as $recipe) {
|
||||||
}
|
the_product_item($recipe);
|
||||||
?>
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
<?php the_pagination($context['recipes_count'], CATALOG_MAX_RECIPES, $context["page"]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="filters-container">
|
<div class="filters-container">
|
||||||
<div class="filters">
|
<div class="filters">
|
||||||
|
|||||||
18
apps/Recipes/Templates/components/recipe-ings-item.php
Normal file
18
apps/Recipes/Templates/components/recipe-ings-item.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<a href="<?= $recipe->get_absolute_url() ?>" class="daily-meal hover-anim">
|
||||||
|
<div class="meal-img">
|
||||||
|
<img src="<?= $recipe->get_image_url() ?>" alt="meal-img">
|
||||||
|
</div>
|
||||||
|
<div class="daily-meal-info">
|
||||||
|
<div class="daily-meal-title">
|
||||||
|
<h3><?= $recipe->field_title ?></h3>
|
||||||
|
<span class="meta"><i class="fa-regular fa-clock"></i><?= $recipe->field_estimated_time ?>mins to make</span>
|
||||||
|
</div>
|
||||||
|
<div class="daily-meal-ingredients">
|
||||||
|
<ul class="ingredients-list">
|
||||||
|
<?php for ($i=0; $i < count($ingredients) && $i <= 6; $i++): ?>
|
||||||
|
<li><?= $ingredients[$i]->ingredient_name ?></li>
|
||||||
|
<?php endfor; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
require_once APPS_PATH . '/Recipes/components.php';
|
||||||
require_once(INCLUDES_PATH . '/Const/recipes.php');
|
require_once(INCLUDES_PATH . '/Const/recipes.php');
|
||||||
|
|
||||||
the_header(
|
the_header(
|
||||||
@ -14,137 +15,17 @@ the_header(
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="daily-recipes">
|
<div class="daily-recipes">
|
||||||
<?php
|
<?php
|
||||||
foreach (DAYS_OF_WEEK as $day) {
|
foreach ($context['weeks'] as $day => $recipe_prefetches) {
|
||||||
?>
|
?>
|
||||||
<div class="daily-meals">
|
<div class="daily-meals">
|
||||||
<h2 class="title">Your Menu for <?= ucfirst($day) ?></h2>
|
<h2 class="title">Your Menu for <?= ucfirst($day) ?></h2>
|
||||||
<div class="daily-meals-grid">
|
<div class="daily-meals-grid">
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
<?php
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
foreach ($recipe_prefetches as $recipe_pref) {
|
||||||
</div>
|
the_product_recipes_item($recipe_pref['origin'], $recipe_pref['relations']);
|
||||||
<div class="daily-meal-info">
|
}
|
||||||
<div class="daily-meal-title">
|
?>
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="#" class="daily-meal hover-anim">
|
|
||||||
<div class="meal-img">
|
|
||||||
<img src="media/recipe1.jpeg" alt="meal-img">
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-info">
|
|
||||||
<div class="daily-meal-title">
|
|
||||||
<h3>Goulash</h3>
|
|
||||||
<span class="meta"><i class="fa-regular fa-clock"></i>120mins to make</span>
|
|
||||||
</div>
|
|
||||||
<div class="daily-meal-ingredients">
|
|
||||||
<ul class="ingredients-list">
|
|
||||||
<li>Ground beef</li>
|
|
||||||
<li>Tomato sauce</li>
|
|
||||||
<li>Onion</li>
|
|
||||||
<li>Macaroni</li>
|
|
||||||
<li>Garlic</li>
|
|
||||||
<li>Cheese</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
|
|||||||
@ -13,16 +13,21 @@ the_header(
|
|||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="favorites">
|
<div class="favorites">
|
||||||
|
<?php if(!empty($context['recipes'])): ?>
|
||||||
<div class="favorites-items">
|
<div class="favorites-items">
|
||||||
<?php
|
<?php
|
||||||
for( $i = 0; $i < 5; $i++) {
|
|
||||||
foreach ($context['recipes'] as $recipe) {
|
foreach ($context['recipes'] as $recipe) {
|
||||||
the_product_item($recipe);
|
the_product_item($recipe);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
|
<?php else: ?>
|
||||||
|
<div class="nothing">
|
||||||
|
Nothing to show
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ the_header(
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="recipe-id" hidden><?= $context['recipe']->get_id() ?></div>
|
<div id="recipe-id" hidden><?= $context['recipe']->get_id() ?></div>
|
||||||
|
<div id="in-usermenu" hidden><?= $context['recipe']->in_usermenu; ?></div>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="single-recipe">
|
<div class="single-recipe">
|
||||||
|
|||||||
@ -5,4 +5,8 @@ use Lycoreco\Apps\Recipes\Models\RecipeModel;
|
|||||||
function the_product_item(RecipeModel $recipe)
|
function the_product_item(RecipeModel $recipe)
|
||||||
{
|
{
|
||||||
include APPS_PATH . '/Recipes/Templates/components/catalog-item.php';
|
include APPS_PATH . '/Recipes/Templates/components/catalog-item.php';
|
||||||
|
}
|
||||||
|
function the_product_recipes_item(RecipeModel $recipe, array $ingredients)
|
||||||
|
{
|
||||||
|
include APPS_PATH . '/Recipes/Templates/components/recipe-ings-item.php';
|
||||||
}
|
}
|
||||||
@ -15,13 +15,41 @@ document.addEventListener('click', (e) => {
|
|||||||
|
|
||||||
|
|
||||||
const options = document.querySelectorAll('.dropdown-item');
|
const options = document.querySelectorAll('.dropdown-item');
|
||||||
|
const inUsermenu = document.getElementById('in-usermenu').textContent;
|
||||||
|
|
||||||
|
if (inUsermenu) {
|
||||||
|
options.forEach(option => {
|
||||||
|
if (option.getAttribute('data-value') === inUsermenu && option.getAttribute('data-value') !== 'remove') {
|
||||||
|
option.classList.add('dropdown-selected');
|
||||||
|
toggleBtn.textContent = option.textContent;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
options.forEach(option => {
|
options.forEach(option => {
|
||||||
option.addEventListener('click', () => {
|
option.addEventListener('click', async (e) => {
|
||||||
const selectedValue = option.getAttribute('data-value');
|
const selectedValue = option.getAttribute('data-value');
|
||||||
|
|
||||||
options.forEach(opt => opt.classList.remove('dropdown-selected'));
|
options.forEach(opt => opt.classList.remove('dropdown-selected'));
|
||||||
|
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('action', 'usermenu');
|
||||||
|
formData.append('recipe_id', recipeId);
|
||||||
|
formData.append('dayofweek', selectedValue);
|
||||||
|
|
||||||
|
const response = await fetch('/ajax', {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
});
|
||||||
|
|
||||||
|
const json = await response.json();
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const message = json.error;
|
||||||
|
showToastify(message, 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (selectedValue === 'remove') {
|
if (selectedValue === 'remove') {
|
||||||
toggleBtn.textContent = 'Add to list';
|
toggleBtn.textContent = 'Add to list';
|
||||||
} else {
|
} else {
|
||||||
@ -31,7 +59,7 @@ options.forEach(option => {
|
|||||||
|
|
||||||
dropdown.classList.add('hidden');
|
dropdown.classList.add('hidden');
|
||||||
|
|
||||||
alert(`You selected: ${selectedValue}`);
|
showToastify(json.success, 'success');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -42,20 +70,20 @@ const qrPopup = document.querySelector(".qr-popup");
|
|||||||
const overlay = document.getElementById('overlay');
|
const overlay = document.getElementById('overlay');
|
||||||
|
|
||||||
qrBtn.addEventListener("click", () => {
|
qrBtn.addEventListener("click", () => {
|
||||||
|
|
||||||
qrPopup.classList.toggle("hidden")
|
qrPopup.classList.toggle("hidden")
|
||||||
overlay.classList.toggle("hidden")
|
overlay.classList.toggle("hidden")
|
||||||
|
|
||||||
qrContainer.innerHTML = "";
|
qrContainer.innerHTML = "";
|
||||||
|
|
||||||
|
|
||||||
new QRCode(qrContainer, {
|
new QRCode(qrContainer, {
|
||||||
text: window.location.href,
|
text: window.location.href,
|
||||||
width: 200,
|
width: 200,
|
||||||
height: 200
|
height: 200
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const qrImg = qrContainer.querySelector("img");
|
const qrImg = qrContainer.querySelector("img");
|
||||||
if (qrImg) {
|
if (qrImg) {
|
||||||
@ -64,8 +92,8 @@ qrBtn.addEventListener("click", () => {
|
|||||||
}, 500);
|
}, 500);
|
||||||
});
|
});
|
||||||
|
|
||||||
document.addEventListener('click', (e) =>{
|
document.addEventListener('click', (e) => {
|
||||||
if(!qrPopup.contains(e.target) && !qrBtn.contains(e.target)){
|
if (!qrPopup.contains(e.target) && !qrBtn.contains(e.target)) {
|
||||||
qrPopup.classList.add("hidden");
|
qrPopup.classList.add("hidden");
|
||||||
overlay.classList.add("hidden");
|
overlay.classList.add("hidden");
|
||||||
}
|
}
|
||||||
@ -85,7 +113,7 @@ favoriteBtn.addEventListener('click', async (e) => {
|
|||||||
formData.append('type', type);
|
formData.append('type', type);
|
||||||
|
|
||||||
favoriteBtn.disabled = true;
|
favoriteBtn.disabled = true;
|
||||||
const response = await fetch('/ajax', {
|
const response = await fetch('/ajax', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: formData
|
body: formData
|
||||||
});
|
});
|
||||||
@ -93,20 +121,20 @@ favoriteBtn.addEventListener('click', async (e) => {
|
|||||||
|
|
||||||
const json = await response.json();
|
const json = await response.json();
|
||||||
|
|
||||||
if(!response.ok) {
|
if (!response.ok) {
|
||||||
const message = json.error;
|
const message = json.error;
|
||||||
showToastify(message, 'error');
|
showToastify(message, 'error');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
favoriteBtn.classList.toggle('active');
|
favoriteBtn.classList.toggle('active');
|
||||||
|
|
||||||
if(type == 'add') {
|
if (type == 'add') {
|
||||||
favoriteIcon.classList.remove('fa-regular');
|
favoriteIcon.classList.remove('fa-regular');
|
||||||
favoriteIcon.classList.add('fa-solid');
|
favoriteIcon.classList.add('fa-solid');
|
||||||
} else {
|
} else {
|
||||||
favoriteIcon.classList.add('fa-regular');
|
favoriteIcon.classList.add('fa-regular');
|
||||||
favoriteIcon.classList.remove('fa-solid');
|
favoriteIcon.classList.remove('fa-solid');
|
||||||
}
|
}
|
||||||
|
|
||||||
showToastify(json.success, 'success');
|
showToastify(json.success, 'success');
|
||||||
});
|
});
|
||||||
@ -133,13 +133,13 @@ function the_pagination(int $count, int $elem_per_page, int $current_page)
|
|||||||
continue;
|
continue;
|
||||||
$GET['page'] = $i;
|
$GET['page'] = $i;
|
||||||
?>
|
?>
|
||||||
<li><a class="btn page-btn" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
|
<li><a class="btn btn-secondary" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
|
||||||
<?php endfor; ?>
|
<?php endfor; ?>
|
||||||
|
|
||||||
<!-- Current page -->
|
<!-- Current page -->
|
||||||
<?php if ($current_page > 0 && $current_page <= $total_pages): ?>
|
<?php if ($current_page > 0 && $current_page <= $total_pages): ?>
|
||||||
<li>
|
<li>
|
||||||
<div class="btn active page-btn"><?php echo $current_page ?></div>
|
<div class="btn btn-primary"><?php echo $current_page ?></div>
|
||||||
</li>
|
</li>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ function the_pagination(int $count, int $elem_per_page, int $current_page)
|
|||||||
<?php for ($i = $current_page + 1; $i <= $total_pages && $i <= $current_page + 2; $i++):
|
<?php for ($i = $current_page + 1; $i <= $total_pages && $i <= $current_page + 2; $i++):
|
||||||
$GET['page'] = $i;
|
$GET['page'] = $i;
|
||||||
?>
|
?>
|
||||||
<li><a class="btn page-btn" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
|
<li><a class="btn btn-secondary" href="<?php the_GET_request($GET) ?>"><?php echo $i ?></a></li>
|
||||||
<?php endfor; ?>
|
<?php endfor; ?>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
define('DAYS_OF_WEEK', array(
|
define('DAYS_OF_WEEK', array(
|
||||||
'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'
|
1 => 'monday', 2 => 'tuesday', 3 => 'wednesday', 4 => 'thursday', 5 => 'friday', 6 => 'saturday', 0 => 'sunday'
|
||||||
));
|
));
|
||||||
Loading…
x
Reference in New Issue
Block a user