SEO-Saurus - Vývoj webu v reálném čase
seo-saurus

Tvorba HD Shopu: Nastavení produktů a zobrazení detailů

Příprava modelu produktu a repository

V předchozím kroku jsme nastavili základní strukturu rozšíření a integrovali tabulku produktů. Nyní se blíže podíváme na manipulaci s produkty ve frontendu.

Abychom mohli načíst všechny dostupné produkty, musíme připravit dvě základní součásti:

  • Product Model: Reprezentuje data produktu jako objekt.
  • Product Repository: Spravuje databázové operace pro produkty.

Definice Product Modelu

Model produktu slouží jako předloha pro objekty produktu. Získává data z databáze a vytváří strukturované objekty. Tento model je definován v:

Classes/Domain/Model/Product.php

<?php
namespace Hyperdigital\HdShop\Domain\Model;
class Product extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
/**
* @var string
*/
protected $title = '';

/**
* @return string
*/
public function getTitle()
{
return $this->title;
}

/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
}

Vytváříme Product Repository

Úložiště je zodpovědné za načítání produktů z databáze. Na začátku definujeme základní úložiště v:

Classes/Domain/Repository/ProductRepository.php

<?php
namespace Hyperdigital\HdShop\Domain\Repository;

class ProductRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{

}

Rozšiřujeme Product Controller

Nyní rozšíříme náš ProductController tak, aby načítal a zobrazoval produkty ve frontendu.

Napojíme Repository

Pro přístup k úložišti ProductRepository přidáme konstruktor s funkcí dependency injection:

public function __construct(
    protected readonly \Hyperdigital\HdShop\Domain\Repository\ProductRepository $productRepository
){}

To umožní proměnné $this->productRepository přístup k repositáři.

Implementujeme akci List

Získáváme všechny produkty a předáváme je do zobrazení - rozuměj do templatu:

$products = $this->productRepository->findAll();
$this->view->assign('products', $products);

Ladíme výstup

Pro ověření dat přidáme debuggovací příkaz:

Resources/Private/Templates/Product/List.html

<f:debug>{_all}</f:debug>

Ujistěte se, že v nastavení plugin jste nastavili správnou složku pro Storage Page. Jedná se o složku, kde máte uloženy v backendu produkty.

Řešená problému s Debuggerem

Pokud narazíte na error jako cannot access protected property $_localizeduid, zkontrolujte své globální nastavení:

config/system/settings.php

Ujistěte se, že konfigurace ['SYS']['fluid']['namespace']['f'] upřednostňuje TYPO3\CMS\Fluid\ViewHelpers před TYPO3Fluid\Fluid\ViewHelpers. Pokud je potřeba, upravte jejich pořadí.

Vytvoření šablony seznamu produktů

Nyní upřesníme šablonu výpisu produktů.

Hlavní šablona seznamu produktů

Resources/Private/Templates/Product/List.html

<html data-namespace-typo3-fluid="true">
    <f:render section="Main" partial="List/List1" arguments="{products: products}" />
</html>

Tím se vyvolá Partial umístěný na adrese:

Resources/Private/Partials/List/List1.html

Partial pro seznamu produktů

<html data-namespace-typo3-fluid="true" xmlns:f="http://www.w3.org/1999/html">
    <f:section name="Main">
        <f:if condition="{products}">
            <div>
                <f:for each="{products}" as="product">
                    <f:render section="product" arguments="{product: product}" />
                </f:for>
            </div>
        </f:if>
    </f:section>

<f:section name="product"> <div> {product.title} </div> </f:section> </html>

Tato šablona:

  • Zkontroluje, zda existují produkty.
  • Prochází seznam.
  • Každý produkt vykreslí v samostatné sekci “product”.

V tomto okamžiku by se měl na úvodní straně zobrazit seznam názvů produktů.

Implementace zobrazení detailu produktu

Dále vytvoříme zobrazení detailů, které zobrazuje informace o jednotlivých produktech.

Definujeme akci Detail

Z existujícího souboru ext_localconf.php máme nadefinováno, že se akce bude jmenovat detail a ta mapuje v controlleru:

public function detailAction(\Hyperdigital\HdShop\Domain\Model\Product $product)
{
   $this->view->assign('product', $product);
   return $this->htmlResponse();
}

Tato akce přiřadí vybraný produkt z parametru k zobrazení.

Abychom si ověřili data, přidáme debugger do zobrazení detailu:

Resources/Private/Templates/Product/Detail.html

<f:debug>{_all}</f:debug>

Nalinkování produktů do jejich detailů

Upravíme partial pro zobrazení produktu. V sekci product přidáme link.action viewhelper, což je základní linkovací funkce pro napojení akcí:

<f:section name="product">
    <div>
        <f:link.action action="detail" arguments="{product: product}">{product.title}</f:link.action>
    </div>
</f:section>

Tím se vygenerují klikací názvy produktů, které odkazují na příslušné stránky s podrobnostmi.

Testování detailu

Po kliknutí na název produktu by se mělo zobrazit podrobné zobrazení s výstupem debuggeru.

Další kroky

V dalším kroku rozšíříme zobrazení detailů o obrázky produktů, ceny a další atributy.

Komentáře

Komentáře

Sledujte mě