ToDoVel [Parte 13] Criando Listas de Tasks

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

Acontece que agora temos um monte de tarefas soltas.
Seria legal se fosse possível agrupar essas tasks em listas de coisas para fazer (to-dos).
Assim, poderiamos criar uma lista de coisas para fazer no trabalho, itens para comprar no mercado, pessoas para mandar email desaforado…

Criando a Tabela de Listas e Atualizando a Tabela de Tasks

Vamos criar uma nova Migration para ter um script que cria a tabela com as listas de to-do e vamos aproveitar para alterar a tabela de tasks para que cada task tenha uma foreign key para uma lista.

php artisan migrate:make add_lists

E ai, no arquivo criado, vamos escrever as funções de up() e down()

public function up()
{
   //creating lists table
   Schema::create('listas', function($table) {
       $table->increments('id');
       $table->string('titulo', 100); //coluna de titulo, varchar de 100 caracteres
       
       $table->timestamps();
   });
   
   
   //add foreign key to TASKS table
   Schema::table('tasks', function($table) {
       $table->integer('list_id')->unsigned()->nullable();
       
       $table->foreign('list_id')->references('id')->on('listas')->onDelete('cascade')->onUpdate('cascade');
   });
}


public function down()
{
   //remove foreign key
   Schema::table('tasks', function($table){
       $table->dropForeign('list_id');
       $table->dropColumn('list_id');
   });
   
   Schema::dropIfExists('listas'); //se a tabela existir, exclui
}

O método up() é dividido em duas etapas: a criação da tabela listas e a alteração da tabela tasks.
Criar tabela já aprendemos, lavo minhas mãos.

Alterar tabela é coisa nova, mas muito simples (até agora, houve algo difícil de fazer com o Laravel 4?)
Para alterar a tabela utilizo Schema::table(‘tabela’, closure);
ATENÇÃO: Como migrations podem, e devem, ser utilizados em ambiente de produção, ALTERAR tabelas é sempre um perigo pois pode-se estar trabalhando com dados valiosos.
Vale a pena testar em ambiente de desenvolvimento e, antes de executar em produção, FAZER BACKUP!

Na tabela tasks adicionei uma nova coluna chamada list_id que será o id da lista pai da task.
Marquei como nullable pois, caso a tabela já possua valores, quando a migration criar a nova coluna, o valor null será o valor default.
E ai, marquei a coluna list_id como sendo foreign.

É FÁCIL OU NÃO É?
Chega dá vontade de rir por nada.

HAHAEOUIAEHIOEHIOEHOIAHUEOAUHEOAHUEOAUIEH OIHOAIHOAEIHIOAEUHOAIHOAUHIOHUAOIUHEWOHUAEOHAE OUHEOUIHAEOUAHOIHUEOHAEIHAEOHAEOIHAEIOHUA AEHAOEHUOAEUHOAEHOAEUIHOAIHOAUEHOAUIEHOAUHOIAUHOIHU AEOUIAHEOAUIEHOUIAHEOIHUAEOUIAHEOIUAHEOIA HUEOIAUHOAEUIHOAIEHOAIEUHIOAEUHOAIEHIOAEHIOEHIOUE HOIAEUHAIOEUHAOE

Rota Para Criar Listas

/*    lists    */
Route::get('list/create', 'ListController@getCreate');
Route::post('list/create', 'ListController@postCreate');

Controller Para Criar Listas

O controller ListController.php que vou criar para minhas listas é igualzinho ao TaskController.php, claro que com leve adaptações.

<?php

class ListController extends BaseController {
	public function getCreate() {
		return View::make('add_list');
	}
	
	
	public function postCreate() {
		//criando regras de validação
		$regras = array('titulo' => 'required');
		
		//executando validação
		$validacao = Validator::make(Input::all(), $regras);
		
		//se a validação deu errado
		if ($validacao->fails()) {
			return Redirect::to('list/create')->withErrors($validacao);
		}
		//se a validação deu certo
		else {
			$list= new Lista;
			$list->titulo = Input::get('titulo');
			$list->save();
			
			return View::make('add_list')->with('sucesso', TRUE);
		}
	}
}

View Para Criar Listas

A view para criar listas foi é um trabalho de preguiçoso: copiar add_task.blade.php, colar e renomear para add_list.blade.php.
E ai, pra não dizer que é fácil demais, só alterar o Form::open().

@extends('template')

@section('conteudo')

    <div class="row-fluid marketing">
        <div class="span6">
            @if ( count($errors) > 0)
                Erros encontrados:<br />
                <ul>
                    @foreach ($errors->all() as $e)
                        <li>{{ $e }}</li>
                    @endforeach
                </ul>
            @endif
            
            @if ( isset($sucesso) )
                <h3>FUNCIONOU!</h3>
            @endif
            
            {{ Form::open( array("action" => "list/create") ) }}
                {{ Form::label('titulo', 'Nova Lista:') }}
                    {{ Form::text('titulo') }}
                
                {{ Form::submit('OK') }}
            {{ Form::close() }}
            
        </div>
    </div>
@stop

Criando o Model List

¬¬
Sério que eu vou precisar dizer como faz?

Dúvidas???
Deixe um comentário ou veja esse projeto no GitHub:
https://github.com/frenetic/todovel

18 thoughts on “ToDoVel [Parte 13] Criando Listas de Tasks

  1. Parabéns pela sequência de posts, bem intuitivo, assim como você comecei a estudar Django e Rails devido ser cansativo trabalhar com coisas repetidas no php.

    Após conhecer o Laravel, descobri uma maneira de trabalhar com a liguagem que mais gosto =D.

    Poderia criar tutoriais futuros sobre a criação de bundles, e fazer upload de imagens com ajax.

  2. Ola,

    No Form:open, apareceu uma mensagem de erro. Ajustei para o action para “ListController@postCreate” e resolveu.

    Grato,
    Helder

  3. Bom dia, eu gostaria primeiramente de agradecer pela iniciativa de criar este tutorial para difundir ainda mais o Laravel 4, mas eu também gostaria de questionar o seu método bem “liberal”.
    Este curso apresenta muitos erros de escrita e algumas inconsistências no código, o que acaba afastando quem quer encarar o Laravel como uma coisa mais séria.
    Seria legal dar uma revisada no que foi escrito para ter a certeza que o código funciona como deveria, pois isso afeta também a credibilidade do autor.

    Abraço.

    1. Os código funcionam no ambiente proposto no início do projeto, Laravel 4 beta 4.
      99% dos códigos funcionam sem alterações no Laravel 4, visto que poucas coisas foram alteradas.

      Os artigos apresentados aqui não são um curso.
      São uma demonstração prática de como o Laravel 4 funciona.
      Eu apenas desejei documentar uma experiência de introdução ao Laravel 4.
      Escrevi tudo enquanto programava cada etapa, para ter os artigos bem fiéis a forma de fazer.
      Os artigos são divididos em simples etapas e são curtos pelo simples motivo de eu ter pouco tempo para me dedicar a eles.
      Também, quase nunca tive tempo para revisar.
      Após escrever, eu sempre dava uma lida rápida e publicava.
      Logo, alguns erros de digitação, concordância verbo-nominal e até conjugação verbal podem ter ocorrido.

      Eu realmente gostaria de ter mais tempo para melhorar os artigos, atualizar a biblioteca CSS/JavaScript que faz highlight dos códigos e corrigir os erros de português.
      Eu gostaria bastante de ter uma melhor documentação de introdução ao programador PHP curioso no Laravel.
      Mas, no momento, tenho outros focos que demandam muito mais tempo.

      Fica então o convite: após ler a documentação do Laravel (http://laravel.com), faça seu tutorial e divulgue na comunidade brasileira de Laravel (http://laravel.com.br)

      1. Falar do que ta pronto é fácil.
        Vejo isso como uma introdução ao Laravel e não uma forção, como toda linguagem, com o tempo a gente vai se aperfeiçoando.

        Vamos ficar no aguardo de um tutorial da parte do Sr. Marcelo.

    2. Chega dá vontade de rir.

      HAHAEOUIAEHIOEHIOEHOIAHUEOAUHEOAHUEOAUIEH OIHOAIHOAEIHIOAEUHOAIHOAUHIOHUAOIUHEWOHUAEOHAE OUHEOUIHAEOUAHOIHUEOHAEIHAEOHAEOIHAEIOHUA AEHAOEHUOAEUHOAEHOAEUIHOAIHOAUEHOAUIEHOAUHOIAUHOIHU AEOUIAHEOAUIEHOUIAHEOIHUAEOUIAHEOIUAHEOIA HUEOIAUHOAEUIHOAIEHOAIEUHIOAEUHOAIEHIOAEHIOEHIOUE HOIAEUHAIOEUHAOE

  4. Muito bom o post. Fiquei o feriado inteiro sem olhar para computador, finalmente consegui isso… 😉

    Para criar o migration, não sei, mas tive que fazer assim php artisan migrate:make add_lists e não migration como vc passou, mas criou, sem crise, a minha dúvida e problema foi depois que escrevi o código do migration AddLists, pois quando fui rodar o php artisan migrate para poder criar/alterar as tabelas ele me apagou tudo do banco, inclusive da tabela migrations, e dai criou as tabelas. Fiz algo de errado?

    Muito obrigado mesmo por toda ajuda.

    1. Você está certo, é MIGRATE mesmo.
      Não sei por que escrevi Migration…

      Se o Laravel apagou tudo, inclusive a tabela de migrations, você não fez nada de errado.
      Quem fez foi o Laravel…
      Se você conseguir reproduzir esse erro novamente, recomendo abrir um bug com o pessoal da linguagem.

      1. Opa, entendi, mas tentei refazer algumas coisas e não deu o erro, funcionou td, ainda bem que estou em teste e nada de importante foi apagado, mas com isso aprendi mais uma fez, SEMPRE fazer BACKUP antes.
        Valew

  5. Muito bom a série, queria ter ‘descoberto’ esse material antes.. rsrs

    Queria apenas salientar que no ListController.php deu pau aqui, resolvi alterando o seguinte:

    return Redirect::to(‘list/create’)->withErrors($validacao);

    por

    return Redirect::to(‘list/add’)->withErrors($validacao);

    É isso. Parabéns pela série. 😉

Deixe uma resposta

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