Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pellegrini2106

Carregar id de uma tabela para gravar em outra possuindo chave estrang

Recommended Posts

Ola amigos programadores veio por meio deste post para tirar uma duvida!!!!

E que possuo 2 classes:

class Setor {

private $id_setor;
private $desc;

function getId_setor() {
return $this->id_setor;
}

function getDesc() {
return $this->desc;
}

function setId_setor($id_setor) {
$this->id_setor = $id_setor;
}

function setDesc($desc) {
$this->desc = $desc;
}

}

class Funcionario {

private $id_func;
private $id_setor;
private $nomeF;
private $setor;

function getId_func() {
return $this->id_func;
}

function getId_setor() {
return $this->id_setor;
}

function getNomeF() {
return $this->nomeF;
}

function getSetor() {
return $this->setor;
}

function setId_func($id_func) {
$this->id_func = $id_func;
}

function setId_setor($id_setor) {
$this->id_setor = $id_setor;
}

function setNomeF($nomeF) {
$this->nomeF = $nomeF;
}

function setSetor($setor) {
$this->setor = $setor;
}

1° Fazer um select para trazer todas informações das descrições da tabela setor pelo método carregaCombobox() que está.dentro da classe Setor.

2° Depois criar uma Classe chamada Controle Setor que é estendida da classe Setor ele passará um método ctlCarregaBox() onde será passado um $_POST['cbsetor'] e tambem retornara a classe carregaCombobox().

public function ctlCarregaBox() {

$this->setDesc($_POST['cbsetor']);
return $this->carregaBox();
}

3° Na visão ele carrega o controle na visãoCadastroFuncionario.

<select class="ComboBox" name="cbsetor">
<?php
include '../controle/controleSetor.php';
$vs = new ControleSetor();
$array = $vs->ctlCarregaBox();
foreach ($array as $key => $valor) {
?>
<option value="<?= $valor['id_setor']; ?>"><?= $valor['descricao']; ?>
<?php } ?>
</option>
</select>

Minha duvida e como pego essa id que foi carregada <?= $valor['id_setor']; ?> e gravo na tabela Funcionário.

Olha o metodo onde estou com duvidas.

public function ctlIncluirFunc() {

if (isset($_POST['btnincluir'])) {
if (empty($_POST['txtnome'])) {
echo '<div class="alert-error"> Por Favor Preencha o Campo em Branco!!!!!!</div>';
} else {

"PRECISO DA ID_SETOR QUE VEM DA CONSULTA CARREGACOMBOX PARA GRAVAR NO FUNCIONÁRIO".
$this->setNomeF($_POST['txtnome']);
return $this->incluirFunc();
}
}
}

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A Views somente tem a responsabilidade renderizar seus dados.

Qualquer outra coisa é obrigação do controller e/ou model

Se os dados vem do controller ou model, faça isso por lá, não tem a necessidade trazer para view e voltar novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A Views somente tem a responsabilidade renderizar seus dados.
Qualquer outra coisa é obrigação do controller e/ou model
Se os dados vem do controller ou model, faça isso por lá, não tem a necessidade trazer para view e voltar novamente.

Minha Duvida:

Meu amigo não entendi como eu faço para descarregar meus registros da consulta no controle e depois exibir

seus resultados através do comando Foreach pois preciso exibir os resultados na coluna da table.

exemplo:
<td align="center"><?= $valor['descricao']; ?></td>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos ao primeiro exemplo, acho que dei uma confundida! ^_^

Para facilitar leitura coloque os codigos dentro da tag código , este sinalzinho <>

exemplo:


public function ctlIncluirFunc() {

        if (isset($_POST['btnincluir'])) {
            if (empty($_POST['txtnome'])) {
                echo '<div class="alert-error"> Por Favor Preencha o Campo em Branco!!!!!!</div>';
            } else {

               // PRECISO DA ID_SETOR QUE VEM DA CONSULTA CARREGACOMBOX PARA GRAVAR NO FUNCIONÁRIO".

                $this->setNomeF($_POST['txtnome']);
                return $this->incluirFunc();
            }
        }
    }

:rolleyes:

Voce quer pegar o value do select id_setor, só usar o $_POST

<select class="ComboBox" name="cbsetor">
                                <?php
                                include '../controle/controleSetor.php';
                                $vs = new ControleSetor();
                                $array = $vs->ctlCarregaBox();
                                foreach ($array as $key => $valor) {
                                    ?>
                                    <option value="<?= $valor['id_setor']; ?>"><?= $valor['descricao']; ?>
                                    <?php } ?>     
                                </option>
                            </select>

Pegando o Valor

$id_setor = isset( $_POST['id_setor'] ) ? (int)$_POST['id_setor'] : null;

depois só instanciar a classe Funcionario, e setar o id, e manipular no controller

$func = new Funcionario();

if ($func instanceof Funcionario) {
    $id_setor = isset( $_POST['id_setor'] ) ? (int)$_POST['id_setor'] : null;
    //Se for maior que zero, seta
    if ($id_setor > 0) {
       $func->setIdSetor($id_setor);
       $func->funcaoQueAlteraIdQueEstaNaModelFuncionario(); 
    } else {
       //Trata o erro aqui
    }
} else {
    die('Não há instancia da Classe Funcionario');
}

Caso esteja usando Herança, se existir este metodo setIdSetor da Classse Funcionario

Utilize a instancia da ControleSetor

if ($vs instanceof ControleSetor) {
    $id_setor = isset( $_POST['id_setor'] ) ? (int)$_POST['id_setor'] : null;
    $vs->setIdSetor($id_setor);
    $vs->funcaoQueAlteraIdQueEstaNaModelFuncionario(); 
} else {
    die('Não há instancia da Classe ControleSetor');
}

;)

E as includes vem antes do html, desta forma você controla melhor o fluxo das dependências e evita warnings.

E para eliminar os includes, use autoload ou composer


Humm no seu caso é setId_setor . Só alterar acima.



Padrão Correto do MVC

https://www.youtube.com/watch?v=Aw28-krO7ZM

Herança



Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não e isso gente!!!!

Queria pegar a id que sai deste select que possui um option <option value="<?= $valor['id_setor']; ?>"><?= $valor['descricao']; ?> e esse valor id_setor passaria pelo controle abaixo

public function ctlIncluirFunc() {

if (isset($_POST["btnincluir"])) {
if (empty($_POST["txtnome"])) {
echo '<div class="alert-error"> Por Favor Preencha o Campo em Branco!!!!!!</div>';
} else {
$this->setId_s($_POST['cb_setor']); <------------------------- passararia aqui a id para ser gravado
$this->setNomeF($_POST["txtnome"]);
return $this->incluirFunc();
}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não e isso gente!!!!

Vamos ao Baśico então, em outro post que deu origin a este, você fala o seguinte!

Deletando registro direto da consulta no padrão MVC

Por isso eu disse!

Padrão Correto do MVC

https://www.youtube.com/watch?v=Aw28-krO7ZM

O que você esta usando é o Padrão DAO, e MVC está bem longe disso.

Já que seu padrão é DAO e não MVC, abstrai esses métodos em uma Classe Abstrata, dessa forma as subclasses utilizam esses métodos por meio de heranças.

O PHP 5 introduz métodos e classes abstratas. Classes definidas como abstratas não podem ser instanciadas, e qualquer classe que contenha ao menos um método abstrato também deve ser abstrata. Métodos são definidos como abstratos declarando a intenção em sua assinatura - não podem definir a implementação.

Ao definir um método abstrato é como se fosse uma assinatura para outras Classes derivadas e DEVE conter nas derivadas os métodos que foram assinados como abstrato, é uma especie de contrato.

Vamos ao primeiro exemplo:

FuncionarioAbstract.php

abstract class FuncionarioAbstract
{

    private $id_func;
    private $id_setor;
    private $nomeF;
    private $setor;

    protected $sql;

    /**
     * @return mixed
     */
    public function getIdFunc()
    {
        return $this->id_func;
    }

    /**
     * @param mixed $id_func
     */
    public function setIdFunc($id_func)
    {
        $this->id_func = $id_func;
    }

    /**
     * @return mixed
     */
    public function getIdSetor()
    {
        return $this->id_setor;
    }

    /**
     * @param mixed $id_setor
     */
    public function setIdSetor($id_setor)
    {
        $this->id_setor = $id_setor;
    }

    /**
     * @return mixed
     */
    public function getNomeF()
    {
        return $this->nomeF;
    }

    /**
     * @param mixed $nomeF
     */
    public function setNomeF($nomeF)
    {
        $this->nomeF = $nomeF;
    }

    /**
     * @return mixed
     */
    public function getSetor()
    {
        return $this->setor;
    }

    /**
     * @param mixed $setor
     */
    public function setSetor($setor)
    {
        $this->setor = $setor;
    }

    /**
     * Ao herdar uma classe abstrata, todos os métodos marcados
     * como abstratos na na declaração da classe pai
     * devem ser implementados na classe filha
     */

    abstract public function criar();
    abstract public function ler();
    abstract public function atualizar();
    abstract public function excluir();

}

Essa classe FuncionarioAbstract, faz abstração da sua tabela funcionário e sua derivações "se quiser" e o que mais precisar para as classes derivadas...

Classe Funcionario, esta classe estende todos os métodos da FuncionarioAbstract, e uma vez declaradas nela e quiser usar na Funcionario use $this-> nome do método ou parent::

class Funcionario extends FuncionarioAbstract
{

    public function criar()
    {

        $this->sql = "INSERT INTO `funcionario` (`nomeF`,`id_setor`)
                    VALUES ('{$this->getNomeF()}','{$this->getIdSetor()}')";

        return $this->sql;

    }

    public function ler()
    {

        $this->sql = "SELECT * FROM `funcionario` WHERE `id_func`={$this->getIdFunc()}";

        return $this->sql;

    }

    public function atualizar()
    {

        $this->sql = "UPDATE `funcionario` SET `nomeF`='{$this->getNomeF()}',
              `id_setor`='{$this->getIdSetor()}' WHERE `id_func`={$this->getIdFunc()}";

        return $this->sql;

    }

    public function excluir()
    {
        $this->sql =  "DELETE FROM `funcionario` WHERE `id_func`={$this->getIdFunc()}";

        return $this->sql;
    }

}

Veja que declarei como abstract os métodos abaixo na FuncionarioAbstract, basicamente você tem que criar os métodos nas derivadas com o mesmo nome ou dará erro. A partir dai você pode colocar oque quiser dentro do escopo, também pode criar outros métodos que não contenha na abstract, já que o CRUD qualquer classe que interage com banco de dados tem que ter, essa é a teoria.

abstract public function criar();
abstract public function ler();
abstract public function atualizar();
abstract public function excluir();

Setor a mesma coisa

class Setor extends FuncionarioAbstract
{

    public function criar()
    {

        $this->sql = "INSERT INTO `setor` (`nome`) VALUES ('{$this->getSetor()}')";

        return $this->sql;

    }

    public function ler()
    {

        $this->sql = "SELECT * FROM `setor` WHERE `id_setor`={$this->getIdSetor()}";

        return $this->sql;

    }

    public function atualizar()
    {

        $this->sql = "UPDATE `setor` SET `nome`='{$this->getSetor()}',
              WHERE `id_setor`={$this->getIdSetor()}";

        return $this->sql;

    }

    public function excluir()
    {
        $this->sql =  "DELETE FROM `setor` WHERE `id_setor`={$this->getIdSetor()}";

        return $this->sql;
    }

}

Para Manipular

echo "<h1>Funcionarios - Trabalhando com Métodos</h1>";

$funcionario = new Funcionario();
$funcionario->setNomeF('William Bonner');
$funcionario->setIdSetor(30);
$funcionario->setIdFunc(100);

echo $funcionario->criar();
echo "<hr>";
echo $funcionario->ler();
echo "<hr>";
echo $funcionario->atualizar();
echo "<hr>";
echo $funcionario->excluir();


echo "<h1>Setor - Trabalhando com Métodos</h1>";

$setor = new Setor();
$setor->setSetor('Apresentador');
$setor->setIdSetor(2);

echo $setor->criar();
echo "<hr>";
echo $setor->ler();
echo "<hr>";
echo $setor->atualizar();
echo "<hr>";
echo $setor->excluir();

Nada te impede passar por Injeção de Dependencia este dados, mas ai tem que estudar, onde parece que ta faltando um pouco de conhecimento a respeito.

Veja funcionando no IDEONE

http://ideone.com/kACtT8

Vamos ao MVC, no MVC dificilmente você vai usar métodos e se usar vai ser métodos Fluent e Escaláveis para facilitar sua vida, do mais é Arrays.

Exemplos:

Uma classe de Conexão que abstrai a PDO

Conn.php

class Conn
{
    protected $pdo
}

AppModel, é uma classe generica que faz a manipulação com um ou varios Banco de Dados, e que estende os dados de Conexão da PDO.

Este echo dentro é para imprimir os dados, "EXEMPLO" para mostrar os dados que foram passados por dependências.

AppModel.php

class AppModel extends Conn
{

    public function criar($sql)
    {
        echo '$this->pdo("'.$sql.'");';
    }

    public function ler($sql)
    {
        echo '$this->pdo("'.$sql.'");';
    }

    public function atualizar($sql)
    {
        echo '$this->pdo("'.$sql.'");';
    }

    public function excluir($sql)
    {
        echo '$this->pdo("'.$sql.'");';
    }

}

FuncionarioModel.php

/**
 * Class FuncionarioModel
 * Cadastra do Banco de Dados
 */
class FuncionarioModel extends AppModel
{

    public function criarFuncionario()
    {
        $this->criar();
    }

    public function lerFuncionario()
    {
        $this->ler();
    }

    public function atualizarFuncionario()
    {
        $this->atualizar();
    }

    public function excluirFuncionario()
    {
        $this->excluir();
    }

}

SetorModel.php

Passando as templates da SQL, também tem inúmeras maneiras, gosto de trabalhar com arrays, Fluents e Traits, gosto é gosto.

/**
 * Class SetorModel
 */
class SetorModel extends AppModel
{

    public function criarSetor($setor_nome)
    {
        /**
         * A Funçao criar e da AppModel
         */
        $this->criar("INSERT INTO `setor` (`nome`) VALUES ('{$setor_nome}')");
    }

    public function lerSetor($id_setor)
    {

        /**
         * A funçao ler e da AppModel
         */
        $this->ler("SELECT * FROM `setor` WHERE `id_setor`={$id_setor}");
    }

    public function atualizarSetor($setor_nome,$id_setor)
    {
        /**
         * A funçao atualizar e da AppModel
         */
        $this->atualizar("UPDATE `setor` SET `nome`='{$setor_nome}',
              WHERE `id_setor`={$id_setor}");
    }

    public function excluirSetor($id_setor)
    {
        /**
         * A funçao atualizar e da AppModel
         */
        $this->excluir("DELETE FROM `setor` WHERE `id_setor`={$id_setor}");
    }

}

SetorController.php

E de responsabilidade da Controller receber os dados e tratar e enviar para model

/**
 * Class SetorController
 * Recebe os dados da Views
 */
class SetorController extends SetorModel {


    public function viewCadastrar()
    {

        $_POST['setor_nome'] = 'Apresentador';

        $setor_nome = $_POST['setor_nome'];
        $this->criarSetor($setor_nome);

    }

    public function viewLer()
    {

        $setor_id = $_POST['setor_id'] = 100;
        $this->excluirSetor($setor_id);

    }

    public function viewExcluir()
    {

        $setor_id = $_POST['setor_id'] = 100;
        $this->excluirSetor($setor_id);

    }

    public function viewAtualizar()
    {

        $setor_nome = $_POST['setor_nome'] = 'Jornalista';
        $setor_id = $_POST['setor_id'] = 100;
        $this->atualizarSetor($setor_nome,$setor_id);

    }

}

Não se instancia desta forma um controller, pra isso existe rotas e etc, só para voce ter um exemplo básico.

$setor = new SetorController();
$setor->viewCadastrar();
echo "<hr>";
$setor->viewLer();
echo "<hr>";
$setor->viewExcluir();
echo "<hr>";
$setor->viewAtualizar();

No IDEONE

http://ideone.com/JtVtJN

Agora pra resolver seu problema estude Injeção de dependência, existem N maneiras, só passei via parâmetros para não confundir muito, mas tem como passar a classe inteira.

https://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_depend%C3%AAncia

http://code.tutsplus.com/tutorials/dependency-injection-in-php--net-28146

http://pt.stackoverflow.com/questions/20770/o-que-%C3%A9-inje%C3%A7%C3%A3o-de-depend%C3%AAncia

http://php-di.org/

http://php-di.org/doc/understanding-di.html

Ninguém aqui pode fazer nada por você, senão entender os conceitos desses patterns antes.

PS.: Lembrando que todos os dados que coloquei manualmente voce pega por $_POST ou $_GET

Bons Estudos e Abraços!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.