Jump to content

50l3r

New Members
  • Posts

    14
  • Joined

  • Last visited

Everything posted by 50l3r

  1. Entiendo tu frustración y la comparto en ciertos aspectos. Vengo de Wordpress y me he topado con proyectos en el que era imperativo trabajar con Prestashop por decisiones del cliente. He desarrollado plugins e integraciones para ambas plataformas y en definitiva creo que Wordpress tiene mas estabilidad a pesar de que el modelo de datos no es para nada optimo. Para Prestashop actualmente es mas complicado desarrollar ya que mitad del proyecto esta en Symfony y la otra no. Mi resumen sin mojarme es que recomendaría Wordpress para proyectos mas pequeños y Prestashop para mas grandes. Al menos a día de hoy si. Sin embargo, creo que no nos podemos cabrear cuando algo funcione mal o se tomen decisiones en la plataforma que pueden no ser las mejores. El núcleo de Prestashop al igual que Wordpress es gratuito y no podemos exigir que una herramienta sea infalible sin aportar nada a la misma. Puedo entenderlo si adquieres un plugin de pago y este no funciona como debería y no te dan el soporte que mereces. Que en Prestashop porcierto no son nada baratos 😜 Dejando esta disputa de lado os dejo por aquí el problema y una posible solución: El problema a día de hoy está en que el usuario cambia de Invitado a Cliente correctamente cuando estas dentro del seguimiento de un pedido. Prestashop te da la opción de convertir tu cuenta de invitado en una de cliente dentro de esta sección. La cosa hasta ahí funciona bien pero lo que ocurre es que si un usuario que ya hizo una compra como invitado, toma la iniciativa de querer registrarse por su cuenta, se duplica el usuario y aquí está el problema. Ahora tienes una cuenta de invitado y una de cliente para el mismo usuario. Sin embargo esto no es del todo erróneo, ya que si un usuario quiere registrarse y existe una cuenta de invitado, si fusionaríamos las dos cuentas podemos estar ante una brecha de seguridad. ¿Porque? Fácil, si una persona conoce el email de otra que ha realizado un pedido como invitado puede intentar registrarse posteriormente y capturaría todos los datos de la persona suplantada, exponiendo todos los datos de la misma. Para evitar esto lo que se me ha ocurrido es modificar la linea 119 del archivo classes/form/CustomerForm.php De $id_customer = Customer::customerExists($emailField->getValue(), true, true); A $id_customer = Customer::customerExists($emailField->getValue(), true, false); Esta linea verifica si el cliente existe o no y la ultima variable sirve para ignorar a los usuarios invitados o no. El resultado es que a la hora de registrarse va a dar el error de que el usuario ya existe en la plataforma. La única manera de recuperar el acceso a esta cuenta seria acceder como invitado a tu pedido y crearte la cuenta sabiendo al menos el numero de referencia del ultimo pedido o que la propia tienda te active el usuario. No es la mejor manera pero al menos evita duplicados de usuarios. Esto podria evitarse si las cuentas tuvieran verificacion de email por defecto Para los mas puritanos que no quieran tocar el core de Prestashop (Os lo recomiendo) pueden hacer uso de este override: <?php class CustomerForm extends CustomerFormCore { public function validate() { $emailField = $this->getField('email'); $id_customer = Customer::customerExists($emailField->getValue(), true, false); $customer = $this->getCustomer(); if ($id_customer && $id_customer != $customer->id) { $emailField->addError($this->translator->trans( 'The email is already used, please choose another one or sign in', [], 'Shop.Notifications.Error' )); } // check birthdayField against null case is mandatory. $birthdayField = $this->getField('birthday'); if (!empty($birthdayField) && !empty($birthdayField->getValue()) && Validate::isBirthDate($birthdayField->getValue(), $this->context->language->date_format_lite) ) { $dateBuilt = DateTime::createFromFormat( $this->context->language->date_format_lite, $birthdayField->getValue() ); $birthdayField->setValue($dateBuilt->format('Y-m-d')); } $this->validateFieldsLengths(); $this->validateByModules(); return parent::validate(); } public function validateByModules() { $formFieldsAssociated = []; // Group FormField instances by module name foreach ($this->formFields as $formField) { if (!empty($formField->moduleName)) { $formFieldsAssociated[$formField->moduleName][] = $formField; } } // Because of security reasons (i.e password), we don't send all // the values to the module but only the ones it created foreach ($formFieldsAssociated as $moduleName => $formFields) { if ($moduleId = Module::getModuleIdByName($moduleName)) { // ToDo : replace Hook::exec with HookFinder, because we expect a specific class here $validatedCustomerFormFields = Hook::exec('validateCustomerFormFields', ['fields' => $formFields], $moduleId, true); if (is_array($validatedCustomerFormFields)) { array_merge($this->formFields, $validatedCustomerFormFields); } } } } } Cabe decir que esto se ha realizado en la version de Prestashop 1.7.7,5
  2. Buenas tardes a todos, Uno mas que se une al problema. He estado realizando pruebas en un entorno de desarrollo y mi problema es el siguiente: 1 - Un usuario hace un pedido como invitado 2 - Después de completar el pedido, por comodidad, el usuario se registra para futuros pedidos 3 - El sistema no detecta que ya existe un usuario invitado con ese email y lo duplica El resultado son dos veces el mismo usuario. El cliente luego quiere acceder a ver sus pedidos pero le sale que no tienen ninguno o solo le aparecen los que hizo como usuario registrado, porque ya no puede acceder a ver sus pedidos anteriores como invitado ya que le obliga a iniciar sesión al tener ya una cuenta creada. Es un problema de flujo de trabajo nada más. Aunque si es importante que los emails no se repitan y el primer limitador como dice @qlio es crear un indice UNIQUE para el campo email, mas allá de luego comprobar en el controlador si existe o no. Voy a indagar en el código a ver de que manera lo solucionamos.
  3. I refer to the native multistore system of PrestaShop. I created a function who pass product id and array of shop ids and reassign the product to another shops. function assignProduct($id_product, $shops){ $currentShop = Context::getContext()->shop->id; if($id_product && $shops){ //Check if product exists on X shops $sql = "SELECT id_shop FROM `"._DB_PREFIX_."product_shop` ps WHERE id_product = '".$id_product."'"; $query = Db::getInstance()->executeS($sql); $product = new Product($id_product); if($query && $product){ $id_shop_default = $product->id_shop_default; $productShops = array_map(function($s){ return $s['id_shop']; }, $query); $delete = []; $add = []; // Populate array with new shops foreach($shops as $shop){ if(!in_array($shop, $productShops)){ $add[] = $shop; } } // Populate array with old shops foreach($productShops as $shop){ if(!in_array($shop, $shops)){ $delete[] = $shop; } } // Associate products with new shops $product->id_shop_list = $add; $product->update(); foreach($delete as $shop){ // Prevent remove product from original shop if($shop===$id_shop_default) continue; // Remove product attributes $sql = "DELETE FROM `"._DB_PREFIX_."product_attribute_shop` WHERE id_product = \"".$id_product."\" AND id_shop = \"".$shop."\""; Db::getInstance()->Execute($sql); // Remove images $sql = "DELETE FROM `"._DB_PREFIX_."image_shop` WHERE id_product = \"".$id_product."\" AND id_shop = \"".$shop."\""; Db::getInstance()->Execute($sql); // Remove customizations $sql = "DELETE FROM `"._DB_PREFIX_."customization_field_lang` WHERE id_shop = \"".$shop."\" AND id_customization_field IN (SELECT id_customization_field FROM `"._DB_PREFIX_."customization_field` WHERE id_product = \"".$id_product."\")"; Db::getInstance()->Execute($sql); // Remove product $sql = "DELETE FROM `"._DB_PREFIX_."product_shop` WHERE id_product = \"".$id_product."\" AND id_shop = \"".$shop."\""; Db::getInstance()->Execute($sql); } foreach($add as $shop){ // Duplicate attributes $sql = "INSERT INTO `"._DB_PREFIX_."product_attribute_shop` (id_product, id_product_attribute, id_shop, wholesale_price, price, ecotax, weight, unit_price_impact, default_on, minimal_quantity, low_stock_threshold, low_stock_alert, available_date, ctk_price, ctk_hidden) SELECT id_product, id_product_attribute, \"".$shop."\", wholesale_price, price, ecotax, weight, unit_price_impact, default_on, minimal_quantity, low_stock_threshold, low_stock_alert, available_date, ctk_price, ctk_hidden FROM `"._DB_PREFIX_."product_attribute_shop` WHERE id_product = \"".$id_product."\" AND id_shop = \"".$currentShop."\""; Db::getInstance()->Execute($sql); // Duplicate image $sql = "INSERT INTO `"._DB_PREFIX_."image_shop` (id_product, id_image, id_shop, cover) SELECT id_product, id_image, \"".$shop."\", cover FROM `"._DB_PREFIX_."image_shop` WHERE id_product = \"".$id_product."\" AND id_shop = \"".$currentShop."\""; Db::getInstance()->Execute($sql); // Duplicate customization $sql = "INSERT INTO `"._DB_PREFIX_."customization_field_lang` (id_customization_field, id_lang, id_shop, name) SELECT id_customization_field, id_lang, \"".$shop."\", name FROM `"._DB_PREFIX_."customization_field_lang` WHERE id_customization_field IN (SELECT id_customization_field FROM `"._DB_PREFIX_."customization_field` WHERE id_product = \"".$id_product."\") AND id_shop = \"".$currentShop."\""; Db::getInstance()->Execute($sql); // Disable product $sql = "UPDATE `"._DB_PREFIX_."product_shop` set active = 0 WHERE id_product = \"".$id_product."\" AND id_shop = \"".$shop."\""; Db::getInstance()->Execute($sql); } die(Calltek::JsonResponse(200)); }else{ die(Calltek::JsonResponse(500, 'Ocurrió un error inesperado')); } }else{ die(Calltek::JsonResponse(400, 'Parámetros incorrectos')); } }
  4. Hi guys, I want to create a function to clone product from shop1 to shop2 preserving the same product id. Currently the only way to share products is at the time of creating a new store. Maybe getting a product and create new one? Currently i have this part of code to get the product: public function ajaxProcessCloneProduct(){ if(Calltek::hasPermissions('AdminCalltekProducts')){ $id = !empty(Tools::getValue('id')) ? Tools::getValue('id') : null; if($id){ $product = new Product($id); var_dump($product); } die(Calltek::JsonResponse(400, 'Parámetros incorrectos')); } die(Calltek::JsonResponse(401, 'Acceso denegado')); } Thanks in advance
  5. Buenas tardes, Estoy informándome acerca de toda la sistemática de multitienda en cuanto a la gestión de productos. Verán, mi casuística es la siguiente: Dispongo de varias tiendas las cuales a futuro van a ser cerca de 200-300. Si, es una exageración y una locura pero las circunstancias me obligan a hacerlo así, mediante Prestashop y con el sistema Multitienda. El caso es que estoy intentando organizar todo de la forma mas optima posible, desarrollando módulos para una perfecta orquestación entre todas las tiendas y lo que comparten, y una cosa importante es la gestión de productos. Trabajo a nivel de tienda independiente, grupo de tiendas y todas las tiendas, esto quiere decir que hay veces que un producto es independiente, otras global y otras solo se da en ciertas tiendas. El caso es que me he dado cuenta de que me es posible crear un producto a nivel "Todas las tiendas" pero no me es posible crearlo a nivel de "Grupo de tiendas". Veo que no se ofrece una opción de copiar producto para otra tienda de forma oficial, pero si accedo a un producto de la tienda 1 por ejemplo, y cambio a la tienda 2 el producto puedo guardarlo y se me clona. Mi pregunta es, cual seria la forma mas rápida de gestionar productos para grupos? He de desarrollar un modulo o comprar uno existente? Poseo la version 1.7.7.5
  6. I have similar problem. When i try to add product to cart i recieve this error: core.js:116 Uncaught TypeError: Cannot read property 'length' of undefined at HTMLButtonElement.<anonymous> (core.js:116) at HTMLBodyElement.dispatch (core.js:39) at HTMLBodyElement.m.handle (core.js:39) It refers to: ("[data-allow-oosp]").data("allow-oosp").length) It does not happen in all products
  7. Nope. The only way to do this its overwrite the module
  8. Great. Much thanks.
  9. The VAT problem was solved? How can i override the /src/PrestaShopBundle/Controller/Admin/Sell/Order.php to add fields to order list?
  10. AdminOrdersController.php doesnt exist anymore. I have the same problem
  11. In Prestashop 1.7.7.4 AdminOrdersController it doesnt exist. How can i do this?
  12. Buenas tardes a todos, Quisiera saber si existe manera de reactivar un tema de forma masiva en un prestashop multisitio. Dispongo de una instalación con decenas de tiendas en ese multisitio de las cuales todas usan el mismo tema realizado a medida. Ese tema hace uso del config.yml para registrar hooks en determinadas posiciones. He visto que no hay manera de tener sincronizados los hooks de todas las tiendas sino que has de ir una a una. He visto que puedo solventar este problema activando y desactivando el tema, pero también debo de ir de uno en uno. ¿Hay alguna forma de poder reactivar el tema para todos los sitios?
×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More