Tagcloud in 4.4.1

Nach Umstellung auf Version 4.4.1 wurde bei einem Shop die Tagcloud nicht mehr mit unterschiedlichen Größen der Tags angezeigt.

Ist das ein generelles Problem?

Gemäß meinem Debugging müsste es eines sein, im Demo-Shop wird die Tagcloud allerdings richtig angezeigt.

Anyway, ich habe das Problem gelöst, und bin dabei darauf gestoßen, dass die “[B]inc/tag.tpl[/B]” ziemlich ineffizient ist, und auch der Grund für die Fehlfunktion war.

In “[B]inc/tag.tpl[/B]” wird die Cloud wie folgt aufgebaut:

<p class="tags" id="tags.cloud">
  [{assign var="oCloudManager" value=$oView->getTagCloudManager() }]
  [{foreach from=$oCloudManager->getCloudArray() item=iCount key=sTagTitle}]
    <a class="tagitem_[{$oCloudManager->getTagSize($sTagTitle)}]" href="[{$oCloudManager->getTagLink($sTagTitle)}]">[{$oCloudManager->getTagTitle($sTagTitle)}]</a>
  [{/foreach}]
</p>

was dazu führt, dass keine Größeninfo für den “a”-Tag generiert wird, und die Größe nur durch CSS-Klassen bestimmt wird ([B]daher funktioniert das im Demo-Shop![/B])…

(Ineffizient ist das zudem, da die Tagcloud vorher schon ([B]ohne [/B]CSS richtig und viel [B]variantenreicher [/B]über [B]style=“font-size:xx%”[/B] formatiert) erstellt wird. Über die CSS-Klassen werden nur 5 verschiedene Größen definiert.)

Wenn man das ersetzt mit

<p class="tags" id="tags.cloud">
  [{$oView->getTagCloud()}]
</p>

dann verwendet man die schon vorher erstellte Tagcloud direkt, und spart den erneuten “foreach”-Loop für deren Aufbau.

Bei der Gelegenheit habe ich auch gleich die Routine zur Aufbereitung der Tagcloud verbessert, weil die auch ziemlich ineffizient war…

So wurden für die Tagcloud der Startseite die Tags [B]aller Artikel [/B]ausgelesen und bearbeitet, auch wenn keine Tags im Artikel definiert waren.

Zu allem Überfluss wurde dann bei der Verarbeitung für jeden Tag auch noch abgefragt, ob es ein Datenbank-Abfrageergebnis gab und im Abfrageergebnis Datensätze vorhanden waren.

Das habe ich eliminiert, und auch gleich noch sicher gestellt, dass [B]keine doppelten Tags [/B]mehr auftreten.

Ein “Komma” als Tag-Trenner wird auch noch entfernt.

Das ist der überarbeitete Code für die Routine “[B]public function getTags[/B]” in “[B]core/oxtagcloud.php[/B]”.

    public function getTags( $sArtId = null, $blExtended = false, $iLang = null )
    {
        $oDb = oxDb::getDb(true);
        if ($blExtended) {
            $iAmount = OXTAGCLOUD_EXTENDEDCOUNT;
        } else {
            $iAmount = OXTAGCLOUD_STARTPAGECOUNT;
        }
        //Avenger
        if ( $sArtId ) 
        {
            $sArticleSelect = "AND oxarticles.oxid = ".$oDb->quote( $sArtId )." ";
            $iAmount = 0;
        }
        else
        {
            $sArticleSelect = '';
        }

        $sField = "oxartextends.oxtags".oxLang::getInstance()->getLanguageTag( $iLang );

        $sArtView = getViewName('oxarticles');
        $sQ = "select $sField as oxtags from $sArtView as oxarticles left join oxartextends on oxarticles.oxid=oxartextends.oxid where oxarticles.oxactive=1 AND $sField<>'' $sArticleSelect";
        //$sQ = "select $sField from oxartextends where $sArticleSelect";
        $rs = $oDb->execute( $sQ );
        if ( $rs && $rs->recordCount()) 
        {
          $aTags = array();
          while ( !$rs->EOF ) 
          {
              $sTags = $this->trimTags( $rs->fields['oxtags'] );
              $aArticleTags = explode( $this->_sSeparator, $sTags );
              foreach ( $aArticleTags as $sTag ) 
              {
                  $sTag=str_replace(',','',$sTag);
                  if ( $sTag  ) 
                  {
                    if (!in_array($sTag,$aTags))
                    {
                      ++$aTags[$sTag];
                    }
                  }
              }
              $rs->moveNext();
          }
          //Avenger

          //taking only top tags
          if ( $iAmount ) 
          {
              arsort( $aTags );
              $aTags = array_slice( $aTags, 0, $iAmount, true );
          }
          $aTags = $this->_sortTags( $aTags );
        }  
        else
        {
          $aTags='';
        }
        return $aTags;
        //Avenger
    }

Um den Neuaufbau der Tagcloud zu erzwingen, das “tmp”-Verzeichnis löschen…

Sieht ja gut aus. Kannst du das noch in den Bugtracker eintragen, damit die Core-Programmierer sich das angucken müssen ?

(Zumindest mein Problem ist,dass ich gerne nahe am Standard bleiben würde, deswegen wäre es super wenn es dorthin kommt.)

Alternativ müßte man es als Feature Request eintragen. z.B. “Implement Avengers improvements” und hierauf verlinken :wink:

Hi,

danke @Avenger für die Anregung, danke @Firefax für’s Engagement :slight_smile:

Gruß