예제 #1
0
 /**
  * cria os campos do formulario baseando-se na entidade informada
  *
  * @return DSForm
  * */
 public function factoryField()
 {
     $fields = array();
     $columns = $this->_source->annotation()->load();
     $columns = $columns->attrs;
     foreach ($columns as $key => $column) {
         $getter = $column->get;
         $fields[$column->name] = $this->field($column, $this->_source->{$getter}());
     }
     $this->add($fields);
     return $this;
 }
예제 #2
0
 /**
  * Obtém o nome do método acessor e do atributo informados.
  *
  * @param string $typeAcessor
  * @param string $attrAtribute
  * @return string
  * @throws IllegalArgumentException
  */
 private function _getAcessorMethod($typeAcessor, $attrAtribute)
 {
     $this->_checkPropertyExists($attrAtribute);
     IllegalArgumentException::throwsExceptionIfParamIsNull(in_array($typeAcessor, array('get', 'set')), 'Tipo de método acessor é inválido.');
     $annotation = $this->_valueObject->annotation()->load();
     $attrs = $annotation->attrs;
     $attrValue = $attrs->{$attrAtribute};
     return $attrValue->{$typeAcessor};
 }
예제 #3
0
 /**
  * Função que monta os dados para pesquisa
  * @param ValueObjectAbstract $valueObject
  */
 protected function _preparePersist(ValueObjectAbstract $valueObject)
 {
     $arrVo = $valueObject->toArray();
     $attrs = (array) $valueObject->annotation()->load()->attrs;
     foreach ($arrVo as $key => $elmnt) {
         if (isset($attrs[$key]->database)) {
             if ('string' == $attrs[$key]->type && NULL != $elmnt) {
                 $elmnt = '%' . $elmnt . '%';
             }
             $this->_params[$key] = (object) array('type' => $attrs[$key]->type, 'value' => '' == $elmnt ? NULL : $elmnt);
         }
     }
 }
예제 #4
0
파일: DML.php 프로젝트: sgdoc/sgdoce-codigo
 /**
  * retorna representacao textual do comando para alterar os dados
  *
  * @param ValueObjectAbstract
  * @return string
  * */
 public function update(ValueObjectAbstract $valueObject)
 {
     $annon = $valueObject->annotation()->load();
     $dmlQuery = $conditional = NULL;
     foreach ($this->persistAttr($valueObject, 'update') as $column) {
         # verifica se  o campo eh uma chave primaira
         if (isset($column->primaryKey)) {
             $conditional .= sprintf(' %s %s = :%s', trim($conditional) ? 'AND' : 'WHERE', $column->database, $column->name);
             continue;
         }
         $dmlQuery .= sprintf(', %s = :%s', $column->database, $column->name);
     }
     $dmlQuery = ltrim($dmlQuery, ', ');
     # por questao de seguranca, nao sera permitido a alteracao
     # de toda entidade, ou seja, seja necessario que ao menos
     # uma PK exista na entidade
     DMLException::throwsExceptionIfParamIsNull($conditional, self::T_DMLABSTRACT_FILTER_REQUIRED);
     return sprintf('UPDATE %s SET %s%s', $this->_persist->getEntity($valueObject)->qualifiedName(), $dmlQuery, $conditional);
 }
예제 #5
0
 /**
  * {@inheritdoc}
  */
 public function isKeepHistory(ValueObjectAbstract $valueObject)
 {
     $info = $valueObject->annotation()->getClassDoc();
     return isset($info['log']);
 }
예제 #6
0
 /**
  * Efetua pesquisa por parametrizada.
  *
  * Se informado, o segundo paramentro $limit define o numero de resultado que será retornado. O terceiro pramentro
  * $offSet que também é opcional define o registro inicial que sera contato o limite
  *
  * @param ValueObjectAbstract $valueObject
  * @param integer $limit
  * @param integer $offSet
  * @return ValueObject[]
  * @throws PersistException
  * */
 public function findByParam(ValueObjectAbstract $valueObject, $limit = 10, $offSet = 0)
 {
     try {
         # recupera anotacao do valuObject
         $tmpOperator = array('WHERE', 'AND');
         $annon = $valueObject->annotation()->load();
         $fieldData = $fieldList = array();
         $filter = NULL;
         # campos que devem ser utilizados para persistencia de database
         $attrs = $this->_persist->persistAttr($valueObject, 'select');
         foreach ($attrs as $attr) {
             $fieldList[] = $attr->database;
             $fieldData[$attr->database] = $this->_persist->getValue($valueObject, $attr->get, $attr->type);
             if (NULL === $fieldData[$attr->database]->value) {
                 unset($fieldData[$attr->database]);
                 // @codeCoverageIgnoreStart
                 continue;
                 // @codeCoverageIgnoreEnd
             }
             # insere o campo na listagem de filtro
             $filter .= sprintf(' %1$s %2$s = :%2$s', $tmpOperator[(bool) $filter], $attr->database);
         }
         # monta instrucao SQL de pesquisa
         // @codeCoverageIgnoreStart
         $queryString = sprintf('SELECT %s FROM %s%s', implode(', ', $fieldList), $annon->entity, $filter);
         # se houver, aplica ordenacao
         $queryString = $this->_persist->sorter($queryString);
         # aplica limitacao da consulta
         if ($limit != NULL && 0 < $limit && ($offSet != NULL && 0 < $offSet)) {
             $queryString .= sprintf(' LIMIT %d, %d', (int) $offSet, (int) $limit);
         } elseif ($limit != NULL && 0 < $limit) {
             $queryString .= sprintf(' LIMIT %d', (int) $limit);
         } elseif (0 > $limit) {
             $queryString .= sprintf(' LIMIT %d', 0);
         }
         # executa a consulta
         return $this->_persist->getConnect()->prepare($queryString, $fieldData)->retrieve();
     } catch (\PDOException $pdoExc) {
         throw new PersistException($pdoExc->getMessage(), 0);
     }
 }
예제 #7
0
 /**
  * Retorna lista de campos que compõe a entidade
  *
  * @param ValueObjectAbstract $valueObject
  * @return string[]
  * */
 public function fetch(ValueObjectAbstract $valueObject)
 {
     $fields = array('field' => array(), 'value' => array());
     $annon = $valueObject->annotation();
     $infor = $annon->getClassDoc();
     $attrs = $annon->getAttrsDoc();
     $list = 'all' == strtolower($infor['log']) ? $this->fields($annon) : $this->translante($annon, explode(',', $infor['log']));
     foreach ($list as $key => $field) {
         $fields['field'][] = $field;
         $fields['value'][] = self::getValueRecursively($valueObject, $attrs[$key]['get']);
     }
     return $fields;
 }
 /**
  * Função que monta os dados para pesquisa
  * @param ValueObjectAbstract $valueObject
  */
 private function _preparePersist(ValueObjectAbstract $valueObject)
 {
     $arrResult = array();
     $arrVo = array_filter($valueObject->toArray());
     $attrs = (array) $valueObject->annotation()->load()->attrs;
     foreach ($arrVo as $key => $elmnt) {
         $arrResult[$key] = (object) array('type' => $attrs[$key]->type, 'value' => $elmnt);
     }
     return $arrResult;
 }
예제 #9
0
 /**
  * Método construtor.
  * Recupera a relação dos campos a realizar o log de auditoria e a relação dos atributos do VO.
  * @param ValueObjectAbstract $valueObject
  * @param string $pathLeaf
  * @param mixed $pathLeaf
  * @throws \br\gov\sial\core\persist\exception\PersistException
  * */
 public function __construct(ValueObjectAbstract $valueObject, $pathLeaf = NULL, $upload = NULL)
 {
     self::$_config['logFields'] = self::getIfDefined($valueObject->annotation()->load(), 'log') ? $valueObject->annotation()->load()->log : NULL;
     self::$_config['xmlStruct'] = NULL;
     self::$_config['xmlContent'] = NULL;
     self::$_config['xmlContentLog'] = NULL;
     self::$_config['attrs'] = $valueObject->annotation()->load()->attrs;
     self::$_config['timeStamp'] = date("D, d M Y H:i:s");
     self::$_config['namespace'] = $this->getClassName();
     self::$_config['valueObject'] = $valueObject;
     self::$_config['upload'] = $upload;
     # $pathLeaf
     self::$_config['path'] = $pathLeaf;
 }
예제 #10
0
 /**
  * Prepara o comando que será executado no repositório.
  *
  * @param [string|string[] ]$query
  * @param stdClass[] $params
  * @return Connect
  * */
 public function prepare(ValueObjectAbstract $voQuery, $params)
 {
     $attrs = (array) $voQuery->annotation()->load()->attrs;
     $sial_queryFields = array();
     foreach ($attrs as $field) {
         if ($attr = self::getIfDefined($field, 'ldap')) {
             $this->_ldapParam[] = $field->ldap;
             $getMethod = $field->get;
             $this->_ldapFilter[$field->ldap] = $voQuery->{$getMethod}();
         }
         if ($attr = self::getIfDefined($field, 'keyLdap')) {
             $this->_ldapKey = $field->keyLdap;
         }
     }
     $this->_ldapMethod = $params;
     return $this;
 }
예제 #11
0
 /**
  * retorna apenas os dados das chaves primarias
  *
  * @param ValueObject
  * */
 public function primaryKey(ValueObjectAbstract $valueObject)
 {
     $annon = $valueObject->annotation()->load();
     $attrs = NULL;
     foreach ($annon->attrs as $column) {
         if (self::_isPrimaryKey($column)) {
             $attrs[] = $column->name;
         }
     }
     return self::get($valueObject, $attrs);
 }
예제 #12
0
 /**
  * copia o conteudo, dos atributos avaliados como vazio do objeto atual, do valueObjet informado
  *
  * Nota: Este metodo só funciona com objetos de mesmo tipo
  *
  * @param ValueObjectAbstract $source
  * @return ValueObjectAbstract
  * */
 public function copySaveObjectData(self $source)
 {
     $ttype = $this->annotation();
     $tdata = $this->toArray();
     $sdata = $source->toArray();
     ValueObjectException::throwsExceptionIfParamIsNull($source->annotation()->getClassName() == $ttype->getClassName(), self::T_VALUEOBJECT_OPERATION_REQUIRE_SOME_OBJECT);
     # copia os dados da origem para destino
     foreach ($ttype->getAttrsDoc() as $attr) {
         $name = $attr['name'];
         $setter = $attr['set'];
         # quando o valor for um array isso indica uma chave estrangeira, assim, pega-se a
         # mesma chave e busca no array.
         if (is_array($sdata[$name])) {
             $sdata[$name] = isset($attr['foreingKeyAlias']) ? $sdata[$name][$attr['foreingKeyAlias']] : $sdata[$name][$name];
         }
         # se attr local estiver vazio entao preenche-o com o
         # dado do valueObject informado
         if (is_array($tdata[$name])) {
             $tdata[$name] = isset($attr['foreingKeyAlias']) ? $tdata[$name][$attr['foreingKeyAlias']] : ($tdata[$name] = $tdata[$name][$name]);
         }
         # preenche o attr deste VO se o attr estiver vazio
         if ('boolean' != gettype($tdata[$name]) && '' == $tdata[$name] || 'boolean' != gettype($tdata[$name]) && FALSE === $tdata[$name]) {
             $this->{$setter}($sdata[$name]);
         }
     }
     return $this;
 }
예제 #13
0
 /**
  * Injeta os valores recuperados do banco no ValueObject.
  *
  * @param ValueObjectAbstract $valueObject
  * @param ResultSet $resultSet
  * */
 protected static function _injectResultOnValueObject(ValueObjectAbstract $valueObject, ResultSet $resultSet)
 {
     $adapter = self::PERSIST_TYPE;
     $annon = $valueObject->annotation()->load();
     $tmpRow = $tmpResult = NULL;
     while (TRUE) {
         $tmpRow = $resultSet->fetch();
         if (NULL == $tmpRow) {
             // @codeCoverageIgnoreStart
             break;
             // @codeCoverageIgnoreEnd
         }
         $tmpResult = $tmpRow;
     }
     foreach ($annon->attrs as $attr) {
         if (isset($attr->set) && isset($attr->{$adapter})) {
             $setter = $attr->set;
             $fName = $attr->{$adapter};
             $valueObject->{$setter}($tmpResult ? parent::getIfDefined($tmpResult, $fName) : NULL);
         }
     }
 }
예제 #14
0
 /**
  * Deleta dados no repositório.
  *
  * @param ValueObjectAbstract $valueObject
  * @return br\gov\sial\core\persist\Persist
  * @throws PersistException
  * */
 public function delete(ValueObjectAbstract $valueObject)
 {
     $annon = $valueObject->annotation()->load();
     $tmpFilter = NULL;
     # tecnica explicada no metodo findByParam
     $tmpOperator = array('WHERE', 'AND');
     foreach ($annon->attrs as $field) {
         if (!isset($field->database) || !isset($field->primaryKey)) {
             // @codeCoverageIgnoreStart
             continue;
             // @codeCoverageIgnoreEnd
         }
         $tmpFilter .= sprintf(' %1$s %2$s = :%2$s', $tmpOperator[(bool) $tmpFilter], $field->database);
         $params[$field->database] = self::_getValue($valueObject, $field->get, $field->type);
     }
     # por padrao nao eh possivel atualizar toda a entidade, se realmente  for necessario realizar
     # esta operacao sobreescreve este metodo
     PersistException::throwsExceptionIfParamIsNull($tmpFilter, sprintf(self::PERSIST_UNAVAILABLE_DELETE_FILTER, $annon->entity));
     $query = sprintf('DELETE FROM %s %s', $annon->entity, $tmpFilter);
     $this->_persist->getConnect()->prepare($query, $params)->update();
 }
예제 #15
0
 /**
  * Retorna todos os atributos do valueObject que podem ser utilizados na camada de persistência, definida por
  * 'self::PERSIST_TYPE'. Opcionalmente, o tipo da operacao podera ser informada (insert, update, delete). Nota:
  * Por padrao os atributos selecionados serao validos para pesquisa.
  *
  * @param ValueObjectAbstract $valueObject
  * @param string $operType
  * @return \stdClass
  * @throws PersistException
  * */
 public function persistAttr(ValueObjectAbstract $valueObject, $operType = NULL)
 {
     $annon = $valueObject->annotation()->load();
     $list = array();
     if (NULL !== $operType) {
         $method = '_persistAttr' . ucfirst(strtolower($operType));
         $message = sprintf(self::T_DMLABSTRACT_UNSUPPORTED_OPERATION, $method);
         DMLException::throwsExceptionIfParamIsNull($this->hasMethod($method), $message);
     }
     foreach ($annon->attrs as $attr) {
         # verifica se o attr pode ser manipulado pela camada de persistencia
         if (FALSE == $this->_persist->isAttrPersistable($attr, $this->_persist->adapter())) {
             continue;
         }
         if (NULL !== $operType) {
             $this->{$method}($list, $attr, $valueObject);
         }
     }
     return $list;
 }
예제 #16
0
 /**
  * Prepara os parâmetros para consulta do LDAP.
  *
  * @param ValueObjectAbstract $valueObject
  * @return array[]
  */
 private function _prepareLdapParams(ValueObjectAbstract $valueObject)
 {
     $annon = $valueObject->annotation()->load();
     foreach ($annon->attrs as $field) {
         if ($attr = self::getIfDefined($field, 'ldap')) {
             $get = $field->get;
             $params[$field->ldap] = $valueObject->{$get}();
         }
         if ($attr = self::getIfDefined($field, 'keyLdap')) {
             $params['keyLdap'] = $field->keyLdap;
         }
     }
     return $params;
 }