# Shop Navigation Flow Complete guide to navigation structure and URL hierarchy with landing pages. ## URL Hierarchy ``` / (Vendor Root) → Landing Page (if exists) OR redirect to /shop/ ├── /shop/ → E-commerce Homepage (Product Catalog) │ ├── /shop/products → Product Catalog (same as /shop/) │ ├── /shop/products/{id} → Product Detail Page │ ├── /shop/cart → Shopping Cart │ ├── /shop/checkout → Checkout Process │ ├── /shop/account/login → Customer Login │ ├── /shop/account/register → Customer Registration │ ├── /shop/account/dashboard → Customer Dashboard (auth required) │ ├── /shop/about → CMS Content Page │ ├── /shop/contact → CMS Content Page │ └── /shop/{slug} → Other CMS Pages ``` ## Navigation Patterns ### Pattern 1: With Landing Page (Recommended) **URL Structure:** ``` customdomain.com/ → Landing Page (marketing/brand) customdomain.com/shop/ → E-commerce Shop customdomain.com/shop/products → Product Catalog ``` **Navigation Flow:** 1. User visits vendor domain → **Landing Page** 2. Clicks "Shop Now" → **/shop/** (product catalog) 3. Clicks "Home" in breadcrumb → **/** (back to landing page) 4. Clicks logo → **/** (back to landing page) **Breadcrumb Example (on Products page):** ``` Home > Products ↓ / (Landing Page) ``` ### Pattern 2: Without Landing Page (Auto-Redirect) **URL Structure:** ``` customdomain.com/ → Redirects to /shop/ customdomain.com/shop/ → E-commerce Shop customdomain.com/shop/products → Product Catalog ``` **Navigation Flow:** 1. User visits vendor domain → **Redirects to /shop/** 2. User browses shop 3. Clicks "Home" in breadcrumb → **/** (redirects to /shop/) 4. Clicks logo → **/** (redirects to /shop/) **Breadcrumb Example (on Products page):** ``` Home > Products ↓ / → /shop/ (redirects) ``` ## Link References ### Base URL Calculation The `base_url` variable is calculated in `shop_pages.py:get_shop_context()`: ```python # For domain/subdomain access base_url = "/" # Result: /shop/products, /shop/cart, etc. # For path-based access base_url = "/vendors/wizamart/" # Result: /vendors/wizamart/shop/products, /vendors/wizamart/shop/cart, etc. ``` ### Template Links **Logo / Home Link (Header):** ```jinja2 {# Points to vendor root (landing page or shop) #} {{ vendor.name }} ``` **Breadcrumb Home Link:** ```jinja2 {# Points to vendor root (landing page) #} Home ``` **Shop Links:** ```jinja2 {# All shop pages include /shop/ prefix #} Products Cart Checkout ``` **CMS Page Links:** ```jinja2 {# CMS pages are under /shop/ #} About Contact {{ page.title }} ``` ## Complete URL Examples ### Path-Based Access (Development) ``` http://localhost:8000/vendors/wizamart/ ├── / (root) → Landing Page OR redirect to shop ├── /shop/ → Shop Homepage ├── /shop/products → Product Catalog ├── /shop/products/4 → Product Detail ├── /shop/cart → Shopping Cart ├── /shop/checkout → Checkout ├── /shop/account/login → Customer Login ├── /shop/about → About Page (CMS) └── /shop/contact → Contact Page (CMS) ``` ### Subdomain Access (Production) ``` https://wizamart.platform.com/ ├── / (root) → Landing Page OR redirect to shop ├── /shop/ → Shop Homepage ├── /shop/products → Product Catalog ├── /shop/products/4 → Product Detail ├── /shop/cart → Shopping Cart ├── /shop/checkout → Checkout ├── /shop/account/login → Customer Login ├── /shop/about → About Page (CMS) └── /shop/contact → Contact Page (CMS) ``` ### Custom Domain Access (Production) ``` https://customdomain.com/ ├── / (root) → Landing Page OR redirect to shop ├── /shop/ → Shop Homepage ├── /shop/products → Product Catalog ├── /shop/products/4 → Product Detail ├── /shop/cart → Shopping Cart ├── /shop/checkout → Checkout ├── /shop/account/login → Customer Login ├── /shop/about → About Page (CMS) └── /shop/contact → Contact Page (CMS) ``` ## User Journeys ### Journey 1: First-Time Visitor (With Landing Page) 1. Visit `customdomain.com/` → **Landing Page** - Sees brand story, features, CTA 2. Clicks "Shop Now" → `/shop/` → **Product Catalog** - Browses products 3. Clicks product → `/shop/products/4` → **Product Detail** - Views product 4. Clicks "Home" in breadcrumb → `/` → **Back to Landing Page** 5. Clicks logo → `/` → **Back to Landing Page** ### Journey 2: Returning Customer (Direct to Shop) 1. Visit `customdomain.com/shop/` → **Product Catalog** - Already knows the brand, goes straight to shop 2. Adds to cart → `/shop/cart` → **Shopping Cart** 3. Checkout → `/shop/checkout` → **Checkout** 4. Clicks "Home" → `/` → **Landing Page** (brand homepage) ### Journey 3: Customer Account Management 1. Visit `customdomain.com/shop/account/login` → **Login** 2. After login → `/shop/account/dashboard` → **Dashboard** 3. View orders → `/shop/account/orders` → **Order History** 4. Clicks logo → `/` → **Back to Landing Page** ## Navigation Components ### Header Navigation (base.html) ```jinja2 {# Logo - always points to vendor root #} {{ vendor.name }} {# Main Navigation #} {# Actions #} Cart Account ``` ### Footer Navigation (base.html) ```jinja2 {# Quick Links #} Products {# CMS Pages (dynamic) #} {% for page in footer_pages %} {{ page.title }} {% endfor %} ``` ### Breadcrumbs (products.html, content-page.html) ```jinja2 {# Points to vendor root (landing page) #} Home / Products ``` ## Best Practices ### ✅ DO: 1. **Use Landing Pages**: Create engaging landing pages at vendor root 2. **Clear Navigation**: Make it easy to get from landing to shop and back 3. **Consistent "Home"**: Logo and "Home" breadcrumb both point to `/` (landing) 4. **Shop Links**: All shop-related links include `/shop/` prefix 5. **CMS Under Shop**: Keep CMS pages under `/shop/` for consistency ### ❌ DON'T: 1. **Hardcode URLs**: Always use `{{ base_url }}` for vendor-aware links 2. **Skip /shop/**: Don't link directly to `/products`, use `/shop/products` 3. **Mix Landing & Shop**: Keep landing page separate from shop catalog 4. **Forget Breadcrumbs**: Always provide "Home" link to go back ## Migration Notes ### Before Landing Pages All links pointed to `/shop/`: ```jinja2 Home {# Logo #} Home {# Breadcrumb #} ``` ### After Landing Pages Separation of concerns: ```jinja2 Home {# Logo - still goes to shop #} Home {# Breadcrumb - goes to landing #} ``` This allows: - Landing page at `/` for marketing/branding - Shop catalog at `/shop/` for e-commerce - Clean navigation between the two ## Technical Implementation ### Route Handlers (main.py) ```python # Vendor root - serves landing page or redirects to shop @app.get("/") @app.get("/vendors/{vendor_code}/") async def root(request: Request): if has_landing_page(): return render_landing_page() else: return redirect_to_shop() # Shop routes @app.include_router(shop_pages.router, prefix="/shop") @app.include_router(shop_pages.router, prefix="/vendors/{vendor_code}/shop") ``` ### Context Calculation (shop_pages.py) ```python def get_shop_context(request: Request): base_url = "/" if access_method == "path": base_url = f"/vendors/{vendor.subdomain}/" return { "base_url": base_url, "vendor": vendor, "theme": theme, # ... } ``` ## Summary The navigation system creates a **two-tier structure**: 1. **Landing Page** (`/`) - Marketing, branding, vendor story 2. **Shop** (`/shop/`) - E-commerce, products, cart, checkout This gives vendors flexibility to: - Have a marketing homepage separate from their store - Choose different landing page designs (minimal, modern, full) - Or skip the landing page and go straight to the shop All while maintaining clean, consistent navigation throughout the experience.