Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

Suporte geral sobre problemas técnicos para OpenCart v1.x.
#32207
Olá!
Acho meio estranho um site colocar em sua home, uma listagem de produtos, seja os destaques, mais vendidos e ou ofertas, e os mesmos estarem sem estoque para venda.
Tentei de algumas formas e procurei em vários sites mas não achei uma solução.
Preciso esconder os produtos sem estoque (igual a 0) em alguns modulos, veja o que fiz e não deu certo:

Irei comentar sobre o modulo produtos em oferta (special), pois através desse posso mudar os outros.

Via vqmode inseri o codigo do site gringo para deixar aleatório a ordem dos produtos:
Código: Selecionar todos
<modification>

	<id>Ordem Aleatoria produtos em promocao (Specials)</id>
	<version>1.0.0</version>
	<vqmver>1.0.3</vqmver>
	<author>qphoria</author>

	<file name="catalog/controller/module/special.php">
      	<operation error="skip"><!-- v1.5.x -->
            <search position="replace"><![CDATA[
            'limit' => $setting['limit']
            ]]></search>
            <add><![CDATA[
			'limit' => ($setting['limit'] * 10)
            ]]></add>
        </operation>
		
		<operation error="skip"><!-- v1.5.x -->
            <search position="after"><![CDATA[
            $results = $this->model_catalog_product->getProductSpecials($data);
            ]]></search>
            <add><![CDATA[
		srand((float)microtime() * 1000000);
		shuffle($results); 
		$results = array_slice($results, 0, $setting['limit']);
            ]]></add>
        </operation>
		
	</file>
</modification>
No arquivo special.php (catalog/controller/module/special.php), logo abaixo de "$this->data['products'][] = array(" inseri "stock" e "stock_status", ficando assim:
Código: Selecionar todos
$this->data['products'][] = array(
                                'stock' => $product_info['quantity'],
                                'stock_status'  => $product_info['stock_status'],
				'product_id' => $result['product_id'],
				'thumb'   	 => $image,
				'name'    	 => $result['name'],
				'price'   	 => $price,
				'special' 	 => $special,
				'rating'     => $rating,
				'reviews'    => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
				'href'    	 => $this->url->link('product/product', 'product_id=' . $result['product_id']),
			);
No arquivo special.tpl (/catalog/view/theme/NOMEDOMEUTEMA/template/module/special.tpl), logo abaixo de "<?php foreach ($products as $product) { ?>" inseri um IF e OR, ficando assim:
Código: Selecionar todos
<div class="box">
  <div class="box-heading"><?php echo $heading_title; ?></div>
  <div class="box-content">
    <div class="box-product">
      <?php foreach ($products as $product) { ?>

      <!--IF - OR : Pegar produtos com estoque maior que zero ou com Status de Sob encomenda -->
      <?php if ($product['stock'] > 0 or $product['stock_status'] == "Sob encomenda") { ?>
      <!--Fim IF - OR -->

      <div>
        <?php if ($product['thumb']) { ?>
        <div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>
        <?php } ?>
        <div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>
        <?php if ($product['price']) { ?>
        <div class="price">
          <?php if (!$product['special']) { ?>
          <?php echo $product['price']; ?>
          <?php } else { ?>
          <span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
          <?php } ?>
        </div>
        <?php } ?>
        <?php if ($product['rating']) { ?>
        <div class="rating"><img src="catalog/view/theme/default/image/stars-<?php echo $product['rating']; ?>.png" alt="<?php echo $product['reviews']; ?>" /></div>
        <?php } ?>
        <div class="cart"><input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" /></div>
      </div>
      
      <!-- Fechar IF - OR -->
      <?php } ?>
      <!--Fim Fechar -->

      <?php } ?>
    </div>
  </div>
</div>
O que fiz, em parte funciona, mas acontece o seguinte, deixei o modulo Special listando apenas 10 produtos na home, no site tenho 15 produtos em oferta, para teste deixei apenas 1 produto com estoque 0 e status padrão Esgotado e 1 produto com estoque 0 e status criado Sob encomenda.
Notei que quando ele procura na tabelas ele realmente pega o que quero com estoque e sob encomenda, mas quando chega no produto estoque 0 e status diferente de Sob encomenda ele para o loop e não pega o próximo produto, fica um buraco em branco.

OBS: além dos produtos que estão com estoque, também vai vender produtos com o estoque zero mas com o status Sob encomenda.

Espero achar alguém aqui no forum que ajude com isso.
#32531
Alguém pode me ajudar?

Não consigo ocultar os produtos com estoque = 0.

Quero que eles continuem acessíveis, porém não quero que sejam listados caso tenham estoque = 0.

Creio que esta edição tem de ser feita no model catalog/product.php
#35661
Bom, consegui resolver em partes.
Para esconder os produtos esgotados (zero), basta inserir o código AND p.quantity > '0' logo após p.date_available <= NOW() no arquivo catalog/model/catalog/product.php.
Para esconder somente em alguns módulos que ficam na home, como por exemplo o módulo Specials (promoções), ja que o restante do site, como por exemplo nas categorias, desejo que os produtos esgotados sejam listados, modifiquei conforme li em alguns foruns.

Exemplo para Produtos em promoção (Specials). Em catalog/model/catalog/product.php por volta da linha 212 terá public function getProductSpecials seis ou sete linhas abaixo terá o código:
Código: Selecionar todos
                           $sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id"; 
Substitua por:
Código: Selecionar todos
                           $sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p.quantity > '0' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";
Pronto, somente com estoque será mostrado.
Dentro desse mesmo arquivo tem getLatestProducts, getPopularProducts, e outros módulos, para modificar o site todo acho que é em public function getProducts($data = array()) {, não testei.

Ai teve um problema, o opencart tem duas opções no produto, quando indisponível, ou seja, estoque zero, podemos escolher que apareça esgotado, sob encomenda, etc. A outra opção em um produto com estoque é Ativado ou Desativado, não podemos escolher que um produto com estoque seja sob encomenda, o que muitos podem pensar, po isso é meio estranho, se é sob encomenda, é pq não tem em estoque, bom, talvez você não tenha no estoque de sua loja A mas sim no estoque da loja B que é distante e exige uma quantidade X de dias para que o mesmo venha até você, para depois mandar para o cliente, exigindo assim que o cliente marque que está ciente de estar comprando um produto que não é de entrega imediata.
Se eu tiver um produto com estoque zero mas com status sob encomenda, ele não será listado pelo sistema devido ao código acima, então, para burlar isso, especifiquei que todo produto com estoque 9.999 será sob encomenda.
O problema encontrado é que não consigo controlar o estoque desse produto, pois o mesmo sempre deve estar com estoque em 9.999, então dentro do produto a opção Diminuir do Estoque, deve ser não.

Em catalog/language/portuguese-br/product/product.php após:
Código: Selecionar todos
$_['text_tags']         = 'Tags:';
Inseri:
Código: Selecionar todos
$_['text_sobencomenda']        = 'Sob encomenda';
Em catalog/controller/product/product.php após:
Código: Selecionar todos
$this->data['text_tags'] = $this->language->get('text_tags'); 
Inseri:
Código: Selecionar todos
$this->data['text_sobencomenda'] = $this->language->get('text_sobencomenda');
e após:
Código: Selecionar todos
$this->data['stock'] = $product_info['stock_status']; 
Inseri:
Código: Selecionar todos
} elseif	($product_info['quantity'] == 9999) {
           $this->data['stock'] = $this->language->get('text_sobencomenda');
É isso aí, continuo a procura de como modificar, pois assim não precisaria dessa gambiarra.
Talvez criando uma lista de opção de status de produto para produtos com estoque.
Vamos ver se chego lá, se alguém der uma luz fico grato.
#47175
Olá pessoal,
ressuscitando este tópico, estou usando este vQmod mas mesmo quando acessa um produto pelo link diz "Produto não encontrado", o problema que muitos clientes depois que compram querem ver o anuncio do produto que compraram e não conseguem, alguém sabe como fazer para não exibir o produto no catálogo da loja, mas ainda assim ser visto pelo link?
#66051
DiMais desculpe eu achei que tinha mas fui procurar aqui e não tenho mais este XML não..

O que eu precisava mesmo era que os produtos com estoque zerado não pudessem ser "comprados", tenho um vQmod que eu fiz aqui juntando a idéia de alguns que ví então se o produto tiver esgotado, ao invés de aparecer o botão Comprar aparece Esgotado.

Segue abaixo o XML para quem precisar:

esgotado.xml
Código: Selecionar todos
<modification>

	<id>Retira botao de Comprar de produtos Esgotados</id>
	<version>1.0.0</version>
	<vqmver>2.1.5</vqmver>
	<author>daniel.uramg - 04/12/2013</author>
	
	<file name="catalog/controller/module/featured.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'    	 => $product_info['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */		
			'quantity'    	 => $product_info['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/module/bestseller.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'    	 => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/module/latest.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'    	 => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/module/special.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'    	 => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/product/category.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'        => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */ 
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/product/special.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'        => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/product/search.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'        => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */ 
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/product/manufacturer.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'        => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */ 
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>

	<file name="catalog/controller/product/product.php">	 	
		<operation error="skip">
			<search position="after" ><![CDATA[
			'name'    	 => $result['name'],
			]]></search>
			<add><![CDATA[
			/* trecho adicionado pelo Aviso_esgotado.xml */
			'quantity'    	 => $result['quantity'],
			]]></add>  
		</operation>
	</file>
	
	<file name="catalog/view/theme/*/template/product/product.tpl">
		<operation> <![CDATA[ Texto de Quantidade ]]>
			<search position="replace"><![CDATA[<div><?php echo $text_qty; ?>]]></search>
				<add><![CDATA[
				<?php if ($stock !== "Esgotado") { ?>
				<?php echo "<div>$text_qty"; ?>
				<?php } else { ?>
				<?php echo "<div><input type='button' value='Item Esgotado' class='button' />"; ?>
				<?php } ?>
				]]></add>
		</operation>

		<operation> <![CDATA[ Campo de quantidade ]]>
			<search position="replace"><![CDATA[<input type="text" name="quantity" size="2" value="<?php echo $minimum; ?>" />]]></search>
				<add><![CDATA[
				<?php if ($stock !== "Esgotado") { ?>
				<?php echo "<input type=\"text\" name=\"quantity\" size=\"2\" value=\"$minimum\" />"; } ?>
				]]></add>
		</operation>

		<operation> <![CDATA[ Botao de pagamento ]]>
			<search position="replace"><![CDATA[<input type="button" value="<?php echo $button_cart; ?>" id="button-cart" class="button" />]]></search>
				<add><![CDATA[
				<?php if ($stock !== "Esgotado") { ?>
				<?php echo "<input type=\"button\" value=\"$button_cart\" id=\"button-cart\" class=\"button\" />"; } ?>
				]]></add>
		</operation>

		<operation> <![CDATA[ Texto Ou ]]>
			<search position="replace"><![CDATA[<span>&nbsp;&nbsp;<?php echo $text_or; ?>&nbsp;&nbsp;</span>]]></search>
				<add><![CDATA[
				<?php if ($stock !== "Esgotado") { ?>
				<?php echo "<span>&nbsp;&nbsp; $text_or &nbsp;&nbsp;</span>"; } ?>
				]]></add>
		</operation>
		
		<operation> <![CDATA[ Link ir para Comparacao ]]>
			<search position="replace"><![CDATA[<a onclick="addToCompare('<?php echo $product_id; ?>');"><?php echo $button_compare; ?></a></span>]]></search>
				<add><![CDATA[
				<?php if ($stock !== "Esgotado") { ?>
				<?php echo "<a onclick=\"addToCompare($product_id);\">$button_compare</a></span>"; } ?>
				]]></add>
		</operation>
	</file>
	
	<file name="catalog/view/theme/*/template/product/category.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>

	<file name="catalog/view/theme/*/template/product/search.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>
	
	<file name="catalog/view/theme/*/template/product/manufacturer_info.tpl">
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>
	
<file name="catalog/view/theme/*/template/module/featured.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>

<file name="catalog/view/theme/*/template/module/latest.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>
	
<file name="catalog/view/theme/*/template/module/special.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>
	
<file name="catalog/view/theme/*/template/module/bestseller.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>
	
<file name="catalog/view/theme/*/template/product/special.tpl">	 	
		<operation>
			<search position="replace"><![CDATA[
				<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
			]]></search>
			<add><![CDATA[
				<?php if ( $product['quantity'] < 1 ){ ?>
					<input type="button" value="Item esgotado" class="button" />
				<?php } else { ?>
					<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
				<?php } ?>
			]]></add>   
		</operation>
	</file>
	
</modification>

Night games. One night, no worries Real Women P[…]

@Manoel Vidal Poderia me ajudar com 2 coisas n[…]

Looking for a partner for an unforgettable night? […]

Vou verificar, Obrigado