Magento 2: Używanie flag
Tematem dzisiejszej notki jest używanie flag w Magento. Do zapisu konfiguracji w Magento mamy tabelę core_config_data. Jeśli zaś chcemy zachować stan naszej aplikacji dalej, możemy skorzystać z owej tabeli bądź też stworzyć własną. Na szczęście do przechowywania właśnie zapisanego stanu Magento oferuję dedykowaną tabelę flag i odpowiednią klasę modelu do jej obsługi.
Ważne: nie zapisuj danych stanowych w tabeli core_config_data, ponieważ model obsługujący nie czyści cache po zapisie danych do tej tabeli, przez co mogą być dziwne problemy, jeden opisany jest tutaj.
Tworzenie modelu do obsługi flagi
Dla przykładu został stworzony moduł Anna_Flag.
Potrzebujemy stworzyć klasę, która będzie dziedziczyć po klasie Magento\Framework\Flag. W podkatalogu modułu Model\Flag dodajmy klasę o nazwie LastProductFlag.
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace Anna\Flag\Model\Flag; use Magento\Framework\Flag as MagentoFlag; class LastProductFlag extends MagentoFlag { private const MY_MODULE_LAST_PRODUCT_ID = 'anna_flag_last_product_id'; protected $_flagCode = self::MY_MODULE_LAST_PRODUCT_ID; } |
Potrzebujemy nadpisać pole klasowe $_flagCode naszym kodem dla flagi.
Pobieranie wartości naszej flagi
Do odczytania wartości naszej flagi używamy metody loadSelf() modelu. Następnie dobrze jest, aby sprawdzić, czy istnieje wartość poprzez sprawdzenie kolumny flag_data:
1 2 3 4 5 6 |
/** * @throws \Magento\Framework\Exception\LocalizedException */ private function settLastImportedProductId(\Anna\Flag\Model\Flag\LastProductFlag $lastProductFlag): void { $flag = $lastProductFlag->loadSelf(); $this->lastProductId = ($flag->hasData('flag_data')) ?? 0; } |
Zapis nowej wartości dla flagi
Nadanie nowej wartości odbywa się poprzez wywołanie metody setFlagData():
1 2 3 4 5 6 7 8 9 |
/** * @throws \Magento\Framework\Exception\LocalizedException */ public function saveLastImportedProductId(int $newLastProductId): void { $this->lastProductFlagModel->loadSelf(); $this->setFlagData($newLastProductId); $this->lastProductFlagModel->save(); } |