ToDoVel [Parte 16] Listando as tasks de uma lista

Observação: Este tutorial refere-se ao Laravel-4-BETA, estando totalmente DESATUALIZADO para a versão atual. Muita coisa mudou no framework…

Aqui é molesa.
Anteriormente fizemos uma listagem de todas as tasks da nossa app.
Agora vamos fazer a listagem por lista e não um geralzão.

Route

Route::get('list/{lista_id?}', 'ListController@listarTasks');

Controller

ListController.php

public function listarTasks($lista_id = 0) {
	if ($lista_id == 0)
		return $this->listar();
	
	return View::make('lista')->with('lista', Lista::findOrFail($lista_id));
}

View

Para criar o arquivo lista.blade.php vou copiar o arquivo list_tasks.blade.php.
Faço isso por que quero utilizar tudo o que fiz dentro de list_tasks.blade.php, com algumas modificações.
E também por que eu estou com preguiça de digitar tudo.

@extends('template')

@section('conteudo')

    <h3>{{ $lista->titulo }}</h3>
    
    <p>
        <a href="{{ URL::to('task/add') }}/{{ $lista->id }}">Adicionar Task</a> <br />
    </p>
    
    <ul style="list-style: none;">
        @foreach ($lista->tasks as $task)
            <li class="task">
                @if ($task->status)
                    <span class="label label-success">{{ $task->titulo }}</span>
                @else
                    <label data-task-id='{{ $task->id }}'>
                        <input type="checkbox" />
                        {{ $task->titulo }}
                    </label>
                @endif
            </li>
        @endforeach
    </ul>
@stop


@section('custom_script')
    <script language="javascript">
        $(document).ready( function() {

            $('li label input').on('change', function(){
                var task_id = $(this).parent().data('task-id');
                //var li = $(this).parent().parent();
                var li = $(this).closest(".task");

                //ajax post request
                $.post(
                    "/task/check",
                    {task_id: task_id},
                    function(data) {
                        //callback do ajax request
                        if (data.status == true) {
                            li.html("<span class='label label-success'>"+data.titulo+"</span>");
                        }
                    }
                );
            });
        });
    </script>
@stop

Vale ressaltar a alteração no link para criação de novas tasks.
Antes era assim: <a href=”{{ URL::to(‘task/add’) }}”>Adicionar Task</a> .
Agora é assim: <a href=”{{ URL::to(‘task/add’) }}/{{ $lista->id }}”>Adicionar Task</a> .

Por que isso?
Cenas do próximo capítulo 😀

6 thoughts on “ToDoVel [Parte 16] Listando as tasks de uma lista

  1. Olha só, estou conseguindo entender bem até aqui, e até mesmo o meus erros, que bom né :p

    O que eu tentei foi passar um id que não existe e me retornou um erro, só que não soube como arrumar. Tentei dar uma olhada na documentação em http://laravel.com/docs/eloquent mas não sei ainda onde que eu tenho que fazer as alterações. Depois, se puder dar uma ajuda.

    Valew

    1. A idéia de passar um id que não existe é retornar erro mesmo.
      A gente está usando o comando Lista::findOrFail($lista_id).
      Ele funciona assim: tenta encontrar no banco de dados, se não conseguir FAIL.
      Você pode utilizar esse fail num bloco try/catch para gerar páginas de erro 404 customizadas (isso eu não ensinei nesse tutorial).

      Se você quer que pare de dar erro, utilize apenas Lista::find($lista_id).
      Só que, no caso de passar um id que não existe, o comando retornará NULL.
      Ai, na view, quando você tentar exibir alguma coisa, você terá PHP Error, por estar tentando fazer operações com NULL.

  2. Depois de 2 dias apanhando aqui consegui resolver uma parada aqui.
    Foi o seguinte:
    No custom_script tive problemas com o envio da requisição ajax com o endereço “estático” da rota, no caso o “/task/check”. Pois na listagem de todas as tarefas (list_tasks) funcionou na boa, mas quando era acessado/requisitado a partir da view lista.blade dava error 404 por não encontrar a rota porque a url neste caso muda e o endereço para a rota se torna inválido.
    Neste caso a tarefa está dentro de uma lista, por isso o problema, aí tive que colocar caminho relativo (“../task/check”) … mas na boa achei pouco “enxuto” trabalhar assim, aí pensei: pow o Laravel/Blade é tão foda que deve dar pra usar {{ }} aqui dentro, então foi isso. 🙂
    É só colocar no custom_script por exemplo:
    $.post(“{{ route(‘nomeDaRotaNomeada’) }}, {task_id: task_id}, function(data){ … tudo igual … });

    A vantagem que vejo é que independente em que nível a view esteja ou se ela possui subviews funcionará sempre… em fim, o Laravel/Blade vai pegar a url para a rota totalmente qualificada e plotar na view que solicitar.

    OBS: Eu nomeei a a rota de task/check, não sei se passar a rota explicitamente vai rolar.

    1. Esqueci, também usar task/check, /task/check, e nada funcionou tão bem e dinâmico quanto o exposto acima.
      E para não esquecer, porra Frenetic obrigado mais uma vez pelo tutorial cara, parabéns, estou aprendendo muito e na boa, Laravel está me fazendo vontade de retornar a estudar mais profundamente o PHP, pois já estava quase o abandonando, só estava estudando Java 🙂 vlw

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *