/** * Recherche avancée */ public function search($payload = null) { global $db; require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; // Filtres $search = $payload['search'] ?? ''; $category = $payload['category'] ?? null; $status = $payload['status'] ?? null; $minPrice = $payload['minPrice'] ?? null; $maxPrice = $payload['maxPrice'] ?? null; // Pagination $limit = min($payload['limit'] ?? 50, 100); // Max 100 $offset = $payload['offset'] ?? 0; // Construction de la requête $sql = "SELECT p.rowid FROM " . MAIN_DB_PREFIX . "product as p"; // Jointure catégorie si nécessaire if ($category) { $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "categorie_product as cp"; $sql .= " ON p.rowid = cp.fk_product"; } $sql .= " WHERE p.entity IN (" . getEntity('product') . ")"; // Filtres if ($search) { $sql .= " AND (p.label LIKE '%" . $db->escape($search) . "%'"; $sql .= " OR p.ref LIKE '%" . $db->escape($search) . "%')"; } if ($category) { $sql .= " AND cp.fk_categorie = " . (int) $category; } if ($status !== null) { $sql .= " AND p.tosell = " . (int) $status; } if ($minPrice !== null) { $sql .= " AND p.price >= " . (float) $minPrice; } if ($maxPrice !== null) { $sql .= " AND p.price <= " . (float) $maxPrice; } $sql .= " ORDER BY p.label ASC"; $sql .= " LIMIT " . (int) $limit; $sql .= " OFFSET " . (int) $offset; $resql = $db->query($sql); $products = []; $mapper = new dmProduct(); while ($obj = $db->fetch_object($resql)) { $product = new \Product($db); $product->fetch($obj->rowid); $products[] = $mapper->exportMappedData($product); } return [['products' => $products], 200]; }