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!