Bonjour tous le monde,

J'ai une base de données qui contient une colonne position. A chaque nouvelle entrée cette colonne se voit affecté la valeur : nombre d'entrée + 1.
Ainsi ca me permet d'ordonner mes champs par rapport à cette colonne position.
J'ai créer une fonction qui permet lorsqu'on l'appelle de changer cette ordre, donc la valeur du champ position.
Cependant, ma fonction marche bizarrement puisque j'arrive seulement à inverser la position de ses entrée (la 1 passe en dernier, la 2 en avant dernière, ...) et ceci de toute les manière possibles. Une fois l'ensemble des champs inverser il m'est impossible de modifier l'ordre d'aucune de mes entrées. C'est un comportement que je n'aurais pas réussi à codé si je l'avais désiré. Ca relève presque de la sorcellerie :D. Donc avant d'aller démarabouter mon ordi je fais appel à vos précieux conseil.

Voici ma vue
            <tbody>
            <?php $count=1 ?>
            @foreach ($prestations as $prestation)
                <tr id="ref{{ $prestation->id }}" class="admin--table--item">
                    <td class="admin--table--item--checkbox"><input type="checkbox" name="ref{{ $prestation->id }}" id="ref{{ $prestation->id }}"></td>
                    <td class="admin--table--item--link"><a href="{{ URL::action('PrestationController@edit', $prestation->id) }}">{{ $prestation->title }}</a></td>
                    <td class="admin--table--item--btns">
                        <a href="{{ URL::action('PrestationController@edit', $prestation->id) }}" class="button">Modifier</a>
                        {!! Form::open(['method' => 'DELETE', 'action' => ['PrestationController@destroy', $prestation->id]]) !!}
                        {!! Form::submit('Supprimer', ['class' => 'red', 'onclick' => 'return confirm(\'Voulez-vous vraiment supprimer cette prestation ?\')']) !!}
                        {!! Form::close() !!}
                    </td>
                    <td class="admin--table--item--position">
                        @if($count==1)
                            <span>&#9650;</span>
                        @else
                            {!! Form::open(['method' => 'PUT', 'action' => ['PrestationController@up']]) !!}
                            {{ Form::hidden('position', $prestation->position, ['id'=>'position']) }}
                            {!! Form::submit('&#9650;', ['class' => 'up']) !!}
                            {!! Form::close() !!}
                        @endif

                        @if($count==count($prestations))
                            <span>&#9660;</span>
                        @else
                            {!! Form::open(['method' => 'PUT', 'action' => ['PrestationController@up']]) !!}
                            {{ Form::hidden('position', $prestation->position+1, ['id'=>'position']) }}
                            {!! Form::submit('&#9660;', ['class' => 'down']) !!}
                            {!! Form::close() !!}
                        @endif
                        <?php $count++ ?>
                    </td>
                </tr>
            @endforeach
            </tbody>
        </table>

et voici la fonction up :

public function up(Request $request)
    {
        $position = $request->input('position');

        $prestation = $this->prestationRepository->updateSpecific($position+0, $position-1);

        $prestation_min_one = $this->prestationRepository->updateSpecific($position-1, $position+0);
        //dd($prestation . ' et ' . $prestation_min_one);
        return redirect()->action('PestationController@index');
    }

et enfin la fonction updateSpecific de mon repository :

    public function updateSpecific($position, $data)
    {
        $query = $this->prestation->where('position',$position)->get();
        $query[0]->position = $data;
        $query[0]->save();
        return $position .' en ' . $data;
    }

Malheureusement, je ne suis pas sur d'avoir été suffisament clair pour être compréhensible. Moi même ne comprenant pas le problème j'arrive mal à l'explicité, mais je tente quand même peut être que ca parlera à l'un d'entre vous.

Merci d'avance et bonne soirée

3 réponses


Oui absolument le but est de pouvoir modifier l'ordre d'apparition pour que ces "prestations" soit classé dans un ordre défini par l'utilisateur.

On voit sur l'image la possibilité avec des flèches haut-bas de monter ou descendre la prestation.

Je peux comprendre que mon explication est peu intelligible. Mais sans tenir compte de ma solution avez-vous d'autre méthode à me conseillé pour réaliser ce genre d'action.

Je pense que ton système est le bon, cependant penser à mettre un index pour l'index de position

Et, je sais pas si c'est plus simple, mais quand tu montes ou descend, tu as juste à inverser les positions,
Genre tu aurais une fonction qui te permet de trouver les deux,

$first = ;// Ici c'est l'élément que dont tu veux changer la position;
$next = ;// Ici l'élément avec lequel tu devrait interchanger la position; genre $first->next() si tu veux mettre au suivant ou $first->previous() si tu veux mettre au précédant
// et tu inverses les positions

Hello,

Personnellement je ferais ça comme ça :
Une colonne 'position' (int) dans la table.

Lors d'un mouvement vers le haut ou le bas :

$prestation = Prestation::find($id);

//En fonction de si on 'monte' ou on 'descend' on incrémente de 1 ou on décrémente
if($monter) $prestation->position++;
else $prestation->position--;

if($prestation->save()){
    //On recherche maintenant une prestation avec la position que l'on vient d'attribuer (mais sans vouloir récupérer celui qu'on vient de modifier)
    $other_prestation = Prestation::wherePosition($prestation->position)->whereNotId($prestation->id)->first();

    //En fonction, on décrémente / incrémente la position de l'autre prestation
    if($monter) $other_prestation->position--;
    else $other_prestation->position++;
    $other_prestation->save();
}

Le code n'est pas forcément bon, mais c'est dans ce sens que je serais aller. Bien faire attention a ce que la position soit unique par contre dans mon cas !