Stat Relation, Menu Count Label Bootstrap

Hallo Zusammen

Mit folgendem Code zeige ich im Menu dem Benutzer die Anzahl von offene Aktionen an. Der Code funktioniert aber die Prüfung ob der wert 0 ist finde ich etwas laienhaft. IIF geht da nicht oder? Kann mir jemand zu Lernzwecken eine professionelle Umsetzung zeigen?

Gruss Beat

Im Model die STAT definiert




public function relations() {

		return array(

			'benutzer' => array(self::BELONGS_TO, 'User', 'Benutzer'),

			'tblStatuses' => array(self::HAS_MANY, 'TblStatus', 'idfs_Projekt'),

			'benutzerCount' => array(self::STAT, 'User', 'Benutzer'),

			'OffeneBewerbungen' => array(self::STAT, 'TblStatus', 'idfs_Projekt','condition'=>'Status = "Anfrage offen"'),

		);

	}



Im Menu dann der Zugriff


<?php


$Bewerbungen = TblProjekt::model()->with('OffeneBewerbungen')->findByAttributes(Array('Benutzer'=> Yii::app()->User->id)); 


if (!isset($Bewerbungen)) {

	$Bewerbungen = 0;

	} else {

	$Bewerbungen = 	$Bewerbungen->OffeneBewerbungen;

 }

 

$Bewerbungen = "Anfragen <span class='badge badge-success'> ". $Bewerbungen . "</span>";


 $this->widget('bootstrap.widgets.TbMenu', array(

 'encodeLabel'=>false,

    'type'=>'pills',

    'items'=>array(

      

        array('label'=>'Home', 'icon'=>'home', 'url'=>'?r=User/mobile'),

        array('label'=>'Meine Projekte' , 'icon' =>'icon-align-justify', 'url'=>array('/User/mobile&id=' .yii::app()->user->id, 'view'=>'mobile')),

        array('label'=>$Bewerbungen, 'icon'=>'user', 'url'=>'?r=TblStatus/Admin'),	

    	array('label'=>'Profile', 'icon'=>'cog', 'url'=>'?r=user/update&id='.yii::app()->user->id),

        array('label'=>'Hilfe', 'icon'=>'flag', 'url'=>'#'),

    ),

)); ?>

Ich glaube, dass ich dich nicht bis zum Ende verstanden habe, aber du kannst ein statische Methode für deinen Model implementieren.

in TblProject.php hinzufügen:




public static function getOffeneBerwebungen()

{

  $model = self::model()->with('OffeneBewerbungen')->findByAttributes(Array('Benutzer'=> Yii::app()->User->id));

  return $model ? $model->OffeneBewerbungen : 0;

}



und dann in dein View:


$Bewerbungen = "Anfragen <span class='badge badge-success'> ". TblProjekt::getOffeneBerwebungen(). "</span>";

du kannst auch html Code für <span> in der getOffeneBerwebungen() Funktion einbauen. Es ist aber ein bisschen gegen MVC Prinzipien, aber falls du brauchst dieses html Code irgendwo in andere Platz, dann wird es gut, wenn Model für alle Falle gleiche Code zurücksendet, weil es noch DRY Prinzipien gibt))

Falls dieses Vorschlag wird dich nicht helfen, umschreibe bitte dein Frage, weil ich nicht völlig verstehe, was du willst.

Hallo SleepWalker

Du hast mich schon richtig verstanden. [size="2"]Ich möchte die Eintrage einer relationalen Tabelle zählen.[/size]

[size="2"]

Wenn ich Deinen Vorschlag mit der [/size]public static function einfügen erhalte ich einen Error:


Fatal error: Cannot instantiate abstract class BaseTblProjekt in /srv/www/vhosts/makebusiness.ch/httpdocs/protected/framework/db/ar/CActiveRecord.php on line 387[size=2]

[/size]

Ich möchte eigentlich diesen SQL mit dem Framework erstellen.

$sql = 'SELECT Count(tblStatus.Status) AS AnzahlvonStatus

	FROM tblProjekt INNER JOIN tblStatus ON tblProjekt.primary = tblStatus.idfs_Projekt


	WHERE (((tblProjekt.Benutzer)=261) AND ((tblStatus.Status)=&quot;Anfrage offen&quot;))' 

$Bewerbungen = TblProjekt::model()->CountBySql($sql);

[quote=beat78]Wenn ich Deinen Vorschlag mit der public static function einfügen erhalte ich einen Error:
[/quote]

Es sieht so aus, ob du die Funktion getOffeneBerwebungen() nicht in TblProjekt, sondern in abstract class BaseTblProjekt hinzugefügt hast. Du kannst probieren TblProjekt::model() statt self::modell() in getOffeneBerwebungen() schreiben. Aber wenn meine Vermutung stimmt, dann sollst du Function in richtige Class einbauen.

Falls es etwas mit Relation selbst, wenn die falsch funktioniert, würde ich in log das SQL Anfrage anschauen (in default main.php File gibt es ein Grundkonfiguration für WebLogRoute, man braucht es einfach Kommentar entfernen. Dann kannst du Log gleich am Unten der Seite sehen), um zu prüfen ob es alles richtig geht.

Es könnte auch sein, dass man in der Relation nicht Status = "Anfrage offen", sondern TblStatus.Status = "Anfrage offen" schreiben soll.

Klappt Prima!

Danke für den Super Tipp mit der Config der webLogRoute.




Querying SQL: SELECT `t`.`primary` AS `t0_c0`, `t`.`Kategorie` AS 

`t0_c1`,`t`.`Projektname` AS `t0_c2`, `t`.`Ziel` AS `t0_c3`, `t`.`Team` AS 

`t0_c4`,`t`.`Prototyp` AS `t0_c5`, `t`.`Gesucht` AS `t0_c6`, `t`.`Location` 

AS`t0_c7`, `t`.`Logo` AS `t0_c8`, `t`.`Benutzer` AS `t0_c9`, `t`.`Anteil` 

AS`t0_c10`, `t`.`Framework` AS `t0_c11`, `t`.`url` AS `t0_c12` FROM`tblProjekt` 

`t`  WHERE (`t`.`Benutzer`=:yp0)


in 

/srv/www/vhosts/makebusiness.ch/httpdocs/protected/models/TblProjekt.php(12)


in/srv/www/vhosts/makebusiness.ch/httpdocs/protected/components/views/userMenu1.php(3)


in/srv/www/vhosts/makebusiness.ch/httpdocs/protected/components/UserMenu1.php(14)


Querying SQL: SELECT `idfs_Projekt` AS `c`, COUNT(*) AS `s` FROM`tblStatus` `t` 


WHERE (Status = "Anfrage offen") AND (`t`.`idfs_Projekt` IN(1, 2, 11, 12, 13, 14, 23)) 


GROUP BY `idfs_Projekt`




in /srv/www/vhosts/makebusiness.ch/httpdocs/protected/models/TblProjekt.php(12)

in/srv/www/vhosts/makebusiness.ch/httpdocs/protected/components/views/userMenu1.php(3)

in/srv/www/vhosts/makebusiness.ch/httpdocs/protected/components/UserMenu1.php(14)

Alles Klappt, oder nur mit WebLog? :)

Hallo SleepWalker

Der Weblog klappt prima.

Ich kämpfte jedoch noch lange mit der Zählung der Relationalen Felder. Es zählte mir immer nur 1 statt 2. Ich habe es nun dank Deiner Hilfe hinbekomen.

Herzlichen Dank

Model TblProjekt.




public static function getOffeneAnfragen(){

              $arr=TblProjekt::model()->with(array(

                'tblStatuses'=>array(

                    'joinType'=>'INNER JOIN',

                    'condition'=>'tblStatuses.Status= "Anfrage offen"',

                    'condition'=>"Benutzer= " .yii::app()->user->id, 

                ),

            ))->findAll();

            return count($arr);    

}


 public static function getOffeneBewerbungen(){

            $arr1=TblProjekt::model()->with(array(

                'tblStatuses'=>array(

                    'joinType'=>'INNER JOIN',

                    'condition'=>'tblStatuses.Status= "Anfrage offen"',

                    'condition'=>"tblStatuses.idfs_Bewerber= " .yii::app()->user->id,

                ),

            ))->findAll();

   		return count($arr1);






View


$Anfragen = "Anfragen <span class='badge badge-success'> ". TblProjekt::getOffeneAnfragen().  "</span>";

$Bewerbungen = "Bewerbungen <span class='badge badge-success'> ". TblProjekt::getOffeneBewerbungen().  "</span>";


 $this->widget('bootstrap.widgets.TbMenu', array(

 'encodeLabel'=>false,

    'type'=>'pills',

    'items'=>array(

      

        array('label'=>'Home', 'icon'=>'home', 'url'=>'?r=User/mobile'),

        array('label'=>'Meine Projekte' , 'icon' =>'icon-align-justify', 'url'=>array('/User/mobile&id=' .yii::app()->user->id, 'view'=>'mobile')),

        array('label'=>$Anfragen, 'icon'=>'user', 'url'=>'?r=TblStatus/Admin'),

        array('label'=>$Bewerbungen, 'icon'=>'user', 'url'=>'?r=TblStatus/Bewerbung'),

	array('label'=>'Profile', 'icon'=>'cog', 'url'=>'?r=user/update&id='.yii::app()->user->id),

        array('label'=>'Hilfe', 'icon'=>'flag', 'url'=>'#'),

    ),

)); 



Jetzt zählt er richtig und es ist dank deinem Input auch gem. MVC umgesetzt.

Hallo Beat, gut, dass alles geklappt hat, weil ich Typs von JOIN ohne Testen kaum unterscheide :)

du solltest aber Funktion ein bisschen umschreiben, weil in deine Version das erste Kondition bei zweite überschreibt wird. So ist richtiger:


public static function getOffeneAnfragen(){

              $arr=TblProjekt::model()->with(array(

                'tblStatuses'=>array(

                    'joinType'=>'INNER JOIN',

                    'condition'=>'tblStatuses.Status= "Anfrage offen" AND Benutzer=' . yii::app()->user->id,

                ),

            ))->findAll();

            return count($arr);    

}

und ich hatte das getestet

thx AwakeWalker

Ich erstelle eine Plattform wo Programmierer, Grafiker, Visionäre, Projektmanager sich für Projekte finden und sich an den Projekten beteiligen können.

Vision: Mittels Gameification ein Punktesystem für Ehre, Rum, Pünktlichkeit, Zuverlässigkeit zu erstellen und später eine Vermittlung aufbauen. Interessierte einfach direkt über Plattform am Projekt teilnehmen.

www.makebusiness.ch