Расширение для модуля "Каталог"

Потребовалось для магазина сделать блоки «Популярные», «Самые обсуждаемые» и т.п.
Пример можно посмотреть здесь MYscrap

Объясню на примере добаления блока «Популярные»
В Addon.class.php создаем функцию

public function GetAddonsPopular($iLimit) {
  return $this->oMapper->GetAddonsPopular($iLimit);
}

В Addon.mapper.class.php создаем функцию

	public function GetAddonsPopular($iLimit) {
		$sql = "SELECT
					*
				FROM
					".DB_TABLE_ADDONS."
				WHERE
					addon_moderation = '1'
					AND addon_active = '1'
					AND addon_type = '0'
				ORDER by
					addon_count_use asc
				LIMIT ?d;
					";
		$aResult=array();
		if ($aRows=$this->oDb->select($sql, $iLimit)) {
			foreach ($aRows as $aRow) {
				$aResult[]=new AddonEntity_Addon($aRow);
			}
		}
		return $aResult;
	}

Далее создать файл classes/blocks/BlockAddonPopular.class.php

<?
class BlockAddonPopular extends Block {
	public function Exec() {
		$aAddonsPopular = $this->Addon_GetAddonsPopular(ADDON_POPULAR_LIMIT);
		$this->Viewer_Assign("aAddonsPopular",$aAddonsPopular);

	}
}
?>

А в папке активного скина файл block.AddonPopular.tpl

{if count($aAddonsPopular) > 0}
<div class="block addon">
	<div class="tl"><div class="tr"></div></div>
	<div class="cl"><div class="cr">
		<h4>{$aLang.addon_block_popular}</h4>
		{foreach from=$aAddonsPopular item=oAddon name="adn"}
			<div class="addon_wrap">
				<a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_ADDONS}/{$oAddon->getId()}/" title="{$oAddon->getName()|escape:'html'}">
					{if $oAddon->getAvatar()}
					<img src="{$DIR_WEB_ROOT}{$oAddon->getAvatar()}" alt="{$oAddon->getName()|escape:'html'}" />
					{else}
					<img src="{$DIR_STATIC_SKIN}/images/modules-avatar.gif" alt="{$oAddon->getName()|escape:'html'}" />
					{/if}
					<span>{$oAddon->getName()|escape:'html'}</span>
				</a>
			</div>
			{if $smarty.foreach.adn.iteration % 2 == 0}
			<div style="clear:both;"></div>
			{/if}
		{/foreach}
		<div style="clear:both;"></div>
	</div></div>
	<div class="bl"><div class="br"></div></div>
</div>
{/if}

css:

.block.addon .addon_wrap { float: left; width: 144px; margin: 0 10px 10px; }
.block.addon .addon_wrap IMG { display: block; margin: 0 auto; border: 1px solid #555; }
.block.addon .addon_wrap SPAN { display: block; text-align: center; }

В языковой файл добавить

'addon_block_popular'=>'Популярные',

ADDON_POPULAR_LIMIT — параметр определяет количество выводимых товаров в блоке
его прописываем в конфиге модуля.

Теперь вопрос: также хотелось сделать блок «Самые обсуждаемые», но так как с MySQL знаком плохо не знаю как сделать запрос к БД. Прошу помочь знающих людей. Заранее спасибо.

UPD
Сделал функцию для блока «Самые обсуждаемые», но она делает два запроса к БД

	public function GetAddonsTop($iLimit) {
		$sql = "SELECT
					addon_id
				FROM
					".DB_TABLE_ADDONS_COMMENT."
				GROUP BY
					addon_id
				ORDER BY
				    MAX(addon_id) asc
				LIMIT ?d;
					";
		$aIds=array();
		if ($aRows=$this->oDb->select($sql, $iLimit)) {
			foreach ($aRows as $aRow) {
				$aIds[]=$aRow["addon_id"];
			}
		}
		$sWhere = '';
		$iCount = count($aIds);
		if ($iCount == 1) {
			$sWhere = " addon_id = ".$aIds[0]." ";
		}
		else if ($iCount > 1){
			$sWhere = " addon_id IN (".implode(',', $aIds) .") ";
		}

		$aResult=array();
		if ($iCount > 0) {
			$sql = "SELECT
						*
					FROM
						".DB_TABLE_ADDONS."
					WHERE
						".$sWhere."
					ORDER BY
					    RAND()
						";
			if ($aRows=$this->oDb->select($sql)) {
				foreach ($aRows as $aRow) {
					$aResult[]=new AddonEntity_Addon($aRow);
				}
			}
		}
		return $aResult;
	}



Может кто-нибудь поможет оптимизировать эту функцию?

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.