Ir para conteúdo
Fórum Script Brasil

Rafael Laurindo

Membros
  • Total de itens

    659
  • Registro em

  • Última visita

Tudo que Rafael Laurindo postou

  1. class Teste { private $teste, $teste2; public function __set($attName, $value){ $this->$attName = $value; } public function __get($attName){ return $this->$attName; } } E se eu quisesse fazer assim retornar ou definir esses atributos se possem estáticos, em que teria que definir com o self::, como faria?
  2. Obrigado, resolveu mais uma vez. Esqueci de postar o porquê do erro, para chamar um script externo, devemos usar as tags <script></script> só, sem conteúdo algum. Abs.
  3. Olhem o código. No final de tudo depois de demorar alguns segundos, ele só cadastra os dados na tabela Pessoa e GenPessoa em Login não. A tela é esta. Está bem simples, só para testes. <?php //usar o require_once para chamar este arquivo externamente $login = $_POST['txtLogin']; require_once '../lib/sample/Main.php'; $main = new sample_Main(); $_db = $main->get_conn(); $cidades = " select * from cidade "; if ($login) { $genPessoa = new sample_GenPessoa(); $genPessoa = $genPessoa->retornaGenPessoa($login); $nome = $genPessoa['nome']; $email = $genPessoa['email']; $sexo = $genPessoa['sexo']; $naturalidade = $genPessoa['id_cidade']; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Teste</title> <script> function validarLogin(login){ //usar ajax } </script> </head> <body> <div align="right"><a href="#" onclick="">Sair</a></div> <!--<form method="POST" action="../lib/sample/Login.php">--> <form method="POST" action="../lib/sample/GenPessoa.php"> <fieldset> <legend>Dados da Pessoa</legend> Nome: <input type="text" name="txtNome" maxlength="10" value="<?= $nome ?>" /> <br/> login: <input type="text" name="txtLogin" id="txtLogin" maxlength="45" value="<?= $login ?>"/><!-- onblur="validarLogin(this.id)" --> <br/> senha: <input type="password" name="txtSenha" maxlength="45" value="<?= $senha ?>" /> <br/> Sexo: <br /> M <input type="radio" name="rbSexo" value="M" <?php if($sexo == 'M') echo "checked=\"checked\"" ?> /> <br/> F <input type="radio" name="rbSexo" value="F" <?php if($sexo == 'F') echo "checked=\"checked\"" ?> /> <br/><br/> Naturalidade: <select name="cbNaturalidade"> <option value="">selecione...</option> <?php $stmt = $_db->query($cidades); while ($cidade = $stmt->fetch()) { if($naturalidade == $cidade['id']) echo "<option value=\"$cidade[id]\" selected=\"selected\">$cidade[nome]</option>"; else echo "<option value=\"$cidade[id]\">$cidade[nome]</option>"; } ?> </select> <br /><br /> <input type="submit" id="submit" name="submit" value="Salvar"/> </fieldset> </form> </body> </html>[/codebox] Login.php [code]<?php require_once 'Main.php'; class sample_Login { public $login, $senha; protected $_db; public function __construct() { $main = new sample_Main(); $this->_db = $main->get_conn(); } public function obterLogin() { $this->login = $_POST['txtLogin']; $this->senha = md5($_POST['txtSenha']); } public function adicionarLogin($id) { $this->obterLogin(); $add = " insert into login(id_pessoa, login, senha) values('$id', '$this->login', '$this->senha') "; $stmt = $this->_db->prepare($add); if ($stmt->execute()){ return true; } return false; } }[/code] Pessoa.php [code]<?php abstract class sample_Pessoa { protected $_db, $id=NULL, $nome, $id_cidade; abstract function obterPessoa(); abstract function adicionarPessoa($query_pessoa); }[/code] GenPessoa.php [codebox]<?php require_once 'Main.php'; //Responsável por fazer a conexão com o banco class sample_GenPessoa extends sample_Pessoa { public $sexo; public function __construct() { $main = new sample_Main(); $this->_db = $main->get_conn(); if(!empty($_POST['submit'])) $this->adicionarGenPessoa(); } public function obterPessoa() { $this->nome = $_POST['txtNome']; $this->id_cidade = $_POST['cbNaturalidade']; } public function adicionarPessoa(){ $this->obterPessoa(); $add = " insert into pessoa(id, nome, id_cidade) values ('$this->id', ?, ?) "; $stmt = $this->_db->prepare($add); $stmt->bindParam(1, $this->nome, PDO::PARAM_STR); $stmt->bindParam(2, $this->id_cidade, PDO::PARAM_INT); if ($stmt->execute()){ $id = " select max(id) from pessoa "; if ($this->id = $this->_db->query($id)->fetchColumn()){ return true; } return false; } return false; } public function obterGenPessoa(){ $this->sexo = $_POST['rbSexo']; } private function adicionarGenPessoa() { $this->_db->beginTransaction(); //inicia uma transação. Método da classe PDO (PHP Data Object) do PHP $this->obterGenPessoa(); $query_pessoa = " insert into pessoa(id, nome, id_cidade) values ('$this->id', ?, ?) "; if(!$this->adicionarPessoa($query_pessoa)) $this->_db->rollback(); $add = " insert into genPessoa(id_pessoa, sexo) values ('$this->id', ?) "; $stmt = $this->_db->prepare($add); $stmt->bindParam(1, $this->sexo, PDO::PARAM_STR); if (!$stmt->execute()) $this->_db->rollBack(); $login = new sample_Login(); //aparentemente o script trava aqui. Se eu comentar esse último if funciona normalmente. if (!$login->adicionarLogin($this->id)) $this->_db->rollBack(); else echo 'Todos os dados foram cadastrados com sucesso!'; $this->_db->commit(); //encerra a transação } } $genPessoa = new sample_GenPessoa(); Existem outros métodos, mas não vem ao caso, pois somente estes estão envolvidos no problema em questão.
  4. Galera, preciso muito de ajuda, bati a cabeça horas e horas, e não consigo resolver. Vou postar o código abaixo, ele está lento na hora de cadastar, e não consegue realizar um dos cadastros.
  5. Descobri o erro, eu estava colocando no src=RPLTeste.js e o nome era RPLTesteAPI.js. MIl perdões. Mas, gostaria ainda de fazer uma pergunta. Por que é obrigatório o uso do type?
  6. Agora está dando esta resposta: RPLTeste is not defined RPLTeste.staticFunc();
  7. RPLTeste.js RPLTeste = { staticProperty : 'static property', staticFunc : function() { alert('static function'); }, class : function() { this.testar = function() { alert(''); } } } Esse é o arquivo teste.htm [/font] <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> <script src="js/RPLAPI/RPLTeste.js"> function teste(){ RPLTeste.staticFunc(); } </script> </head> <body> <form> <input type="button" id="btnTeste" value="testar" onclick="teste()" /> </form> </body> </html> [font="Verdana"] O que está errado? O firebug do ff está mostrando: teste is not defined teste();
  8. Rapaz, to bolado, acho que tem um bug no FF, eu coloquei um comentário entre as tags select /select e o ff as leu como um nó filho. Teste aew. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> <script> function create_monthOptions(id) { var el = document.getElementById(id); if(!el.firstChild.nextSibling) { for (var i = 1; i <= 12; i++) { //somente cria, não adiciona, ainda option = document.createElement('option'); option.value = i; option.text = i; //adiciona o option ao elemento do id informado el.appendChild(option); } } } </script> </head> <body onload=""> <form> <select id="cbMes" onclick="createOptionMonth(this.id)" > <!--<option value="teste">oi</option>--> </select> </form> </body> </html>
  9. Aeeeeee! Hehehe!. Eu tava tentando só com o nextSibling, mas antes de verificar um irmão tem que verificar se existe pelo menos um filho. Isso aí Jonathan, sua teoria tava certa, parabéns. Resolvido. Mas gostaria de saber uma coisa que me intriga: por que não funcionaria havendo previamente um option? Seria por que exite a constante TEXT_NODE, ficando assim subentendido que existe algum filho? E por falar nisso, para que serve essas constantes? function create_monthOptions(id) { var el = document.getElementById(id); if(!el.firstChild.nextSibling) { for (var i = 1; i <= 12; i++) { //somente cria, não adiciona option = document.createElement('option'); option.value = i; option.text = i; //adiciona o option ao elemento do id informado el.appendChild(option); } } } Bom só testei desse jeito que fez mais sentido para mim.
  10. Galera, me perdoe, mas eu preciso de uma resposta, pois a lógica pra mim está certa. O código pessado pelo Jonathan funciona , mas em um if, como acima não.
  11. Bom, modifiquei, e ficou assim: function create_monthOptions(id) { var el = document.getElementById(id); if(!el.firstChild) { for (var i = 1; i <= 12; i++) { option = document.createElement('option'); option.value = i; option.text = i; el.appendChild(option); //coloca o option dentro do elemento do id informado } } } Não consigo gerar direito. Se eu tirar o IF, ele não para de gerar. Gera de 1 à 12 concatenando, com os anteriormente criados, se eu deixa-lo assim, simplesmente não funciona.
  12. Obrigado, vo fazer os testes aqui e postarei qualquer coisa. Abração.
  13. Não testei em outros, visto que faço as coisas sempre baseado no Netscape. Toda vez que alguém pergunta se funciona em todos, seria mais fácil perguntar, roda no IE? Pois só ele tem seus próprios padrões, o resto segue o Netscape, huhua, bricandeira ;). Mas quero o alternativo sim, sempre quererei. O appendChild, removeChild e firstChild só dão para ser usados em comboboxes? Ou daria para usar em tables também, e tudo que tiver "filho"?
  14. Huahuah, desculpe. É por que a maioria da galera coloca apelido na exibição, daí fica difícil. Não sabia seu nome, você poderia ter pego de algum site ueh!. Mais uma vez obrigado pelas dicas. Akeleabrass
  15. Galera, olhem este código: function create_monthOptions(form, objId) { if(form[objId].value == '') for (var i = 1; i <=12; i++) { var option = document.createElement('option'); option.value = i; option.text = i; form[objId].options.add(option); } } Gostaria de saber, como fazer para deixar uma combo pura, sem options.
  16. Muitíssimo obrigado, era isso que eu pensava eu só queria confirmar.
  17. Certo, deixarei os créditos sim, são seus? Você é o Welligton?
  18. Rs, eu não entendo do SQL SERVER da Microsoft, mas se está sendo retornado que o suporte a transação não existe, então deve ser por causa da versão do seu SGBD. Já procurou saber sobre isso? Outra coisa, você está reeinventando a roda, você não precisa de uma função rollBack, crie uma classe só para a conexão com o banco, nesta classe, defina um método que retorne um objeto PDO em uma propriedade, em cada classe, coloque uma propriedade $_db por exemplo, no método __construct, coloque $_db para receber o objeto PDO criada pela outra classe.
  19. Rafael Laurindo

    Logica errada?

    Ou, procure validar antes no lado do cliente também, com o js por exemplo. Quando ele encontra um else if verdadeiro ele para e não testa os outros. Solução, use um if para cada confronto e não um else if, pois este é para auxiliar o if, quando o teste deve ter apenas uma resposta verdadeira parando neste ponto. Abraço.
  20. Galera, é possível o js puro, pegar data e hora do servidor?
  21. Na verdade, esse era só um exemplo, a classe deveria ter os mesmo atributos que a tabela do banco, é como se essa classe representasse uma tabela com apenas dois atributos, daí eu não precisaria fazer os métodos "setTeste", "setTeste2", "getTeste", "getTeste2", resolvendo assim com o __set($property, $value) e o __get($property), mas desse jeito eu teria que definir todos os atributos antes. Com esse novo jeito é totalmente dinâmico.Você criou uma forma para se criar os métodos para criar propriedades dinamicamente, e seus métodos, "get" e "set". Gostei muito, que economia de código. Bom, desculpe a ignorância, mas desse jeito, eu nunca mais precisarei modelar uma classe tipo Transfer Object, com todos os seus atributos? Visto que nunca precisarei defini-los antes, nem os métodos para defini-los e recupera-los. É isso mesmo? Caso sim, muito obrigado. Vou comenta-lo para a galera desfrutar também. Se não, não é qualquer um que o entenderá. <?php /** * @version 1.0 * @author Wellington Rodrigues <wellingtonbr@gmail.com> */ //essa classe tem a importancia de criar, definir e recuperar seus atributos. Não incluindo métodos de acesso a base de dados. Devendo estes ficarem em outra classe. class Cliente { private $arr_property; public function __construct(){ //da o poder a $arr_property de ser um array, podendo criar/acessar índices e receber/recuperar valores $this->arr_property = array(); } //o método __call() é executado toda vez que tentamos chamar um método da classe, sendo passado para ele como parâmetro, o nome do método e seus argumentos //o array está especificando o tipo do argumento que será usado no método public function __call($methodName, array $arguments) { //verifica se $methodName começa com set ou get if( preg_match('/^(g|s)+et/', $methodName)) { //troca set ou get de $methodName por '' tranformando method na palavra restante, toda em minúscula. Ex.: setName = name $property = strtolower(preg_replace('/^(g|s)+et/','', $methodName)); if(preg_match('/^set/', $methodName)){ //Atribui o primeiro valor do array "arguments" ao array $arr_property. Nesse caso, é o único que interessa $this->arr_property[$property] = $argument[0]; } else if( preg_match('/^get/', $method ) ) return $this->arr_property[$property]; } else{ //Para o processamento, e instancia a classe "Exception" passando a menssagem abaixo para o seu método mágico "__construct()" throw new Exception('O método '.$methodName." não existe em \"".__CLASS__."\""); } } } //cria a instancia $cliente = new Cliente(); //cria dinâmicamente os métodos, get e set bem como as propriedades Nome e Idade, e seus respectivos valores $cliente->setNome('ursolouco'); $cliente->setIdade(27); echo $cliente->getNome() . "<br />"; echo $cliente->getIdade(); Explicando as expressões de validação: /^ : início (g|s) : verifica se a primeira letra começa com g ou s + : concatena +et: verifica se tem "et" depois da expressão anterior. Ex.: nesse caso, s + et = set ou g + et = get / : fim Galera, esse código é do Welligton, eu só modifiquei algumas coisas. ;) Akeleabrass.
  22. Galera, desta vez o assunto é mais sério. Design Patterns. De acordo com o padrão DAO (Data Access Object), devo ter uma classe para transferencia de dados que contenham todos os atributos de uma tabela do banco de dados como private, sendo assim, deve haver um método público para cada atributo, para defini-los bem como acessa-los. A dúvida é: eu preciso realmente de um para cada? A dúvida, é por ter visto assim em exemplos, e me deu vontade de fazer os métodos __set() e __get() mais genéricos de acordo com o exemplo à saber: class Teste{ private $teste, $teste2; public function __set($attName, $value){ $this->$attName = $value; } public function __get($attName){ return $this->$attName; } } $t = new Teste(); $t->__set('teste', 'Rafael'); $t->__set('teste2', 'oi'); echo $t->__get('teste2'); //oi echo $t->__get('teste'); //Rafael Isso também é correto? Eu achei que fosse porque economizou código, o foco do DAO é separar as regras de negócio dos métodos de acesso ao banco, ficando assim as classes, mais fáceis de serem reutilizadas, bem como o código arrumado. Mas se puderem opinar eu agradeceria muito.
×
×
  • Criar Novo...