Source

Uva Searchengines / protected / controllers / ArticleController.php

Full commit
<?php

class ArticleController extends Controller
{
    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/main';


    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    public function actionView($id) {
        $this->render('view', array(
            'model' => $this->loadModel($id),
        ));
    }

    /*Functie om de wordcloud te printen. */
    public function printWordCloud($article) {

        $articleWords = $article->articlesWords;
        if ($articleWords) {

            /*maximale en minimale font size (lettergrootte) in pixels.*/
            $max_size = 24;
            $min_size = 10;

            /*hoe veel moet de tf*idf frequency zijn, om het woord op te nemen in de woordenwolk.*/
            $max_qty = 0;
            $min_qty = PHP_INT_MAX;

            foreach ($articleWords as $articleWord) {
                if ($articleWord->word_id != 0) {
                    if($articleWord->score < $min_qty){
                        $min_qty = $articleWord->score;
                    }
                    if($articleWord->score > $max_qty){
                        $max_qty = $articleWord->score;
                    }
                }
            }


            $spread = $max_qty - $min_qty;
            if ($spread == 0) {
                $spread = 50;
            }

            //$step is de waarde waarmee de font size wordt geincrementeerd.
            $step = ($max_size - $min_size) / ($spread);

            /*Het ingevulde maximaal woorden is het aantal woorden dat in de woordenwolk komt, dus dat aantal wordt uit de array gehaald (gesliced).
Omdat de array gesorteerd is, kan van 0 tot en met de waarde van $max_words gesliced worden.*/
            $max_words = 20;
//            $tags = array_slice($tags, 0, ($max_words));

            // loop door de tag array
            foreach ($articleWords as $articleWord)
            {
                /* berekening van de font-grootte:value is hoevaak het voorkomt, min_qty is hoevaak het woord minstens moet voorkomen. Dit wordt vermenigvuldigd met de step, en de minimale fontgrootte wordt hierbij opgeteld (en het getal wordt afgerond om een heel getal voor de fontgrootte te krijgen.*/
                $size = round($min_size + (($articleWord->score - $min_qty) * $step));

                /*Lijst met mogelijke fontkleuren voor de woorden in de wordcloud.*/
                $lijst = array('red', 'brown', 'black', 'grey', 'green', 'blue', 'pink', 'orange', 'purple', 'DarkOliveGreen', 'DarkRed', 'Gold');
                $total = count($lijst);
                $random = (mt_rand() % $total);
                $kleur = "$lijst[$random]"; //er wordt random een kleur uit de array gekozen voor elk woord.
                /*Het gekozen font in het formulier wordt toegewezen aan de woorden in de wordcloud.*/
                $font = 'Impact';

                /*Er wordt gedefinieerd hoe het woord zometeen moet worden geprint, en dit wordt opgeslagen in de array cloud.*/
                $cloud[] = CHtml::link($articleWord->word->text,
	                array('word/view', 'id' => $articleWord->word_id),
	                array(
		                'style' => 'font-size: ' . $size . 'px; font-weight: bold; color: ' . $kleur,
		                'title' => 'Tf*idf-score: ' . $articleWord->score,
		                )
                ) . ' ' ;
            }
            //end foreach

            /*De array cloud wordt geshuffled, zodat niet het grootste woord aan het begin staat, het daarna grootste woord als 2e, enz. maar door elkaar.*/
            shuffle($cloud);
            for ($i = 0;$i < count($cloud);$i++)
            {
                echo $cloud[$i];
            }
        }
    }

    /**
     * Lists all models.
     */
    public
    function actionIndex() {
        $dataProvider = new CActiveDataProvider('Article');
        $this->render('index', array(
            'dataProvider' => $dataProvider,
        ));
    }


    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param integer the ID of the model to be loaded
     */
    public
    function loadModel($id) {
        $model = Article::model()->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

}