[Yii1] Problema da Model a View


#1

Salve mi ritrovo a non riuscire a risolvere un problema con la generazione dei risultati in una vista.
Ho una funzione nel model Post che cerca tutti i post presenti e per ogni post esegue una ricerca dentro al Model Userphoto prelevando tutte le foto che riguardano ogni post tramite l’ id del post (postid).
Però per ogni ciclo foreach su ogni post al posto di mostrare le sole foto riguardanti quel post, mi mostra le foto del post cercato più quelle del post ad esso precedente.
Questo è il codice che ho nel Model:

public static function UserAllPosts()
    {
	$baseUrl = Yii::getPathOfAlias('webroot');
	$goodUrl = $baseUrl.'/images/opinion/good.png';
	$nogoodUrl = $baseUrl.'/images/opinion/no-good.png';
	$risataUrl = $baseUrl.'/images/opinion/risata.png';
	$tristezzaUrl = $baseUrl.'/images/opinion/tristezza.png';
	$arrabbiatoUrl = $baseUrl.'/images/opinion/arrabbiato.png';
	$loveUrl = $baseUrl.'/images/opinion/love.png';
	$userid = Yii::app()->user->id;
	$criteria = new CDbCriteria();	
	$criteria->compare('approve',1);
    $criteria->order = 'id DESC';	

	$posts= Post::model()->findAll($criteria);
	foreach($posts as $post)
	{	
	$start  = date_create($post->date.' '.$post->time);
    $end 	= date_create();
    $diff  	= date_diff( $start, $end );
	if($diff->d == 0 && $diff->h < 1)
	{
    $timeI = $diff->i.' min fà';
    }
	if($diff->d == 0 && $diff->h >= 1)
	{
    $timeI = $diff->h.' ore fà';
    }
	if($diff->d >= 1)
	{	
	$timeI = $post->date.' alle ore '.$post->time;
	}
	$tempo =  $timeI;
	
	if($post->message == NULL)
	{
	$notifica = $post->notify;	
	}
	if($post->message != NULL)
	{
	$notifica = $post->message;	
	}
	
	$good = new CDbCriteria();
	$good->compare('postid',$post->id);
	$good->compare('iconid',1);		
	$goodOpinion = Opinionpost::model()->findAll($good);
	$countgood = count($goodOpinion);
	
	$nogood = new CDbCriteria();
	$nogood->compare('postid',$post->id);
	$nogood->compare('iconid',2);		
	$nogoodOpinion = Opinionpost::model()->findAll($nogood);
	$countnogood = count($nogoodOpinion);
	
	$risata = new CDbCriteria();
	$risata->compare('postid',$post->id);
	$risata->compare('iconid',3);		
	$risataOpinion = Opinionpost::model()->findAll($risata);
	$countrisata = count($risataOpinion);
	
	$love = new CDbCriteria();
	$love->compare('postid',$post->id);
	$love->compare('iconid',4);		
	$loveOpinion = Opinionpost::model()->findAll($love);
	$countlove = count($loveOpinion);
	
	$tristezza = new CDbCriteria();
	$tristezza->compare('postid',$post->id);
	$tristezza->compare('iconid',5);		
	$tristezzaOpinion = Opinionpost::model()->findAll($tristezza);
	$counttristezza = count($tristezzaOpinion);
	
	$arrabbiato = new CDbCriteria();
	$arrabbiato->compare('postid',$post->id);
	$arrabbiato->compare('iconid',6);		
	$arrabbiatoOpinion = Opinionpost::model()->findAll($arrabbiato);
	$countarrabbiato = count($arrabbiatoOpinion);
	
	$cr = new CDbCriteria();
	$cr->compare('ownerid',$userid);	

	$photos = Profilephoto::model()->findAll($cr);
	foreach($photos as $photo)
	{
	$Immagine = Yii::app()->request->baseUrl.$photo->cartella.$photo->images;	
	$imgShow = CHtml::image($Immagine,'',array('id'=>$photo->id,'data-toggle'=>'modal','data-target'=>'#myModal'));
	}

	$crt = new CDbCriteria();
	$crt->compare('postid',$post->id);

	$ShowPhotos = Userphoto::model()->findAll($crt);
	foreach($ShowPhotos as $ShowPhoto)
	{		
    $Show = Yii::app()->request->baseUrl.$ShowPhoto->cartella.$ShowPhoto->images;	
	$arr[] = CHtml::image($Show,'',array('id'=>$ShowPhoto->id, 'postid'=>$post->id,
	'countgood'=>$countgood, 'countnogood'=>$countnogood, 'countrisata'=>$countrisata,
	'countlove'=>$counlove, 'counttristezza'=>$counttristezza,'countarrabbiato'=>$countarrabbiato,
	'data-toggle'=>'modal','data-target'=>'#myModal','style'=>'width:22.5%; padding:1%;'));		
	$imgShowPost = implode('',$arr);
	}


	echo '<div class="span8 border" style="border-top:2px solid #00C1C2; margin-left:20%; margin-bottom:3%;">
	
	<div id="container-header" style="background: #00C1C2; width:100%; padding-bottom:10px;">
	<div class="profile-userpic" style="width:14%; display:inline-block; vertical-align:middle; margin-top:1%;">'.$imgShow.'</div>
	<div style="width:81%;font-size:0.9em;  vertical-align:middle; display:inline-block; margin-top:1%;">'.$post->notify.'<br /> '.$tempo.'</div>
	</div>
	
	<div id="container-post" style="width:100%; margin-left:1%; margin-top:2%;">
	<div id="'.$post->id.'">'.$post->message.'</div>
	<div style="display:inline-block; margin-top:2%;">'.$imgShowPost.'</div>
	</div>
	
	<div class="span6" style="background:#c0ffff; text-align:center; width:100%; margin-left:0px;">
	<div class="good"  id="'.$post->id.'" title="Mi piace", userid="'.$userid.'"postid="'.$post->id.'" iconid="1" link="'.$goodUrl.'" style="display:inline-block;">
	 <span>'.$countgood.'</span>
	 </div>
	<div class="nogood" id="'.$post->id.'"  title="Non mi piace", userid="'.$userid.'" postid="'.$post->id.'" iconid="2" link="'.$nogoodUrl.'" style="display:inline-block;">
	<span>'.$countnogood.'</span>
	</div>
	<div class="risata" id="'.$post->id.'" title="Che ridere", userid="'.$userid.'" postid="'.$post->id.'" iconid="3" link="'.$risataUrl.'" style="display:inline-block;">
	<span>'.$countrisata.'</span>
	</div>
	<div class="love" id="'.$post->id.'" title="Love", userid="'.$userid.'" postid="'.$post->id.'" iconid="4" link="'.$loveUrl.'" style="display:inline-block;">
	<span>'.$countlove.'</span>
	</div>
	<div class="tristezza" id="'.$post->id.'" title="Mi dispiace", userid="'.$userid.'" postid="'.$post->id.'" iconid="5" link="'.$tristezzaUrl.'" style="display:inline-block;">
	<span>'.$counttristezza.'</span>
	</div>
	<div class="arrabbiato" id="'.$post->id.'" title="Sono arrabbiato", userid="'.$userid.'" postid="'.$post->id.'" iconid="6" link="'.$arrabbiatoUrl.'" style="display:inline-block;">
	<span>'.$countarrabbiato.'</span>
	</div>
	</div>
	
	</div>';
	}
   }

Nella vista richiamo solo la funzione in maniera tale che mi generi i div per ogni post trovato tramite la funzione:

<?php echo Post::UserAllPosts();?>

Il controller invece richiama solo la vista e il suo layout nella action:

public function actionIndex()
	{
		$this->layout="//layouts/main";
		$this->render('allposts');
	}

Qualcuno può aiutarmi a risolvere questo problema, e a far si che per ogni singolo post trovato vengano mostrate solo le foto di quel post? Grazie in anticipo.


#2

Nessuno può aiutarmi perfavore? Praticamente ad ogni ciclo in

 foreach($posts as $post) 

eseguo un altra ricerca in un altra tabella per trovare le foto.

$crt = new CDbCriteria();
$crt->compare('postid',$post->id);
$ShowPhotos = Userphoto::model()->findAll($crt);
foreach($ShowPhotos as $ShowPhoto) {.......}

In questa seconda ricerca praticamente il $post->id del primo foreach si ripete dentro al secondo foreach e mi trova tutte le foto in modo consecutivo per ogni post trovato che contenga foto.
Infatti nel secondo foreach

$crt = new CDbCriteria();
$crt->compare('postid',$post->id);
$ShowPhotos = Userphoto::model()->findAll($crt);
foreach($ShowPhotos as $ShowPhoto)
{		
    $Show = Yii::app()->request->baseUrl.$ShowPhoto->cartella.$ShowPhoto->images;	
	$arr[] = CHtml::image($Show,'',array('id'=>$ShowPhoto->id, 'postid'=>$post->id,
	'countgood'=>$countgood, 'countnogood'=>$countnogood, 'countrisata'=>$countrisata,
	'countlove'=>$counlove, 'counttristezza'=>$counttristezza,'countarrabbiato'=>$countarrabbiato,
	'data-toggle'=>'modal','data-target'=>'#myModal','style'=>'width:22.5%; padding:1%;'));	
	$imgShowPost = implode('',$arr);
	$fotoPostId[] = $post->id;
	}
var_dump(implode('',$fotoPostId));

Con il var_dump vedo queste stringhe e da qui si capisce che per i 5 cicli che fa ripete le ricerche di tutte le foto in base al loro postid;

string(2) "44" (qui il primo post con 2 foto - post->id 4 ripetututo tante volte quante sono le foto di quel post);

string(7) "4433333"  (Secondo ciclo, trova le 2 foto precedenti e le 5 contenute nel secondo post con post->id 3);

string(8) "44333332"  (terzo ciclo, trova le prime 2 foto, le 5 del secondo post, e l' unica foto del post numero 2 con post->id 2);

string(9) "443333321" (quarto ed ultimo ciclo trova le prime 2 foto del primo post, le 5 foto del secondo post, 1 foto del terzo post e 1 foto del post numero 1 con post.->id 1 che è appunto l' ultimo post)

Ora mi chiedo se sia possibile che al posto di queste stringhe innanzitutto riceva un array di valori e che dalla tabella Userphoto mi prelevi le foto del singolo post id senza fare cicli continui anche di quelle che ha già estratto. O se sia possibile fare questo anche attraverso le stringhe.
Spero di essere stato un po più chiaro che in precedenza e che qualcuno magari possa aiutarmi. Buona serata a tutti.