Stock status output

Phoca Cart - complex e-commerce extension
mino182
Phoca Professional
Phoca Professional
Posts: 224
Joined: 12 Feb 2015, 13:30

Stock status output

Post 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.

Tags:
User avatar
Jan
Phoca Hero
Phoca Hero
Posts: 49049
Joined: 10 Nov 2007, 18:23
Location: Czech Republic
Contact:

Re: Stock status output

Post by Jan »

Ahoj, přidáno do FR: https://github.com/PhocaCz/PhocaCart/issues/268

V Joomle nelze provést override tříd.
If you find Phoca extensions useful, please support the project
Cony
Phoca Member
Phoca Member
Posts: 16
Joined: 24 Mar 2011, 15:51

Re: Stock status output

Post 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.
mino182
Phoca Professional
Phoca Professional
Posts: 224
Joined: 12 Feb 2015, 13:30

Re: Stock status output

Post 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.
Post Reply