7

Me han pedido que haga un menú de configuración en el que mostrar secciones en el menu de mi página web.Así que me he puesto manos a la obra y esto he conseguido.

indexcreate

Bueno pues el problema es que me falta realizar la opcion de update y al tratarse de un multiplecheckbox tengo dudas sobre como realizarlo. Adjunto mis archivos de códigos por si alguien me pudiera tirar un cable.

Ruta:

use App\Http\Controllers\ConfigController;
Route::resource('configs', ConfigController::class);

Tabla de migracion:

public function up()
    {
        Schema::create('configs', function (Blueprint $table) {
            $table->id();
            $table->string('category');
            $table->timestamps();
        });
    }

Modelo (Config.php)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Config extends Model
{
    use HasFactory;
    protected $fillable = ['category'];

    public function setCategoryAttribute($value)
    {
        $this->attributes['category'] = json_encode($value);
    }

    public function getCategoryAttribute($value)
    {
        return $this->attributes['category'] = json_decode($value);
    }
}

Controlador (ConfigController.php):

<?php

namespace App\Http\Controllers;

use App\Models\Config;
use Illuminate\Http\Request;

class ConfigController extends Controller
{
   //index , create,store

    public function edit($id)
    {
        $config = Config::find($id);
    return view('configs.config',compact('id'));
    }

    public function update(Request $request, $id)
    {
        //
    }
}

Como podeis ver aquí me falta update que no se muy bien como hacerlo.

Edit (config.blade.php) Adjunto la parte del formulario:

<form method="post" action="{{ route('configs.update',$configs->id) }}" enctype="multipart/form-data">
@csrf
                                
<div class="form-group">
<label><strong>Category :</strong></label><br>
<label><input type="checkbox" name="category[]" value="contacto"> Contacto</label>
<label><input type="checkbox" name="category[]" value="tiempo"> El Tiempo</label>
<label><input type="checkbox" name="category[]" value="galeria"> Galeria</label>
<label><input type="checkbox" name="category[]" value="mercadillo"> Mercadillo</label>
<label><input type="checkbox" name="category[]" value="noticias"> Noticias</label>
<label><input type="checkbox" name="category[]" value="webcams"> Webcams</label>
</div>                                 
 <div class="form-group text-center">
<button type="submit" class="btn btn-success btn-sm">Save</button>
</div>
</form>
                    

Si alguna persona amable me pudiera hechar un cable se lo agradecería mucho ya que desconozco como completar esto.

Edicion:

He probado esto en el update del controlador:

public function update(Request $request, $id)
    {
        $conf = Config::find($id);
        $conf->category = $request->get('category');


        $conf->update();

        return redirect('/configs')->with('success', 'menu web actualizado correctamente.');
    }

y esta ruta en el action del formulario para editar:

<form action="{{ route('configs.update',$config->id) }}" method="POST">

Pero da el siguiente error:

ErrorException
Undefined variable: config (View: C:\xampp\htdocs\ruta\resources\views\configs\config.blade.php)

Alguien me podría ayudar? llevo dias con esto y nose muy bien como hacerlo he buscado en google , en youtube, ya nose que m��s hacer no encuentro nada sobre esto.

Si se requiere de más codigo lo adjunto sin problema.

5
  • El error es porque en ningún momento a tu vista se pasa una variable $config. En cuanto a lo demás. Recuerda que cuando haces uso del método create, al pasarle un array, este cotejará los campos en tu modelo para insertarlos y luego pues si estos campos existen en tu base de datos, se insertarán, pero sino, te dará error.
    – gaidyjg
    Commented el 12 may. 2021 a las 17:52
  • Una pregunta. La imagen que adjuntaste es una sola vista, no? Se espera que, lo que seleccione abajo, luego de guardarse, aparezcan arriba, o me equivoco? Además, asumo que no hay opción de eliminar un menú por ahora. Commented el 14 may. 2021 a las 22:47
  • Por otro lado, dónde es que guardas todas las categorías y dónde es que guardas sólo las categorías seleccionadas? Aunque puedes usar sólo una tabla y agregarle un campo llamado visible, o como prefieras. Commented el 14 may. 2021 a las 23:00
  • @JonatanLavado la logica de las secciones del menu ya la tengo lista y funcionando con la base de datos actual, solo me queda hacer funcionar la parte del crud. Si cuando se seleciona se guarda en la base de datos en la columna category y se crea un array en esta columna ["contacto","galeria","tiempo","mercadillo"] , esta columna es la que se muestra en la prmera imagen en la vista, la parte donde estan los checks es un icono de fontawesome que se repite por cada item mostrado, solo es estetico
    – Sara11
    Commented el 15 may. 2021 a las 12:36
  • En las ediciones creo que aun debe de verse la pregunta entera que puse anteriormente, ya que me aconsejaron que la acortara, de todas formas puedo añadir el contenido nuevamente
    – Sara11
    Commented el 15 may. 2021 a las 12:42

2 respuestas 2

1
+50

Lo que ocurre es no estas pasando bien los parámetros ni ejecutando el método correcto

primeramente debes pasar el config o usar directamente id

ademas debido a que estamos modificando es muy probable haber datos, y estos los cargamos con {{in_array($config->category,"contacto") ? "checked":""}}

    public function edit($id) {
        $config = Config::find($id);
        return view('configs.config',compact('config'));
    }


<form method="post" action="{{ route('configs.update',['id' => $config->id]) }}" enctype="multipart/form-data">
    @csrf
                                
    <div class="form-group">
        <label><strong>Category :</strong></label><br>
        <label><input type="checkbox" name="category[]" {{in_array("contacto", $config->category) ? "checked":""}} value="contacto"> Contacto</label>
        <label><input type="checkbox" name="category[]" {{in_array("tiempo", $config->category) ? "checked":""}} value="tiempo"> El Tiempo</label>
        <label><input type="checkbox" name="category[]" {{in_array("galeria", $config->category) ? "checked":""}} value="galeria"> Galeria</label>
        <label><input type="checkbox" name="category[]" {{in_array("mercadillo", $config->category) ? "checked":""}} value="mercadillo"> Mercadillo</label>
        <label><input type="checkbox" name="category[]" {{in_array("noticias", $config->category) ? "checked":""}} value="noticias"> Noticias</label>
        <label><input type="checkbox" name="category[]" {{in_array("webcams", $config->category) ? "checked":""}} value="webcams"> Webcams</label>
    </div>                                 
    <div class="form-group text-center">
        <button type="submit" class="btn btn-success btn-sm">Save</button>
    </div>
</form>

se ejecuta el save para guardar, suponiendo que el modelo Config tenga un $casts = ["category" => "array" ]

    public function update(Request $request, $id) {
        $conf = Config::find($id);
        $conf->category = $request->input('category');// ['contacto', 'noticias', 'webcams']
        $conf->save();

        return redirect('/configs')->with('success', 'menu web actualizado correctamente.');
    }
3
  • Hola, Manrrique {{in_array($config->category,"contacto") ? "checked":""}} esta linea me da error y dice json_decode() expects parameter 1 to be string, array given
    – Sara11
    Commented el 19 may. 2021 a las 9:15
  • 1
    ok, un error, primero va el valor a buscar y segundo la lista php.net/manual/es/function.in-array.php, recuerda que tu modelo Config debe tener esta línea protected $casts = ["category" => "array" ] es un parseo para no usar json_decode y/o json_encode, puedes leerlo aquí laravel.com/docs/8.x/eloquent-mutators#array-and-json-casting Commented el 20 may. 2021 a las 10:50
  • Muchas gracias! por tu ayuda me ha servido
    – Sara11
    Commented el 20 may. 2021 a las 11:19
0

Según veo, tus únicos problemas serían los siguientes:

  1. En tu edit, le estás pasando una variable llamada id, no config. Por lo que debes cambiar eso:

    public function edit($id)
    {
        $config = Config::find($id);
        return view('configs.config', compact('config'));
    }
    
  2. Lo que necesitas, según entendí por tu comentario, es unir ambos arrays en uno solo, por lo que puedes usar array_merge():

    $conf->category = array_merge($conf->category, $request->get('category'));
    

Puedes elegir hacer el array_merge aquí o en el mutador que tienes.

Lo único que hará esto es agregar lo que selecciones en la vista. Obviamente que, para eliminar, necesitarás otra lógica pero todo se resume a manejo de arrays.

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.