Commit e7bb7bd9 by Manuel Ruiz Toribio

Merge remote-tracking branch 'origin/developJC' into developmanu

parents d073734b 5f3f5bcf
...@@ -68,15 +68,19 @@ $routes->get('/myrecipes', 'User::personalRecipes', ['filter' => 'user_auth']); ...@@ -68,15 +68,19 @@ $routes->get('/myrecipes', 'User::personalRecipes', ['filter' => 'user_auth']);
// Ruta para vista "Mi perfil" // Ruta para vista "Mi perfil"
$routes->get('/profile', 'User::myprofile', ['filter' => 'user_auth']); $routes->get('/profile', 'User::myprofile', ['filter' => 'user_auth']);
$routes->post('/cambiarFoto', 'User::changeProfilePhoto'); $routes->post('/profile', 'User::editProfile'); // Cambia la ruta para editar perfil
$routes->get('login','Pages::viewLogin'); $routes->get('login','Pages::viewLogin');
$routes->get('users','User::list');
$routes->get('users', 'User::list', ['filter' => 'admin_auth']); $routes->get('users', 'User::list', ['filter' => 'admin_auth']);
$routes->get('home','Pages::prueba'); $routes->get('home','Pages::prueba');
$routes->get('(:segment)', 'Home::index'); $routes->get('(:segment)', 'Home::index');
// Ruta para la búsqueda de recetas
$routes->post('/filter_recipes', 'RecipesController::filter_recipes');
$routes->match(['get', 'post'], '/filterRecipes', 'RecipesController::filterRecipes'); $routes->match(['get', 'post'], '/filterRecipes', 'RecipesController::filterRecipes');
......
...@@ -9,66 +9,67 @@ class InsertRecipeController extends Controller ...@@ -9,66 +9,67 @@ class InsertRecipeController extends Controller
public function index() public function index()
{ {
return view('templates/header') return view('templates/header')
.view('pages/insertRecipe') . view('pages/insertRecipe')
. view('templates/footer'); . view('templates/footer');
} }
public function search_ingredient() { public function search_ingredient()
{
// Obtener la consulta de búsqueda desde el formulario // Obtener la consulta de búsqueda desde el formulario
$query = $this->request->getVar('query'); $query = $this->request->getVar('query');
// Cargar el modelo de ingredientes (si no lo has hecho) // Cargar el modelo de ingredientes (si no lo has hecho)
$ingredientModel = new \App\Models\IngredientModel(); $ingredientModel = new \App\Models\IngredientModel();
// Buscar ingredientes en la base de datos que coincidan con la consulta // Buscar ingredientes en la base de datos que coincidan con la consulta
$ingredients = $ingredientModel->search_ingredient($query); $ingredients = $ingredientModel->search_ingredient($query);
// Devolver los ingredientes coincidentes en formato JSON // Devolver los ingredientes coincidentes en formato JSON
return $this->response->setJSON($ingredients); return $this->response->setJSON($ingredients);
} }
public function insert_recipe() public function insert_recipe()
{ {
// Cargar los modelos necesarios // Cargar los modelos necesarios
$recipeModel = new \App\Models\RecipesModel(); $recipeModel = new \App\Models\RecipesModel();
$recipesIngredientModel = new \App\Models\RecipesIngredientModel(); $recipesIngredientModel = new \App\Models\RecipesIngredientModel();
// Obtener los datos del formulario
$recipeData = $this->request->getPost();
$selectedIngredients = json_decode($recipeData['selected_ingredients'], true);
// Eliminar el elemento 'selected_ingredients' de los datos de la receta
unset($recipeData['selected_ingredients']);
// Manejar el archivo de imagen
$photo = $this->request->getFile('photo');
if ($photo->isValid() && !$photo->hasMoved()) {
$photoBlob = file_get_contents($photo->getRealPath());
$recipeData['photo'] = $photoBlob;
}
// Obtener el email del usuario de la sesión // Obtener los datos del formulario
$session = session(); $recipeData = $this->request->getPost();
$userEmail = $session->get('user')->email; $selectedIngredients = json_decode($recipeData['selected_ingredients'], true);
// Agregar el email del usuario a los datos de la receta // Eliminar el elemento 'selected_ingredients' de los datos de la receta
$recipeData['email_user'] = $userEmail; unset($recipeData['selected_ingredients']);
// Insertar la receta en la tabla 'recipes' // Manejar el archivo de imagen
$recipeId = $recipeModel->insert($recipeData); $photo = $this->request->getFile('photo');
if ($photo->isValid() && !$photo->hasMoved()) {
$photoBlob = file_get_contents($photo->getRealPath());
$recipeData['photo'] = $photoBlob;
}
// Insertar los ingredientes seleccionados y sus cantidades en la tabla 'recipes_ingredient' // Obtener el email del usuario de la sesión
foreach ($selectedIngredients as $ingredient) { $session = session();
$recipesIngredientModel->insert([ $userEmail = $session->get('user')->email;
'id_recipe' => $recipeId,
'id_ingredient' => $ingredient['id'], // Agregar el email del usuario a los datos de la receta
'amount' => $ingredient['amount'] $recipeData['email_user'] = $userEmail;
]);
}
// Redireccionar a la página principal // Insertar la receta en la tabla 'recipes'
return redirect()->to('/home'); $recipeId = $recipeModel->insert($recipeData);
}
// Insertar los ingredientes seleccionados y sus cantidades en la tabla 'recipes_ingredient'
foreach ($selectedIngredients as $ingredient) {
$recipesIngredientModel->insert([
'id_recipe' => $recipeId,
'id_ingredient' => $ingredient['id'],
'amount' => $ingredient['amount']
]);
}
// Redireccionar a la página principal
return redirect()->to('/home');
}
} }
\ No newline at end of file
...@@ -192,23 +192,35 @@ class User extends BaseController ...@@ -192,23 +192,35 @@ class User extends BaseController
. view('templates/footer'); . view('templates/footer');
} }
public function changeProfilePhoto() public function editProfile()
{ {
$session = \Config\Services::session(); $session = session();
$email = $session->get('user')->email; $userModel = new \App\Models\UserModel();
$userModel = new UserModel();
if($this->request->getMethod() === 'post') {
$photo = $this->request->getFile('photo'); $username = $this->request->getPost('username');
if ($photo->isValid() && !$photo->hasMoved()) {
$photoBlob = file_get_contents($photo->getRealPath()); // Manejar el archivo de imagen
$data['photo'] = $photoBlob; $photo = $this->request->getFile('photo');
$userModel->update($email, $data); $photoBlob = null;
if ($photo->isValid() && !$photo->hasMoved()) {
$photoBlob = file_get_contents($photo->getRealPath());
$userModel->updateUser($session->get('user')->email, $username, $photoBlob);
} else {
// Actualiza solo el nombre de usuario si no se ha subido una nueva foto
$userModel->updateUser($session->get('user')->email, $username, $session->get('user')->photo);
}
// Actualizar datos de la sesión
$session->set('user', $userModel->find($session->get('user')->email));
$session->setFlashdata('success', 'Profile updated successfully');
return redirect()->to('/profile'); // Cambia la redirección a '/profile'
} }
return redirect()->to('/perfil'); $data['user'] = $session->get('user');
return view('edit_profile', $data);
} }
} }
\ No newline at end of file
...@@ -12,7 +12,7 @@ class AdminAuth implements FilterInterface ...@@ -12,7 +12,7 @@ class AdminAuth implements FilterInterface
if (!session('logged_in')) if (!session('logged_in'))
return redirect()->to(site_url('/login')); return redirect()->to(site_url('/login'));
elseif ((session('user')->rol & 2) == 0) elseif ((session('user')->rol & 2) == 0)
return redirect()->to(site_url('/unauthorized')); return redirect()->to(site_url('/login'));
} }
public function after( public function after(
RequestInterface $request, ResponseInterface $response, RequestInterface $request, ResponseInterface $response,
......
...@@ -11,7 +11,7 @@ class UserModel extends Model ...@@ -11,7 +11,7 @@ class UserModel extends Model
protected $returnType = 'object'; # 'object' or 'array' protected $returnType = 'object'; # 'object' or 'array'
protected $useSoftDeletes = false; # true if you expect to recover data protected $useSoftDeletes = false; # true if you expect to recover data
# Fields that can be set during save, insert, or update methods # Fields that can be set during save, insert, or update methods
protected $allowedFields = ['email', 'username', 'password','photo']; protected $allowedFields = ['email', 'username', 'password', 'photo'];
protected $useTimestamps = false; # no timestamps on inserts and updates protected $useTimestamps = false; # no timestamps on inserts and updates
# Do not use validations rules (for the time being...) # Do not use validations rules (for the time being...)
protected $validationRules = []; protected $validationRules = [];
...@@ -36,5 +36,17 @@ class UserModel extends Model ...@@ -36,5 +36,17 @@ class UserModel extends Model
return $this->insert($data); return $this->insert($data);
} }
public function updateUser($email, $username, $photo)
{
$data = [
'username' => $username,
'photo' => $photo,
];
return $this->update($email, $data);
}
} }
\ No newline at end of file
<main id="main" class="main"> <main id="main" class="main">
<div class="pagetitle"> <div class="pagetitle">
<h1>Recetas</h1> <h1>Recetas</h1>
<nav> <nav>
...@@ -11,57 +10,70 @@ ...@@ -11,57 +10,70 @@
</nav> </nav>
</div><!-- End Page Title --> </div><!-- End Page Title -->
<section class="section dashboard" id="recipeSection"> <section class="section dashboard">
<div id="recipeCards">
<?php <?php
$recipesModel = new \App\Models\RecipesModel(); $recipesModel = new \App\Models\RecipesModel();
$recipes = $recipesModel->findAll(); $recipes = $recipesModel->findAll();
if (sizeof($recipes) > 0) { if (sizeof($recipes) > 0) {
foreach ($recipes as $row) { foreach ($recipes as $row) {
$ingredients = $recipesModel->get_recipe_ingredients($row->id); $ingredients = $recipesModel->get_recipe_ingredients($row->id);
?> ?>
<!-- Inicio de la tarjeta de la receta --> <!-- Inicio de la tarjeta de la receta -->
<div class="card info-card sales-card"
onclick="window.location.href='<?php echo base_url('recipe/' . $row->id); ?>'">
<a href="<?php echo base_url('recipe/' . $row->id); ?>"> <div class="card info-card sales-card"
</a> onclick="window.location.href='<?php echo base_url('recipe/' . $row->id); ?>'">
<div class="row flex-nowrap"> <a href="<?php echo base_url('recipe/' . $row->id); ?>">
<div class="col-lg-3 col-md-4 col-sm-12 imagen-container"> </a>
<img src="<?php echo base_url('recipe/image/' . $row->id); ?>" alt="" <div class="row flex-nowrap">
class="img-fluid rounded-start"> <div class="col-lg-3 col-md-4 col-sm-12 imagen-container">
<img src="<?php echo base_url('recipe/image/' . $row->id); ?>" alt=""
class="img-fluid rounded-start">
</div>
<div class="col-lg-9 col-md-8 col-sm-12">
<div class="filter">
<a class="icon" href="#" data-bs-toggle="dropdown"><i class="bi bi-three-dots"></i></a>
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
<li class="dropdown-header text-start">
<h6>Opciones</h6>
</li>
<li><a class="dropdown-item" href="#">Guardar</a></li>
<li><a class="dropdown-item" href="#">Compartir</a></li>
</ul>
</div> </div>
<div class="col-lg-9 col-md-8 col-sm-12"> <div class="card-body">
<h5 class="card-title">
<?php echo $row->name; ?> <span>|
<div class="card-body"> <?php echo $row->origin; ?>
<h5 class="card-title"> </span>
<?php echo $row->name; ?> <span>| </h5>
<?php echo $row->origin; ?> <!--ingredientes-->
</span> <?php foreach ($ingredients as $ingredient) { ?>
</h5> <div class="chip" title="Cantidad: <?php echo $ingredient->amount; ?>">
<!--ingredientes--> <img src="imagenes/ingredientes/<?php echo $ingredient->icon; ?>">
<?php foreach ($ingredients as $ingredient) { ?> <b style="font-size: 14px">
<div class="chip" title="Cantidad: <?php echo $ingredient->amount; ?>"> <?php echo $ingredient->name; ?>
<img src="imagenes/ingredientes/<?php echo $ingredient->icon; ?>"> </b>
<b style="font-size: 14px"> </div>
<?php echo $ingredient->name; ?> <?php } ?>
</b> <!--fin ingredientes-->
</div>
<?php } ?>
<!--fin ingredientes-->
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- Fin de la tarjeta de la receta --> <!-- Fin de la tarjeta de la receta -->
<?php <?php
}
} }
?> }
</div> ?>
</section> </section>
</main><!-- End #main --> </main><!-- End #main -->
......
<main id="main" class="main"> <style>
<section class="section dashboard"> .profile-container {
<?php $session = session(); ?> max-width: 500px;
<div style="display: flex; flex-direction: row; align-items: center;"> margin: auto;
<?php if ($session->has('user') && !is_null($session->get('user')->photo)): ?> }
<img src="data:image/jpeg;base64,<?= base64_encode($session->get('user')->photo) ?>" alt="Profile" .profile-photo {
style="width: 100px; height: 100px; object-fit: cover; border-radius: 50%;"> max-width: 200px;
<?php else: ?> display: block;
<img src="<?= base_url("imagenes/profile.png") ?>" margin: 10px 0;
style="width: 100px; height: 100px; object-fit: cover; border-radius: 50%;"> }
<?php endif; ?> .save-btn-container {
<div style="display: flex; flex-direction: column; margin-left: 20px;"> margin-top: 20px;
<span style="font-size: 18px; font-weight: bold;">Nombre de usuario:</span> }
<span style="font-size: 16px;"> </style>
<?= $session->get('user')->username ?>
</span>
<span style="font-size: 18px; font-weight: bold;">Correo:</span>
<span style="font-size: 16px;">
<?= $session->get('user')->email ?>
</span>
</div>
</div>
<a href="#" id="cambiar-foto-btn" class="btn btn-primary">Cambiar foto de perfil</a>
<div class="modal fade" id="cambiar-foto-modal" tabindex="-1" role="dialog"> <main id="main" class="main">
<div class="modal-dialog" role="document"> <section class="section dashboard">
<div class="modal-content"> <?php
<div class="modal-header"> $session = session();
<h5 class="modal-title">Cambiar foto de perfil</h5> $user = $session->get('user');
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> ?>
<span aria-hidden="true">&times;</span>
</button> <div class="container profile-container">
</div> <div class="card">
<div class="modal-body"> <div class="card-header">
<form id="cambiar-foto-form" enctype="multipart/form-data"> Editar usuario
<div class="form-group"> </div>
<label for="foto">Selecciona una foto:</label> <div class="card-body">
<input type="file" class="form-control-file" id="foto" name="foto"> <form method="post" enctype="multipart/form-data">
</div> <div class="form-group">
</form> <label for="email">Email</label>
</div> <input type="email" class="form-control" id="email" name="email" value="<?= $user->email ?>" readonly>
<div class="modal-footer"> </div>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button> <div class="form-group">
<button type="button" class="btn btn-primary" id="guardar-foto-btn">Guardar</button> <label for="username">Nombre de usuario</label>
</div> <input type="text" class="form-control" id="username" name="username" value="<?= $user->username ?>">
</div>
<div class="form-group">
<label for="photo">Foto de perfil</label>
<?php if ($user->photo): ?>
<img src="data:image/jpeg;base64,<?= base64_encode($user->photo) ?>" alt="User photo" class="profile-photo" />
<?php endif; ?>
<input type="file" class="form-control" id="photo" name="photo">
</div>
<div class="text-center save-btn-container">
<button type="submit" class="btn btn-primary">Guardar cambios</button>
</div>
</form>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
</main><!-- End #main --> </main><!-- End #main -->
<script>
$(document).ready(function () {
$('#cambiar-foto-btn').click(function () {
$('#cambiar-foto-modal').modal('show');
});
});
</script>
<script>
$(document).ready(function() {
$('#guardar-foto-btn').click(function() {
var formData = new FormData($('#cambiar-foto-form')[0]);
$.ajax({
url: '/cambiarFoto',
type: 'POST',
data: formData,
contentType: false,
processData: false,
success: function(data) {
window.location.href = '/perfil';
}
});
});
});
</script>
...@@ -96,7 +96,6 @@ ...@@ -96,7 +96,6 @@
<img src="<?= base_url("imagenes/profile.png") ?>" alt="Profile" class="rounded-circle"> <img src="<?= base_url("imagenes/profile.png") ?>" alt="Profile" class="rounded-circle">
<?php endif; ?> <?php endif; ?>
<span class="d-none d-md-block dropdown-toggle ps-2"> <span class="d-none d-md-block dropdown-toggle ps-2">
</span> </span>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment