Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive display of data with blade, laravel

Tags:

laravel

My Controller:

class Comments extends Controller {

public function GenerateComments($id){
    $theme = DB::table('New_Themes')
                     ->where('id', $id)
                     ->get();
    $Comments = NewTheme_Comment::where('id_theme',  $id)->get();
    return view('comments', ['Themes'=>$theme, 'Comments'=>$Comments]);
}

My Table(NewTheme_Comment):

id
parent_id
id_theme
user
text
upVotes
downVotes

My view(contains the recursive display of the tree of comments like the same in reddit), ......(data) contains the bootstrap media object, and the </div>'s things are used to round up (visually) the tree of comments as it should be:

<?php
tree($Comments, 0, 0);
$var = -1;
function tree($Comments, $parent_id = 0, $level=0, $c=0) {
  global $var;
  foreach($Comments as $Comment) {
      if($Comment['parent_id'] == $parent_id) {
        If ($level > $var)  $var++; else {  
                for ($i = $var-$level+1; $i>0; $i--) { if ($c < 0) echo '</div> </div>'; else $c--;  };   
                $var=$level; 
                   }; 
        echo '........(data)';
        tree($Comments, $Comment['id'], $level+1,$c);
        };
  };
};
?> 

The problem is that .........(data) should contain this stuff:

    <div class="media">
      <div class="media-left">
        <a href="{{route('vote', ['id' => $Comment->id, 'vote' => 'plus'  ])}}"> <img class="media-object" style="height:40px; width:40px;" src="{{ URL::asset("images/upVote.svg") }}" ></a>
        <div>{{$Comment->upVotes-$Comment->downVotes}}</div>
        <a href="{{route('vote', ['id' => $Comment->id, 'vote' => 'minus'  ])}}"><img class="media-object" style="height:40px; width:40px;" src="{{ URL::asset("images/downVote.svg") }}" ></a>
      </div>
      <div class="media-body">
        <p class="media-heading">{{ $Comment->text }}</p>
        <p class="media-heading">{{ $Comment->user }} / {{ $Comment->created_at }} </p>

And I am using the blade above this line | , which I can't integrate into that echo in view, replacing the ..........(data). I have the intuition that the function I should integrate into the controller but I am broken(I spent to much time on recursive method of displaying comments) and I don't know how to take the data and print out it as whole unit recursively.

Any help is GREATLY appreciated to find a way out of this mess, thank you very much

Edit 1:

This is an example if i am filling with bootstrap media object in ........(data):

<div class="media">
  <a class="media-left" href="#">
    <img class="media-object" src="..." alt="...">
  </a>
  <div class="media-body">
    <h4 class="media-heading">Media heading</h4>
  Without 2 x </div> 

View with no data

like image 491
DomainFlag Avatar asked Jul 29 '16 18:07

DomainFlag


1 Answers

You are approaching the views in a wrong way, as blade templates are not meant to use functions, it's better to follow the below recommendations.

The best way for that is to place the function code inside a blade file, for example recursive.blade.php:

recursive.blade.php

@foreach($comments as $comment)
//place your code here
@endforeach

Then in your main blade you can call it several times:

main.blade.php

<div>
    @include('recursive', ['comments' => $comments])
</div>
like image 197
Mina Abadir Avatar answered Sep 28 '22 03:09

Mina Abadir