Page 1 of 1

Stock status output

Posted: 21 Oct 2025, 17:37
by mino182
Ahoj, prosím náhodou neplánuješ spraviť stock status output nejakým spôsobom štýlovateľný? Napr. potreboval som upraviť, aby sa počet položiek skladom zobrazoval len od určitého počtu a tiež som za číslo chcel pridať "m", lebo predávam na metre tak som si upravil triedu PhocacartStock::getStockStatusOutput, lenže to nie je veľmi trvácne riešenie kvôli updatom... Napadlo ma, či by nešlo generovanie toho outputu spraviť ako layout, aby sa dal upravovať v šablóne?

Vzhľadom na to, že tá trieda rieši celý stock a chcelo by to širšiu úpravu, asi bude odpoveď nie :D , mohol by si mi prosím poradiť, ako udržať takýto typ úpravy aj po update komponentu? Je v Joomle nejako možné urobiť override triedy v libraries? Díky.

Re: Stock status output

Posted: 22 Oct 2025, 16:13
by Jan
Ahoj, přidáno do FR: https://github.com/PhocaCz/PhocaCart/issues/268

V Joomle nelze provést override tříd.

Re: Stock status output

Posted: 22 Oct 2025, 16:48
by Cony
Override tříd lze provést takovým drobným "hackem". Pointa je zaregistrovat třídu, dřív než se zaregistruje komponentou, tzn. vytvořit systémový plugin který hned v OnAfterRoute zaregistruje třídu s příslušným jménem. Pak se všude v kódu při volání té třídy použije tvoje upravená třída.

Pokud ji nechceš přepisovat celou, přichází na řadu "hack" - původní soubor třídy načíst do paměti, pozměnit jméno třídy a odvodit novou třídu od té změněné.

V pluginu to pak může vypadat nějak takto (kód je pro J3, ale princip je stejný)

Code: Select all

  protected function overrideClass($class, $file)
  {
    if (JFile::exists(JPATH_ROOT . $file)) {
      $content = JFile::read(JPATH_ROOT . $file);
      $content = str_replace('<?php', '', $content);
      $content = preg_replace('~class\s+' . $class . '~i', 'class override' . $class, $content, 1);
      eval($content);
      require_once (__DIR__ . '/overrides/' . $class . '.php');
    }
  }

  public function onAfterRoute()
  {
    $input = $this->app->input;

    if ($input->get('option') === 'com_wrapper') {
      $this->overrideClass('WrapperController', '/components/com_wrapper/controller.php');
    }
  }
a pozměněná třída takto

Code: Select all

class WrapperController extends overrideWrapperController
{
	public function display($cachable = false, $urlparams = array())
	{
	  ...
	}
}
Jinak samozřejmě ano, veškeré výstupy by měly být v layout.

Re: Stock status output

Posted: 22 Oct 2025, 17:13
by mino182
A prosím ťa, musí sa tá trieda registrovať so všetkými funkciami naraz? Myslím, že či by šlo, že v plugine vytvorím tú triedu (s rovnakým názvom) len s jednou funkciou, ktorú potrebujem zmeniť a ostatné by sa potom zaregistrovali z komponenty? Či keď už raz trieda existuje, tak je koniec a ostane celá taká ako bola zaregistrovaná prvýkrát?

Lebo to by vyriešilo problém s updatami - ak sa nejaká funkcia časom pridá, nebudem to musieť furt kontrolovať...

Díky.