Solucionado (ver solução)
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;
        }