select('par.*') ->from('parameters_configurations', 'parc') ->join('parc', 'parameters', 'par', 'parc.id_parameter = par.id') ->where($spec) ->execute(); $result = []; foreach ($items as $data) { $item = self::createFromArray($data); $result[$item->id] = $item; } return $result; } public static function createFromArray($data) { $item = new self(); foreach ($data as $key => $value) { $item->{$key} = $value; } return $item; } public static function insertValue($id_parameter, $id_product) { sqlQuery('INSERT INTO parameters_configurations (id_parameter, id_product) ( SELECT * FROM (SELECT :id_parameter as id_parameter, :id_product as id_product) AS tmp WHERE NOT EXISTS(SELECT * FROM parameters_configurations WHERE id_parameter=:id_parameter AND id_product=:id_product) );', ['id_parameter' => $id_parameter, 'id_product' => $id_product] ); } public function deleteValue($id_parameter, $id_product) { return $this->deleteSQL('parameters_configurations', ['id_parameter' => $id_parameter, 'id_product' => $id_product]); } /** * @return ParameterConfigurationValue[] * * @throws \Doctrine\DBAL\Exception */ public function fetchValues(bool $applyCurrency = true): array { $qb = sqlQueryBuilder()->select('pl.*, pp.*, COALESCE(pp.unit, pa.unit) as unit') ->from('parameters', 'pa') ->join('pa', 'parameters_products', 'pp', 'pp.id_parameter=pa.id') ->leftJoin('pa', 'parameters_list', 'pl', 'pp.value_list=pl.id') ->orderBy('pa.position ASC, pp.weight DESC, pa.id ASC, pl.position') ->where(Operator::equals(['pp.id_parameter' => $this->id, 'pp.id_product' => $this->id_product])); $qb->andWhere(Translation::joinTranslatedFields(ParametersTranslation::class, function (QueryBuilder $qb, $columnName, $translatedField) { if ($columnName == 'unit') { $field = Operator::coalesce($translatedField, 'pp.unit'); $qb->addSelect("COALESCE({$field}, pa.unit) as unit"); return false; } }, ['unit', 'name', 'descr'])); $qb->andWhere(Translation::joinTranslatedFields(ParametersListTranslation::class, function (QueryBuilder $qb, $columnName, $translatedField) { if ($columnName == 'value') { $field = Operator::coalesce($translatedField, 'pl.value'); $qb->addSelect("CASE pa.value_type WHEN 'char' THEN pp.value_char WHEN 'list' THEN {$field} ELSE pp.value_float END as value"); return false; } }, ['value', 'description'])); $values = []; foreach ($qb->execute() as $value) { $value = ParameterConfigurationValue::createFromArray($value, $applyCurrency); $values[$value->id] = $value; } return $values; } } #[AllowDynamicProperties] class ParameterConfigurationValue extends TemplateAccess { public $id; public $value; /** * @var Decimal */ public $configuration_price; public $id_product; public static function createFromArray($data, $applyCurrency = true): ParameterConfigurationValue { $item = new self(); foreach ($data as $key => $value) { $item->{$key} = $value; } $item->configuration_price = toDecimal($item->configuration_price); if ($applyCurrency) { $item->configuration_price = applyCurrency($item->configuration_price); } return $item; } public function fetchPrice() { /* * Tohle je dmntni, ale musi to tu bejt, aby do template chodila cena priplatku s aplikovanou cenovou hladinou. * Ve funkci createFromArray to naopak bejt nema, aby tam byla defaultni cena, protoze kdyz se to pak fetchuje v kosiku, * tak se aplikuje potom formatCustomerPrice na celou polozku. * */ // protože už mohla být aplikována currency v createFromArray $currencyContext = Contexts::get(CurrencyContext::class); $price = formatCustomerPrice($this->configuration_price, 0, 0, $this->id_product, null, null, null, $currencyContext->getActive())['value_with_vat']; return $price; } }