public function storeProductCustomfields($table, $datas, $id)
 {
     //vmdebug('storeProductCustomfields',$datas);
     JSession::checkToken() or jexit('Invalid Token, in store customfields');
     //Sanitize id
     $id = (int) $id;
     //Table whitelist
     $tableWhiteList = array('product', 'category', 'manufacturer');
     if (!in_array($table, $tableWhiteList)) {
         return false;
     }
     // Get old IDS
     $this->_db->setQuery('SELECT `virtuemart_customfield_id` FROM `#__virtuemart_' . $table . '_customfields` as `PC` WHERE `PC`.virtuemart_' . $table . '_id =' . $id);
     $old_customfield_ids = $this->_db->loadColumn();
     if (isset($datas['custom_param'])) {
         $params = true;
     } else {
         $params = false;
     }
     if (isset($datas['field'])) {
         //vmdebug('datas save',$datas);
         $customfieldIds = array();
         foreach ($datas['field'] as $key => $fields) {
             $fields['virtuemart_' . $table . '_id'] = $id;
             $tableCustomfields = $this->getTable($table . '_customfields');
             $tableCustomfields->setPrimaryKey('virtuemart_product_id');
             if (!empty($datas['custom_param'][$key]) and !isset($datas['cloned_product_id'])) {
                 if (array_key_exists($key, $datas['custom_param'])) {
                     $fields['custom_param'] = json_encode($datas['custom_param'][$key]);
                 }
             }
             VirtueMartModelCustomfields::setParameterableByFieldType($tableCustomfields, $fields['field_type']);
             if (!isset($datas['cloned_product_id'])) {
                 VirtueMartModelCustomfields::bindParameterableByFieldType($tableCustomfields, $fields['field_type']);
             }
             $tableCustomfields->bindChecknStore($fields);
             $errors = $tableCustomfields->getErrors();
             foreach ($errors as $error) {
                 vmError($error);
             }
             $key = array_search($fields['virtuemart_customfield_id'], $old_customfield_ids);
             if ($key !== false) {
                 unset($old_customfield_ids[$key]);
             }
             // 				vmdebug('datas clone',$old_customfield_ids,$fields);
         }
     }
     if (count($old_customfield_ids)) {
         // delete old unused Customfields
         $this->_db->setQuery('DELETE FROM `#__virtuemart_' . $table . '_customfields` WHERE `virtuemart_customfield_id` in ("' . implode('","', $old_customfield_ids) . '") ');
         $this->_db->execute();
     }
     JPluginHelper::importPlugin('vmcustom');
     $dispatcher = JDispatcher::getInstance();
     if (isset($datas['plugin_param']) and is_array($datas['plugin_param']) and !isset($datas['cloned_product_id'])) {
         foreach ($datas['plugin_param'] as $key => $plugin_param) {
             $dispatcher->trigger('plgVmOnStoreProduct', array($datas, $plugin_param));
         }
     } else {
         if (isset($datas['field']) and is_array($datas['field']) and isset($datas['cloned_product_id'])) {
             foreach ($datas['field'] as $key => $plugin_param) {
                 if ($plugin_param['field_type'] !== 'E') {
                     continue;
                 }
                 $datas['plugin_param'] = $datas['field'];
                 $dispatcher->trigger('plgVmOnCloneProduct', array($datas, $plugin_param, $datas['cloned_product_id']));
             }
         }
     }
 }