Bonjour,

Voila je rencontre un petit problème avec mon code. Je cherche à mettre à jour une base de donnée avec un formulaire basique. Je récupère en premier des infos.

Ce que je fais

Dans mon controller, j'ai 2 actions, l'action edit() qui me permet de récupérer les données et l'action update() qui permettrait d'enregistrer dans la base de donnée!
Mes actions de mon controller:

<?php
public function edit($id){
        $posts = Post::published()
            ->select('id', 'title')
            ->orderBy('created_at','desc')
            ->where('publish_date', '>=', date('Y-m-d H:i:s', strtotime('- 2 days')))
            ->lists('title', 'id')
            ->toArray();
        $newsletters = Newsletter::with('newsletterpost')
            ->where('type', 'current')
            ->where('id', $id)
            ->get()
            ->toArray();
        $newsletters = current($newsletters);
        return view('admin.newsletter.edit', compact('newsletters', 'posts'));
    }
    public function update(Request $request,  $id)
    {
        Newsletter::where('id', $id)->update($request->all());
        //redirect
    }
    ?>

Et ma vue:

{!! Form::open(['route' => ['admin.newsletter.update', $newsletters['id']] ]) !!}
                    <input name="_method" value="POST" type="hidden">
                    <?php
                        for($i=0; $i<=5; $i++){
                            $current = $i+1;
                            if($newsletters['newsletterpost'])
                            {
                                $post_id = $newsletters['newsletterpost'][$i]['post_id'];
                            }
                            else{
                                $post_id = '';
                            }
                            ?>
                            <div class="col-lg-12">
                                <div class="col-lg-11">
                                    <div class="form-group">
                                        <div class="col-lg-2">
                                            {!! Form::label("newsletterpost[$i]['post_id']", 'Article n°' . $current) !!}
                                        </div>
                                        <div class="col-lg-10">
                                            {!! Form::select("newsletterpost[$i]['post_id']", $posts, $post_id, ['class' => 'form-control selectoronlect', 'data-id'=> $i]) !!}
                                        </div>
                                    </div>
                                </div>
                                <div class="col-lg-1">
                                    <p style="text-align: center">
                                        <a href="#" class="url_{{ $i }}" target="_blank"><i class="fa fa-file-text-o"></i></a>
                                    </p>
                                </div>
                            </div>
                            <br /><br /><br />
                            <?php
                        }
                    ?>
                    <br /><br /><br />
                    <div class="col-lg-12">
                        <a href="#" class="btn btn-primary">Aperçu de la newsletter</a>
                    </div>
                    <br /><br /><br />
                    <div class="col-lg-12">
                        <div class="form-group">
                            <div class="col-lg-2">
                                {!! Form::label('state', 'Etat de la newsletter') !!}
                            </div>
                            <div class="col-lg-10">
                                <?php
                                $state = $newsletters['state'];
                                $etat = array(0 => "Brouillon", 1 => "Publier", 2 => "Déjà envoyé");
                                ?>
                                {!! Form::select('state', $etat, $state, ['class' => 'form-control']) !!}
                            </div>
                        </div>
                        {!! Form::submit('Valider', ['class' => "btn btn-primary"]) !!}
                    </div>
                    {!! Form::close() !!}

Le soucis est que je n'arrive pas à enregistrer. Je pense que mon soucis vient de ma vue et non de mon code php présent dans le controller.

Je pense que mon soucis vient de la partie du "for".
Voyez vous mon erreur?
Merci pour l'aide que vous pourrez m'apporter.

7 réponses


leknoppix
Auteur
Réponse acceptée

@Shark, merci pour ton code. Je vais voir comment faire dans mon cas puisque dans le tiens, tu ajoutes 1 seul commentaire à la fois, alors que dans mon cas, c'est, pour l'instant, 6 insertions à la fois.

Bonjour

J'ai continué mes cherches et je pense je dois être con!
J'ai donc, dans un premier temps, restructurer mon formulaire car je pense que c'est bien lui qui merde à la base.
Voici mon code actuel pour mon formulaire:

<div class="col-lg-12">
                    {!! Form::open(['route' => ['admin.newsletter.update', $newsletters['id']] ]) !!}
                    <input name="_method" value="POST" type="hidden">
                    <?php
                        for($i=0; $i<=5; $i++){
                            $current = $i+1;
                            ?>
                            <div class="col-lg-12">
                                <div class="col-lg-11">
                                    <div class="form-group">
                                        <div class="col-lg-2">
                                            {!! Form::label("newsletterpost[$i]['post_id']", 'Article n°' . $current) !!}
                                        </div>
                                        <div class="col-lg-10">
                                            <?php if($newsletters['newsletterpost']) { ?>
                                                <?php $post_id = $newsletters['newsletterpost'][$i]['post_id']; ?>
                                                {!! Form::select("newsletterpost[$i]['post_id']", $posts, $post_id, ['class' => 'form-control selectoronlect', 'data-id'=> $i]) !!}
                                                {!! Form::hidden("newsletterpost[$i]['id']", $newsletters['newsletterpost'][$i]['id'])!!}
                                            <?php } else { ?>
                                                {!! Form::select("newsletterpost[$i]['post_id']", $posts, '', ['class' => 'form-control selectoronlect', 'data-id'=> $i]) !!}
                                            <?php }
                                                ?>
                                                {!!  Form::hidden("newsletterpost[$i]['newsletter_id']", $newsletters['id']) !!}
                                        </div>
                                    </div>
                                </div>
                                <div class="col-lg-1">
                                    <p style="text-align: center">
                                        <a href="#" class="url_{{ $i }}" target="_blank"><i class="fa fa-file-text-o"></i></a>
                                    </p>
                                </div>
                            </div>
                            <br /><br /><br />
                            <?php
                        }
                    ?>
                    <br /><br /><br />
                    <div class="col-lg-12">
                        <a href="#" class="btn btn-primary">Aperçu de la newsletter</a>
                    </div>
                    <br /><br /><br />
                    <div class="col-lg-12">
                        <div class="form-group">
                            <div class="col-lg-2">
                                {!! Form::label('state', 'Etat de la newsletter') !!}
                            </div>
                            <div class="col-lg-10">
                                <?php
                                $state = $newsletters['state'];
                                $etat = array(0 => "Brouillon", 1 => "Publier", 2 => "Déjà envoyé");
                                ?>
                                {!! Form::select('state', $etat, $state, ['class' => 'form-control']) !!}
                            </div>
                        </div>
                        {!!  Form::hidden('id', $newsletters['id']) !!}
                        {!! Form::submit('Valider', ['class' => "btn btn-primary"]) !!}
                    </div>
                    {!! Form::close() !!}
                </div>

Lors de la validation, j'obtiens une erreur de "synthaxe".

[2018-10-21 18:48:03] dev.ERROR: ErrorException: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array in /home/leknoppix/................../vendor/laravel/framework/src/Illuminate/Support/helpers.php:686

Par contre, quand je fais une print_r() suiivi d'un die(), j'obtiens bien un tableau avec les informations de ce formulaire:

Array
(
    [_token] => dTK7cguWBEF06BBC55RWpFwKOi6hYlBEHtuH42Gi
    [_method] => POST
    [newsletterpost] => Array
        (
            [0] => Array
                (
                    ['post_id'] => 30503
                    ['newsletter_id'] => 2
                )

            [1] => Array
                (
                    ['post_id'] => 30504
                    ['newsletter_id'] => 2
                )
            [2] => Array
                (
                    ['post_id'] => 30505
                    ['newsletter_id'] => 2
                )
            [3] => Array
                (
                    ['post_id'] => 30506
                    ['newsletter_id'] => 2
                )
            [4] => Array
                (
                    ['post_id'] => 30507
                    ['newsletter_id'] => 2
                )
            [5] => Array
                (
                    ['post_id'] => 30508
                    ['newsletter_id'] => 2
                )
        )
    [state] => 0
    [id] => 2
)

Ce qui prouve que mon action du controller est bel et bien appelé.
Si quelqu'un aurait une idée, je suis preneur car je ne sais plus quoi faire.

Merci d'avance

Je ne sais pas si j'ai juste, mais pour moi il manque une "}" à la fin de ton script

                        for($i=0; $i<=5; $i++){
                            $current = $i+1;
                            if($newsletters['newsletterpost'])
                            {
                                $post_id = $newsletters['newsletterpost'][$i]['post_id'];
                            }
                            else{
                                $post_id = '';
                            } 
                            //<----------- ici

Ce qui donne :

for($i=0; $i<=5; $i++) 
{
    $current = $i + 1;
    if ($newsletters['newsletterpost']) 
    {
        $post_id = $newsletters['newsletterpost'][$i]['post_id'];
    } else 
        {
            $post_id = '';
        } 
}//<--------------- celle-ci en plus

Merci @Shark pour ta réponse, mais j'ai enlevé ce if qui fait un traitement un peu idiot. regarde dans mon second post, c'est mon code actuel.

J'ai fait une petite recherche sur ton erreur ErrorException: preg_replace() et je trouve

//Error is here: array within array
        $data = array(
        [
            'menutype' => $post['menutype'],
            'status' => $post['status'],
        ]);
   La solution vient apprement d'un single array
        //Single array declaration
        $data =
        [
            'menutype' => $post['menutype'],
            'status' => $post['status'],
        ];

Voici le lien si ca peut t'aider. je regarderais ton code plus tard dans la journée, mais apprement cela vien bien du controller et pas de ta vue :)

    https://stackoverflow.com/questions/35501881/laravel-5-2-errorexception-preg-replace-parameter-mismatch-pattern-is-a-st

Je viens de voir ta réponse. Je pense que tu as raison. Comme je me disais, c'est moi qui me suis bien chez dans la vue, je cherche mon erreur.

Je te mets mes fonctions de mon commentsController si ca peux aussi aider :

public function index(Post $post)
  {
    return response()->json($post->comments()->with('user')->latest()->get());
  }
  public function store(Request $request, Post $post)
  {
    $comment = $post->comments()->create([
      'body' => $request->body,
      'user_id' => Auth::id()
    ]);
    $comment = Comment::where('id', $comment->id)->with('user')->first();
    broadcast(new NewComment($comment))->toOthers();
    return $comment->toJson();
  }