Différents produits dans certaines zones

  • Posts: 98
  • Thank you received: 1
11 years 8 months ago #92476

Bonjour,
Différents produits sont disponibles dans certaines zones, mais pas toutes les zones.

On vend tous les produits partout sauf quelques-uns, par exemple, pas en Europe ou pas dans les pays internationaux.
Comment peux-je appliquer ce critère?

j'ai 4 zones de livraison :

  • Canada
  • États-Unis
  • Europe
  • International...

Alors j'ai créé un champ personnalisé (dans le menu « Affichage », sous rubrique : « champs personnalisés ») :

Titre : pas vente
Table : product
Champ : pasvente
Type : Texte
Requis Non
Filtrage de l'entrée Oui
Lecture seule Non
Activé Oui
Dans la partie publique Non
Formulaires dans l'administration Oui
Listings dans l'administration Oui


Je vais mettre une condition :
Si le « pasvente » est vide, on le vend partout sinon selon la valeur de « pasvente » on ne le vend pas à certaines zones de livraison :
  • VIDE ---> on le vend par tout
  • CAD ---> on ne le vend qu'en Canada
  • CADUS ---> on ne le vend qu'en Canada et aux États-Unis
  • CADUSINT ---> on ne le vend pas en Europe

Alors je vais ajouter le code dans checkout/cart.php (dans le menu « Affichage », sous rubrique : Vues » == Voir : « checkout » et Fichier : « cart.php »

Mais je n'ai pas certain sur ma démarche :

Voici ce que je pense :
//... votre code :
    if($this->config->get('print_cart',0)&&JRequest::getVar('tmpl','')!='component'){ ?>
      <div class="hikashop_checkout_cart_print_link">
        <a title="<?php echo JText::_('HIKA_PRINT');?>" class="modal" rel="{handler: 'iframe', size: {x: 760, y: 480}}" href="<?php echo hikashop_completeLink('checkout&task=printcart',true); ?>">
          <img src="<?php echo HIKASHOP_IMAGES; ?>print.png" alt="<?php echo JText::_('HIKA_PRINT');?>"/>
        </a>
      </div>
    <?php }
// voici le mien debut
	if(!empty($this->row->pasvente))
		{
		 $pasvente = $this->row->pasvente;
		 $app = JFactory::getApplication();
		 $shipping_id = $app->getUserState( HIKASHOP_COMPONENT.'.shipping_id');
		 $critere_vente = true;
		 switch ($pasvente)
			{
			case "CAD":
					switch ($shipping_id)
						{
						case 2: //USA
						case 3: //Eu
						case 4: //int
						 $critere_vente = false;
						  break;

						default:
						  $critere_vente = true;
						}
						
			case "CADUS":
					switch ($shipping_id)
						{
						case 3: //Eu
						case 4: //int
						 $critere_vente = false;
						  break;

						default:
						  $critere_vente = true;
						}
						
			case "CADUSINT":
					switch ($shipping_id)
						{
						case 3: //Eu
						 $critere_vente = false;
						  break;

						default:
						  $critere_vente = true;
						}					
						


			default:
			  $critere_vente = true;
			}


			if($critere_vente = false)
			{
			$this->nextButton = false;
			$app->enqueueMessage('Ce produit n\'est pas disponible dans votre pays, pouvez-vous le supprimer, merci'); 
			}

		}
// voici le mien fin
//votre code :
    foreach($this->rows as $i => $row){
      if(empty($row->cart_product_quantity)) continue;
      if(!empty($row->product_min_per_order)){
        if($row->product_min_per_order>$row->cart_product_quantity){
          $this->nextButton = false;
          $app =& JFactory::getApplication();
          $app->enqueueMessage(JText::sprintf('YOU_NEED_TO_ORDER_AT_LEAST_X_X',$row->product_min_per_order,$row->product_name));
        }
      }
    }
    $row_count = 4;
//..
Est-ce que vous pouvez m'aider?

Merci

Please Log in or Create an account to join the conversation.

  • Posts: 13201
  • Thank you received: 2322
11 years 8 months ago #92527

Bonjour,

Le code semble pas mal dans l'ensemble, mais je pense que vous devez le mettre dans un foreach afin de récupérer les "$row"

foreach($this->rows as $i => $row){
Puis un foreach pour chaques fields de type product:
foreach($this->extraFields['product'] as $field){
Et un if, pour passer dans votre code seulement pour la field "pasvente":
if($field->field_namekey == 'pasvente'){

N'oubliez pas de modifier vos variables en conséquence.

Please Log in or Create an account to join the conversation.

  • Posts: 98
  • Thank you received: 1
11 years 8 months ago #92654

Bonjour Xavier,

merci pour vos explications, mais, je n'ai pas bien compris :sick:

Xavier wrote: Bonjour,

Puis un foreach pour chaques fields de type product:

foreach($this->extraFields['product'] as $field){


Fonction extraFields? c'est quoi?
(('product'))? Est-ce que la valeur du champ 'field_table' de la table : 'hikashop_field' de la base de données de HikaShop?

en fait, lorsque je fais :
   foreach($this->rows as $i => $row)
  {
    foreach($this->extraFields['product'] as $field)
      {
        if($field->field_namekey == 'pasvente')

j'ai un alerte avec la 2e ligne : ((foreach($this->extraFields as $field))) :
Warning: Invalid argument supplied for foreach()

Merci et bonne fin de semaine

Last edit: 11 years 8 months ago by aspkiddy.

Please Log in or Create an account to join the conversation.

  • Posts: 13201
  • Thank you received: 2322
11 years 8 months ago #92809

Bonjour,

En effet dans cette vue là, le code suivant suffit:

foreach($this->rows as $i => $row){
	if(!empty($row->pasvente)){
		// your code, and change "$this->row->pasvente" by "$row->pasvente".	
	}	
}

Please Log in or Create an account to join the conversation.

  • Posts: 98
  • Thank you received: 1
11 years 8 months ago #92909

Bonjour Xavier,

Merci pour les explications, :) je n'ai plus de message d'alerte ni d'erreur, :cheer:
mais mes conditions ne marche pas : mon [nextButton] est toujours actif et il n'y a pas de [enqueueMessage]. :sick:

Voici mon code (voir entre "new code for sale option START et END", ci-dessous) et je me demande si j'ai oublié quelque chose ?

<div id="hikashop_checkout_cart" class="hikashop_checkout_cart">
  <?php

  if(empty($this->rows)){
    echo $this->params->get('comp_description');
  }else{

    if($this->config->get('print_cart',0)&&JRequest::getVar('tmpl','')!='component'){ ?>
      <div class="hikashop_checkout_cart_print_link">
        <a title="<?php echo JText::_('HIKA_PRINT');?>" class="modal" rel="{handler: 'iframe', size: {x: 760, y: 480}}" href="<?php echo hikashop_completeLink('checkout&task=printcart',true); ?>">
          <img src="<?php echo HIKASHOP_IMAGES; ?>print.png" alt="<?php echo JText::_('HIKA_PRINT');?>"/>
        </a>
      </div>
    <?php }
	// new code for sale option START
	foreach($this->rows as $i => $row)
	{
		if(!empty($row->pasvente)){
			if($field->field_namekey == 'pasvente')
          {
            $pasvente = $row->pasvente;
             $app = JFactory::getApplication();
             $shipping_id = $app->getUserState( HIKASHOP_COMPONENT.'.shipping_id');
             $critere_vente = true;
             switch ($pasvente)
              {
              case "CAD": // on ne le vend qu'en Canada
                  switch ($shipping_id)
                    {
                    case 2: //USA
					case 3: //Eu
					case 4: //int
                     $critere_vente = false;
                      break;
         
                    default:
                      $critere_vente = true;
                    }
         
              case "CADUS"://on ne le vend qu'en Canada et aux États-Unis
                  switch ($shipping_id) 
                    {
                    case 3: //Eu
					case 4: //int
                     $critere_vente = false;
                      break;
         
                    default:
                      $critere_vente = true;
                    }
					
			 case "CADUSINT": //on ne le vend pas en Europe
					switch ($shipping_id)
						{
						case 3: //Eu
						 $critere_vente = false;
						  break;
 
						default:
						  $critere_vente = true;
						}
         
              default:
                $critere_vente = true;
              }
         
         
              if($critere_vente = false)
              {
              $this->nextButton = false;
              $app->enqueueMessage('Ce produit n\'est pas disponible dans votre pays, pouvez-vous le supprimer, merci');
              }
          
          } 
		}	
	}
// new code for sale option END

    foreach($this->rows as $i => $row){
      if(empty($row->cart_product_quantity)) continue;
      if(!empty($row->product_min_per_order)){
        if($row->product_min_per_order>$row->cart_product_quantity){
          $this->nextButton = false;
          $app =& JFactory::getApplication();
          $app->enqueueMessage(JText::sprintf('YOU_NEED_TO_ORDER_AT_LEAST_X_X',$row->product_min_per_order,$row->product_name));
        }
      }
    }
    $row_count = 4;

Merci

Last edit: 11 years 8 months ago by aspkiddy.

Please Log in or Create an account to join the conversation.

  • Posts: 13201
  • Thank you received: 2322
11 years 8 months ago #92931

Vers la fin de votre code, remplacez "if($critere_vente = false)" par "if($critere_vente == false)"

Please Log in or Create an account to join the conversation.

  • Posts: 98
  • Thank you received: 1
11 years 8 months ago #92972

Bonjour Xavier,

Ça ne marche pas du tout...
Même avec le code suivant, c'est-à-dire sans switch $pasvente , il n'y a pas de message [enqueueMessage] qui s'affiche. Le bouton [nextButton] est toujours actif :


    if($this->config->get('print_cart',0)&&JRequest::getVar('tmpl','')!='component'){ ?>
      <div class="hikashop_checkout_cart_print_link">
        <a title="<?php echo JText::_('HIKA_PRINT');?>" class="modal" rel="{handler: 'iframe', size: {x: 760, y: 480}}" href="<?php echo hikashop_completeLink('checkout&task=printcart',true); ?>">
          <img src="<?php echo HIKASHOP_IMAGES; ?>print.png" alt="<?php echo JText::_('HIKA_PRINT');?>"/>
        </a>
      </div>
    <?php }
	// new code for sale option START
	foreach($this->rows as $i => $row)
	{
		if(!empty($row->pasvente)){
			if($field->field_namekey == 'pasvente')
          {
            $pasvente = $row->pasvente;
             $app = JFactory::getApplication();
             $shipping_id = $app->getUserState( HIKASHOP_COMPONENT.'.shipping_id');
             $critere_vente = true;
             //switch ($pasvente)
              
         
			$critere_vente = false;
              if($critere_vente == false)
              {
              $this->nextButton = false;
              $app->enqueueMessage('Ce produit n\'est pas disponible dans votre pays, pouvez-vous le supprimer, merci');
              }
          
          } 
		}	
	}
// new code for sale option END

    foreach($this->rows as $i => $row){
      if(empty($row->cart_product_quantity)) continue;
      if(!empty($row->product_min_per_order)){
        if($row->product_min_per_order>$row->cart_product_quantity){
          $this->nextButton = false;
          $app =& JFactory::getApplication();
          $app->enqueueMessage(JText::sprintf('YOU_NEED_TO_ORDER_AT_LEAST_X_X',$row->product_min_per_order,$row->product_name));
        }
      }
    }
    $row_count = 4;
  ?>
  <br/>
    <table class="table table-striped table-hover" width="100%">
      <thead>
  

Last edit: 11 years 8 months ago by aspkiddy.

Please Log in or Create an account to join the conversation.

  • Posts: 98
  • Thank you received: 1
11 years 8 months ago #93108

Bonjour,

sans switch et en forçant que ce soit 'false' :angry:

$critere_vente = false;
je n'arrive pas afficher le message "enqueueMessage" :S et le bouton suivant, "nextButton", ne devient pas désactivé. :sick:

attendant votre réponse, bonne journée

Last edit: 11 years 8 months ago by aspkiddy.

Please Log in or Create an account to join the conversation.

  • Posts: 13201
  • Thank you received: 2322
11 years 8 months ago #93203

Bonjour,

Votre code ne fonctionne pas car vous avez ajouté "if($field->field_namekey == 'pasvente'){ ...}", et comme $field n'est pas défini, cela retourne une erreur.

Utilisez seulement:

	foreach($this->rows as $i => $row)
	{
		if(!empty($row->pasvente)){
            $pasvente = $row->pasvente;
             $app = JFactory::getApplication();
             $shipping_id = $app->getUserState( HIKASHOP_COMPONENT.'.shipping_id');
             $critere_vente = true;
             //switch ($pasvente)
 
 
			$critere_vente = false;
              if($critere_vente == false)
              {
              $this->nextButton = false;
              $app->enqueueMessage('Ce produit n\'est pas disponible dans votre pays, pouvez-vous le supprimer, merci');
              }
		}	
	}

N'oubliez pas de mettre le error reporting à "maximum" dans les options joomla lorsque vous développez.

Last edit: 11 years 8 months ago by Xavier.
The following user(s) said Thank You: aspkiddy

Please Log in or Create an account to join the conversation.

  • Posts: 98
  • Thank you received: 1
11 years 8 months ago #93505

Super Xavier, :silly:
ça marche le message et le bouton selon le produit et le zone...

Un grand merci. :lol:

Voici le code complet :

foreach($this->rows as $i => $row)
	{
		if(!empty($row->pasvente))
		{
            $pasvente = $row->pasvente;
			$nomarticle = $row->product_name;
            $app = JFactory::getApplication();
            $shipping_id = $app->getUserState( HIKASHOP_COMPONENT.'.shipping_id');
            $critere_vente = true;
           
		    switch ($pasvente)
			{
				case "CAD":
						switch ($shipping_id)
							{
							case 2: //USA
							case 3: //Eu
							case 4: //int
							 $critere_vente = false;
							  break;
	 
							default:
							  $critere_vente = true;
							}
	 
				case "CADUS":
						switch ($shipping_id)
							{
							case 3: //Eu
							case 4: //int
							 $critere_vente = false;
							  break;
	 
							default:
							  $critere_vente = true;
							}
	 
				case "CADUSINT":
						switch ($shipping_id)
							{
							case 3: //Eu
							 $critere_vente = false;
							  break;
	 
							default:
							  $critere_vente = true;
							}					
	 
	 
	 
				default:
				  
				}
			
			if($critere_vente == false)
              {
              $this->nextButton = false;
              $app->enqueueMessage($nomarticle.'</em>" n\'est pas disponible dans votre pays, pouvez-vous le supprimer, merci');
              }

        } 
	}

Je me demande si je peux aussi mettre ce message dans la zone de produit concerné (par exemple (td class="hikashop_cart_product_name_value")) au nom de l'interface conviviale.

Alors comment je peux le faire, vous pouvez me donner un indic.? :ohmy:

Merci

Please Log in or Create an account to join the conversation.

  • Posts: 13201
  • Thank you received: 2322
11 years 8 months ago #93572

Pour cela il faudrait avoir un id sur le td, pour bien faire le nom du produit.
Et dans votre code, ajouter du javascript pour récupérer le contenu du td, ajouter votre message dans le html de ce td et remplacer le contenu précédent par celui modifié.

<script>
    var ctn = document.getElementById('<?php echo $row->product_name; ?>').innerHTML;
    ctn = ctn + "You message";
    document.getElementById('<?php echo $row->product_name; ?>').innerHTML = ctn;
</script>
Quelque chose un peu comme ça.

The following user(s) said Thank You: aspkiddy

Please Log in or Create an account to join the conversation.

  • Posts: 98
  • Thank you received: 1
11 years 7 months ago #98396

Merci

Please Log in or Create an account to join the conversation.

Time to create page: 0.087 seconds
Powered by Kunena Forum