/** * Get field values for a model object * * @param mixed $model * @param int $id * @param array $filters * @return mixed */ public static function getModelObjectValues($model, $id = null, array $filters = []) { if (is_string($model)) { $class = $model; } else { $class = get_class($model); if (isset($model->id)) { $id = $model->id; } } $fieldValues = []; $sql = Table\Fields::sql(); $sql->select()->where('models LIKE :models'); $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $class . '%' : '%' . addslashes($class) . '%'; $fields = Table\Fields::execute((string) $sql, ['models' => $value]); if (null !== $id && $fields->count() > 0) { foreach ($fields->rows() as $field) { $fValue = ''; if ($field->storage == 'eav') { $fv = Table\FieldValues::findById([$field->id, $id, $class]); if (isset($fv->field_id)) { $fValue = json_decode($fv->value); foreach ($filters as $filter => $params) { if (null !== $params && count($params) > 0) { $params = array_merge([$fValue], $params); } else { $params = [$fValue]; } $fValue = call_user_func_array($filter, $params); } if ($field->encrypt) { if (is_array($fValue)) { foreach ($fValue as $k => $fv) { $fValue = (new Mcrypt())->decrypt($fValue); } } else { $fValue = (new Mcrypt())->decrypt($fValue); } } } } else { $fv = new Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findRecordsBy(['model_id' => $id, 'model' => $class, 'revision' => 0]); if ($fv->hasRows()) { if ($fv->count() > 1) { $fValue = []; foreach ($fv->rows() as $f) { $fValue[] = $field->encrypt ? (new Mcrypt())->decrypt($f->value) : $f->value; } } else { $fValue = $field->encrypt ? (new Mcrypt())->decrypt($fv->value) : $fv->value; } } } if (is_object($model)) { $model->{$field->name} = self::parse($fValue); } else { $fieldValues[$field->name] = self::parse($fValue); } } } return is_object($model) ? $model : $fieldValues; }
/** * Drop field table * * @param string $name * @return void */ protected function dropFieldTable($name) { $sql = Table\Fields::sql(); $db = $sql->getDb(); $table = $sql->quoteId(DB_PREFIX . 'field_' . $name); $db->query('DROP TABLE ' . $table); $module = \Phire\Table\Modules::findBy(['folder' => 'phire-fields']); if (isset($module->id)) { $assets = unserialize($module->assets); if (in_array(DB_PREFIX . 'field_' . $name, $assets['tables'])) { unset($assets['tables'][array_search(DB_PREFIX . 'field_' . $name, $assets['tables'])]); } $module->assets = serialize($assets); $module->save(); } }
/** * Get all entity field names * * @param array $rows * @return array */ public function getAllFields(array $rows) { $fieldNames = []; foreach ($rows as $i => $row) { if (class_exists('Phire\\Fields\\Model\\FieldValue')) { $class = 'Phire\\Entities\\Model\\Entity'; $sql = \Phire\Fields\Table\Fields::sql(); $sql->select()->where('models LIKE :models'); $sql->select()->orderBy('order'); $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $class . '%' : '%' . addslashes($class) . '%'; $fields = \Phire\Fields\Table\Fields::execute((string) $sql, ['models' => $value]); foreach ($fields->rows() as $field) { $field->models = unserialize($field->models); if ($this->isFieldAllowed($field->models, $row)) { if ($field->storage == 'eav') { $fv = \Phire\Fields\Table\FieldValues::findBy(['field_id' => $field->id, 'model_id' => $row->id, 'model' => 'Phire\\Entities\\Model\\Entity']); foreach ($fv->rows() as $fv) { if (!array_key_exists($field->name, $fieldNames)) { $fieldNames[$field->name] = $field->type; } $rows[$i][$field->name] = json_decode($fv->value, true); } } else { $fv = new \Pop\Db\Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findRecordsBy(['model_id' => $row->id, 'model' => 'Phire\\Entities\\Model\\Entity', 'revision' => 0]); if (!array_key_exists($field->name, $fieldNames)) { $fieldNames[$field->name] = $field->type; } if ($fv->count() > 1) { $rows[$i][$field->name] = []; foreach ($fv->rows() as $f) { $rows[$i][$field->name][] = $f->value; } } else { $rows[$i][$field->name] = $fv->value; } } } } } } return $fieldNames; }
/** * Get form submission values * * @param \Pop\Module\Manager $modules * @return array */ public function getValues(\Pop\Module\Manager $modules = null) { $values = []; $fieldNames = []; if (null !== $modules && $modules->isRegistered('phire-fields')) { $class = 'Phire\\Forms\\Model\\Form'; $sql = \Phire\Fields\Table\Fields::sql(); $sql->select()->where('models LIKE :models'); $sql->select()->orderBy('order'); $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%' . $class . '%' : '%' . addslashes($class) . '%'; $fields = \Phire\Fields\Table\Fields::execute((string) $sql, ['models' => $value]); foreach ($fields->rows() as $field) { if ($field->storage == 'eav') { $fv = \Phire\Fields\Table\FieldValues::findBy(['field_id' => $field->id, 'model_id' => $this->id, 'model' => 'Phire\\Forms\\Model\\FormSubmission']); foreach ($fv->rows() as $fv) { $fieldNames[$field->name] = $field->type; $values[$field->name] = json_decode($fv->value, true); } } else { $fv = new \Pop\Db\Record(); $fv->setPrefix(DB_PREFIX)->setPrimaryKeys(['id'])->setTable('field_' . $field->name); $fv->findRecordsBy(['model_id' => $this->id, 'model' => 'Phire\\Forms\\Model\\FormSubmission', 'revision' => 0]); $fieldNames[$field->name] = $field->type; if ($fv->count() > 1) { $values[$field->name] = []; foreach ($fv->rows() as $f) { $fieldNames[$field->name] = $field->type; $values[$field->name][] = $f->value; } } else { $values[$field->name] = $fv->value; } } } } return ['values' => $values, 'fields' => $fieldNames]; }
/** * Constructor method to instantiate the form object * * @param mixed $id * @param array $captchaConfig * @throws \Pop\Form\Exception * @return self */ public function __construct($id, $captchaConfig = []) { $form = is_numeric($id) ? Table\Forms::findById($id) : Table\Forms::findBy(['name' => $id]); if (!isset($form->id)) { throw new \Pop\Form\Exception('That form does not exist.'); } if (!class_exists('Phire\\Fields\\Model\\Field')) { throw new \Pop\Form\Exception('The phire-fields module is not installed or active.'); } $fieldGroups = []; $submitAttributes = []; $formAttributes = []; $this->filter = (bool) $form->filter; if (!empty($form->submit_attributes)) { $attribs = explode('" ', $form->submit_attributes); foreach ($attribs as $attrib) { $attAry = explode('=', $attrib); $att = trim($attAry[0]); $val = str_replace('"', '', trim($attAry[1])); $submitAttributes[$att] = $val; } } if (!empty($form->attributes)) { $attribs = explode('" ', $form->attributes); foreach ($attribs as $attrib) { $attAry = explode('=', $attrib); $att = trim($attAry[0]); $val = str_replace('"', '', trim($attAry[1])); $formAttributes[$att] = $val; } } $sql = \Phire\Fields\Table\Fields::sql(); $sql->select()->where('models LIKE :models'); $sql->select()->orderBy('order', 'ASC'); $value = $sql->getDbType() == \Pop\Db\Sql::SQLITE ? '%Phire\\Forms\\Model\\Form%' : '%Phire\\\\Forms\\\\Model\\\\Form%'; $fields = \Phire\Fields\Table\Fields::execute((string) $sql, ['models' => $value]); foreach ($fields->rows() as $field) { if (null !== $field->group_id) { $fieldGroups[$field->group_id] = []; } } $fieldGroups[0] = []; $fieldGroups[-1] = []; foreach ($fields->rows() as $field) { $field->validators = unserialize($field->validators); $field->models = unserialize($field->models); if (null !== $field->group_id) { foreach ($field->models as $model) { if (null === $model['type_value'] || $form->id == $model['type_value']) { $fieldConfig = \Phire\Fields\Event\Field::createFieldConfig($field); if (strpos($fieldConfig['label'], '<span class="editor-link-span">') !== false) { $fieldConfig['label'] = str_replace('<span class="editor-link-span">', '<span style="display: none;" class="editor-link-span">', $fieldConfig['label']); } $fieldGroups[$field->group_id]['field_' . $field->id] = $fieldConfig; break; } } } else { if (null === $field->group_id) { foreach ($field->models as $model) { if (null === $model['type_value'] || $form->id == $model['type_value']) { $fieldConfig = \Phire\Fields\Event\Field::createFieldConfig($field); if (strpos($fieldConfig['label'], '<span class="editor-link-span">') !== false) { $fieldConfig['label'] = str_replace('<span class="editor-link-span">', '<span style="display: none;" class="editor-link-span">', $fieldConfig['label']); } $fieldGroups[0]['field_' . $field->id] = $fieldConfig; break; } } } } } if ($form->use_csrf) { $fieldGroups[-1]['csrf'] = ['type' => 'csrf']; } if ($form->use_captcha) { if (class_exists('Phire\\Captcha\\Model\\Captcha')) { $captcha = new \Phire\Captcha\Model\Captcha($captchaConfig); $captcha->createToken(); $fieldGroups[-1]['captcha'] = ['type' => 'captcha', 'label' => 'Enter Code', 'token' => $captcha->token]; } else { $fieldGroups[-1]['captcha'] = ['type' => 'captcha', 'label' => 'Please Solve: ']; } } $fieldGroups[-1]['id'] = ['type' => 'hidden', 'value' => $form->id]; $fieldGroups[-1]['submit'] = ['type' => 'submit', 'label' => ' ', 'value' => !empty($form->submit_value) ? $form->submit_value : 'SUBMIT', 'attributes' => $submitAttributes]; parent::__construct($fieldGroups, null, $form->method); foreach ($formAttributes as $attrib => $value) { $this->setAttribute($attrib, $value); } }