Jump to content

Récupération des données Product


Recommended Posts

Bonjour ! 
Je suis sous la version 1.7.8.3, 
J'aimerais afficher une fiche produit sur la page d'accueil, j'ai créé un module mais je ne récupère pas toutes les infos dans product

$product = new Product($id_product, false, $lang_id)

Je n'obtiens qu'une partie des informations, j'ai vu dans productController que c'était pas le même Product qui sortait mais un ProductLazyArray. 

Comment faire pour obtenir la même chose dans un module ?
1148951884_Capturedecran2022-02-05a17_01_59.thumb.png.1ac039e76160dc0be39b3f7beee54755.png
Merci pour votre aide !

Share this post


Link to post
Share on other sites

Merci pour votre aide, non malheureusement je n'ai pas plus d'informations en passant false a true.

Je récupère pas mal d'informations qui me permettent de reconstruire une fiche produit mais il me faut quand même remplacer les . par des ->, est-ce normal ? en reprenant le code du product.tpl que je passe de tableau a objet ?

Il me manque des informations par exemple le regular_price, l'id_customisation, ... afin de permettre l'affichage des différents types de produits.

 

Share this post


Link to post
Share on other sites

public function hookDisplayHome($params)
{
    $lang_id = (int) Configuration::get('PS_LANG_DEFAULT');

        // récupération de l'id Produit depuis le BO
    $id_product = Configuration::get('MYMODULE_CONFIG');

        // récupération produit
    $product = new Product($id_product, true, $lang_id); 
	 
	// prix TTC
    $price = $product->getPricesDrop($id_product);

    // $flags = discount::get();

    // Hook displayProductExtraContent
    // $extraContentFinder = new ProductExtraContentFinder();


        // image de couverture
    $image = Product::getCover($id_product); 
    $cover_url = $this->context->link->getImageLink($product->link_rewrite, $image['id_image'], ImageType::getFormatedName('large'));
    $other_img = $product->getImages($id_product);
    $product_img = [];
    foreach ($other_img as $img) {
        array_push($product_img, $this->context->link->getImageLink($product->link_rewrite, $img['id_image'], ImageType::getFormatedName('large')));  
    }

    $features = $product->getFrontFeatures($lang_id);
    $attachments = Attachment::getAttachments($lang_id, $id_product);
   
    if (Validate::isLoadedObject($product)) {

        $this->context->smarty->assign([
            'my_module_name' => Configuration::get('MYMODULE_NAME'),
            'product' => $product,

            'cover_url' => $cover_url,
            'product_img' => $product_img,

            'features' => $features,
            'attachments' => $attachments,

            'price' => $price,
          
        ]);

    }   
   
    return $this->display(__FILE__, 'mymodule.tpl');
}

partie monmodule.php au dessus, ou j'ai du "trafiqué" pour récupérer certaines données, comme le prix TTC que je récupère dans getPricesDrop,
 

et la partie product-prices.tpl
avec en commentaire les parties que je ne peux ajouter car je n'arrive pas a récupérer des variables, ou que je dois recréer au sein du module car elles nécessitent des -> au lieu de . dans le code.

 

{if $product->show_price}
  <div class="product-prices js-product-prices">
    {block name='product_discount'}
      {if $product->specificPrice}
        <div class="product-discount">
          {hook h='displayProductPriceBlock' product=$product type="old_price"}
          <span class="regular-price">{$price.0.price_without_reduction}€</span>
        </div>
      {/if}
    {/block}


    {block name='product_price'}
      <div
        class="product-price h5 {if $product->specificPrice}has-discount{/if}">

        <div class="current-price">
          <span class='current-price-value' content="{$product->price}">
            {capture name='custom_price'}{hook h='displayProductPriceBlock' product=$product type='custom_price' hook_origin='product_sheet'}{/capture}
            {if '' !== $smarty.capture.custom_price}
              {$smarty.capture.custom_price nofilter}
            {else}
            {$price.0.price}€
            {/if}
          </span>

          {if $product->specificPrice}
            {if $product->specificPrice.reduction_type === 'percentage'}
              <span class="discount discount-percentage">{l s='Save %percentage%' d='Shop.Theme.Catalog' sprintf=['%percentage%' => ($product->specificPrice.reduction * 100)]}% </span>
            {else}
              <span class="discount discount-amount">
                  {l s='Save %amount%' d='Shop.Theme.Catalog' sprintf=['%amount%' => $price.0.reduction]}€
              </span>
            {/if}
          {/if} 
        </div>

       {* {block name='product_unit_price'}
          {if $product->unit_price}
            <p class="product-unit-price sub">{l s='(%unit_price%)' d='Shop.Theme.Catalog' sprintf=['%unit_price%' => $product->unit_price]}</p>
          {/if}
        {/block}  *}
      </div>
    {/block}

    {* {block name='product_without_taxes'}
      {if $priceDisplay == 2}
        <p class="product-without-taxes">{l s='%price% tax excl.' d='Shop.Theme.Catalog' sprintf=['%price%' => $product.price_tax_exc]}</p>
      {/if}
    {/block} *}

    {* {block name='product_pack_price'}
      {if $displayPackPrice}
        <p class="product-pack-price"><span>{l s='Instead of %price%' d='Shop.Theme.Catalog' sprintf=['%price%' => $noPackPrice]}</span></p>
      {/if}
    {/block} *}

    {block name='product_ecotax'}
      {if $product->ecotax > 0}
        <p class="price-ecotax">{l s='Including %amount% for ecotax' d='Shop.Theme.Catalog' sprintf=['%amount%' => $product->ecotax]}
          {if $product->specificPrice}
            {l s='(not impacted by the discount)' d='Shop.Theme.Catalog'}
          {/if}
        </p>
      {/if}
    {/block}

    {hook h='displayProductPriceBlock' product=$product type="weight" hook_origin='product_sheet'}

    <div class="tax-shipping-delivery-label">
      {* {if !$configuration.taxes_enabled}
        {l s='No tax' d='Shop.Theme.Catalog'}
      {elseif $configuration.display_taxes_label}
        {$product.labels.tax_long}
      {/if} *}
      {hook h='displayProductPriceBlock' product=$product type="price"}
      {hook h='displayProductPriceBlock' product=$product type="after_price"}

             
      {if $product->is_virtual == 0}
        {* {if $product->additional_delivery_times == 1}
        {if $product.delivery_information}
            <span class="delivery-information">{$product.delivery_information}</span>
          {/if}
        {elseif $product->additional_delivery_times == 2} *}
          {if $product->quantity > 0}
            <span class="delivery-information">{$product->delivery_in_stock}</span>
          {* Out of stock message should not be displayed if customer can't order the product. *}
          {elseif $product->quantity <= 0 }
            <span class="delivery-information">{$product->delivery_out_stock}</span>
          {/if}
        {* {/if} *}
      {/if}
    </div>
  </div>
{/if}

 

Edited by Leo-Sur (see edit history)

Share this post


Link to post
Share on other sites

Sur PrestaShop 1.7, pour obtenir un ProductLazyArray, il faut utiliser les classes ProductAssembler et ProductPresenter.

// Select product id
$id_product = 1;

$context = Context::getContext();
$assembler = new ProductAssembler($context);
$presenterFactory = new ProductPresenterFactory($context);
$presentationSettings = $presenterFactory->getPresentationSettings();
$presenter = $presenterFactory->getPresenter();

$productData = $presenter->present(
	$presentationSettings,
	$assembler->assembleProduct(['id_product' => (int)$id_product]),
	$context->language
);

// Send ProductLazyArray to Smarty
$this->context->smarty->assign('product', $productData);

 

  • Like 1

Share this post


Link to post
Share on other sites

  • 2 weeks later...

Je reviens avec une question qui concerne toujours la même chose.

J'arrive bien à afficher mon produit sur la page d'accueil avec toutes les informations que je veux, mais j'aimerais afficher les déclinaisons de mon produit aussi, chose que je ne parviens à faire car il me manque la variable $groups qui apparait dans product.tpl, et qui vient du controller productController.php. voici le tableau que je dois récupérer, si vous avez une idée je suis preneur ! 

Merci pour votre aide

array:1 [▼
  5 => array:6 [▼
    "group_name" => "Contenant"
    "name" => "Diamètre"
    "group_type" => "select"
    "default" => 26
    "attributes" => array:2 [▼
      26 => array:4 [▼
        "name" => "2 pouces"
        "html_color_code" => ""
        "texture" => ""
        "selected" => true
      ]
      27 => array:4 [▼
        "name" => "6 pouces"
        "html_color_code" => ""
        "texture" => ""
        "selected" => false
      ]
    ]
    "attributes_quantity" => array:2 [▼
      26 => 10
      27 => 10
    ]
  ]
]

 

Edited by Leo-Sur (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More