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

VIII Partie privée : administrez vos photos

VIII.A Introduction

Nous allons d?abord créer des albums, puis nous choisirons d?uploader notre photo via un formulaire, et enfin nous proposerons de partager certains albums

VIII.B Créons notre module d?albums

Rendons nous dans le builder pour générer un module CRUD intégrable de notre classe model_albums

Décochez "Formulaire de suppression" (il ne sera pas possible de supprimer des albums) et décochez le champ "user_id" (on le forcera par la suite)

VIII.C Forcer le user

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

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


Ensuite dans la méthode save(), forçons l'utilisateur
Remplacez

  
if($oAlbums->save()){
    


Par

  
//on force le user_id avec la propriete de notre module
$oAlbums->user_id=$this->user_id;
if(
$oAlbums->save()){
    



VIII.D Filtrons les albums par user

Ajoutez une méthode findAllByUser dans model/model_Albums.php

  
public function findAllByUser($user_id){
   return $this->findMany('SELECT * FROM '.$this->sTable.' WHERE user_id=?',$user_id);
}
    


Remplacer dans la methode _list de module/Albums/main.php

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


Par

  
$tAlbums
=model_Albums::getInstance()->findAllByUser($this->user_id);
    



VIII.D Intégrons notre module Albums dans notre module principal mainPrivate

Comme pour les modules Groups et Posts, on va l?intégrer
Éditez le fichier de contrôleur module/mainPrivate/main.php
Modifiez la méthode _pictures() ainsi

  
   
public function _pictures(){
       $oModuleAlbums=new module_Albums;
       //on initialise ici le profil à utiliser avec l'id du user connecte
       $oModuleAlbums->setUserId_root::getAuth()->getAccount()->id );
       //recupere la vue du module
       $oView=$oModuleAlbums->_index();

       $this->oLayout->add('main',$oView);
   }
    




VIII.E Permettons l?upload de photos

Vous pouvez créer des albums, nous allons maintenant permettre d?uploader des photos dans les albums
Éditez la vue module/Albums/view/show.php

  
<h1>Album <?php echo $this->oAlbums->name ?></h1>

<form action="" method="POST" enctype="multipart/form-data">
Choisir une photo <input type="file" name="path" /><input type="submit" value="Uploader"/>
</form>
<p><a href="<?php echo module_Albums::getLink('list')?>">Retour</a></p>
   

On souhaiterait lister les photos dans nos albums, pour cela il faudrait lister les photos par albums
Ajouter une méthode findListByAlbum dans la classe model_Pictures dans votre fichier model/model_Pictures.php

  
public function findListByAlbum($album_id){
   return $this->findMany('SELECT * FROM '.$this->sTable.' WHERE album_id=?',$album_id);
}
    


Éditez le contrôleur module/Albums/main.php
Modifiez la méthode _show()

  
   
public function _show(){
       $oAlbums=model_Albums::getInstance()->findByIdmodule_Albums::getParam('id') );

       $oView=new _view('Albums::show');
       $oView->oAlbums=$oAlbums;
       $oView->tPictures=model_Pictures::getInstance()->findListByAlbum($oAlbums->id);

       if(_root::getRequest()->isPost() and isset($_FILES['path'])){
           $sNewFileName='../data/upload/album_'.$oAlbums->id.'_'.date('Ymdhis');

           $oPluginUpload=new plugin_upload('path');
           if($oPluginUpload->isValid()){
               $oPluginUpload->saveAs($sNewFileName);

               $oPicture=new row_Pictures();
               $oPicture->album_id=$oAlbums->id;
               $oPicture->path=$oPluginUpload->getPath();
               $oPicture->save();
              
               _root
::redirect('mainPrivate::pictures',array('mode'=>'show','id'=>$oAlbums->id));
           }
       }

       return $oView;
   }
    


Puis on va lister les photos dans la vue
Éditez le fichier module/Albums/view/show.php

  
<h1>Album <?php echo $this->oAlbums->name ?></h1>

<form action="" method="POST" enctype="multipart/form-data">
Choisir une photo <input type="file" name="path" /><input type="submit" value="Uploader"/>
</form>

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

A chaque upload de photo, on liste les photos présentes dans l?album



VIII.F Partageons nos albums avec des groupes

On va procéder comme pour les messages du fil
On va d?abord récupérer la liste des groupes ainsi que la liste des groupes avec lesquels on partage les albums
Pour cela, il faut d?abord ajouter une requête à notre model_share
Éditez le fichier model/model_Share.php

  
public function findListByAlbum($album_id){
   return $this->findMany('SELECT * FROM '.$this->sTable.' WHERE album_id=?',$album_id);
}
public function 
findListAlbumsIndexedByAlbum($album_id){
   $tSharedGroup=$this->findListByAlbum($album_id);
   $tIndexed=array();
   foreach($tSharedGroup as $oShare){
       $tIndexed[$oShare->group_id]=$oShare;
   }
   return $tIndexed;
}
    


Éditez la méthode _show() du controleur module/Albums/main.php

  
//recuperons les groupes
$oView->tGroups=model_Groups::getInstance()->findListByUser$this->user_id);
//recuperons les groupes avec lesquels on partage cet album
$oView->tSharedGroups=model_Share::getInstance()->findListAlbumsIndexedByAlbum$oAlbums->id);
    


Éditez la vue module/Albums/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>

<form action="" method="post" enctype="multipart/form-data">
Choisir une photo <input type="file" name="path" /><input type="submit" value="Uploader"/>
</form>

<?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;?>

<form action="" method="POST">
<input type="hidden" name="share" value="1"/>
<?php foreach($this->tGroups as $oGroups):?>
<input <?php if(isset($this->tSharedGroups[$oGroups->id])):?>checked="checked"<?php endif;?> type="checkbox" name="tGroup[]" value="<?php echo $oGroups->id?>"/><?php echo $oGroups->name?><br />
<?php endforeach;?>
<p><input type="submit" value="partager"/></p>
</form>

<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_Albums::getLink('list')?>">Retour</a></p>
   

Revenons au contrôleur pour prendre en compte les groupes sélectionnés, mais pour cela, nous allons ajouter une méthode pour enregistrer ces partages:
Éditez model/model_Share.php pour ajouter

  
public function shareUserAlbumsWithGroups($user_id,$album_id,$tGroup_id){
   //on supprime d'abord tous les partages pour les recreer ensuite
   $this->execute('DELETE FROM '.$this->sTable.' WHERE user_id=? AND album_id=?',$user_id,$album_id);

   if($tGroup_id){
       foreach($tGroup_id as $group_id){
           $oGroups=new row_Share;
           $oGroups->user_id=(int)$user_id;
           $oGroups->album_id=(int)$album_id;
           $oGroups->group_id=(int)$group_id;
           $oGroups->date=date('Y-m-d');
           $oGroups->save();
       }
   }
}
    


Puis modifiez le contrôleur module/Albums/main.php pour utiliser ceci

  
   
public function _show(){
       $oAlbums=model_Albums::getInstance()->findByIdmodule_Albums::getParam('id') );

       $oView=new _view('Albums::show');
       $oView->oAlbums=$oAlbums;
       $oView->tPictures=model_Pictures::getInstance()->findListByAlbum($oAlbums->id);
      
       
//recuperons les groupes
       $oView->tGroups=model_Groups::getInstance()->findListByUser$this->user_id);
       //recuperons les groupes avec lesquels on partage cet album
       $oView->tSharedGroups=model_Share::getInstance()->findListAlbumsIndexedByAlbum$oAlbums->id);

       if(_root::getRequest()->isPost() and isset($_FILES['path'])){
           $sNewFileName='../data/upload/album_'.$oAlbums->id.'_'.date('Ymdhis');

           $oPluginUpload=new plugin_upload('path');
           if($oPluginUpload->isValid()){
               $oPluginUpload->saveAs($sNewFileName);

               $oPicture=new row_Pictures();
               $oPicture->album_id=$oAlbums->id;
               $oPicture->path=$oPluginUpload->getPath();
               $oPicture->save();
              
               _root
::redirect('mainPrivate::pictures',array('mode'=>'show','id'=>$oAlbums->id));
           }
       }
       if(_root::getParam('share')){
           $tPostedGroups=_root::getParam('tGroup');
           model_Share::getInstance()->shareUserAlbumsWithGroups($this->user_id,$oAlbums->id,$tPostedGroups);
          
           self
::redirect('show',array('id'=>$oAlbums->id));
       }

       return $oView;
   }
    




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 : IX Profil partagé