Création d'un réseau social avec le mkframework


-I Préambule
-II Création et initialisation du projet
-III L'authentification
-IV Créons notre menu
-V Partie privée : le profil
-VI Partie privée : votre réseaux de contacts
-VII Partie privée : votre fil
-VIII Partie privée : administrez vos photos
-IX Profil partagé
-X Design/ esthétique
-XI Conclusion

IX Profil partagé

IX.A VII.A Commençons par le module principal

Rendez-vous sur le builder, et créons un module mainShare
Dans le builder, rendrez vous sur « créer un module »
Créez un module mainShare avec les actions profil et photos

Ce nouveau module principal va nécessiter un menu différent

IX.B Créons le menu pour notre module share

Ajoutez une méthode share dans module/menu/main.php

  
public function _share(){
  
   $tLink
=array(
       'mainShare::profil' => 'Son profil',
       'mainShare::photos' => 'Ses photos',
   );
  
   $oView
=new _view('menu::share');
   $oView->tLink=$tLink;
      
   
return $oView;
      
}
    


Dupliquez la vue module/menu/view/list.php en module/view/share.php
Puis modifiez cette vue ainsi

  
<ul class="menu">
<?
php foreach($this->tLink as $sNav => $sLabel):?>
   <li <?php if(_root::getParamNav()==$sNav):?>class="selectionne"<?php endif;?>><a href="<?php echo _root::getLink($sNav,array('user_id'=>_root::getParam('user_id')))?>"><?php echo $sLabel?></a></li>
<?php endforeach; ?>
   <li><a href="<?php echo _root::getLink('mainPrivate::home')?>">Retour</a></li>
</ul>
   

Ce module va nous permettre de consulter les profils partagés de nos contacts, on a donc ajouté le user_id récupéré dans l'adresse URL ainsi qu'un lien de retour vers sa propre page privée.

IX.C Restreignons l'acces aux contacts

Commençons par créer une methode dans model/model_Friends.php

  
public function isUserFiendsWith($user_id,$user_id2){
   $oRow=$this->findOne('SELECT count(*) as total FROM Friends where
               (user_id=? AND user_id2=? AND state='
.self::STATE_ACCEPTED.')
               OR
               (user_id2=? AND user_id=? AND state='
.self::STATE_ACCEPTED.')
               '
,
               $user_id,$user_id2,$user_id,$user_id2);
                  
   
if($oRow->total >0){
       return true;
   }else{
       return false;
   }
}
    


Vérifions dans le contrôleur qu'il est bien un contact dans le fichier module/mainShare/main.php

  
   
public function before(){
       if(!model_Friends::getInstance()->isUserFiendsWith(_root::getParam('user_id'), _root::getAuth()->getAccount()->id) ){
           //si  on est pas un contact de cette personne, on est redirige
           _root::redirect('mainPrivate::profil');
       }
  
       $this
->oLayout=new _layout('template1');
      
       $this
->oLayout->addModule('menu','menu::share');
   }
    


Si ce n'est pas le cas, on redirige vers le module principal

IX.D Pour notre partie profil partagé

Ajoutez l'action showshare à notre fichier module/profil/main.php

  
public function _showshare(){
   $oUsers=model_Users::getInstance()->findById$this->id );
      
   $oView
=new _view('profil::showshare');
   $oView->oUsers=$oUsers;
      
   
return $oView;
}
    


Dupliquer la vue module/profil/view/show.php en module/profil/view/showshare.php

  
<div style="float:right"><img style="width:100px;border:2px solid gray" src="<?php echo $this->oUsers->profilPicture ?>" /></div>

<
table class="tb_show">
   <tr>
       <th>lastname</th>
       <td><?php echo $this->oUsers->lastname ?></td>
   </tr>
   <tr>
       <th>firstname</th>
       <td><?php echo $this->oUsers->firstname ?></td>
   </tr>
   <tr>
       <th>mail</th>
       <td><?php echo $this->oUsers->mail ?></td>
   </tr>
   <tr>
       <th>profilPicture</th>
       <td><?php echo $this->oUsers->profilPicture ?></td>
   </tr>
   <tr>
       <th>job</th>
       <td><?php echo $this->oUsers->job ?></td>
   </tr>
</table>
   

Integrons cette nouvelle action dans notre module principal
Modifiez votre methode _profil ainsi dans module/mainShare/main.php

  
public function _profil(){
  
   $oModuleProfil
=new module_profil;
   $oModuleProfil->setId(_root::getParam('user_id'));
   $oView=$oModuleProfil->_showshare();
      
   $this
->oLayout->add('main',$oView);
}
    



IX.E Les photos partagés

Créons un nouveau module Albumshare  :
Rendez vous dans le builder rubrique « créer un module CRUD intégrable » sélectionnez la classe model_Albums
Saissez Albumshare dans le nom du module, et décochez tout sauf "Page d'affichage du détail" et le champ "name"

Forcer le user  :
Ajoutez une methode dans le fichier model/model_Albums.php

  
public function findAllShareByUserForUser($user_id,$usershared_id){
   return $this->findMany('SELECT distinct Albums.*
       FROM Share, Albums, UsersGroup
       WHERE
           Share.album_id = Albums.id
           AND
           UsersGroup.group_id = Share.group_id
           AND
           Albums.user_id=?
           AND UsersGroup.user_id=?'
,$user_id,$usershared_id
   
);
}
    


Ajoutez dans le fichier module/Albumshare/main.php comme pour le module groups

  
private $user_id;
public function 
setUserId($user_id){
   $this->user_id=(int)$user_id;
}
    


Remplacez dans la methode _list

  
$tAlbums
=model_Albums::getInstance()->findAll();
    


Par

  
$tAlbums
=model_Albums::getInstance()->findAllShareByUserForUser($this->user_id_root::getAuth()->getAccount()->id);
    


Modifiez la methode _show
pour ajoutez la recuperation des photos

  
   
public function _show(){
       $oAlbums=model_Albums::getInstance()->findByIdmodule_Albumshare::getParam('id') );
      
       $oView
=new _view('Albumshare::show');
       $oView->oAlbums=$oAlbums;
       $oView->tPictures=model_Pictures::getInstance()->findListByAlbum($oAlbums->id);
      
       
return $oView;
   }
    


Editez également la vue module/albumshare/view/show.php

  
<script>
function 
hidePicture(){
   var a=getById('popup');
   if(a){
       a.style.display='none';
   }
}
function 
showPicture(sPath){
   var a=getById('popup');
   if(a){
       a.style.display='block';
       var b=getById('img');
       if(b){
           b.innerHTML='<img src="'+sPath+'"/>';
       }
   }
}
</script>
<h1>Album <?php echo $this->oAlbums->name ?></h1>

<?php foreach($this->tPictures as $oPicture):?>
<a href="#" onclick="showPicture('<?php echo $oPicture->path?>');"><img style="width:100px;height:100px;border:4px solid gray" src="<?php echo $oPicture->path?>" /></a>
<?php endforeach;?>

<div id="popup" style="position:absolute;display:none;border:1px solid gray;background:white">
<p style="margin:0px;background:black;text-align:right"><a style="color:white" href="#" onclick="hidePicture()" >Fermer</a></p>
<div id="img"></div>
</div>

<p><a href="<?php echo module_Albumshare::getLink('list')?>">Retour</a></p>
   

Ici on a simplement copié la vue module/Albums/view/show.php en enlevant la partie permettant d'uploader de nouvelles photos ainsi que la partie partage ;)
Intégrons-le à notre module mainShare
Modifier le contrôleur dans module/mainShare/main.php

  
   
public function _photos(){
      
       $user_id
=_root::getParam('user_id');
  
       $oModuleAlbum
=new module_Albumshare;
       $oModuleAlbum->setUserId($user_id);
       $oModuleAlbum->setRootLink('mainShare::photos',array('user_id'=>$user_id));
       $oView=$oModuleAlbum->_index();
      
       $this
->oLayout->add('main',$oView);
   }
    


Utilisons ce module mainShare  :
Maintenant nous allons ajouter un lien vers cette page
Editez la vue module/contacts/view/listembedded.php pour ajouter un lien vers ce module

  
<h1>Mes contacts</h1>
<?
php if($this->tContacts):?>
<table>
   <?php foreach($this->tContacts as $oContact):?>
       <tr>
           <td><a href="<?php echo _root::getLink('mainShare::profil',array('user_id'=>$oContact->id))?>"><?php echo $oContact->lastname ?></a></td>
           <td><a href="<?php echo _root::getLink('mainShare::profil',array('user_id'=>$oContact->id))?>"><?php echo $oContact->firstname ?></a></td>
       </tr>
   <?php endforeach;?>
</table>
<?php else:?>
Aucun pour le moment
<?php endif;?>
   

Ajoutons un lien vers l'album partagé
Lors du partage d'un album photo avec nos contacts, on va créer un message avec un lien pour consulter cet album
Ajoutez une methode showForFil dans le module module/Albums/main.php

  
public function showForFil$album_id){
   $oAlbums=model_Albums::getInstance()->findById$album_id );

   $oView=new _view('Albums::showForFil');
   $oView->oAlbums=$oAlbums;
      
   
return $oView;
}
    


Créer la vue module/Albums/view/showForFil.php

  
<a href="<?php echo _root::getLink('mainShare::photos',
                   array(
                       'user_id'=>
$this->oAlbums->user_id,
                       'albumshareid'=>
$this->oAlbums->id
                   )
)?>"
>Consultez cet album partag&eacute;</a>
    


Ajoutez dans la condition if share du fichier module/Albums/main.php dans la méthode _show()

  
   
if(_root::getParam('share')){
      
           $oViewAlbum
=$this->showForFil($oAlbums->id);
              
           $oPosts
=new row_Posts;
           $oPosts->title='Partage de photos';
           $oPosts->body=$oViewAlbum->show();
           $oPosts->date=date('Y-m-d');
           $oPosts->time=date('H:i:s');
           $oPosts->user_id=$this->user_id;
           $oPosts->save();
              
           $tPostedGroups
=_root::getParam('tGroup');
                  
           
//partge du post avec les groups
           model_Share::getInstance()->shareUserPostWithGroups($this->user_id,$oPosts->id,$tPostedGroups);
                  
           model_Share
::getInstance()->shareUserAlbumsWithGroups($this->user_id,$oAlbums->id,$tPostedGroups);
                  
           self
::redirect('show',array('id'=>$oAlbums->id));
       }
    



Ici on récupère la vue retourné par la méthode showForFil, on appelle sa méthode show() pour récupérer le html.

En vous connectant avec par exemple albert camus, vous pouvez voir le post contenant le lien vers l'album partagé


Téléchager le zip

Téléchargez l'archive du projet à cette étape en cliquant ici
A copier dans le répertoire data/genere du mkframework

Lire la suite : X Design/ esthétique