Quando utilizamos o zend framework para cada action chamada ele faz forward automaticamente para uma pagina do mesmo nome e quando estamos utilizando AJAX esse não é o objetivo. Para resolver esse problema basta colocar a linha no corpo da action.

  $this->_helper->viewRenderer->setNoRender();

Alguns tutoriais antigos que coloquei sobre AJAX eu utilizava uma página que apenas ecoava o objeto, isso não é necessário utilizando o recurso acima e para colocar o objeto no response para poder ler na página basta fazer.

$this->_response->appendBody($objJson);
Anúncios

O pessoal do zend liberou a versão 1.6 RC 1(Release Candidate), quem quiser testar as novas funcionalidades.

http://devzone.zend.com/article/3712-Zend-Framework-1.6-Release-Candidate-1-now-available

Post migrado em:

http://programatik.soucafecomleite.com.br/csharp-casting

Existe uma versão do mesmo tutorial porém utilizando AJAX aqui:

http://programatik.soucafecomleite.com.br/zend-validate-com-ajax

 

Vou mostrar o uso básico do Zend_Validate, porém não tem segredo. Primeiro começamos com um formulário básico.


  <form name="frm" action="<? echo $this->baseUrl ?>/Produto/insere" method="post">
<table>
<tr>
<td>
      Nome do Produto:</td>
<td>
       <input type="text" name="nomeProduto"/></td>
</tr>
<tr>
<td>
      Valor Produto:</td>
<td>
      <input type="text" name="valorProduto" /></td>
</tr>
</table>
<input type="submit" value="Inserir" />
  </form>

		class ProdutoController extends Zend_Controller_Action
	{

		function insere(){

			// Pegando os valores da camada de visao

			$nome       = $this->_request->getParam("nomeProduto");
			$valor      = $this->_request->getParam("valorProduto");

			// Dando Loader na classes de validacao
			Zend_Loader::loadClass('Zend_Validate_StringLength');
			Zend_Loader::loadClass('Zend_Validate_Float');

			// Instanciando os validadores
			$validadorNome       = new Zend_Validate_StringLength(1,100);
			$validadorValor      = new Zend_Validate_Float();

			// Setando as mensagens e os tipos de validação
			$validadorNome->setMessage(
					"Campo nome é obrigatório".,
					Zend_Validate_StringLength::TOO_SHORT);

			$validadorNome->setMessage(
					"Campo nome maior que o permitido.",
					Zend_Validate_StringLength::TOO_LONG);

			$validadorValor->setMessage(
					"Campo valor nao é um número válido.",
					Zend_Validate_Float::NOT_FLOAT);

			// Verificando se os valores digitados sao válidos
			if ( $validadorNome->isValid(trim($nome)) &&
				 $validadorNome->isValid($nome) &&
				 $validadorValor->isValid($valor) ){

				// Executa os procedimentos para insercao	

			} else {
				// Deu erro na validacao

				$msg = array_merge( $validadorNome->getMessages(), $validadorValor->getMessages() );

// Na variavel $msg vai ter todos os erros apontados no formulario,
//basta exibir em um alert ou direto no corpo da página.
			}

		}

	}

Uma boa prática é carregar todas as mensagens em um arquivo texto ao invés de utilizar as mensagens direto no arquivo do controller, apesar de php ser uma linguagem script e nao ser necessário a compilação de todo o sistema para apenas a troca de uma mensagem, um arquivo texto com todas as mensagens é válido pois iremos ter centralizado todas as mensagens.

Pode usar um absctract controller que faz esse papel, colocando a mensagem na camada de visao pois ela poderá usar em todos os controladores.

Uma das técnicas que tem mais sido usadas é a edição in-line do gridview e o comum de se encontrar é utilizar a última linha da gridview com os campos para inserção, porém se você utilizar o commandfield para adicionar os linkbutton pode dar um pouco de dor de cabeça para conseguir deixar um layout legal.

O resultado que esperamos conseguir é algo nesse estilo:

aspx

        <asp:GridView 
            ID="grid1" 
            runat="server"                
            ShowFooter="true"   
            OnRowDataBound="gvRow"                                         
        >
        <Columns>
              <asp:CommandField 
                    HeaderText="Opções" 
                    EditText="Editar"                                                            
                    UpdateText="Salvar"
                    ShowEditButton="true"
                    CancelText="Cancelar"
                    ShowCancelButton="true"
                    DeleteText="Excluir"
                    ShowDeleteButton="true"                                           
                    FooterText="Inserir"                                                    
            /> 
        protected void gvRow(object sender, GridViewRowEventArgs e)
        {
           //Verifica se é o rodapé
            if (e.Row.RowType.Equals(DataControlRowType.Footer))
            {
                // Deixando o linkbutton centralizado
                e.Row.Cells[0].Style.Add("text-align", "center");
                // Instanciando o linkbutton
                LinkButton lb = new LinkButton();
                lb.Text = "Inserir";
                // Registrando o evento
                lb.Click += new EventHandler(gvSistemasInserir);             
                // Adicionando a celula
                e.Row.Cells[0].Controls.Add(lb);
            }
        }

Bem, o que basicamente fizemos foi no evento de RowDataBound, verificar quando se está no rodapé e adicionar na primeira célula o link de Inserir, é um método meio “porco” mas funciona e no momento meu lema é “Funcionou, tá certo”

Post migrado em:

http://programatik.soucafecomleite.com.br/fluent-interfaces

Microsoft PEX(Program EXploration) é um framework para auxiliar a criação de testes para o seu programa, ele automaticamente gera os testes abrangendo todas as possibilidades possiveis, além disso ainda sugere como corrigir os bugs.

Lembrando que é um framework, então ele não trabalha sozinho, você deve escrever o teste e ele vai cobrir todas as possibilidades possiveis. Achei um blog que mostra alguns testes e os relatórios que ele produz.

Página Oficial: Microsoft PEX