OpenCart - URL článkov umiestnené do cesty

09.08.2015 | 11:57 | originalnynazovblogu | LUcoRP

Ak máte nasadený na svojom eshope redakčný systém OpenCart 2 a v rámci zlepšovania obsahu stránky potrebujete implementovať aj pridávanie článkov, je to možné aj v tomto e-commerce systéme relatívne jednoducho a rýchlo.

Aj keď primárne určenie OpenCartu je zabezpečiť katalóg, košík a ďalšie základné funkcionality pre elektronický obchod, ak sa niektorý obchodník vydal cestou tvorenia kvalitného obsahu na svojom eshope, môže na vytvorenie článkov/blogu použiť funkcionalitu informačných stránok.

Pôvodné určenie informačných stránok je, ako už ich názov napovedá, na vytváranie stránok s informáciami o obchode, ako sú všeobecné obchodné podmienky, postup pri vybavovaní reklamácií a podobne. Na projekte, ktorý riešim som tento typ obsahu využil aj na pridávanie článkov.

Implementácia vôbec nie je zložitá, stačí pridať nové články a na tie potom linkovať v príslušných Viewoch aktuálneho templatu. Tomu ako ich linkovať sa však teraz nebudem venovať.

Problém nastal pri vytváraní URL pre daný článok, ktoré mali byť optimalizované pre vyhľadávače. Samozrejme, ako pri všetkých hlavných stránkach v OpenCarte, je možné v adminovi pre danú stránku zadať manuálne URL, má to však jeden háčik. Tieto URL aliasy sú v systéme brané iba ako konečná adresa a nie ako cesta, preto ak zadáte URL v tvare nazov-clanku, bude článok linkovaný na domena.sk/nazov-clanku, ak však zadáte blog/názov-clanku, dôjde k výnimke v skripte a vy budete končiť na stránke 404.

Riešenie tohto problému je banálne, jediný problém je pochopiť logiku, akou OpenCart vytvára a spracováva URL. Stačí si zvoliť v akej ceste chceme, aby sa články nachádzali (v tomto príklade to bude domena.sk/blog/nazov-clanku) a následne upraviť súbor /catalog/controller/common/seo_url.php. V tomto súbore obsahujucom triedu starajúcu sa o spracovávanie URL adries potrebujeme upraviť dve metódy.

V prvom rade upravíme metódu index(), kde hneď za overenie prázdnych prvkov v poli $parts potrebujeme vymeniť poradie prvkov, ak je nultým prvkom nami požadovaný string. Pokiaľ chceme zavádzať naše článkové URL do hlbšej cesty (napr. /blog/clanky/nazov-clanku) je nutné odfiltrovať z pola všetky úrovne nachádzajúce sa pred koncovou časťou URL. Pokiaľ nespravíme toto odfiltrovanie, následovný foreach cyklus skončí hneď pri prvom zbehnutí na presmerovaní na 404 a sparví break;. Kód ktorý som použil:

if ($parts[0] == 'blog') { 
	unset($parts[0]); 
}

Druhou časťou, ktorú budeme upravovať je metóda rewrite(), ktorá sa stará o generovanie odkazovaných URL adries v rámci CMS. Tu je nutné pred riadok starajúci sa o generovanie lomítka medzi URL domény a SEO URL stránky ( $url .= '/' . $query->row['keyword']; ) pridať riadok, ktorý v prípade informačných stránok pridá do adresy /blog. Kód ktorý som použil:

if ($key == 'information_id') { 
	$url .= '/blog'; 
}

Po týchto úpravách stačí už iba zadať pri článkoch SEO url, ktoré chceme používať a článok sa bude nachádzať v ceste vasadomena.sk/blog/nazov-clanku

Footnote: Tento zápisok slúži hlavne ako moja pripomienka, ak budem musieť niekedy riešiť podobný problém a nebude sa mi chcieť hrabať kvôli nemu v GITe. Ak pomôže niekomu ďalšiemu, budem iba rád. Tento zásah bol testovaný na OpenCart 2.0.3.1. Nemám žiadnu zodpovednosť za prípadné znefunkčnenie systému týmto zásahom - ak nový kód najprv netestuješ mimo live-u, je to tvoj problém ;)

    • RE: OpenCart - URL článkov umiestnené do cesty 10.08.2015 | 08:25
      Avatar bedňa antiX, Devuan, LegacyIce  Administrátor

      To čo upravuješ sú oficiálne konfiguračné súbory? Ak nie, aktualizácia to prevalí.

      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • RE: OpenCart - URL článkov umiestnené do cesty 10.08.2015 | 09:09
        Avatar LUcoRP Debian, *buntu, Android  Používateľ

        Samozrejme s aktualizaciou treba pri uprave systemovych suborov vzdy narabat opatrne. Tato konkretna instalacia OpenCartu je uz natolko scustomizovana, ze budem musiet aktualizovat diff kontrolou zmien v novej verzii a ich manualnym zapracovanim do zmenenych suborov. Je to cena za prisposobenie systemu, ktora je vsak aj tak minimalna s prihliadnutim na to co vsetky zmeny systemovych suborov prinesu.

        • RE: OpenCart - URL článkov umiestnené do cesty 10.08.2015 | 10:32
          Avatar bedňa antiX, Devuan, LegacyIce  Administrátor

          Diffami som spravoval jeden web, ale dá to prácu navyše.

          Asi by to chcelo pozrieť do nápovedy ako prevaliť premenné, metódy a tak oficiálne. Našiel som aj plugin, za $13 sa s tým hádam neoplatí ani patlať.

          Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
          • RE: OpenCart - URL článkov umiestnené do cesty 10.08.2015 | 11:12
            Avatar LUcoRP Debian, *buntu, Android  Používateľ

            samozrejme ide to nadradit cez /system/modification, len 1, velmi tomu neverim a 2, myslim ze pri aktualizacii by mi to aj tak zblblo. Ten plugin co linkujes riesi iba umiestnenie custom kodu v specifickych viewoch a navyse je urceny pre OC 1.5, ktoreho kod aj logika niektorych veci, napriklad aj generovania SEO URL sa od OC 2 lisi. Ku pluginom som vo vseobecnosti dost skepticky, ked niekedy pozeram ich kod tak ma chyta hroza, a aj tak v konecnom dosledku v 99% pripadoch po nainstalovani pluginu mu nejaka zasadna funkcionalita chyba a treba ju dorobit, s cim je viac roboty, nez zacat na zelenej luke.

            • RE: OpenCart - URL článkov umiestnené do cesty 13.08.2015 | 23:29
              Avatar Milan Dvorský debian,mint kde,android  Administrátor

              presta ma na tento pripad subadresar overrides, kde si vies prepisat tu danu funkciu. v pripade potreby vies v administracii vypnut overrides.

              • RE: OpenCart - URL článkov umiestnené do cesty 13.08.2015 | 23:31
                Avatar Milan Dvorský debian,mint kde,android  Administrátor

                a viem, ze toto nie je Linuxovy blog, ale je to o opensource systeme, tak preto som to dal medzi clanky ma uvodnej ;)