Recipes/app/Http/Controllers/RecipeController.php

224 lines
8.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Recipe;
use App\RecipeIngredient;
use App\RecipeCategory;
use App\User;
class RecipeController extends Controller
{
public function index()
{
$recipes = Recipe::with('user')->get();
$categories=array_values(RecipeCategory::get()->sortby('name')->pluck('name')->unique()->toArray());
return view('recipes.index')->with('recipes', $recipes)->with('categories',$categories);
}
public function show($id)
{
$recipe=Recipe::with('user')->findOrFail($id);
return view('recipes.show')->with('recipe', $recipe);
}
public function edit($id){
$recipe=Recipe::with('user')->with('categories')->with('ingredients')->findOrFail($id);
$lists['ingredients']=array_values(RecipeIngredient::get()->sortby('name')->pluck('name')->unique()->toArray());
$lists['measurements']=array_values(RecipeIngredient::get()->sortby('measurement')->pluck('measurement')->unique()->toArray());
$lists['categories']=array_values(RecipeCategory::get()->sortby('name')->pluck('name')->unique()->toArray());
$lists['authors']=array_values(Recipe::get()->sortby('author')->pluck('author')->unique()->toArray());
$lists['owners']=User::select('id','name')->get()->sortby('name');
return view('recipes.edit')->with('recipe', $recipe)->with('lists',$lists);
}
public function update(Request $request, $id)
{
$recipe = Recipe::with('ingredients')->with('categories')->findOrFail($id);
$this->validate($request, [
'name'=>'required|max:500',
'author'=>'required|max:500',
'user_id'=>'required',
'servings'=>'required|integer',
'serving_size'=>'required|max:40',
'description'=>'max:5000',
'instructions'=>'required|max:5000'
]);
//break categories and ingredients into arrays for validation
$categories = array();
$ingredients = array();
foreach($request->all() as $element => $value){
if(preg_match('/category_.*/', $element)){
$explosion = explode('_',$element);
$categories[$explosion[1]][$explosion[2]]=$value;
}else if(preg_match('/ingredient_.*/', $element)){
$explosion = explode('_',$element);
$ingredients[$explosion[1]][$explosion[2]]=$value;
}
}
foreach($categories as $category){
$newreq = new Request($category);
$this->validate($newreq, [
'name'=>'required|max:50',
]);
}
foreach($ingredients as $index => $ingredient){
$newreq = new Request($ingredient);
$this->validate($newreq, [
'order'=>'required|integer',
'quantity'=>['required','regex:/(^\d+\/\d+$)|(^\d*\.\d+$)|(^\d+ \d\/\d$)|(^\d+$)/i'],
'measurement'=>'required|max:40',
'name'=>'required|max:500',
'notes'=>'max:500'
]);
if ($ingredient['notes'] == null){
$ingredients[$index]['special_notes'] = '';
}else{
$ingredients[$index]['special_notes'] = $ingredient['notes'];
}
if(array_key_exists('alternative', $ingredient) && $ingredient['alternative'] == 'on'){
$ingredients[$index]['alternative'] = true;
}else{
$ingredients[$index]['alternative'] = false;
}
}
$update = $request->only('name','author','user_id','servings','serving_size','last_modified','description','instructions');
$update['last_modified']=now();
$recipe->fill($update)->save();
//Delete categories that don't exist in new category array
foreach($recipe->categories as $category){
if(!array_key_exists($category->id,$categories)){
$category->delete();
}
}
//Delete ingredients that don't exist in new ingredient array
foreach($recipe->ingredients as $ingredient){
if(!array_key_exists($ingredient->id,$ingredients)){
$ingredient->delete();
}
}
//create/update categories
foreach($categories as $categoryid => $category){
//Add recipe_id
$category["recipe_id"]=$id;
$newreq = new Request($category);
//Find category if exists, create if it doesn't
$currentcategory = RecipeCategory::where('id','=',$categoryid)->first();
if($currentcategory === null){
RecipeCategory::create($newreq->only('recipe_id','name'));
}else{
$update = $newreq->only('recipe_id','name');
$currentcategory->fill($update)->save();
}
}
//create/update ingredients
foreach($ingredients as $ingredientid => $ingredient){
//Add recipe_id
$ingredient["recipe_id"]=$id;
$newreq = new Request($ingredient);
//Find category if exists, create if it doesn't
$currentingredient = RecipeIngredient::where('id','=',$ingredientid)->first();
if($currentingredient === null){
RecipeIngredient::create($newreq->only('recipe_id','order','alternative','quantity','measurement','name','special_notes'));
}else{
$update = $newreq->only('recipe_id','order','alternative','quantity','measurement','name','special_notes');
$currentingredient->fill($update)->save();
}
}
return redirect()->route('recipes.index')->with('message','Recipe successfully edited.');
}
public function create(){
$lists['ingredients']=array_values(RecipeIngredient::get()->sortby('name')->pluck('name')->unique()->toArray());
$lists['measurements']=array_values(RecipeIngredient::get()->sortby('measurement')->pluck('measurement')->unique()->toArray());
$lists['categories']=array_values(RecipeCategory::get()->sortby('name')->pluck('name')->unique()->toArray());
$lists['authors']=array_values(Recipe::get()->sortby('author')->pluck('author')->unique()->toArray());
$lists['owners']=User::select('id','name')->get()->sortby('name');
return view('recipes.create')->with('lists',$lists);
}
public function store(Request $request){
$this->validate($request, [
'author'=>'required|max:500',
'user_id'=>'required',
'servings'=>'required|integer',
'serving_size'=>'required|max:40',
'description'=>'max:5000',
'instructions'=>'required|max:5000'
]);
//break categories and ingredients into arrays for validation
$categories = array();
$ingredients = array();
foreach($request->all() as $element => $value){
if(preg_match('/category_.*/', $element)){
$explosion = explode('_',$element);
$categories[$explosion[1]][$explosion[2]]=$value;
}else if(preg_match('/ingredient_.*/', $element)){
$explosion = explode('_',$element);
$ingredients[$explosion[1]][$explosion[2]]=$value;
}
}
foreach($categories as $category){
$newreq = new Request($category);
$this->validate($newreq, [
'name'=>'required|max:50',
]);
}
foreach($ingredients as $index => $ingredient){
$newreq = new Request($ingredient);
$this->validate($newreq, [
'order'=>'required|integer',
'quantity'=>['required','regex:/(^\d+\/\d+$)|(^\d*\.\d+$)|(^\d+ \d\/\d$)|(^\d+$)/i'],
'measurement'=>'required|max:40',
'name'=>'required|max:500',
'notes'=>'max:500'
]);
if ($ingredient['notes'] == null){
$ingredients[$index]['special_notes'] = '';
}else{
$ingredients[$index]['special_notes'] = $ingredient['notes'];
}
if(array_key_exists('alternative', $ingredient) && $ingredient['alternative'] == 'on'){
$ingredients[$index]['alternative'] = true;
}else{
$ingredients[$index]['alternative'] = false;
}
}
$create=$request->only('author','user_id','servings','serving_size','name','description','instructions');
$create['date_entered']=now();
$create['date_modified']=now();
$recipe = Recipe::create($create);
//create categories
foreach($categories as $categoryid => $category){
//Add recipe_id
$category["recipe_id"]=$recipe->id;
$newreq = new Request($category);
RecipeCategory::create($newreq->only('recipe_id','name'));
}
//create ingredients
foreach($ingredients as $ingredientid => $ingredient){
//Add recipe_id
$ingredient["recipe_id"]=$recipe->id;
$newreq = new Request($ingredient);
RecipeIngredient::create($newreq->only('recipe_id','order','alternative','quantity','measurement','name','special_notes'));
}
return redirect()->route('recipes.index')->with('message','Recipe successfully edited.');
}
}