ti-enxame.com

Onde usar o JInput no MVC

Estou curioso para saber onde obter dados de JInput no padrão de design do MVC. Por exemplo, em uma situação em que eu preciso de um valor JInput para usar em uma consulta em um método de classe de modelo, devo obter o valor JInput lá ou devo passá-lo da exibição ou não isso importa?

6
doovers

Em uma estrutura MVC adequada, apenas o seu controlador deveria faz interface com os dados da sua solicitação, neste caso JInput, e as dependências injetadas na visualização e no modelo quando instanciadas no controlador.

Com a estrutura atual do CMS, as três partes da estrutura MVC geralmente fazem interface com os dados da solicitação. Nos modelos, isso geralmente é feito no método populateState() e as visualizações são mais frequentes nos arquivos de layout que eles estão carregando do que na classe real.

11
Michael

Tenho a forte convicção de que deve ser recuperada quando apropriado.

Ou seja, você sempre deve usar JInput caso contrário, você está duplicando dados e potencialmente quebrando os princípios DRY .

Uma classe view deve estar recuperando dados para preencher os modelos do view (/tmpl files) ou layouts do model, não injetando valores no model. A view afinal é sobre apresentação de dados e interface do usuário, não manipulação de dados ou manipulação de ações do usuário.

2
Craig

O JInput não oferece esse recurso; então você pode precisar usar $ _POST.

se você pode ter a entrada na forma de matriz (e use JInput :: getArray ())

ou

um objeto codificado por json (você usa json_decode (JInput :: getString ()))

http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Input.html

http://docs.joomla.org/Retrieving_request_data_using_JInput

1
kumarramalingam

Geralmente usarei o JInput no controlador para rotear a solicitação e depois passá-la ao modelo por meio de um objeto de registro.

Idealmente, você passaria os dados da solicitação para o controlador a partir da lógica do roteador, a fim de facilitar o DI em seus controladores, mas ... pelo menos dessa maneira, as dependências da solicitação são injetadas no modelo e não preciso acessar JInput para testá-lo.

Depois de ter os dados no modelo, posso usá-lo para definir o estado do modelo e, em seguida, o controlador injeta esse modelo na visualização com todos os dados necessários para atender às solicitações de dados da visualização já carregadas em suas propriedades.

1
Joomsavvy

Embora já tenha respondido, tentarei explicar na minha perspectiva.

Joomla! é uma implementação MVC realmente excelente e flexível.

Sobre o seu problema de preencher uma Visualização , com dados do Modelo , dependendo no usuário enviou dados através de $ _GET. Aqui está como eu faço isso.

A primeira coisa que gostaria de declarar é que, além dos modelos, visualizações e controladores comuns, existe outra categoria de arquivos amplamente usada no Joomla !, esses são os mini-controladores. Sim, você leu corretamente.

Esses são os arquivos diretamente dentro da pasta de exibição.

Aqui estão alguns deles.

view.html.php
view.raw.php
view.pdf.php

Além de servir ao propósito de gerar diferentes tipos de saída, eles também servem como um controlador (de certa forma).

Portanto, para casos como o seu, não é necessário envolver controladores apenas para obter os dados do modelo. Tudo o que você precisa fazer é obter os dados enviados usando o jinput para desinfectá-los e passar os dados como um objeto ou matriz ou apenas uma variável simples para o Modelo.

Aqui está um exemplo:

view.html.php
<?php
//-- No direct access
defined('_JEXEC') || die('=;)');

class compoViewDashboard extends JViewLegacy {
    public function display($tpl = null) {
        if (JRequest::getVar('layout') == 'somelayout') {
            $jinput = JFactory::getApplication()->input;
            $data = $jinput->post->get('xyz', 'null', 'INT');

            /* If you are calling method from other(different) model you can use the following one line else you can skip it. */
            $this->setModel(JModelLegacy::getInstance('syllabus', 'compoModel'));
            $model = $this->getModel('syllabus');
            $this->courses= $model->getcourses($data);
        }
        parent::display($tpl);
    }
}

É isso aí.

Isenção de responsabilidade: - Lembre-se de que essa é minha própria implementação e pode não ser a maneira perfeita; portanto, obtenha a aprovação dos profissionais antes de usar qualquer código no ambiente de produção.

Nota: - Eu sei que o JRequest está obsoleto, mas está lá para ficar conforme o Joomla! equipe principal, uma vez que o núcleo também a utiliza em todo o lugar.

1
Mohd Abdul Mujib