/** * Gets the content objects for the provided entries * @param \ride\library\orm\model\Model $model * @param array $entries * @param string $siteId * @param string $locale * @param string $idContentMapper * @param string $titleFormat * @param string $teaserFormat * @param string $imageFormat * @param string $dateFormat * @return array Array with Content objects for the provided entries * @see \ride\library\cms\content\Content */ public function getContentForEntries(Model $model, array $result, $siteId, $locale, $idContentMapper = null, $titleFormat = null, $teaserFormat = null, $imageFormat = null, $dateFormat = null) { $modelName = $model->getName(); $modelTable = $model->getMeta()->getModelTable(); $entryFormatter = $this->orm->getEntryFormatter(); if (!$titleFormat) { $titleFormat = $modelTable->getFormat(EntryFormatter::FORMAT_TITLE, false); if ($titleFormat == null) { $titleFormat = $model->getName() . ' #{id}'; } } if (!$teaserFormat && $modelTable->hasFormat(EntryFormatter::FORMAT_TEASER)) { $teaserFormat = $modelTable->getFormat(EntryFormatter::FORMAT_TEASER); } if (!$imageFormat && $modelTable->hasFormat(EntryFormatter::FORMAT_IMAGE)) { $imageFormat = $modelTable->getFormat(EntryFormatter::FORMAT_IMAGE); } if (!$dateFormat && $modelTable->hasFormat(EntryFormatter::FORMAT_DATE)) { $dateFormat = $modelTable->getFormat(EntryFormatter::FORMAT_DATE); } try { $mapper = $this->getContentMapper($modelName, $idContentMapper); } catch (Exception $e) { $mapper = new OrmContentMapper($this->nodeModel, $model, $entryFormatter); } foreach ($result as $index => $entry) { $title = $entryFormatter->formatEntry($entry, $titleFormat); $url = $mapper->getUrl($siteId, $locale, $entry); $teaser = null; if ($teaserFormat) { $teaser = $entryFormatter->formatEntry($entry, $teaserFormat); } $image = null; if ($imageFormat) { $image = $entryFormatter->formatEntry($entry, $imageFormat); } $date = null; if ($dateFormat) { $date = $entryFormatter->formatEntry($entry, $dateFormat); } $content = new Content($modelName, $title, $url, $teaser, $image, $date, $entry); $result[$index] = $content; } return $result; }
/** * Gets the file name for a newly uploaded file * @param \ride\library\orm\model\Model $model * @param \ride\library\orm\definition\field\ModelField $field * @param \ride\library\orm\entry\Entry $entry * @return string Name for the file without path and extension */ protected function getFileName(Model $model, ModelField $field, Entry $entry) { $entryFormatter = $model->getOrmManager()->getEntryFormatter(); $format = $model->getMeta()->getFormat(EntryFormatter::FORMAT_TITLE); $name = $entryFormatter->formatEntry($entry, $format); if ($name) { $name = StringHelper::safeString($name); } else { $name = StringHelper::generate(); } return $name; }
/** * Resolves the provided relationship field * @param \ride\library\orm\model\Model $model * @param string $relationship * @param string $type * @return \ride\library\orm\definition\field\Field */ private function getField(Model $model, $relationship, $type) { $field = $model->getMeta()->getField($relationship); if (!$field instanceof RelationField) { // invalid relationship $error = $this->api->createError(Response::STATUS_CODE_BAD_REQUEST, 'input.relationship', 'Could not set relationship'); $error->setDetail('Relationship \'' . $relationship . '\' does not exist for type \'' . $type . '\''); $error->setSourcePointer('/data/relationships/' . $relationship); $this->document->addError($error); } return $field; }
/** * Prepares the query for the condition * @param \ride\library\orm\model\Model $model * @param \ride\library\orm\query\ModelQuery $query * @param string $fieldName Name of the filter field * @param string $conditionField Name of the model field to query on * @return boolean True when conditionField is set, false otherwise */ protected function prepareQuery(Model $model, ModelQuery $query, $fieldName, &$conditionField) { $orm = $model->getOrmManager(); $meta = $model->getMeta(); $fieldTokens = explode('.', $fieldName); $fieldTokenName = array_shift($fieldTokens); $field = $meta->getField($fieldTokenName); if ($field instanceof PropertyField) { return false; } elseif ($field instanceof BelongsToField) { $conditionField = $fieldTokenName; } else { $conditionField = $fieldTokenName . '.' . ModelTable::PRIMARY_KEY; } $numFields = count($fieldTokens); $numField = 0; $oldFieldTokenName = null; while ($numField <= $numFields) { if ($numField > 0) { $foreignKey = $meta->getRelationForeignKey($fieldTokenName); if ($field instanceof BelongsToField) { // $query->addJoin('LEFT', $relationModelName, $relationModelName, '{self.' . $oldFieldTokenName . '} = {' . $oldFieldTokenName . '.id}'); $conditionField = $oldFieldTokenName . '.' . $fieldTokenName; } elseif ($field instanceof HasManyField) { $relation = $meta->getRelationMeta($fieldTokenName); $foreignKey = $relation->getForeignKey(); $linkModelName = $relation->getLinkModelName(); // $relation->isRelationWithSelf(); // $relation->isHasManyAndBelongsToMany(); if ($linkModelName) { $foreignKeyToSelf = $relation->getForeignKeyToSelf($fieldTokenName); $query->addJoin('LEFT', $linkModelName, $linkModelName, '{' . $linkModelName . '.' . $foreignKeyToSelf . '} = {' . $oldFieldTokenName . '.id}'); $conditionField = $linkModelName . '.' . $foreignKey; } else { $linkRelationModelName = $meta->getRelationModelName($fieldTokenName); $foreignKeyToSelf = $meta->getRelationForeignKeyToSelf($fieldTokenName); $linkModel = $orm->getModel($linkRelationModelName); $linkMeta = $linkModel->getMeta(); $query->addJoin('LEFT', $linkRelationModelName, $linkRelationModelName, '{' . $linkRelationModelName . '.' . $foreignKey . '} = {' . $oldFieldTokenName . '.id}'); $conditionField = $linkRelationModelName . '.' . ModelTable::PRIMARY_KEY; } } } $oldMeta = $meta; $oldFieldTokenName = $fieldTokenName; $relationModelName = $meta->getRelationModelName($fieldTokenName); $relationModel = $orm->getModel($relationModelName); $meta = $relationModel->getMeta(); if ($fieldTokens) { $fieldTokenName = array_shift($fieldTokens); if ($fieldTokenName) { $field = $meta->getField($fieldTokenName); } } else { $fieldTokenName = null; } $numField++; } return true; }
/** * Creates the model query from the provided properties * @param \ride\library\orm\model\Model $model * @param \ride\library\orm\model\ContentProperties $contentProperties * @param string $locale Code of the locale * @param integer $page Page number * @param array $arguments Arguments for the condition * @return \ride\library\orm\query\ModelQuery */ public function getModelQuery(ContentProperties $contentProperties, $locale, $page = 1, array $arguments, &$isFiltered = null) { $isFiltered = false; // create query $query = $this->model->createQuery($locale); $query->setRecursiveDepth($contentProperties->getRecursiveDepth()); $query->setFetchUnlocalized($contentProperties->getIncludeUnlocalized()); // select fields $modelFields = $contentProperties->getModelFields(); if ($modelFields) { foreach ($modelFields as $fieldName) { $query->addFields('{' . $fieldName . '}'); } } // apply condition $condition = $contentProperties->getCondition(); if ($condition) { $arguments = $this->parseContextVariables($condition, $arguments); if ($arguments) { $isFiltered = true; $query->addConditionWithVariables($condition, $arguments); } else { $query->addCondition($condition); } } // apply search if ($contentProperties->hasSearch()) { $searchQuery = $this->request->getQueryParameter('query'); if ($searchQuery) { $conditions = array(); $fields = $this->model->getMeta()->getProperties(); foreach ($fields as $fieldName => $field) { if ($field->getOption('scaffold.search')) { $conditions[] = '{' . $fieldName . '} LIKE %1%'; } } if ($conditions) { $condition = implode(' OR ', $conditions); $searchQuery = '%' . $searchQuery . '%'; $query->addCondition($condition, $searchQuery); } } } // apply filters $this->filters = array(); $filters = $contentProperties->getFilters(); foreach ($filters as $filter) { $filterValue = $this->request->getQueryParameter($filter['name']); if ($filterValue) { $isFiltered = true; } $this->filters[$filter['name']] = array('type' => $filter['type'], 'field' => $filter['field'], 'filter' => $this->dependencyInjector->get('ride\\web\\cms\\orm\\filter\\ContentOverviewFilter', $filter['type'])); $this->filters[$filter['name']]['value'] = $this->filters[$filter['name']]['filter']->applyQuery($this->model, $query, $filter['field'], $filterValue); } // apply order $order = $contentProperties->getOrder(); if ($order) { $query->addOrderBy($order); } // apply pagination if ($contentProperties->isPaginationEnabled()) { $paginationOffset = $contentProperties->getPaginationOffset(); $rows = $contentProperties->getPaginationRows(); $offset = ($page - 1) * $rows; if ($paginationOffset) { $offset += $paginationOffset; } $query->setLimit((int) $rows, (int) $offset); } return $query; }