SEO-sõbralikud täiendused Joomla! pageNavigation-klassile

04.04.2007  |  Gunnar

DT pildigaleriid üles pannes tahtsin lahendada ka "ilusate", ehk otsimootorisõbralike URL-ide küsimuse. Kõik laabus kenasti, koodi sai kirjutatud päris üksjagu. Probleemseks kohaks osutus aga Joomla! pageNavigation-klass, mis genereerib edasi ja tagasi liikumise lingid ridade arvu ja järjekorranumbrite põhjal. See toob endaga kaasa mõned ebameeldivad probleemid. Näiteks OpenSEF'is käsitsi paika pandud "ilusad" URL-id on navigatsiooniribas kasutuskõlbmatud, sest navigatsiooniriba URL sisaldab suvalise elemendi ID-d ja siis kahte arvu, mille põhjal andmebaasipäringust õige koht üles leitakse. Elementide järjekorra muutmine lööb sel juhul kõik segi.

Et "ilusad" URL-id siiski kasutuskõlblikuks jääksid ja navigatsiooniribale ilmuksid, tuli kirjutada pageNavigation-klassile juurde uus meetod. Idee on lihtne. Selle asemel, et navigatsiooniriba genereerida ridade arvu ja käesoleva rea järjekorranumbri põhjal, võtsin ma aluseks päringu ridade arvu, päringu keyset'i ning käesoleva rea unikaalse key väärtuse.

See tähendab seda, et navigatsiooniriba URL-id ei sisalda enam positsioone päringus, vaid konkreetsete elementide unikaalseid identifikaatoreid. Pildigalerii näite põhjal tähendab see siis seda, et pildi thumbnail'il ja suures vaates näidatavas navigatsiooniribas on kasutusel täpselt sama URL, mille SEF-laiendus üles korjab ja "ilusa" URL-iga asendab.

Kood ise järgmine ning see asub failis pageNavigation.php.

function writePagesLinksById( $link, $rows, $id_field, $id ) {
    $txt = '';

    // limit start
    for($i=0; $i <count ($rows); $i++)
        if($rows[$i]->$id_field == $id)
        {
             $this->limitstart = $i;
             break;
        }

    $displayed_pages = 10;
    $total_pages = ceil( $this->total / $this->limit );
    $this_page = ceil( ($this->limitstart+1) / $this->limit );
    $start_loop = (floor(($this_page-1)/$displayed_pages));
    $start_loop *= $displayed_pages+1;
    if ($start_loop + $displayed_pages - 1 <$total_pages) {
        $stop_loop = $start_loop + $displayed_pages - 1;
    } else {
        $stop_loop = $total_pages;
    }

      if (!defined( '_PN_LT' ) || !defined( '_PN_RT' ) ) {
          DEFINE('_PN_LT','&lt;');
          DEFINE('_PN_RT','&gt;');
      }

      if (_PN_LT || _PN_RT) $pnSpace = " ";

    if ($this_page> 1) {
        $page = ($this_page - 2) * $this->limit;

        // first link
        $txt .= '<a href="';
        $tmp = str_replace("%id",$rows[0]->$id_field,$link)
        $txt .= sefRelToAbs($tmp);
        $txt .= '" class="pagenav" title="first page">';
        $txt .= _PN_LT . _PN_LT . $pnSpace . _PN_START .'</a> ';

        // previous link
        $txt .= '<a href="';
        $tmp = $rows[$this_page*$this->limit-2]->$id_field;
        $tmp = str_replace("%id",$tmp,$link);
        $txt .= sefRelToAbs($tmp);
        $txt .= '" class="pagenav" title="previous page">';
        $txt .= _PN_LT . $pnSpace . _PN_PREVIOUS .'</a> ';
    } else {
        // first link
        $txt .= '<span class="pagenav">';
        $txt .= _PN_LT . _PN_LT . $pnSpace;
        $txt .= _PN_START .'</span> ';

        // previous link
        $txt .= '<span class="pagenav">';
        $txt .= _PN_LT . $pnSpace . _PN_PREVIOUS . '</span> ';
    }

    for ($i=$start_loop; $i <= $stop_loop; $i++) {
        $page = ($i - 1) * $this->limit;
        if ($rows[$i-1]->$id_field == $id) {
            $txt .= '<span class="pagenav">'. $i .'</span> ';
        } else {
            $txt .= '<a href="';
            $tmp = str_replace("%id",$rows[$page]->$id_field,$link);
            $txt .=  sefRelToAbs( $tmp );
            $txt .=  '" class="pagenav"><strong>';
            $txt .=  $i .'</strong></a> ';
        }
    }

    if ($this_page <$total_pages) {
        $page = $this_page * $this->limit;
        $end_page = ($total_pages-1) * $this->limit;

        // next link
        $txt .= '<a href="';
        $tmp = str_replace("%id",$rows[$page]->$id_field,$link);
        $txt .= sefRelToAbs($tmp);
        $txt .= '" class="pagenav" title="next page">';
        $txt .= _PN_NEXT . $pnSpace . _PN_RT . '</a> ';

        // last link
        $txt .= '<a href="';
        $tmp = str_replace("%id",$rows[$end_page]->$id_field,$link);
        $txt .= sefRelToAbs($tmp);
        $txt .= '" class="pagenav" title="end page">';
        $txt .= _PN_END . $pnSpace . _PN_RT . _PN_RT . '</a>';
    } else {
        // next link
        $txt .= '<span class="pagenav">';
        $txt .= _PN_NEXT . $pnSpace . _PN_RT . '</span> ';

        // last link
        $txt .= '<span class="pagenav">';
        $txt .= _PN_END . $pnSpace . _PN_RT . _PN_RT . '</span>';
    }
    return $txt;
}

Sellele meetodile tuleb $link anda ette template'ina, kus %id tähistab kohta, kuhu kirjutatakse käesoleva elemendi identifikaator. $rows on rea objetide massiiv, sest juhul, kui read on eelnevalt olemas ning neid ei tule eraldi küsida, saame me identifikaatorid lugeda sealt. $id_field on identifikaatori välja nimi. Ja kõige lõpuks, $id on käesolevalt valitud elemendi identifikaator.

Lähtekoodi, mis navigatsiooni klassi kasutab, ei tule palju muuta. Galerii korral olid muutused küllaltki lihtsad ja võtsid aega kõigest paar minutit.

3 kommentaari sissekandele “SEO-sõbralikud täiendused Joomla! pageNavigation-klassile”

  1. Gunnar

    Tegelikult tegin sinna ühe täienduse veel - nimelt thumbnailide lehtede vahel liikumiseks on ka pager kasutusel. Selle jaoks oli lahendus lühidalt selline. Galeriide linkide lõpust läksid limit ja limitstart ära. Asemele tuli parameeter pg, mis ütleb ette, et mitmendal lehel me antud galeriis oleme. See parameeter, vaikeväärtusega 1, tuli siis lisada kõikidele galerii linkidele, et galeriide lingid korras püsiks.

    Tegemise käigus avastasin veel nii mõndagi huvitavat, mis kõpitsemist tahab. Kui nüüd RSGallery2 meeskond mu enda liivakasti mängima võtab, siis aitan neil enda lahendatud probleemid uutes release-ides ka ära parandada.

  2. Lembit

    Ühe pisikese, ent kindlasti kasutatavust parandava kohenduse tegime Joomla pageNavigation-klassis veel — kui kuvatakse esimest lehekülge paged navigation‘is, ei kuvata linke “Esimene” ja “Eelmine” ning viimase lehekülje puhul vastavalt linke “Järgmine” ja “Viimane”.

  3. Gunnar

    See on kaheksa koodirea välja kommenteerimise küsimus, muideks. :)

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress