Jump to content

[RESOLUT] comment se passe updateproduct


Recommended Posts

Bonjour à tous.

 

Je souhaite pouvoir définir manuellement aussi bien les nom que les attributs alt des images produits.

 

Si je n'ai eu aucun soucis du coté Front je but du coté BO.

 

Je ne comprend absolument pas ou et comment

/admin/index.php?controller=AdminProducts&id_product=370&updateproduct

 

Se passe?

Ou et comment se réalise l'update de la table?

 

Si quelqu'un à une idée.

 

Merci

Edited by jd440 (see edit history)
Link to comment
Share on other sites

Bonsoir jd440,

 

/admin/index.php?controller=AdminProducts&id_product=370&updateproduct

Lors de la modification d'un produit , c'est l'adminTab (AdminProductsController.php) qui est appelé

(dossier prestashp/controllers/admin/AdminProductsController.php)

 

L'update est réalisé par la function ;)

	public function processUpdate()

Edited by indesign (see edit history)
Link to comment
Share on other sites

Merci.

C'est bien là que je regardais, mais dans 5000Lignes j'ai du passer 50fois devant la fonction?

 

Il ne reste plus qu'a.

 

sachant que je dois enregistrer pour chaque image, dans la table ps_image_lang un champ legend et name.

Pas simple

 

 

Il n'y a plus qu'a décortiquer tout cela et se creuser la tete.

Merci encore

Link to comment
Share on other sites

d'accord donc sauf erreur de ma part il faut:

Ajouter dans

  public function processUpdate()

			   	 if ($this->isTabSubmitted('SeoImages'))
						$this->processSeoImages();					  

 

puis créer une fonction:

public function processSeoImages()
{
 if (Validate::isLoadedObject($product = new Product((int)Tools::getValue('id_product'))))
 {

  // add new objects
  $languages = Language::getLanguages(false);
  foreach ($_POST as $key => $val)
  {
if (preg_match('/^alt_([0-9]+)_value/i', $key, $match))
{
 if ($val)
  $product->addAltToDB($match[1], $val);
}
  }
 }
 else
  $this->errors[] = Tools::displayError('probleme');
}

 

Et enfin créer:

$product->addAltToDB($match[1], $val);

sur le modèle de $product->addFeatureToDB($match[1], $val);

 

mais là je vois pas ou cela se passe?

Edited by jd440 (see edit history)
Link to comment
Share on other sites

jette un œil, dans le controller admin (AdminFeaturesController.php)

 

public function processUpdate()
   {
       $object = parent::processUpdate();

       if (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && !count($this->errors))
           $this->redirect_after = self::$currentIndex.'&'.$this->identifier.'=&conf=3&update'.$this->table.'&token='.$this->token;

       return $object;
   }

Link to comment
Share on other sites

j'ai trouvé!!

$product->addFeatureToDB($match[1], $val)

Est dans la class Product,

 

public function addFeaturesToDB($id_feature, $id_value, $cust = 0)
{
 if ($cust)
 {
  $row = array('id_feature' => (int)$id_feature, 'custom' => 1);
  Db::getInstance()->insert('feature_value', $row);
  $id_value = Db::getInstance()->Insert_ID();
 }
 $row = array('id_feature' => (int)$id_feature, 'id_product' => (int)$this->id, 'id_feature_value' => (int)$id_value);
 Db::getInstance()->insert('feature_product', $row);
 SpecificPriceRule::applyAllRules(array((int)$this->id));
 if ($id_value)
  return ($id_value);
}

 

Du coup ca n'as rien à faire la puisque je modifie l'image, mais je me demande à à faire l'update directement dans

 

   public function processUpdate()
   {
   //if ($this->isTabSubmitted('SeoImages')){
       $this->processSeoImages();    
   }

   /**
   * enregistrement SEOIMAGE dans DB
   **/
   public function processSeoImages()
   {
           $languages = Language::getLanguages(false);
           foreach ($_POST as $key => $val)
           {
               if (preg_match('/^alt_([0-9]+)_([0-9]+)/i', $key, $match))
               {
                   if ($val)
                   Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'image_lang` SET `legend` = \''.$val.'\' WHERE  `id_image` = '.$match[1].' AND `id_lang` = '.$match[2]);    
               }
               if (preg_match('/^name_([0-9]+)_([0-9]+)/i', $key, $match))
               {
                   if ($val)
                   Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'image_lang` SET `name` = \''.$val.'\' WHERE  `id_image` = '.$match[1].' AND `id_lang` = '.$match[2]);
               }                
           }
   }

Edited by jd440 (see edit history)
Link to comment
Share on other sites

Afin de faire quelque chose de propre je suis en train de tout passer en ovveride, afin notamment de parer à tout risque de supprression en cas d'update du core.

 

Mais je me pose deux questions.

dans la fonction processUpdate j'appel la fonction processSeoImages

1 - dans l'override suis je obliger de recopier toute la fonction processUpdate????

 public function processUpdate()
{
  //if ($this->isTabSubmitted('SeoImages'))
  $this->processSeoImages();					  
  [...]
}

 

2 - je suis surpris car je me suis inspiré du core

comme:

if ($this->isTabSubmitted('Features'))
 $this->processFeatures();

 

hors si je controle ma tabsubmitted il n'y a pas d'appel à la fonction processSeoImages pourtant j'ai bien en haut de la tab SeoImages:

	<input name="submitted_tabs[]" value="SeoÌmages" type="hidden">

Edited by jd440 (see edit history)
Link to comment
Share on other sites

Afin de faire quelque chose de propre je suis en train de tout passer en override, afin notamment de parer à tout risque de suppression en cas d'update du core.

En effet, c'est la bonne méthode. ;)

• Normalement, il n'est pas nécessaire d'inclure toute la fonction.

• La function processSeoImages doit être incluse dans l'override mais pas dans l'admin de base (si présent)

Il faut, peut-être pour retourner les valeur à l'Admin de base quelque chose comme AdminController::postProcess();

(à vérifier)

 

PS : je viens de voir que tu avais modifié le précédent post, donc mon commentaire n'est peut-être plus d'actualité ? :)

Edited by indesign (see edit history)
Link to comment
Share on other sites

Merci quand même,

 

Ca avance.

Il ne me reste plus qu'a réussir à ajouter une fonction javascript qui permet de créer un adresse seofriendly, en s'insiprant de

updateFriendlyURL

 

inclus dans

admin.js

 

Si j'ajoute dans admin.js:

function updateFriendlyURLIMAGE(id_image)
{
id_image_selected = id_image;
var link = $('#name_' + id_image_selected + '_'+ id_language);
if (link[0])
{
	link.val(str2url($('#name_' + id_image_selected + '_'+ id_language).val(), 'UTF-8'));
}
}

 

avec sur le input:

<input size="30" type="text" id="{$input_name}_{$image_id}_{$language.id_lang}"
name="{$input_name}_{$image_id}_{$language.id_lang}"
 value="{$input_value[$language.id_lang]|htmlentitiesUTF8|default:''}"
 onkeyup="if (isArrowKey(event)) return ;updateFriendlyURLIMAGE({$image_id});"/>

 

Le problème est comment et ou l'ajouter?

car il n'y a pas de ovverride en js?

Du coup il me reste la solution:

 

Ajouter dans l'override:

 

public function postProcess()
{
[...]
  $this->addJS(array(
_PS_JS_DIR_.'productTabsManager.js',
_PS_JS_DIR_.'admin-products.js',
_PS_JS_DIR_.'attributesBack.js',
_PS_JS_DIR_.'price.js',
_PS_JS_DIR_.'tiny_mce/tiny_mce.js',
_PS_JS_DIR_.'tinymce.inc.js',
_PS_JS_DIR_.'fileuploader.js',
_PS_JS_DIR_.'admin-dnd.js',
_PS_JS_DIR_.'jquery/plugins/treeview-categories/jquery.treeview-categories.js',
_PS_JS_DIR_.'jquery/plugins/treeview-categories/jquery.treeview-categories.async.js',
_PS_JS_DIR_.'jquery/plugins/treeview-categories/jquery.treeview-categories.edit.js',
_PS_JS_DIR_.'admin-categories-tree.js',
_PS_JS_DIR_.'jquery/ui/jquery.ui.progressbar.min.js',
_PS_JS_DIR_.'jquery/plugins/timepicker/jquery-ui-timepicker-addon.js',
_PS_JS_DIR_.'admin-override.js'	
  ));

[...]
 }
}

 

Avec dans admin-override.js:

var ajax_running_timeout = null;
if (!id_language)
var id_language = Number(1);
function str2url(str, encoding, ucfirst)
{
str = str.toUpperCase();
str = str.toLowerCase();
if (PS_ALLOW_ACCENTED_CHARS_URL)
 str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]\\u00A1-\\uFFFF/g,'');
else
{
 str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g,'a');
 str = str.replace(/[\u00E7\u010D\u0107\u0106]/g,'c');
 str = str.replace(/[\u010F]/g,'d');
 str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118\u0117]/g,'e');
 str = str.replace(/[\u00EC\u00ED\u00EE\u00EF\u012F]/g,'i');
 str = str.replace(/[\u0142\u0141]/g,'l');
 str = str.replace(/[\u00F1\u0148]/g,'n');
 str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3]/g,'o');
 str = str.replace(/[\u0159]/g,'r');
 str = str.replace(/[\u015B\u015A\u0161]/g,'s');
 str = str.replace(/[\u00DF]/g,'ss');
 str = str.replace(/[\u0165]/g,'t');
 str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F\u016B\u0173]/g,'u');
 str = str.replace(/[\u00FD\u00FF]/g,'y');
 str = str.replace(/[\u017C\u017A\u017B\u0179\u017E]/g,'z');
 str = str.replace(/[\u00E6]/g,'ae');
 str = str.replace(/[\u0153]/g,'oe');
 str = str.replace(/[\u013E\u013A]/g,'l');
 str = str.replace(/[\u0155]/g,'r');
 str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]/g,'');
}
str = str.replace(/[\u0028\u0029\u0021\u003F\u002E\u0026\u005E\u007E\u002B\u002A\u002F\u003A\u003B\u003C\u003D\u003E]/g, '');
str = str.replace(/[\s\'\:\/\[\]-]+/g, ' ');
// Add special char not used for url rewrite
str = str.replace(/[ ]/g, '-');
str = str.replace(/[\/\\"'|,;]*/g, '');
if (ucfirst == 1) {
 var first_char = str.charAt(0);
 str = first_char.toUpperCase()+str.slice(1);
}
return str;
}
function updateFriendlyURLIMAGE(id_image)
{
id_image_selected = id_image;
var link = $('#name_' + id_image_selected + '_'+ id_language);
if (link[0])
{
	link.val(str2url($('#name_' + id_image_selected + '_'+ id_language).val(), 'UTF-8'));
}
}

Edited by jd440 (see edit history)
Link to comment
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
×
×
  • Create New...