From ac18248db2a66e5ede53b5852d4cd568fac84ab5 Mon Sep 17 00:00:00 2001 From: Sander Potjer Date: Sun, 19 Jul 2020 10:47:37 +0200 Subject: [PATCH] #16 Load other extensions from same categiry --- .../components/com_jed/models/extension.php | 76 +++- .../components/com_jed/models/extensions.php | 6 +- .../com_jed/views/extension/tmpl/default.php | 342 +++++++++--------- 3 files changed, 239 insertions(+), 185 deletions(-) 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->title; ?>

-
- -
- $this->item->score]); ?> - item->reviews; ?> reviews +
+
+
+
+

item->title; ?>

+
+ +
+ $this->item->score]); ?> + item->reviews; ?> reviews +
-
-
-
- item->homepageLink): ?> - Get extension - +
+
+ item->homepageLink): ?> + Get extension + - - - Favourite - + + + Favourite + +
+
-
-
-
-
-
-
- item->image): ?> - <?php echo $this->item->title; ?> - -
-
-
-
-

- - item->category; ?>, - item->relatedCategories as $category): ?> - title; ?>, - -

-

- item->intro; ?> -

-

- item->downloadLink): ?> - Download - - item->demoLink): ?> - Demo - - item->documentationLink): ?> - Documentation - - item->supportLink): ?> - Support - - item->licenseLink): ?> - License - - item->translationLink): ?> - Translation +

+
+
+
+ item->image): ?> + <?php echo $this->item->title; ?> -

-
-
-

- - Report - Share - -

-
-
-
Version
-
item->version; ?>
-
-
-
Last updated
-
item->updated, Text::_('F d, Y')); ?>
-
-
-
Date added
-
item->added, Text::_('F d, Y')); ?>
-
-
-
Includes
-
item->extensionTypes)); ?>
-
-
-
Joomla! version(s)
-
item->joomlaVersion); ?>
-
-
-
PHP version(s)
-
item->phpVersion); ?>
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
+

+ + item->category; ?>, + item->relatedCategories as $category): ?> + title; ?>, + +

+

+ item->intro; ?> +

+

+ item->downloadLink): ?> + Download + + item->demoLink): ?> + Demo + + item->documentationLink): ?> + Documentation + + item->supportLink): ?> + Support + + item->licenseLink): ?> + License + + item->translationLink): ?> + Translation + +

+
+
+

+ + Report + Share + +

+
+
+
Version
+
item->version; ?>
+
+
+
Last updated
+
item->updated, Text::_('F d, Y')); ?>
+
+
+
Date added
+
item->added, Text::_('F d, Y')); ?>
+
+
+
Includes
+
item->extensionTypes)); ?>
+
+
+
Joomla! version(s)
+
item->joomlaVersion); ?>
+
+
+
PHP version(s)
+
item->phpVersion); ?>
+
+
+
-
-
-
-

Description

- item->body, 1000, true); - ?> -

Read all

+
+
+
+
+
+
+
+
+
+
-
-
-
-
-

Reviews for free version

- item->score / 10; ?> - $this->item->score]); ?> - item->reviews; ?> reviews +
+
+

Description

+ item->body, 1000, true); + ?> +

Read all

+
+
-
-

Most valuable reviews

-
-

Powerful and useful extension

-

Rating

-

Positives & negatives

-

Description

-

Author

+
+
+

Reviews for free version

+ item->score / 10; ?> + $this->item->score]); ?> + item->reviews; ?> reviews
-
-

Powerful and useful extension

-

Rating

-

Positives & negatives

-

Description

-

Author

+
+

Most valuable reviews

+
+

Powerful and useful extension

+

Rating

+

Positives & negatives

+

Description

+

Author

+
+
+

Powerful and useful extension

+

Rating

+

Positives & negatives

+

Description

+

Author

+
+

All reviews

-

All reviews

-
item->otherExtensions): ?>
@@ -209,24 +209,26 @@
-
-
-

You might also be interested in

-
    - - 'https://extensionscdn.joomla.org/cache/fab_image/596c962509d22_resizeDown400px175px16.jpg', - 'title' => 'Akeeba Backup', - 'developer' => 'Akeeba Ltd', - 'score' => 99, - 'reviews' => 1061, - 'compatibility' => ['3', '4 alpha'], - 'description' => 'Akeeba Backup Core is the most widely used open-source backup component for the Joomla! CMS. Its mission is simple: create a site backup that can be restored on any Joomla!-capable server.', - 'type' => 'Free', - 'category' => 'Site Security', - 'link' => '#' - ]); ?> - -
+item->relatedExtensions): ?> +
+
+

You might also be interested in

+
    + item->relatedExtensions as $item): ?> + $item->image, + 'title' => $item->title, + 'developer' => $item->developer, + 'score' => $item->score, + 'reviews' => $item->reviews, + 'compatibility' => $item->compatibility, + 'description' => $item->intro, + 'type' => $item->type, + 'category' => $item->category, + 'link' => Route::_('index.php?option=com_jed&view=extension&id=' . $item->id) + ]); ?> + +
+
-
+ \ No newline at end of file