/** * 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; }