Esempio n. 1
0
 /**
  * Get single model object with dynamic field values using a table join
  *
  * @param  string $table
  * @param  string $model
  * @param  array  $params
  * @param  array  $filters
  * @param  array  $conds
  * @param  string $order
  * @return mixed
  */
 public static function getModelObjectsFromTable($table, $model, array $params = [], array $filters = [], array $conds = [], $order = null)
 {
     $sql = Table\Fields::sql();
     $sql->select()->where('models LIKE :models');
     $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $model . '%' : '%' . addslashes($model) . '%';
     $fields = Table\Fields::execute((string) $sql, ['models' => $value]);
     $encrypted = [];
     $multiples = [];
     $allTables = $sql->db()->getTables();
     if ($fields->hasRows()) {
         $sql = new Sql($sql->db(), $table);
         $select = [$table . '.*'];
         foreach ($fields->rows() as $field) {
             $field->models = unserialize($field->models);
             if (self::isFieldAllowed($field->models, $params) && in_array(DB_PREFIX . 'field_' . $field->name, $allTables)) {
                 $select[$field->name] = DB_PREFIX . 'field_' . $field->name . '.value';
             }
         }
         $sql->select($select);
         foreach ($fields->rows() as $field) {
             if (self::isFieldAllowed($field->models, $params) && in_array(DB_PREFIX . 'field_' . $field->name, $allTables)) {
                 if ($field->encrypt) {
                     $encrypted[$field->id] = $field->name;
                 }
                 if ($field->type != 'textarea-history' && ($field->dynamic || $field->type == 'checkbox' || $field->type == 'select' && strpos($field->attributes, 'multiple') !== false)) {
                     $multiples[$field->id] = $field->name;
                 }
                 $sql->select()->join(DB_PREFIX . 'field_' . $field->name, [$table . '.id' => DB_PREFIX . 'field_' . $field->name . '.model_id']);
             }
         }
         foreach ($fields->rows() as $field) {
             if (self::isFieldAllowed($field->models, $params) && in_array(DB_PREFIX . 'field_' . $field->name, $allTables)) {
                 $sql->select()->where(DB_PREFIX . 'field_' . $field->name . '.revision = 0');
             }
         }
         if (count($params) > 0) {
             foreach ($params as $param) {
                 $sql->select()->where($table . '.' . $param);
             }
         }
         if (count($conds) > 0) {
             foreach ($conds as $name => $cond) {
                 $sql->select()->where(DB_PREFIX . 'field_' . $name . '.value ' . $cond);
             }
         }
         if (null !== $order) {
             $orderAry = explode(' ', $order);
             $sql->select()->orderBy($orderAry[0], $orderAry[1]);
         }
         $record = new Record();
         $record->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable($table);
         $record->executeQuery($sql, Record::ROW_AS_ARRAYOBJECT);
         $values = $record->rows();
         foreach ($values as $key => $value) {
             foreach ($value as $k => $v) {
                 foreach ($filters as $filter => $params) {
                     if (null !== $params && count($params) > 0) {
                         $params = array_merge([$v], $params);
                     } else {
                         $params = [$v];
                     }
                     $v = call_user_func_array($filter, $params);
                 }
                 if (in_array($key, $encrypted)) {
                     $values[$key][$k] = self::parse((new Mcrypt())->decrypt($v));
                 } else {
                     $values[$key][$k] = self::parse($v);
                 }
             }
         }
         if (count($multiples) > 0) {
             foreach ($values as $i => $row) {
                 foreach ($multiples as $id => $name) {
                     $fv = new Record();
                     $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $name);
                     $fv->findRecordsBy(['model_id' => $row->id, 'model' => $model]);
                     if ($fv->hasRows()) {
                         $values[$i][$name] = [];
                         foreach ($fv->rows() as $f) {
                             $values[$i][$name][] = self::parse(in_array($id, $encrypted) ? (new Mcrypt())->decrypt($f->value) : $f->value);
                         }
                     }
                 }
             }
         }
     } else {
         $sql = new Sql($sql->db(), $table);
         $sql->select([$table . '.*']);
         $record = new Record();
         $record->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable($table);
         $record->executeQuery($sql, Record::ROW_AS_ARRAYOBJECT);
         $values = $record->rows();
     }
     $filteredValues = [];
     foreach ($values as $value) {
         if (!in_array($value, $filteredValues)) {
             $filteredValues[] = $value;
         }
     }
     return $filteredValues;
 }