Add to cart specific custom field

  • Posts: 105
  • Thank you received: 2
9 years 1 month ago #218451

-- HikaShop version -- : Business: 2.6.0

Bonjour,
j'ai créé un nouveau type de dropdown custom field qui peut se parametrer dans le "product" (et non pas dans "field" comme cela se fait normalement).
J'ai aussi modifié le "show_block_custom_item.php" pour faire apparaitre ce custom field.
Mais quand on appuie sur le "Add to cart", les données ne sont pas retournées (des valeurs "" sont retournées). J'ai aussi un petit probleme de nom de colonne mais je peux le corriger moi même).

Pour info, ce type de custom field est créé en tant que "product" custom field, mais il créé en plus un autre "item" field dont la field_namekey est egale à "field_namekey du custom field dans product"."_item". J'ajoute aussi les colonnes qui vont bien dans 'cart_product' et 'order_product' (sauf que c'est la que j'ai mon petit problème de noms de colonne, que je peux résoudre moi même)

voila le code de show_"block_custom_item.php". Pouvez vous m'aider? Pourriez vous aussi me dire quels fonctions/fichiers sont appellés quand on appuie sur "add to cart"?

defined('_JEXEC') or die('Restricted access');
?><div id="hikashop_product_custom_item_info" class="hikashop_product_custom_item_info">
	<table width="100%">
	<?php
	$db = JFactory::getDBO();
	foreach ($this->itemFields as $fieldName => $oneExtraField) {
		$field_realName=$this->fieldsClass->getFieldName($oneExtraField);
		$onWhat='onchange';
		if($oneExtraField->field_type=='radio')
			$onWhat='onclick';
		$oneExtraField->product_id = $this->element->product_id;
		if($oneExtraField->field_type=='plg.dropdownfreefield'){
			$product_id=$this->element->product_id;
			$field_namekey_pdt=substr($oneExtraField->field_namekey,0,-5);//get rid of the '_item' at the end of the name to get the name of the product column instead of the 'item' column'
			$field_namekey=$field_namekey_pdt;
			$field_custom=get_custom_values($product_id,$field_namekey_pdt);			
		}
		else{
			$itemData = JRequest :: getString('item_data_' . $fieldName, $this->element-> $fieldName);	
			$field_namekey=$oneExtraField->field_namekey;			
		}	
		?>
			<tr id="hikashop_item_<?php echo $field_namekey; ?>" class="hikashop_item_<?php echo $field_namekey;?>_line">
				<td class="key">
					<span id="hikashop_product_custom_item_name_<?php echo $oneExtraField->field_id;?>" class="hikashop_product_custom_item_name">
						<?php echo $field_realName;?>
					</span>
				</td>
				<td>
					<span id="hikashop_product_custom_item_value_<?php echo $oneExtraField->field_id;?>" class="hikashop_product_custom_item_value"><?php 						
						if($oneExtraField->field_type=='plg.dropdownfreefield'){
							$map='data[item]['.$field_namekey.']';
							echo '<select id="'.$field_namekey.'" name="'.$map.'">';
							foreach ($field_custom as $i=>$values){
								echo '<option value="'.$values->value.'" id="'.$field_namekey.'_'.$i.'" >'.$values->title.'</option>';
							}
							echo '</select>';
						}
						else{
							echo $this->fieldsClass->display($oneExtraField,$itemData,'data[item]['.$field_namekey.']',false,' '.$onWhat.'="hikashopToggleFields(this.value,\''.$fieldName.'\',\'item\',0);"');
						}
					?></span>
				</td>
			</tr>
		<?php
	}
	?>
	</table>
</div>
<?php
	function get_custom_values($product_id,$name_column){
		$db = JFactory::getDBO();
		
		$query = 'SELECT '.$name_column.' FROM '.hikashop_table('product').' WHERE `product_id` = '.intval($product_id).' LIMIT 1';
		$db->setQuery($query);
		$db->Query();

		$field = $db->loadResult();
		if(!empty($field))
			$field = explodeValues($field);
		return $field;
	}
	//returns the values (and the title) 
	function explodeValues($values){
		$allValues = explode("\n",$values);
		$returnedValues = array();
		$i=0;
		foreach($allValues as $id => $oneVal){
			$line = explode('::',trim($oneVal));
			$val = $line[0];
			$tit = $line[1];
			if(count($line)==2){
				$disable = '0';
			}else{
				$disable = $line[2];
			}
			if(strlen($tit)>0){
				$obj = new stdClass();
				$obj->value = $val;
				$obj->title = $tit;
				$obj->disabled = $disable;
				$returnedValues[$i] = $obj;
			}
			$i++;
		}
		return $returnedValues;
	}
	?>

Last edit: 9 years 1 month ago by nicolas.

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

  • Posts: 82909
  • Thank you received: 13379
  • MODERATOR
9 years 1 month ago #218474

Bonjour,

Je ne vois pas le soucis dans ce code.

Pour l'ajout au panier, c'est la fonction updatecart du fichier components/com_hikashop/controllers/product.php qui est appelée.
Elle-même appelle les fonctions update et updateEntry du fichier administrator/components/com_hikashop/classes/cart.php pour mettr eà jour le panier. Ils récupèrent les données, comme d'habitude, en appelant la fonction getInput de administrator/components/com_hikashop/classes/field.php

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

  • Posts: 105
  • Thank you received: 2
9 years 1 month ago #218641

merci!!
j'ai résolu le problème grâce a vos indications(en fait j'avais modifié le getinput pour mon custom field; ça marchait quand j''etais dans le back end; mais pas ici). :) :)

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

  • Posts: 105
  • Thank you received: 2
9 years 1 month ago #218771

Hello,

when I arrive to the product view through a product link in an article,with some fields which default value is changed, based on a parameter passed through the link, everything works fine, except that some fields where "Display is limited to " other fields of which I have change the default value, the conditional displayare not displayed; I saw that this is due to a "style='display:none'", but I don't know where this comes from and how to change it.
please help.

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

  • Posts: 82909
  • Thank you received: 13379
  • MODERATOR
9 years 1 month ago #218787

Hi,

The issue is that the fields "display limited to" system is initialized before getting the data from the URL. So that's why you get that behavior.
The system isn't really made to have that in the other order. If you really want to change it, you would have to edit the code of the file components/com_hikashop/views/product/view.html.php

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

  • Posts: 105
  • Thank you received: 2
9 years 1 month ago #218801

Merci Nicolas,

merci. :)
Je suis prêt à le modifier alors;
J'ai regardé ce fichier et il est pas mal long; pourriez vous m'en dire un peu plus (ou et comment dans les grandes lignes).
Je me rends compte que je vais sans doute avoir un problème similaire pour pouvoir charger le prix qui correspond à ce custom field (je n'ai pas encore développé le plugin qui correspond, c'est ma prochaine tâche); alors un conseil concernant ce point est aussi bienvenu.

PS :je ne sais pas pourquoi j'ai écris en anglais hier :huh:

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

  • Posts: 82909
  • Thank you received: 13379
  • MODERATOR
9 years 4 weeks ago #218827

Bonjour,

le code qui charge les custom fields est celui ci:

$fieldsClass = hikashop_get('class.field');
		$fields = $fieldsClass->getFields('frontcomp',$element,'product','checkout&task=state');
		$this->assignRef('fieldsClass',$fieldsClass);
		$this->assignRef('fields',$fields);
		if(hikashop_level(2)) {
			$itemFields = $fieldsClass->getFields('frontcomp', $element, 'item', 'checkout&task=state');
			$null = array();
			$fieldsClass->addJS($null,$null,$null);
			$fieldsClass->jsToggle($itemFields,$element, 0);
			$this->assignRef('itemFields' ,$itemFields);
			$extraFields = array('item'=> &$itemFields);
			$requiredFields = array();
			$validMessages = array();
			$values = array('item'=> $element);
			$fieldsClass->checkFieldsForJS($extraFields, $requiredFields, $validMessages, $values);
			$fieldsClass->addJS($requiredFields, $validMessages, array('item'));
		}
Il faudra rajouter les valeurs venant de l'URL dans $element avant.

PS: ça m'arrive également de temps en temps ;)

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

  • Posts: 105
  • Thank you received: 2
9 years 4 weeks ago #219067

Merci Nicolas.
Je suis bien arrivé à afficher les valeurs en fonction du contexte donné par ma variable de l'url.
en modifiant les lignes indiquées; en revanche, un des custom field a un "limit_to_parent', mais il ne s'affiche pas, meme si la bonne valeur du parent est correct; cette condition doit donc etre testée ailleurs, non?
Pourriez vous me dire où?

De plus, ca ne fonctionne pas avec les boutons radios, car il semble que la valeur du bouton radio dépend de 'item_data'. Ou puis je changer cette valeur, si nécessaire, avant d'arriver dans le show_block_custom_item?

Last edit: 9 years 4 weeks ago by rfonta.

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

  • Posts: 82909
  • Thank you received: 13379
  • MODERATOR
9 years 3 weeks ago #219072

Bonjour,

1. Je me souviens d'un bug que nous avons corrigé à ce sujet. Cela serait-il la cause du problème ?
www.hikashop.com/forum/install-update/87...to-issue.html#217539

2. Vous pouvez rajouter cela dans le fichier components/com_hikashop/views/product/view.html.php au même endroit que sus-mentionné.

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

  • Posts: 105
  • Thank you received: 2
9 years 3 weeks ago #219095

Bonjour,
Je ne comprends pas.
Sur le sujet 1 il y a une discussion pas terminée, et sur le 2 vous n'indiquez pas ce que je dois rajouter??

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

  • Posts: 82909
  • Thank you received: 13379
  • MODERATOR
9 years 3 weeks ago #219105

Bonjour,

1. Je vous ai donné un lien qui va directement sur un message du sujet avec un code à modifier:

Change the code:
if($oneValue === $field->field_default){
$selected = (is_string($field->field_default) && $oneValue === $field->field_default) || is_array($field->field_default) && in_array($oneValue,$field->field_default) ? 'selected="selected" ' : '';
to:
$defaultValueEqualToCurrentValue = (is_numeric($field->field_default) && is_numeric($oneValue) && $oneValue == $field->field_default) || is_string($field->field_default) && $oneValue === $field->field_default;
if($defaultValueEqualToCurrentValue){
$selected = ($defaultValueEqualToCurrentValue || is_array($field->field_default) && in_array($oneValue,$field->field_default)) ? 'selected="selected" ' : '';
in the file administrator/components/com_hikashop/classes/field.php and that will fix the problem.

Cela n'a pas de rapport avec le fait qu'un autre problème a été mentionné ensuite par l'utilisateur.

2. Votre question était "Ou puis je changer cette valeur, si nécessaire, avant d'arriver dans le show_block_custom_item?". Vous demandiez que je vous fournisse l'endroit où ajouter du code que vous vouliez écrirer pour changer une valeur. Ce à quoi j'ai répondu. Vous ne m'aviez pas demander quoi rajouter...
Mais normalement, a partir du moment où les données sont entrés dans $element avant le code sus-mentionné, cela devrait fonctionner... Quel code utilisez vous ?

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

  • Posts: 105
  • Thank you received: 2
9 years 3 weeks ago #219158

Merci, désolé pour l'incompréhension .

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

  • Posts: 105
  • Thank you received: 2
9 years 3 weeks ago #219307

Bonjour,
j'ai téléchargé la derniere version 2.6.0 il y a 15 jours et j'ai l'impression que j'ai déja le code modifié dont vous me parlez (ci joint, le code est en ligne 2099; comme j'ai changé le fichier a d'autres endroits, il est possible que le nb de ligne ne corresponde pas exactement a la version "officielle"). Mais ça ne fonctionne toujours pas
Pour rappel, ce qui ne fonctionne pas c'est quand une valeur d'un custom field est préselectionné suite à une variable envoyée en url, un autre custom field don't l'affichage dépend de cette valeur n'est pas affiché meme si la valeur est la bonne.
Une autre idée?

Last edit: 9 years 3 weeks ago by Jerome.

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

  • Posts: 26159
  • Thank you received: 4028
  • MODERATOR
9 years 3 weeks ago #219440

Bonjour,

Merci de ne pas inclure en pièce jointe des fichiers entiers d'HikaShop.

Suite au post dans l'autre thread ; Nicolas a généré et mis en ligne de nouveau packages d'HikaShop.
Donc oui, si vous avez téléchargez HikaShop après cette mise en ligne, vous avez le patch mentionné directement inclus.

Comme vous le savez, HikaShop ne permet pas de base de définir des données pour les champs personnalisés en fonction de paramètres dans l'URL ; il s'agit donc de code personnalisé que vous avez rajouté suite aux indications de Nicolas (#218827).
La fonction "jsToggle" permet d'initialiser le javascript afin de définir les conditions d'affichage du "display limited to".
Pour cela, elle va faire appel aux fonctions "getLoadJSForToggle" et "initJSToggle" afin de générer le javascript d'initialisation ; mais le tout va utiliser la variable "$data" qui est bien "$element" dans le message de Nicolas.

Cordialement,


Jerome - Obsidev.com
HikaMarket & HikaSerial developer / HikaShop core dev team.

Also helping the HikaShop support team when having some time or couldn't sleep.
By the way, do not send me private message, use the "contact us" form instead.

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

  • Posts: 105
  • Thank you received: 2
9 years 3 weeks ago #219670

Merci :)
je vais aller voir dans ces fonctions si je peux aussi y ajouter mes modifications pour tenir compte des valeurs préselectionnées.
désolé pour le fichier joint, je ne savais pas.

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

Time to create page: 0.091 seconds
Powered by Kunena Forum