/** * Execute search * * @param array $fields * @params \Pop\Module\Manager $modules * @return array */ public function search($fields, \Pop\Module\Manager $modules) { $title = strip_tags($fields['title']); $selectFields = ['id' => DB_PREFIX . 'content.id', 'type_id' => DB_PREFIX . 'content.type_id', 'parent_id' => DB_PREFIX . 'content.parent_id', 'title' => DB_PREFIX . 'content.title', 'uri' => DB_PREFIX . 'content.uri', 'slug' => DB_PREFIX . 'content.slug', 'status' => DB_PREFIX . 'content.status', 'roles' => DB_PREFIX . 'content.roles', 'order' => DB_PREFIX . 'content.order', 'publish' => DB_PREFIX . 'content.publish', 'expire' => DB_PREFIX . 'content.expire']; $sql = Table\Content::sql(); $sql->select($selectFields); $sql->select()->where('status = :status'); $params = ['status' => 1]; if (isset($fields['type_id'])) { $sql->select()->where('type_id = :type_id'); $params['type_id'] = $fields['type_id']; } $sql->select()->where('title LIKE :title'); $params['title'] = '%' . $title . '%'; $sql->select()->orderBy('title', 'ASC'); $results = Table\Content::execute((string) $sql, $params)->rows(); foreach ($results as $i => $row) { $roles = unserialize($row->roles); if (count($roles) > 0 && !in_array($this->user_role_id, $roles)) { unset($results[$i]); } else { if ($modules->isRegistered('phire-fields')) { $item = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Content\\Model\\Content', ['id' => $row->id], 'getById', $this->filters); $results[$i] = new \ArrayObject($item->toArray(), \ArrayObject::ARRAY_AS_PROPS); } } } $log = new Searches(['keywords' => $title, 'results' => count($results), 'method' => $_POST ? 'post' : 'get', 'timestamp' => time()]); $log->save(); return $results; }
/** * Get the feed * * @param array $feedHeaders * @param string $feedType * @param int $feedLimit * @param \Pop\Module\Manager $modules * @return Writer */ public function getFeed($feedHeaders, $feedType, $feedLimit, \Pop\Module\Manager $modules) { $items = []; $feed = Table\Feed::findAll(); foreach ($feed->rows() as $f) { if ($f->type == 'content') { if ($modules->isRegistered('phire-fields')) { $item = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Content\\Model\\Content', ['id' => $f->id]); } else { $item = new \Phire\Content\Model\Content(); $item->getById($f->id); } if ($item->status == 1 && count($item->roles) == 0) { $items[] = $this->formatItem($item, 'content', $feedType); } } else { if ($f->type == 'media') { if ($modules->isRegistered('phire-fields')) { $item = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Media\\Model\\Media', ['id' => $f->id]); } else { $item = new \Phire\Media\Model\Media(); $item->getById($f->id); } $item->publish = $item->uploaded; $items[] = $this->formatItem($item, 'media', $feedType); } } } usort($items, function ($a, $b) { $t1 = strtotime($a['publish']); $t2 = strtotime($b['publish']); return $t2 - $t1; }); if ((int) $feedLimit > 0) { if (count($items) > (int) $feedLimit) { $items = array_slice($items, 0, (int) $feedLimit); } } $writer = new Writer($feedHeaders, $items); if ($feedType == 'atom') { $writer->setAtom(); } return $writer; }
/** * Get category items * * @param int $limit * @param int $page * @return array */ public function getItems($limit = null, $page = null) { $rows = []; $dateFields = ['publish', 'expire', 'created', 'updated', 'uploaded']; if (isset($this->data['id'])) { $sql = Table\CategoryItems::sql(); $sql->select([0 => '*', 'content_title' => DB_PREFIX . 'content.title', 'media_title' => DB_PREFIX . 'media.title'])->join(DB_PREFIX . 'content', [DB_PREFIX . 'category_items.content_id' => DB_PREFIX . 'content.id'])->join(DB_PREFIX . 'content_types', [DB_PREFIX . 'content_types.id' => DB_PREFIX . 'content.type_id'])->join(DB_PREFIX . 'media', [DB_PREFIX . 'category_items.media_id' => DB_PREFIX . 'media.id'])->join(DB_PREFIX . 'media_libraries', [DB_PREFIX . 'media_libraries.id' => DB_PREFIX . 'media.library_id'])->where('category_id = :category_id'); $s = ' AND ((' . $sql->quoteId('media_id') . ' IS NOT NULL) OR ((' . $sql->quoteId('media_id') . ' IS NULL) AND (((' . $sql->quoteId('strict_publishing') . ' = 1) AND (' . $sql->quoteId('publish') . ' <= NOW())) OR (' . $sql->quoteId('strict_publishing') . ' = 0)) AND ((' . $sql->quoteId('expire') . ' IS NULL) OR (' . $sql->quoteId('expire') . ' > NOW())) AND (' . $sql->quoteId('status') . ' = 1)))'; if (null !== $limit) { $page = null !== $page && (int) $page > 1 ? $page * $limit - $limit : null; $sql->select()->limit($limit)->offset($page); } if (isset($this->data['order_by_field']) && isset($this->data['order_by_field'])) { $by = $this->data['order_by_field']; $order = $this->data['order_by_order']; } else { $by = DB_PREFIX . 'category_items.order'; $order = 'ASC'; } $sql->select()->orderBy($by, $order); $s = str_replace('ORDER BY', $s . ' ORDER BY', (string) $sql); $rows = Table\CategoryItems::execute($s, ['category_id' => $this->id])->rows(false); } if (count($rows)) { foreach ($rows as $key => $value) { if (class_exists('Phire\\Fields\\Model\\FieldValue')) { if (!empty($value['media_id'])) { $item = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Media\\Model\\Media', [$value['media_id']], 'getById', $this->data['filters']); } else { $item = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Content\\Model\\Content', [$value['content_id']], 'getById', $this->data['filters']); } $value = array_merge((array) $value, $item->toArray()); } else { if (!empty($value['media_id'])) { $media = new \Phire\Media\Model\Media(); $media->getById($value['media_id']); $value = array_merge((array) $value, $media->toArray()); } } foreach ($value as $ky => $vl) { if (in_array($ky, $dateFields)) { $dateValues = $this->formatDateAndTime($vl); foreach ($dateValues as $k => $v) { $value[$ky . '_' . $k] = $v; } } } $rows[$key] = new \ArrayObject($value, \ArrayObject::ARRAY_AS_PROPS); } } return $rows; }
/** * Render single view * * @param string $name * @param int $id * @param string $dateFormat * @param array $filters * @return mixed */ public function renderSingle($name, $id, $dateFormat = null, array $filters = []) { if (is_numeric($name)) { $this->getById($name); } else { $this->getByName($name); } if (isset($this->data['models'][0]) && isset($this->data['models'][0]['model'])) { $model = $this->data['models'][0]['model']; if (null !== $this->data['models'][0]['type_field'] && null !== $this->data['models'][0]['type_value']) { $object = \Phire\Fields\Model\FieldValue::getModelObject($model, ['id' => $id], 'getById', $filters); return $this->buildSingle($object, $dateFormat); } else { return null; } } else { return null; } }
/** * Get entity by title * * @param string $title * @param array $filters * @return \ArrayObject */ public function getByTitle($title, array $filters = []) { $entity = Table\Entities::findBy(['title' => $title]); if (isset($entity->id)) { $this->getById($entity->id); if (class_exists('Phire\\Fields\\Model\\FieldValue')) { $entity = \Phire\Fields\Model\FieldValue::getModelObjectValues($this, null, $filters); $data = $entity->toArray(); $this->data = array_merge($this->data, $data); } } return new \ArrayObject($this->data, \ArrayObject::ARRAY_AS_PROPS); }
/** * Get all media by library ID * * @param int $libraryId * @return array */ public function getAllByLibraryId($libraryId) { $library = new MediaLibrary(); $library->getById($libraryId); $mediaAry = Table\Media::findBy(['library_id' => $libraryId], ['order' => 'order, id ASC'])->rows(); $ary = []; foreach ($mediaAry as $media) { if (class_exists('Phire\\Fields\\Model\\FieldValue')) { $med = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Media\\Model\\Media', [$media->id]); $m = $med->toArray(); } else { $m = (array) $media; } $icon = $this->getFileIcon($m['file'], $library); $m['filesize'] = $this->formatFileSize($m['size']); $m['library_folder'] = $library->folder; $m['icon'] = $icon['image']; $m['icon_width'] = $icon['width']; $m['icon_height'] = $icon['height']; $ary[] = $m; } return $ary; }
/** * Get tag content * * @param Table\Tags $tag * @param \Pop\Module\Manager $modules * @return void */ protected function getTag(Table\Tags $tag, \Pop\Module\Manager $modules) { if ($modules->isRegistered('phire-fields')) { $t = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Tags\\Model\\Tag', [$tag->id]); $data = $t->toArray(); } else { $data = $tag->getColumns(); } $items = []; $c2t = Table\TagItems::findBy(['tag_id' => $tag->id], ['order' => 'content_id DESC']); if ($c2t->hasRows()) { foreach ($c2t->rows() as $c) { if ($modules->isRegistered('phire-fields')) { $item = \Phire\Fields\Model\FieldValue::getModelObject('Phire\\Content\\Model\\Content', [$c->content_id], 'getById', $modules['phire-tags']['filters']); } else { $class = 'Phire\\Content\\Model\\Content'; $model = new $class(); call_user_func_array([$model, 'getById'], [$c->content_id]); $item = $model; } if ($item->status == 1 && count($item->roles) == 0) { $items[$item->id] = new \ArrayObject($item->toArray(), \ArrayObject::ARRAY_AS_PROPS); } } } $data['items'] = $items; $this->data = array_merge($this->data, $data); }
/** * Get content by date * * @param string $date * @param string $dateTimeFormat * @param array $filters * @param string $limit * @param string $page * @return array */ public function getByDate($date, $dateTimeFormat, $filters, $limit = null, $page = null) { $sql1 = Table\Content::sql(); $sql2 = clone $sql1; $sql2->select(['count' => 'COUNT(*)', 'in_date' => DB_PREFIX . 'content_types.in_date']); $sql1->select(['id' => DB_PREFIX . 'content.id', 'type_id' => DB_PREFIX . 'content.type_id', 'parent_id' => DB_PREFIX . 'content.parent_id', 'title' => DB_PREFIX . 'content.title', 'uri' => DB_PREFIX . 'content.uri', 'slug' => DB_PREFIX . 'content.slug', 'status' => DB_PREFIX . 'content.status', 'publish' => DB_PREFIX . 'content.publish', 'expire' => DB_PREFIX . 'content.expire', 'in_date' => DB_PREFIX . 'content_types.in_date']); $sql1->select()->join(DB_PREFIX . 'content_types', [DB_PREFIX . 'content_types.id' => DB_PREFIX . 'content.type_id']); $sql2->select()->join(DB_PREFIX . 'content_types', [DB_PREFIX . 'content_types.id' => DB_PREFIX . 'content.type_id']); $dateAry = explode('/', $date); if (count($dateAry) == 3) { $start = $dateAry[0] . '-' . $dateAry[1] . '-' . $dateAry[2] . ' 00:00:00'; $end = $dateAry[0] . '-' . $dateAry[1] . '-' . $dateAry[2] . ' 23:59:59'; } else { if (count($dateAry) == 2) { $start = $dateAry[0] . '-' . $dateAry[1] . '-01 00:00:00'; $end = $dateAry[0] . '-' . $dateAry[1] . '-' . date('t', strtotime($dateAry[0] . '-' . $dateAry[1] . '-01')) . ' 23:59:59'; } else { $start = $dateAry[0] . '-01-01 00:00:00'; $end = $dateAry[0] . '-12-31 23:59:59'; } } $sql1->select()->where('status = :status')->where('publish >= :publish1')->where('publish <= :publish2')->where('in_date = :in_date'); $sql2->select()->where('status = :status')->where('publish >= :publish1')->where('publish <= :publish2')->where('in_date = :in_date'); $params = ['status' => 1, 'publish' => [$start, $end], 'in_date' => 1]; $count = Table\Content::execute((string) $sql2, $params)->count; if ($count > $limit) { $page = null !== $page && (int) $page > 1 ? $page * $limit - $limit : null; $sql1->select()->offset($page)->limit($limit); } $sql1->select()->orderBy('publish', 'DESC'); $rows = Table\Content::execute((string) $sql1, $params)->rows(); if (class_exists('Phire\\Fields\\Model\\FieldValue')) { foreach ($rows as $i => $row) { $fieldValues = \Phire\Fields\Model\FieldValue::getModelObjectValues('Phire\\Content\\Model\\Content', $row->id, $filters); $rows[$i] = new \ArrayObject(array_merge((array) $row->getColumns(), $fieldValues), \ArrayObject::ARRAY_AS_PROPS); $rows[$i]->publish = date($dateTimeFormat, strtotime($rows[$i]->publish)); } } return $rows; }