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 😀
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
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.
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.
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
Que bom 😀
Fico feliz por você estar feliz!