save custom field data in product page

  • Posts: 105
  • Thank you received: 2
9 years 10 months ago #217646

Bonjour Nicolas,
j'ai avancé dans ma création de "item custom fields" qui peuvent être customisés dans le "back end product form"; mais je suis coincé.
J'ai crée un "Dropdown customizable" custom field type (en fait, quasiment une copie du Single Dropdown").
J'ai créé "Product custom field" avec ce type. C'est donc un "Single Dropdown" avec plusieurs choix (value, title,disable).. Ce que je veux faire c'est l"afficher comme tel dans "product" ( c'est à dire que je veux afficher toutes les triplettes (value, title,disable) pour modifier les valeurs de "title" et "disable" dans product, et donc pouvoir customiser selon ces valeurs ce que je vais afficher dans le catalogue).
J'y arrive bien, en modifiant "\administrator\components\com_hikashop\views\product\tmpl\form.php".
Mon problème c'est que je n'arrive pas à sauvegarder ces valeurs:
1/ Je ne trouve pas où Hikashop sauve les valeurs liées aux custom field (j'ai regardé dans le controller "product", la class 'product', et je ne vois rien qui va chercher les inputs "data[product]" de la form. DONC 1ERE QUESTION: Ou est-ce?
2/ en fait, ce que je voudrais sauvegarder, c'est l'équivalent du champ "field_value" (donc une concatenation de 'value, title, diable) en faisant un "Implode" de ces trois valeurs (et un ExplodeValues en retour lorsque je veux les avoir). 2EME QUESTION: est-ce bien possible, suis-je sur la bonne voie?

pour info voici la partie de code de "form.php" que j'ai modifié:

if(!empty($this->fields)){?>
						<table class="admintable table" width="100%">
						<?php foreach($this->fields as $fieldName => $oneExtraField){
							if(!$oneExtraField->field_backend){
								if($oneExtraField->field_type = "customtext"){?>
										<tr><td><input type="hidden" name="data[product][<?php echo $fieldName; ?>]" value="<?php echo $this->element->$fieldName; ?>" /></td></tr>
									<?php 
								}
							}
							else{ 
									if($oneExtraField->field_type == "plg.dropdownfreefield"){
											//get the Generic field from the field table
											$classGenField=hikashop_get('class.field');
											$field_id=$oneExtraField->field_id;
											$GenField = $classGenField->get($field_id);
											$GenFieldValue=$GenField->field_value;
											//get the custom values from the product info
											$custom_field_values=get_custom_values($product_id,$name_column);
											?>
										<tr id="fieldopt_multivalues">
											<td class="key" valign="top">
												<?php echo JText::_( 'FIELD_VALUES' ); ?>
											</td>
											<td>
												<table id="hikashop_field_values_table" class="hikaspanleft table table-striped table-hover"><tbody id="tablevalues">
													<tr>
														<td><?php echo JText::_('FIELD_VALUE')?></td>
														<td><?php echo JText::_('FIELD_TITLE'); ?></td>
														<td><?php echo JText::_('FIELD_DISABLED'); ?></td>
													</tr>
														<?php
														if(!empty($GenField->field_value) && is_array($GenField->field_value)){
																foreach($GenField->field_value as $titleGen => $valueGen){
																	//get the individual values coming from the "item" field (customized in the "product table", not the "field table"
																	$cust_title=$custom_field_values->title;
																	if (empty($cust_title)) $cust_title=$this->escape($valueGen->value);
																	$checked='';
																	if((int)$value->disabled) $checked = 'checked';
																	?>
																		<tr>
																			<td><input type="text" name="field_values[title][]" value="<?php echo $titleGen; ?>" /></td>
																			<td><input type="text" name="field_values[value][]" value="<?php echo $cust_title; ?>" /></td>
																			<td><input type="checkbox" name="field_values[disabled][]" value="1" <?php echo ' '.$checked ?>></td>
																		</tr>
																		<?php 
																} 
														}?>
													</tbody>
												</table>
											</td>
										</tr>
										<?php 
									}
									else{?>
									<tr id="hikashop_product_<?php echo $fieldName; ?>">
										<td class="key">
											<?php echo $this->fieldsClass->getFieldName($oneExtraField);?>
										</td>
										<td>
											<?php
												if(!isset($this->element->$fieldName))
													$this->element->$fieldName = $oneExtraField->field_default;
											?>
											<?php $onWhat='onchange'; if($oneExtraField->field_type=='radio') $onWhat='onclick'; ?>
											<?php echo $this->fieldsClass->display($oneExtraField,$this->element->$fieldName,'data[product]['.$fieldName.']',false,' '.$onWhat.'="hikashopToggleFields(this.value,\''.$fieldName.'\',\'product\',0);"'); ?>
										</td>
									</tr>
									<?php }
							}
						} ?>
						</table>
					<?php }?>

Last edit: 9 years 10 months ago by Jerome. Reason: [code] is nice..

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

  • Posts: 84306
  • Thank you received: 13701
  • MODERATOR
9 years 10 months ago #217654

Bonjour,

1. C'est dans la class product. Dans la fonction saveForm et saveBackendForm, il y a un appel à la fonction getInput de la class field qui va chercher les valeurs dans data[product]

2. Pour cela, il suffit de faire une ligne du genre:

<td><input type="text" name="data[product][<?php echo $fieldName; ?>]" value="<?php echo $titleGen.'::'.$cust_title.'::'.$checked; ?>" /></td>

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

  • Posts: 105
  • Thank you received: 2
9 years 10 months ago #217756

Bonjour,

merci. :)

Pour le point 2, cette solution permet de sauver "directement" les valeurs de "field" dans "product", mais ça ne permet pas de les modifier/entrer dans ce formulaire puis de les sauvegarder dans product? non?
je dois donc d'abord récuperer les données entrées dans le formulaire dans la classe product and ajoutant une fonction spécifique de type "saveform de la class field" pour les capturer, puis utiliser une fonction d'implode?non?

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

  • Posts: 105
  • Thank you received: 2
9 years 10 months ago #217773

Désolé mais je suis un peu perdu dans saveForm() de Product.
D'ailleurs je ne trouve pas de saveBackendForm dans la class product??
Ce que je ne comprends c'est comment la "data" de fonction getInput est renseignée car apres la déclaration de $data = new stdClass(); en ligne 621 de "field.php" je ne vois rien qui mette de la donnée dedans.
Mais mettons que ce ne soit pas grave que je ne comprenne pas ça.
dans saveForm je ne vois pas dans quel partie de "element" on met les champs provenant des "custom field", et ensuite je vois en fin de saveForm qu'on fait tout les "update" avec les lignes "$this->updateCategories($element,$status);" et les suivantes, mais je ne vois pas où est ce qu'on charge les custom field values dans la table product.

Pourrais je avoir un peu d'orientation??

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

  • Posts: 84306
  • Thank you received: 13701
  • MODERATOR
9 years 10 months ago #217926

J'ai du mal à suivre ce que vous essayez de faire. Mais soit.

En effet, ma mémoire me fait défaut. Le nom de la fonction est backSaveForm

$data est rempli par la ligne:

$formData[$namekey] = $val;
dans la fonction _checkOneInput qui est appelée par getInput.

Concernant la fonction saveForm, je ne vous suis pas. C'est justement l'appel à getInput qui rempli $element avec les valeurs des custom fields. Ensuite, $element est sauvegardé automatiquement avec l'appel à la fonction save qui se charge de sauvegarder les données du produit dans la table hikashop_product. Pour les autres tables, genre hikashop_price ou hikashop_product_category, il est nécessaire d'avoir un process spécifique, d'où l'appel à des fonctions spécifiques à ces tables, ce qui n'est pas nécessaire pour les custom fields vu qu'ils sont également sauvegarder dans hikashop_product dans leur propre colonne.

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

  • Posts: 105
  • Thank you received: 2
9 years 10 months ago #218020

Bonjour,
Je ne vois toujours pas de fonction saveBackForm.
Et la fonction save ne semble pas enregistrer directement mais elle lance l'événement beforeProductCreate.
Je peux supposer qu'il y a quelque part une fonction (saveBackForm?) qui est activée porte enfin faire la sauvegarde ?
Mais où est-ce?

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

  • Posts: 13201
  • Thank you received: 2322
9 years 10 months ago #218027

Bonjour,

La fonction est "backSaveForm()" et non pas "saveBackForm()".
"save()" appelle le trigger "onBeforeProductCreate()" afin de permettre la modification du produit par des plugins, et ensuite la ligne: $status = parent::save($element); permet la sauvegarde de l'élément dans la table "#__hikashop_product".

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

  • Posts: 105
  • Thank you received: 2
9 years 10 months ago #218117

Bonjour,
Merci pour la repons, mais plutôt que de faire un jeu de piste ou à chaque question/réponse j'ai le premier élément de la poupée russé puis la 2eme...(d'abord la 1 ère fonction, puis la 2eme, puis la sous class), de me donner l'endroit FINAL(là où il y a la Query dans la database) ou c' est sauvegardé car maintenant il faut que je trouve la class HikashopClass (si j'ai bien compris) qui a l'air d'être bien cachée dans je ne sais quel fichier.

Et il n'y a ni backSaveForm()" ni "saveBackForm()" dans le fichier product du répertoire classes.

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

  • Posts: 84306
  • Thank you received: 13701
  • MODERATOR
9 years 10 months ago #218137

Bonjour,

Comme Xavier et moi-même vous l'avons dit, la fonction s'appelle backSaveForm et elle existe. Si vous ne l'avez pas, c'est que vous utilisez une ancienne version d'HikaShop (merci de spécifié le numéro de version lorsque vous créez un nouveau sujet sur le forum).

La class HikashopClass est une class générique d'HikaShop qui génère des requêtes automatiquement sur les tables à partir des données fourni.
Elle se trouve dans le helper principal d'HikaShop: administrator/components/com_hikashop/helpers/helper.php
mais je ne vois pas l'intérêt de toucher à ce fichier (d'où le fait que nous n'en avons pas parlé). Si vous modifiez quelque chose dans la fonction save de HikashopClass, cela affectera toutes les tables d'HikaShop (sauvegarde des catégories, des zones, des devises, des commandes, etc).

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

  • Posts: 105
  • Thank you received: 2
9 years 10 months ago #218166

Bonjour,

merci. Désolé d'avoir été un peu nerveux hier soir.
J'ai fais la mise à jour 2.6 (j'étais en 2.3) et j'ai trouvé backSaveForm.
bonne journée.

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

Time to create page: 0.081 seconds
Powered by Kunena Forum