Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
12
respostas

Função Não tenha a palavra melhor

Não sei porque mas minha aplicação esta executando a função ao contrario, no lugar de não cadastrar se tiver a palavra "melhor", ele só cadastra se tiver a palavra melhor. veja:

public function nao_tenha_a_palavra_melhor($nome) {
                $posicao = strpos($nome, "melhor");
                if($posicao !== FALSE){
                return TRUE;
            } else {
                $this->form_validation->set_message("nao_tenha_a_palavra_melhor", "O campo '%s' não pode conter a palavra 'melhor'");
                return FALSE;
            }


        }
$this->form_validation->set_rules("nome", "nome", "required|min_length[5]|callback_nao_tenha_a_palavra_melhor");
12 respostas

Eu acredito que a função esta incorreta na aula, fiz da seguinte forma:

public function nao_tenha_a_palavra_melhor($nome){

$posicao = strpos($nome, "melhor"); if ($posicao === false) { return TRUE; }else{ $this->form_validation->set_message("nao_tenha_a_palavra_melhor", "O campo '%s' não pode conter a palavra 'melhor'"); return FALSE; } ,

Visto que a função POS retorna FALSE caso não seja encontrada a substring dentro de uma string, e nesse caso a função nao_tenha_a_palavra_melhor deve retornar TRUE.

Visto que a função *STRPOS retorna FALSE

Faça o seguinte, substitua pelo seguinte código de validação

        $posicao = strpos($nome,"melhor");
        if ($posicao) {    
            $this->form_validation->set_message("nao_tenha_a_palavra_melhor","O campo '%s' não pode conter a palavra melhor");
            return FALSE;
        }
        else {
            return TRUE;
        }

Basicamente, se encontrar a palavra "melhor" a função tem que retornar FALSE e a mensagem.

Aqui deu o mesmo problema

solução!

aqui deu o mesmo problema, quando fui assistir a aula novamente percebi que era por causa dos dois iguais.

troque if($posicao !== FALSE){

por if($posicao != FALSE){.

fiz isso aqui no meu e funcionou.

Aqui também está com o mesmo problema, mas fiz como o Paulo falou e deu certo! :)

Seria interessante saber como fazer isso para um array de palavras.

Estava pensando nisso mais cedo também Marcelo...

Bom então aqui vai uma idéia.

1) Criar o helper badwords_helper.php com o seguinte conteúdo:

function buscaPalavrasProibidas($string, $palavras) {
    if(is_array($palavras)) :
        foreach($palavras as $palavra) :
            if(is_array($palavra)) {
                $posicao = strpos_array($string, $palavra);
            } else {
                $posicao = strpos($string, $palavra);
            }
            if($posicao !== FALSE) {
                return $palavra;
            }
        endforeach;
    else :
        $posicao = strpos($string, $palavras);
        if($posicao !== FALSE) {
            return $palavras;
        }
    endif;
}

2) Dentro do controller criar a função retiraPalavras:

public function retiraPalavras($texto) {
    $this->load->helper("badwords_helper");

    $palavras = array("melhor", "incomparavel", "indescritivel");
    $palavra = buscaPalavrasProibidas($texto, $palavras);

    if($palavra) {
         $this->form_validation->set_message("retiraPalavras", "O campo '%s'"
                 . " não pode conter a palavra '{$palavra}'.");
         return FALSE;        
    } else {
         return TRUE;
    }   
}

3) Alterar a chamada da função dentro do campo nome:

"trim|required|min_length[5]|max_length[100]|callback_retiraPalavras"

Nesse exemplo, as palavras "melhor", "incomparavel" e "indescritivel" são proibidas.

O problema no teste é que strpos retorna a posição da palavra , caso ela exista. Se ela não existir vai retornar, NULL ou FALSE (ambos são ==, mas não são ===).

Se existir vai retornar um número, e se for na primeira posição, vai retonar 0 (zero) que é false e que também é null.

Basta fazer o teste por null

        if ($posicao === NULL) {
            return TRUE;
        } else {
            $this->form_validation->set_message("nao_tenha_a_palavra_melhor", "O campo '%s' não pode conter a palavra 'melhor'");
            return FALSE;
        }

    }

Este teste pega a palavra melhor mesmo na primeira posição.

Correção. O teste deve ser contra FALSE e não contra NULL

        if ($posicao === FALSE) {
            return TRUE;
        } else {
            $this->form_validation->set_message("nao_tenha_a_palavra_melhor", "O campo '%s' não pode conter a palavra 'melhor'");
            return FALSE;
        }