diff --git a/public_html/components/com_jed/models/extension.php b/public_html/components/com_jed/models/extension.php index 933f12fa0..f1a8834ea 100644 --- a/public_html/components/com_jed/models/extension.php +++ b/public_html/components/com_jed/models/extension.php @@ -11,6 +11,7 @@ use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\MVC\Model\BaseDatabaseModel; +use Joomla\CMS\Object\CMSObject; /** * Extension model. @@ -21,15 +22,15 @@ class JedModelExtension extends BaseDatabaseModel { /** - * Function to get a specific extension. + * Method to get a specific extension. * - * @param integer $pk The ID of the item + * @param integer $pk The id of the primary key. * - * @return stdClass|mixed The data - * @since 4.0.0 - * @throws Exception If the ID is not found + * @return CMSObject Object with item details. + * + * @since 4.0.0 */ - public function getItem($pk = null) + public function getItem($pk = null): CMSObject { $pk = $pk ?: $this->getState('extension.id'); $db = $this->getDbo(); @@ -115,13 +116,33 @@ public function getItem($pk = null) $extension->phpVersion = $this->getPhpVersions($extension->id); $extension->joomlaVersion = $this->getJoomlaVersions($extension->id); - // Get other extensions from this developer - /** @var JedModelExtensions $extensionsModel */ - $extensionsModel = BaseDatabaseModel::getInstance('Extensions', 'JedModel', array('ignore_request' => true)); - $extensionsModel->setState('filter.developer', $extension->developerId); - $extensionsModel->setState('filter.extensionId', $extension->id); - $extensionsModel->setState('filter.extensionId.include', false); - $extension->otherExtensions = $extensionsModel->getItems(); + // Collect extensions retrieved to exclude + $excludeIds = [$extension->id]; + + // Get other extensions by same developer + $extension->otherExtensions = $this->getExtensions($excludeIds, 100, 'developer', $extension->developerId); + + foreach ($extension->otherExtensions as $otherExtension) + { + $excludeIds[] = $otherExtension->id; + } + + // Get related extensions from same category + $extension->relatedExtensions = $this->getExtensions($excludeIds, 3, 'category', $extension->categoryId); + + foreach ($extension->relatedExtensions as $relatedExtension) + { + $excludeIds[] = $relatedExtension->id; + } + + // Get other related if we don't have 3 items yet + if (count($extension->relatedExtensions) < 3) + { + $extension->relatedExtensions = array_merge( + $extension->relatedExtensions, + $this->getExtensions($excludeIds, 3 - count($extension->relatedExtensions)) + ); + } return $extension; } @@ -246,4 +267,33 @@ public function getPhpVersions(int $extensionId): array return $db->loadColumn(); } + /** + * Get extensions based on quick filters + * + * @param array $excludeIds Array of IDs to exclude + * @param int $limit Limit items retrieved + * @param string $filterType Filter type (developer|category) + * @param int $filterId ID to filter for + * + * @return array + * + * @since 4.0.0 + */ + public function getExtensions(array $excludeIds, int $limit = 100, string $filterType = '', int $filterId = 0): array + { + /** @var JedModelExtensions $extensionsModel */ + $extensionsModel = BaseDatabaseModel::getInstance('Extensions', 'JedModel', array('ignore_request' => true)); + + if ($filterType && $filterId) + { + $extensionsModel->setState('filter.' . $filterType, $filterId); + } + + $extensionsModel->setState('filter.extensionId', $excludeIds); + $extensionsModel->setState('filter.extensionId.include', false); + $extensionsModel->setState('list.limit', $limit); + $extensionsModel->setState('list.ordering', Factory::getDbo()->getQuery(true)->Rand()); + + return $extensionsModel->getItems(); + } } diff --git a/public_html/components/com_jed/models/extensions.php b/public_html/components/com_jed/models/extensions.php index 3fa3db287..da03ecfbe 100644 --- a/public_html/components/com_jed/models/extensions.php +++ b/public_html/components/com_jed/models/extensions.php @@ -121,10 +121,9 @@ protected function getListQuery(): \JDatabaseQuery if ($category) { - + $query->where('extensions.category_id = ' . (int) $category); } - // Filter by a single or group of articles. $extensionId = $this->getState('filter.extensionId'); if (is_numeric($extensionId)) @@ -189,6 +188,8 @@ protected function getListQuery(): \JDatabaseQuery $query->where($db->quoteName('extensions.created_by') . ' = ' . (int) $developer); } + $query->order($this->getState('list.ordering', 'extensions.ordering') . ' ' . $this->getState('list.direction', 'ASC')); + return $query; } @@ -211,6 +212,7 @@ public function getItems() { $item->intro = HTMLHelper::_('string.truncate', $item->body, 150, true, false); } + unset($item->body); // Format the image diff --git a/public_html/components/com_jed/views/extension/tmpl/default.php b/public_html/components/com_jed/views/extension/tmpl/default.php index e40a5dfda..0c6dc7e74 100644 --- a/public_html/components/com_jed/views/extension/tmpl/default.php +++ b/public_html/components/com_jed/views/extension/tmpl/default.php @@ -16,174 +16,174 @@ /** @var JedViewExtension $this */ ?> -
- item->intro; ?> -
--
- -+ item->intro; ?> +
+ ++
+ +Rating
-Positives & negatives
-Description
-Author
+Rating
-Positives & negatives
-Description
-Author
+Rating
+Positives & negatives
+Description
+Author
+Rating
+Positives & negatives
+Description
+Author
+