Tagcloud mit Piwik und Zend Framework


#1

Ich habe mir eine kleine Funktion gebastelt um mit Hilfe von Piwik und Zend Framework eine Tagcloud auszugeben.

Falls Interesse besteht, einfach hier im Thread melden, dann mache ich mir die Mühe und kommentiere den Code und poste ihn hier.

Beispiel unter Beispiel hier


#2

Hiho,

das hört sich wirklich interessant an und sieht auch super aus :D!
Ich würde mir gern den dazugehörigen Code etwas genauer ansehen um die Technik vlt. in zukünftigen Projekten benutzen zu können, da ich grundsätzlich nur mit zf/doctrine arbeite.

Würde mich sehr über den Code-Post freuen :)! Und mach dir nicht zu große Mühe mit den comments :smiley:


#3

Ich setze mal vorraus das Du mit der ZF Struktur vertraut bist.
Anzahl von Tags kann man natürlich variieren, in der DB Abfrage, aber auch im Setup der Tags inkl. CSS.
Beim URL-Setup nutze ich in diesem Beispiel Zend_Route - wie der Link dann halt aussieht bestimmst Du Applikations-übergreifend in der RouteConfig.

Im Controller:


    public function tagcloudAction()
    {
        $data = Doctrine::getTable('WHATEVER_MODEL')->getSearchPhrases();
        //randomize or not? 
        shuffle($data);

        $url = Zend_Controller_Action_HelperBroker::getStaticHelper('Url');

        $tags['tags'] = $data;
        $cloud = new Zend_Tag_Cloud($tags);

        $cloudDecorator = new Zend_Tag_Cloud_Decorator_HtmlCloud();
        $cloudDecorator->setHtmlTags(array('ul' => array('class' => 'tagcloud')));
        $cloudDecorator->setSeparator(' - ');
        $cloud->setCloudDecorator($cloudDecorator);

        $tagDecorator = new Zend_Tag_Cloud_Decorator_HtmlTag();
        $tagDecorator->setClassList(array('tag1','tag2','tag3','tag4','tag5','tag6','tag7','tag8','tag9','tag10'));
        $cloud->setTagDecorator($tagDecorator);

        $this->view->tagcloud = $cloud;
    }

Funktion im Model


    public function getSearchPhrases($amount = 60)
    {
        $pdo = Doctrine_Manager::connection()->getDbh();
        $sql = 'SELECT COUNT(referer_keyword) AS counter, referer_keyword FROM piwik_log_visit  WHERE referer_keyword != " " GROUP by referer_keyword ORDER BY counter DESC LIMIT '.$amount.'';
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll();

        $i = 0;
        $url = Zend_Controller_Action_HelperBroker::getStaticHelper('Url');
        $data = array();
        foreach ($result as $key => $row) {
            $data[$i]['title'] = $row['referer_keyword'];
            $data[$i]['weight'] = $row['counter'];
            $data[$i]['params'] = array('url' => $url->url(array('q' => $row['referer_keyword']), 'search', true));
            ++$i;
        }
        return $data;
    }

Und im View dann


      echo $this->tagcloud;

Noch ein bissel CSS


  /* tagcloud */
	.tagcloud a.tag1 { font-size: 0.75em; font-weight: 100; }
	.tagcloud a.tag2 { font-size: 0.9em; font-weight: 200; }
	.tagcloud a.tag3 { font-size: 1.1em; font-weight: 300; }
	.tagcloud a.tag4 { font-size: 1.2em; font-weight: 400; }
	.tagcloud a.tag5 { font-size: 1.4em; font-weight: 500; }
	.tagcloud a.tag6 { font-size: 1.5em; font-weight: 600; }
	.tagcloud a.tag7 { font-size: 1.6em; font-weight: 700; }
	.tagcloud a.tag8 { font-size: 1.7em; font-weight: 800; }
	.tagcloud a.tag9 { font-size: 1.8em; font-weight: 900; }
	.tagcloud a.tag10 { font-size: 1.9em; font-weight: 900; }

	 ul.tagcloud { margin: 0 2px; padding:10px 0;line-height: 2em; text-align: justify; font-size:1.3em;}
	.tagcloud a { padding: 0px; }
        .tagcloud li { display: inline; background:none;margin:0;padding:0; }



(Peterbo) #4

Hallo dantan,

dann setze das doch auch in einem richtigen Plugin um, wenn Du möchtest. Dann würden sich bestimmt noch mehr Leute darüber freuen! :wink:

Grüße
Peter


#5

Hallo Peter,

was meinst Du mit richtigem Plugin?

Der Code sollte eigentlich interessierten Leuten helfen eine Tagcloud ala http://www.spielzeugtipp.de/tagcloud aufzusetzen.
Als kleines Helferlein wird hier Zend_Tag benutzt - eine Klasse aus dem Zend Framework.

Nochmal, was stellst Du Dir unter einem “richtigen Plugin” vor?
Runterladen, Config ändern, hochladen, fertig?
Das wird schwierig, zu unterschiedlich die Umgebungen werden sein (Zitat Joda :wink: )

Aber vielleicht hab ich ja ne Idee wenn ich genau verstehe was Du meinst.


(Peterbo) #6

Hi dantan,

denkbar wäre zum Beispiel, dass Dein Plugin beispielsweise über eine API verfügt, analog wie hier die Keywords in einem assoziativen Array mit deren Gewichtung zurückgibt (z.B. Skala 1-10). So könnte man serverübergreifend die Tagcloud abfragen (natürlich dann mit einem härteren Limit, damit nicht zu viele Daten verschoben werden, oder caching auf dem remote Server oder so), und müsste außerdem nicht außerhalb von Piwik die Piwikeigene Datenbank befragen. Zusätzlich müsste man in einem Projekt dann das Zend Framework nicht extra einsetzen (falls das noch nicht im Einsatz ist).

Das wäre doch mal ein interessantes Plugin… :wink:

Grüße
Peter


#7

Ich muss gestehen, ich habe die Piwik API erst gesehen nachdem ich mein “Plugin” geschrieben habe - prinzipiell ist es ja nur die Abfrage an die Datenbank die interessant ist - was man dann aus den Ergebnissen macht, bleibt ja jedem selbst überlassen.

Und was halt nach der Abfrage passiert - ok, das könnte man sicherlich auch in ein paar Zeilen Code auch so schreiben das man es einfach per Copy-Paste in seinen Web-Auftritt kopieren könnte.