/** * retona a classe criada * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br * @param string $tablename * @param Lumine_Configuration $cfg * @return Lumine_Factory */ public static function create($tablename, Lumine_Configuration $cfg) { $pkg = $cfg->getProperty('package'); Lumine_Log::debug('Recuperando campos da tabela ' . $tablename); $fields = $cfg->getConnection()->describe($tablename); $obj = new Lumine_Factory($pkg, $tablename); foreach ($fields as $item) { list($name, $type_native, $type, $length, $primary, $notnull, $default, $autoincrement) = $item; $options = array('primary' => $primary, 'notnull' => $notnull, 'autoincrement' => $autoincrement); // para o pg, ainda tem o nome da sequence if (!empty($item[8]['sequence'])) { $options['sequence'] = $item[8]['sequence']; } // se tiver um valor padrao if (!empty($default)) { $options['default'] = $default; } // nome do membro $memberName = $name; // se for para usar camel case if ($cfg->getOption('camel_case') == true) { $memberName = Lumine_Util::camelCase($memberName); } $obj->metadata()->addField($memberName, $name, $type, $length, $options); } return $obj; }
/** * @see Lumine_Validator_AbstractValidator::execute() */ public function execute(Lumine_Base $obj) { $value = $this->getFieldValue($obj); if (!preg_match('@^((\\d{2}\\/\\d{2}\\/\\d{4})|(\\d{4}-\\d{2}-\\d{2}))$@', $value, $reg)) { return false; // se digitou no formato com barras } else { if (!empty($reg[2])) { list($dia, $mes, $ano) = explode('/', $reg[2]); // se nao for formato brasileiro e norte-americano if (!checkdate($mes, $dia, $ano) && !checkdate($dia, $mes, $ano)) { return false; } // se digitou no formato ISO } else { if (!empty($reg[3])) { list($ano, $mes, $dia) = explode('-', $reg[3]); // se for uma data valida if (!checkdate($mes, $dia, $ano)) { return false; } } } } if (!is_null($this->minDate) || !is_null($this->maxDate)) { $f = '%Y-%m-%d'; $resultTime = strtotime(Lumine_Util::FormatDate($value, $f)); if (!is_null($this->minDate) && $resultTime < strtotime(Lumine_Util::FormatDate($this->minDate, $f))) { return false; } if (!is_null($this->maxDate) && $resultTime > strtotime(Lumine_Util::FormatDate($this->maxDate, $f))) { return false; } } return true; }
/** * recupera o valor ja formatado para o banco * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param string $key * @param mixed $val * @return mixed */ private function getStrictValue($key, $val) { try { $res = $this->metadata()->getField($key); if ($val instanceof Lumine_Base || gettype($val) == 'NULL') { //$this->_dataholder[ $key ] = $val; return $val; } switch ($res['type']) { case 'int': case 'integer': case 'boolean': case 'bool': $val = sprintf('%d', $val); break; case 'float': case 'double': $val = sprintf('%f', $val); break; case 'datetime': $val = Lumine_Util::FormatDateTime($val); break; case 'date': if (preg_match('@^(\\d{2})/(\\d{2})/(\\d{4})$@', $val, $reg)) { if (checkdate($reg[2], $reg[1], $reg[3])) { $val = "{$reg['3']}-{$reg['2']}-{$reg['1']}"; } else { $val = "{$reg['3']}-{$reg['1']}-{$reg['2']}"; } } else { if (preg_match('@^(\\d{4})-(\\d{2})-(\\d{2})$@', $val, $reg)) { $val = $val; } else { if (is_numeric($val)) { $val = date('Y-m-d', $val); } else { $val = date('Y-m-d', strtotime($val)); } } } break; } // $this->_dataholder[ $key ] = $val; return $val; } catch (Exception $e) { // $this->_dataholder[ $key ] = $val; return $val; } }
?> </tr> <tr> <th width="3%"> </th> <th width="3%"><a href="javascript:" onclick="$('#busca').submit();"><img src="magnifier.png" width="16" height="16" alt="Pesquisar" title="Pesquisar" /></a></th> <?php foreach ($parts as $name => $item) { $item['name'] = $name; if (empty($item['options']['foreign'])) { echo '<th>', sprintf('<input type="text" class="textinput inputbusca %s" name="_filter_%s" value="%s" />', $item['type'], $name, !isset($_GET['_filter_' . $name]) ? '' : $_GET['_filter_' . $name]), '</th>'; } else { $display = empty($item['options']['displayField']) ? $item['options']['linkOn'] : $item['options']['displayField']; echo '<th>'; echo '<select class="foreign" name="_filter_', $item['name'], '">'; echo '<option value=""></option>'; echo Lumine_Util::buildOptions($obj->_getConfiguration()->getProperty('package') . '.' . $item['options']['class'], $item['options']['linkOn'], $display, isset($_GET['_filter_' . $item['name']]) ? $_GET['_filter_' . $item['name']] : ''); echo '</select>'; echo '</th>'; } } ?> </tr> </thead> <tbody> <?php while ($obj->fetch()) { $pks_string = ''; $pks = $obj->metadata()->getPrimaryKeys(); $vals = array(); foreach ($pks as $name => $prop) { $vals[] = '_pk_' . $prop['name'] . '=' . urlencode($obj->{$prop}['name']);
/** * @param Lumine_Base $obj Objeto a ser validado * @return array - Retorna array contendo erros caso validacao invalida * @author Cairo Lincoln de Morais Noleto * @link http://caironoleto.wordpress.com * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br **/ public static function validate(Lumine_Base $obj) { $fieldList = !empty(self::$validateList[$obj->_getName()]) ? self::$validateList[$obj->_getName()] : array(); $errors = array(); foreach ($fieldList as $fieldName => $validators) { // se ja houver um erro para o campo atual if (self::checkStackError($errors, $fieldName) == true) { // passa para o proximo campo continue; } foreach ($validators as $array) { // se ja houver um erro para o campo atual if (self::checkStackError($errors, $fieldName) == true) { // passa para o proximo campo break; } switch ($array["tipoValidacao"]) { //Verifica se e String case 'requiredString': if (!is_string($obj->{$array}["campo"]) || strlen($obj->{$array}["campo"]) == 0) { self::stackError($errors, $fieldName, $array['message']); } if (isset($array["minimo"]) && strlen($obj->{$array}['campo']) < $array['minimo']) { self::stackError($errors, $fieldName, $array['message']); } // se foi informado o tamanho maximo if (isset($array['maximo'])) { // pega o campo $field = $obj->_getField($fieldName); // se o tamanho informado for maior que o comprimento if (isset($field['length']) && $array['maximo'] > $field['length']) { throw new Lumine_Exception('Tamanho invalido para o campo ' . $fieldName, Lumine_Exception::WARNING); } // alterado para se o usuario // informou um tamanho minimo, mas nao o maximo, // o maximo passa a ser o do campo } else { if (!isset($array['maximo']) && isset($array['minimo'])) { $field = $obj->_getField($fieldName); if (isset($field['length'])) { $array['maximo'] = $field['length']; } } } if (isset($array["maximo"]) && strlen($obj->{$array}['campo']) > $array['maximo']) { self::stackError($errors, $fieldName, $array['message']); } break; //Verifica se e Numero //Verifica se e Numero case 'requiredNumber': if (!is_numeric($obj->{$array}["campo"])) { self::stackError($errors, $fieldName, $array['message']); } else { if (is_numeric($obj->{$array}['campo'])) { if (!is_null($array['minimo']) && $obj->{$array}['campo'] < $array['minimo']) { self::stackError($errors, $fieldName, $array['message']); } else { if (!is_null($array['maximo']) && $obj->{$array}['campo'] > $array['maximo']) { self::stackError($errors, $fieldName, $array['message']); } } } } break; //Verifica se Tamanho invalido //Verifica se Tamanho invalido case 'requiredLength': if (isset($array["minimo"])) { if (strlen($obj->{$array}["campo"]) < $array["minimo"]) { self::stackError($errors, $fieldName, $array['message']); } } if (isset($array["maximo"])) { if (strlen($obj->{$array}["campo"]) > $array["maximo"]) { self::stackError($errors, $fieldName, $array['message']); } } break; //Verifica se e email //Verifica se e email case 'requiredEmail': //Lumine_Util::validateEmail( $val ); $res = Lumine_Util::validateEmail($obj->{$array}["campo"]); if ($res === false) { self::stackError($errors, $fieldName, $array['message']); } break; //Verifica se e uma data //Verifica se e uma data case 'requiredDate': $val = $obj->{$array}["campo"]; if (!preg_match('@^((\\d{2}\\/\\d{2}\\/\\d{4})|(\\d{4}-\\d{2}-\\d{2}))$@', $val, $reg)) { self::stackError($errors, $fieldName, $array['message']); // se digitou no formato com barras } else { if (!empty($reg[2])) { list($dia, $mes, $ano) = explode('/', $reg[2]); // se nao for formato brasileiro e norte-americano if (!checkdate($mes, $dia, $ano) && !checkdate($dia, $mes, $ano)) { self::stackError($errors, $fieldName, $array['message']); } // se digitou no formato ISO } else { if (!empty($reg[3])) { list($ano, $mes, $dia) = explode('-', $reg[3]); // se for uma data valida if (!checkdate($mes, $dia, $ano)) { self::stackError($errors, $fieldName, $array['message']); } } } } break; //Verifica se e uma data/hora //Verifica se e uma data/hora case 'requiredDateTime': $val = $obj->{$array}["campo"]; if (!preg_match('@^((\\d{2}\\/\\d{2}\\/\\d{4})|(\\d{4}-\\d{2}-\\d{2})) (\\d{2}:\\d{2}(:\\d{2})?)$@', $val, $reg)) { self::stackError($errors, $fieldName, $array['message']); // se digitou no formato com barras } else { if (!empty($reg[2])) { list($dia, $mes, $ano) = explode('/', $reg[2]); // se nao for formato brasileiro e norte-americano if (!checkdate($mes, $dia, $ano) && !checkdate($dia, $mes, $ano)) { self::stackError($errors, $fieldName, $array['message']); } // se digitou no formato ISO } else { if (!empty($reg[3])) { list($ano, $mes, $dia) = explode('-', $reg[3]); // se for uma data valida if (!checkdate($mes, $dia, $ano)) { self::stackError($errors, $fieldName, $array['message']); } } } } break; //Verifica uniquidade // - Alteracao por Hugo: Aqui fiz uma mudanca, porque // se fosse feita um update, daria erro. por isso, checamos as chaves primarias //Verifica uniquidade // - Alteracao por Hugo: Aqui fiz uma mudanca, porque // se fosse feita um update, daria erro. por isso, checamos as chaves primarias case 'requiredUnique': $reflection = new ReflectionClass($obj->_getName()); $objeto = $reflection->newInstance(); $objeto->{$fieldName} = $obj->{$fieldName}; $objeto->find(); $todas = true; while ($objeto->fetch()) { $pks = $objeto->_getPrimaryKeys(); foreach ($pks as $def) { if ($objeto->{$def}['name'] != $obj->{$def}['name']) { $todas = false; self::stackError($errors, $fieldName, $array['message']); break; } if ($todas == false) { break; } } } unset($objeto, $reflection); break; //Verifica uma funcao //Verifica uma funcao case 'requiredFunction': // se for um array if (is_array($array['message'])) { $result = call_user_func_array($array['message'], array($obj, $fieldName, $obj->{$fieldName})); if ($result !== true) { self::stackError($errors, $fieldName, $result); break; } } if (is_string($array['message'])) { $function = new ReflectionFunction($array['message']); $result = $function->invoke($obj, $fieldName, $obj->{$fieldName}); if ($result !== true) { //$errors[] = $result; self::stackError($errors, $fieldName, $result); } unset($function); } break; //Verifica se e CPF //Verifica se e CPF case 'requiredCpf': $res = ValidateCPF::execute($obj->{$array}["campo"]); if ($res === false) { self::stackError($errors, $fieldName, $array['message']); } break; //Verifica se e CNPJ //Verifica se e CNPJ case 'requiredCnpj': $res = ValidateCNPJ::execute($obj->{$array}["campo"]); if ($res === false) { self::stackError($errors, $fieldName, $array['message']); } break; default: return true; break; } } } return $errors; }
/** * @see Lumine_Validator_AbstractValidator::execute() */ public function execute(Lumine_Base $obj) { $value = $this->getFieldValue($obj); return Lumine_Util::validateEmail($value); }
/** * Efetua a validacao * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param Lumine_Base $obj Objeto a ser validado * @return array Array contendo os erros encontrados */ public function doValidation() { // nao possui arquivo XML para validacao, sempre retorna true if (empty($this->xml)) { return true; } $xml = new DomDocument(); $xml->validateOnParse = true; $xml->load($this->xml); $errors = libxml_get_errors(); libxml_clear_errors(); if (!empty($errors)) { Lumine_Log::error('A validacao de "' . $this->obj->_getName() . '" nao pode ser executada por erros na formacao do XML. Analise o retorno do metodo "validate" para ver os erros'); foreach ($errors as $error) { $this->errors[] = trim($error->message); } return false; } // ok, o XML nao contem erros // vamos pegar os campos da validacao $xpath = new DOMXPath($xml); $DOMFieldList = $xpath->query('//lumine-validator/field'); $errors = array(); foreach ($DOMFieldList as $DOMField) { // verifica se o campo existe try { $field = $this->obj->_getField($DOMField->getAttribute('name')); $fieldname = $field['name']; // recupera a lista de validator para este campo $query = "//lumine-validator/field[@name='{$fieldname}']/validator"; $DOMValidatorList = $xpath->query($query); // para cada validator foreach ($DOMValidatorList as $DOMvalidator) { // se ja tiver validado o campo, houver outro validator // e nao passou no anterior, passa para proximo campo if (isset($errors[$fieldname]) && $errors[$fieldname] !== true) { break; } // pega os valores dos atributos $minlength = sprintf('%d', $DOMvalidator->getAttribute('minlength')); $maxlength = sprintf('%d', $DOMvalidator->getAttribute('maxlength')); $minvalue = $DOMvalidator->getAttribute('minvalue'); $maxvalue = $DOMvalidator->getAttribute('maxvalue'); $classname = $DOMvalidator->getAttribute('classname'); $msg = $DOMvalidator->getAttribute('msg'); $rule = $DOMvalidator->getAttribute('rule'); $method = $DOMvalidator->getAttribute('method'); $val = $this->obj->{$fieldname}; $res = false; if (empty($classname)) { $classname = $DOMvalidator->getAttribute('name'); } if ($minvalue != '') { $minvalue = (double) $minvalue; } else { $minvalue = null; } if ($maxvalue != '') { $maxvalue = (double) $maxvalue; } else { $maxvalue = null; } // ve o tipo switch ($DOMvalidator->getAttribute('type')) { case 'requiredString': $res = $this->validateRequiredString($val, $minlength, $maxlength); break; case 'requiredNumber': $res = $this->validateRequiredNumber($val, $minvalue, $maxvalue); break; case 'requiredEmail': $res = Lumine_Util::validateEmail($val); break; //Verifica se e uma data //Verifica se e uma data case 'requiredDate': if (!preg_match('@^((\\d{2}\\/\\d{2}\\/\\d{4})|(\\d{4}-\\d{2}-\\d{2}))$@', $val, $reg)) { $res = false; // se digitou no formato com barras } else { if (!empty($reg[2])) { list($dia, $mes, $ano) = explode('/', $reg[2]); // se nao for formato brasileiro e norte-americano if (!checkdate($mes, $dia, $ano) && !checkdate($dia, $mes, $ano)) { $res = false; } // se digitou no formato ISO } else { if (!empty($reg[3])) { list($ano, $mes, $dia) = explode('-', $reg[3]); // se for uma data valida if (!checkdate($mes, $dia, $ano)) { $res = false; } } else { $res = true; } } } break; //Verifica se e CPF //Verifica se e CPF case 'requiredCpf': $res = ValidateCPF::execute($val); break; //Verifica se e CNPJ //Verifica se e CNPJ case 'requiredCnpj': $res = ValidateCNPJ::execute($val); break; case 'unique': $res = $this->validateUnique($val, $fieldname); break; case 'class': $res = $this->validateByClass($val, $fieldname, $classname, $method); break; case 'rule': $res = $this->validateRule($val, $rule); break; default: throw new Lumine_Validator_Exception('Tipo de validator desconhecido: ' . $DOMValidator->getAttribute('type')); } if ($res === false) { $errors[$fieldname] = utf8_decode($msg); } else { $errors[$fieldname] = $res; } } } catch (Exception $e) { Lumine_Log::warning($e->getMessage()); } } // depois de todas as validacoes, vamos ver se deu erro em algum campo $tudo_ok = true; foreach ($errors as $chave => $erro) { if ($erro !== true) { $tudo_ok = false; $this->errors = $errors; break; } } // se realmente estiver tudo ok if ($tudo_ok === true) { return array(); } else { return $this->errors; } }
public function CamelCase($name) { if ($this->getCamelCase() == false) { return $name; } return Lumine_Util::camelCase($name); }
/** * Retorna uma representacao XML do node * * @author Hugo Ferreira da Silva * @param boolean $withChilds Indica se tambem deve incluir os nodes filhos * @return string */ public function toXML($withChilds = true) { $result[0] = $this->toArray($withChilds); return Lumine_Util::array2xml($result); }
/** * faz a importacao automatica de classes (autoload) * * @see http://br2.php.net/manual/pt_BR/function.spl-autoload-register.php * @param string $clname */ public static function autoload($clname) { $args = func_get_args(); $cn = Lumine_ConnectionManager::getInstance(); $list = $cn->getConfigurationList(); foreach ($list as $cfg) { $sufix = $cfg->getOption('class_sufix'); $pacote = $cfg->getProperty('package'); $path = $cfg->getProperty('class_path'); $ext = (empty($sufix) ? '' : '.' . $sufix) . '.php'; if (!empty($pacote)) { $pacote .= '.'; } $fullpath = str_replace('.', '/', $path . '/' . $pacote . $clname); $fullpath .= $ext; if (file_exists($fullpath)) { Lumine_Util::import($pacote . $clname); return; } } }
/** * Faz o parse do valor para SQL * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param Lumine_Base|array $obj * @param mixed $val * @param string $type * @param boolean $islike * @return mixed */ public static function getParsedValue($obj, $val, $type, $islike = false, $usingDefault = false) { if (is_null($val) == true) { return 'NULL'; } // se esta informando atraves de um valor padrao if ($usingDefault && !is_array($val) && !is_object($val)) { // pegamos o prefixo do valor $prefix = substr($val, 0, strlen(Lumine::DEFAULT_VALUE_FUNCTION_IDENTIFIER)); // se for para ser aplicado como uma funcao do banco if ($prefix == Lumine::DEFAULT_VALUE_FUNCTION_IDENTIFIER) { // removemos o prefixo e devolvemos o valor que sera usado como funcao return str_replace($prefix, '', $val); } } switch ($type) { case 'smallint': case 'int': case 'integer': $val = sprintf('%d', $val); break; case 'float': case 'double': $val = sprintf('%f', $val); break; case 'date': /* if(is_numeric($val)) { $val = "'" . date('Y-m-d', $val) . "'"; } else { $val = "'" . date('Y-m-d', strtotime($val)) . "'"; }*/ $val = "'" . Lumine_Util::FormatDate($val, '%Y-%m-%d') . "'"; break; case 'datetime': /* if(is_numeric($val)) { $val = "'" . date('Y-m-d H:i:s', $val) . "'"; } else { $val = "'" . date('Y-m-d H:i:s', strtotime($val)) . "'"; } */ $val = "'" . Lumine_Util::FormatDateTime($val, '%Y-%m-%d %H:%M:%S') . "'"; break; case 'time': $val = Lumine_Util::FormatTime($val, '%H:%M:%S'); $val = "'" . $val . "'"; break; case 'boolean': $val = sprintf("'%d'", $val); break; case 'string': case 'text': case 'varchar': case 'char': default: if ($islike == true) { $val = "'%" . $obj->_getConnection()->escape($val) . "%'"; } else { $val = "'" . $obj->_getConnection()->escape($val) . "'"; } break; } return $val; }
/** * Retorna o nome de um membro no estilo CamelCase * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param string $name * @return string */ private function CamelCase($name) { if ($this->getCamelCase() == true) { $name = Lumine_Util::camelCase($name); } if (isset($this->createdNames[$name])) { if (count($this->createdNames) > 1) { $name .= $this->createdNames[$name]++; } } else { $this->createdNames[$name] = 1; } return $name; }