Pergunta

Estou tentando criar um formulário usando o componente Zend_form, mas o número de elementos varia. As informações para cada elemento zend_form são armazenadas em um banco de dados (nome, opções, validadores, filtros etc.).

O aplicativo em que estou trabalhando consiste em pesquisas de construção que contêm um número variável de perguntas. Cada pergunta está associada a diferentes matrizes de respostas. Por fim, meu objetivo é criar matrizes de botões de rádio/caixa de seleção, dinamicamente, do lado do servidor.

Estou procurando uma maneira bonita de gerar meu formulário, mas não tenho certeza da melhor maneira de carregar o modelo dentro do formulário. O modelo deve ser carregado no controlador e depois passou (de alguma forma, através de um parâmetro?) Diretamente para o formulário, ou é melhor carregar o modelo no método do formulário init ()? Onde é o melhor lugar para colocar a lógica, deve estar dentro da classe de formulário, ou dentro do controlador ou dentro do modelo?

Minha idéia é buscar propriedades do elemento de formulário (nome, regras, filtros etc.) no banco de dados, depois iterar e finalmente renderizar o formulário. O que você acha dessa abordagem? Por fim, os elementos serão adicionados dinamicamente (lado do cliente), desta vez, usando o AJAX e uma biblioteca JavaScript (como o jQuery).

Aqui estão alguns links úteis que encontrei no Google, mas acho que todos respondem a uma pergunta ligeiramente diferente da minha:

Na construção de formas dinâmicas, o lado do servidor:

Na construção de formas dinâmicas, o lado do cliente, com processamento de Ajax:

Foi útil?

Solução

Você pode estender zend_form.

O formulário Zend não é um bom lugar para a lógica, apenas a representação de formação.

Portanto, carregue todos os elementos necessários usando o modelo no controlador e passe -os para o formulário em contrato como parâmetros.

Outras dicas

Eu acho que encontrei uma solução possível, envolve passar uma variedade de Zend Form elementos para o Zend Form :: __ Construct () método. O construtor pega uma variedade de opções, uma delas é chamada "elementos". Dê uma olhada no código -fonte na biblioteca ZEND Framework.

Codifiquei um novo método privado dentro do controlador, chamado BuildSurveyForm (). Nota: O objeto, passado como um parâmetro, é construído a partir de uma enorme consulta SQL com meia dúzia de instruções de junção, buscando dados de algumas tabelas (pesquisas, perguntas, respostas etc.) dentro do banco de dados. Um dos atributos públicos para esta classe consiste em uma variedade de perguntas, armazenadas como objetos (com métodos/atributos públicos também, etc.). O mesmo para respostas. O código para construir essas classes é bastante trivial e fora do tópico aqui.

Aqui está o código dentro do controlador de pesquisa. Copiei/colei e editei/soltei algumas linhas para deixar muito mais claro:

private function buildSurveyForm(MyApp_Object_Survey $survey)
{
    foreach ($survey->questions as $question)
    {
        $element = new Zend_Form_Element_MultiCheckbox($question->order);
        $element->addMultiOptions($question->getAnswersLabels());
        $element->setName($question->order);
        $element->setLabel($question->title);

        $elements[] = $element;
    }

    // Here's the trick :
    $formOptions = array('elements' => $elements);

    $surveyForm = new MyApp_Survey_Form($formOptions);

    $urlHelper = $this->_helper->getHelper('url');
    $surveyForm->setAction($urlHelper->url(array(
            'controller' => 'survey',
            'action' => 'vote'),
        'default'
    ));
    $surveyForm->setMethod('post');

    $this->_forms['survey'] = $surveyForm;

    return $this->_forms['survey'];
}

o Formulário de pesquisa do MyApp A classe contém apenas um botão de envio no método init (). Os elementos gerados dinamicamente com o código acima são adicionados antes do botão Enviar (que é inesperado, mas útil). Esta classe simplesmente estende o zend_form.

Então, no controlador de pesquisa / visualização de ação:

public function viewAction()
{
    $surveyModel =    $this->_model['survey'];
    $survey =        $surveyModel->getFullSurvey($this->_getParam('id'));
    $survey =        new MyApp_Object_Survey($survey);
    // Calls above private method :
    $surveyForm =    $this->buildSurveyForm($survey);

    $this->view->assign(array(
         'surveyForm' => $surveyForm,
    ));
}

Adicionar filtros, validadores e decoradores para formar elementos agora é trivial. Minha proposta está um pouco suja, mas acho que faz o trabalho. Vou adicionar uma nova proposta se encontrar algo mais elegante. Sinta -se à vontade para postar respostas/soluções diferentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top