100 vues
Récupérer membres d'un groupe
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Bonjour ! :)

J'ai fouillé dans le fofo pour cette question, je pense que j'ai déjà aperçu un post identique mais je ne le trouve plus :/

J'aimerai récupérer les membres qui ont été assigné dans un groupe "streamer", pour afficher les membres à la suite du lecteur twitch pour mettre en avant les membres qui stream.

Du coup je dois partir sur...:

<?php
if($Neofrag->user->groups('Streamer')){
echo ;
}
?>


..?

En sachant qu'il pourrait y avoir plusieurs membres je dois donc partir sur une boucle ?

Mon site

Merci d'avance :)
French Family
3 participants
18 réponses
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Bonjour Gnesis,

J'ai fait des petits test de mon côté :).

Le résultat :

$group = $this->groups->check_group(array(4));
$users = $this->db ->select('u.user_id', 'u.username', 'up.avatar', 'up.sex')
->from('nf_users u')
->join('nf_users_profiles up', 'u.user_id = up.user_id')
->where('u.deleted', FALSE)
->get();
foreach ($users as $user)
{
// Si le membre appartient au groupe :
if (in_array($user['user_id'], $group['users']))
{
$user_link = $this->user->link($user['user_id'], $user['username']); // Affiche le lien du membre vers son profil
$user_avatar = $this->user->avatar($user['avatar'], $user['sex'], $user['user_id'], $user['username']); // Affiche directement l'avatar du membre (<img ... />)
}
}


Petites explications pour mieux comprendre la démarche :

On récupère les informations du groupe concerné, avec l'ID (ici j'ai pris le 4) :
$group = $this->groups->check_group(array(4));

On récupère tous les membres du site ainsi que quelques infos de leur profil pour afficher l'avatar si besoin :
$users = $this->db ->select('u.user_id', 'u.username', 'up.avatar', 'up.sex')
->from('nf_users u')
->join('nf_users_profiles up', 'u.user_id = up.user_id')
->where('u.deleted', FALSE)
->get();


On boucle sur tous les membres :
foreach ($users as $user)
{
...
}


Dans la boucle, on regarde si l'id du membre appartient au groupe testé :
if (in_array($user['user_id'], $group['users']))
{
...
}


Du coup, si la condition est bonne, tu peux afficher le contenu que tu veux avec nos raccourcis :
$link = $this->user->link($user['user_id'], $user['username']);
$avatar = $this->user->avatar($user['avatar'], $user['sex'], $user['user_id'], $user['username']);


Voila :)

A bientôt !
eResnova
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Bonjour eResnova,

Merci pour la réponse :)

J'ai testé ça, en mettant l'id du groupe souhaité, mais aucun affichage de membres, j'ai essayer d'attribuer le groupe admin (1) pour tester et du coup le CSS ne fonctionne plus ... Normalement ce code là peut fonctionner pour plusieurs groupes différents, autant admin que streamer ?
French Family
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Bonjour Gnesis,

Où essayes tu d'ajouter ce code ?
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Dans un module dans views/index.tpl.php
French Family
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
D'accord.

Mon bout de code est à placer dans ton contrôleur index
Au niveau de la condition if ( ... ) tu peux stocker dans un array $treamers les utilisateurs à conserver. Ensuite tu peux appeler ta vue et transmettre dedans ton data.

Si tu comprend pas, dit le moi, je connais pas ton niveau de code NeoFrag :) ! Ou sinon, poste moi un bout de ton widget ;)
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
On va dire que je m'y retrouve plus ou moins en Php, je pense que je suis arrivé au while sur Codecademy donc je n'ai pas vraiment le niveau pour coder, bien que Neofrag me motive à apprendre vu toute les fonctions qu'on peut ajouter quand on s'y connait un minimum ^^

Donc mon code dans views/index.tpl.php :

<div class="container-webtv">
<iframe src="https://player.twitch.tv/?channel=frenchfamilytv" frameborder="0" scrolling="no" height="660" width="75%"></iframe>
<iframe src="https://www.twitch.tv/frenchfamilytv/chat?popout=" frameborder="0" scrolling="no" height="660" width="25%"></iframe>
</div>
<div class="titre-streamers">
Nos streamers
</div>
<div class="container-streamers">
<?php
$group = $this->groups->check_group(array(5));
$users = $this->db ->select('u.user_id', 'u.username', 'up.avatar', 'up.sex')
->from('nf_users u')
->join('nf_users_profiles up', 'u.user_id = up.user_id')
->where('u.deleted', FALSE)
->get();
foreach ($users as $user)
{
// Si le membre appartient au groupe :
if (in_array($user['user_id'], $group['users']))
{
$user_link = $this->user->link($user['user_id'], $user['username']); // Affiche le lien du membre vers son profil
$user_avatar = $this->user->avatar($user['avatar'], $user['sex'], $user['user_id'], $user['username']); // Affiche directement l'avatar du membre (<img ... />)
}
}
?>
</div>

Dans controllers/index.php :

class m_webtv_c_index extends Controller_Module
{
public function index()
{
return new Panel(array(
'title' => "WebTV",
'icon' => 'fa-video-camera',
'content' => $this->load->view('index', array(
'webtv'))
));
}
}

Merci beaucoup :D
French Family
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
haaa, mais c'est normal aussi que ça ne t'affiche rien. lol :D
Il n'y a pas d'echo dans ta vue. Je t'avais juste pré-remplis 2 variables dans ta condition mais il faut les afficher :)

echo $this->user->link($user['user_id'], $user['username']); par exemple, etc...

Petite remarque :
Dans ton contrôleur index.php, ce petit bout de code est faux, plutôt inutile :

$this->load->view('index', array('webtv'))

En gros, tu peux déclarer un array dans ta vue pour transmettre des variables que tu aurais définies dans ton contrôleur :). Mais la, tu ne transmet rien de cette façon. C'est plus :

$this->load->view('index', array('webtv' => $variable))

Et de cette façon, côté vue .tpl.php, tu peux faire un <?php echo $data['webtv']; ?> ce qui affichera le contenu de ta variable $variable. Mais tu peux aussi ne pas en déclarer de cette façon : $this->load->view('index')
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Niquel ça fonctionne mieux avec le echo en effet xD

Donc si je comprend bien, pour le $this->load->view('index', array('webtv' => $variable))

Dans mon controllers je dois par exemple donner une valeur à ma variable ex: $variable = Gnesis; et dans le .tpl.php le echo $data['webtv']; m'affichera la valeur ?
Et le array sert à afficher la valeur de plusieurs variable ? (J'essai de comprend un peu le fonctionnement :p).

Encore un grand merci pour ton aide :)
French Family
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Sry doublon :)

Je vois aussi que pour récupérer les données de l'utilisateur :

$users = $this->db ->select('u.user_id', 'u.username', 'up.avatar', 'up.sex')

Il y en a avec u. et d'autres avec up.

u pour les informations de base stocké dans nf_users et up pour nf_users_profiles ?

Car j'aimerai récupérer plusieurs informations comme la localisation, la citation, etc...

Je peux donc continuer avec :

$users = $this->db ->select('u.user_id', 'u.username', 'up.avatar', 'up.sex', 'up.last_name', 'up.quote', 'up.location', 'up.website') ?

Et pour les afficher je peut donc ajouter une variable pour chaque éléments que je récupère ?

$user_quote = $this->user($user['user_id'], $user['username'], $user['quote']);

echo $user_quote; ?
French Family
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Oui c'est ça. En gros tu déclare tes variables dans l'array et tu leur donne un nom de référence pour les appeler dans ta vue :

array(
'webtv' => $mavariable,
'autre' => $variable2
)


webtv et autre sont les "nouveaux" noms de tes variables pour les appeler dans ta vue. Tu peux très bien mettre :
'mavariable' => $mavariable,

En fait, le contrôleur à pour rôle de recevoir les données et de les traiter (avec des conditions, etc...). Tu récupère ainsi dedans tes variables, tes requêtes côté bdd, etc... Et ensuite tu les envoies dans ta vue.

Les vues doivent uniquement traiter des opérations pour afficher les données, sinon on s'y perd et c'est le principe du MVC en php :). Donc dans les vues tu peux faire tes echos, les boucles foreach () etc... Mais si tu fais une requête bdd dedans, c'est "moche"...

Même chose pour les requêtes vers la bdd, l'idéal est de les placer dans ton model, et depuis le contrôleur tu appel ta fonction définie dans le model comme ceci :

$this->model()->nom_de_ta_fonction();

Petite précision : tu peux avoir plusieurs fichiers model si tu as besoin de séparer un peu ton code. Exemple avec le module actualités, on a fait un model news et un model categories pour distinguer les différentes requêtes.

Le model news pourra s'appeler comme ça : $this->model()->nom_de_ta_fonction();
Mais le model categories s’appellera de cette façon : $this->model('categories')->nom_de_ta_fonction();

Si le model porte le même nom que ton module, tu n'as pas besoin de préciser son nom. ;)

Voila :)

Il reste plusieurs points à expliquer, on pourra les voir suivant tes besoins ;).
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Deuxième réponse :

Oui tu as compris le principe. On appel ça un join car on lie 2 tables différentes avec un point commun (user_id). Du coup ça permet de faire une seule requête pour récupérer plusieurs informations.

Donc comme tu l'as dit, cette requête est bonne :
$users = $this->db ->select('u.user_id', 'u.username', 'up.avatar', 'up.sex', 'up.last_name', 'up.quote', 'up.location', 'up.website');

Pour les afficher c'est pas bon par contre :p

Dans ta boucle foreach ($users as $user) :
Tu peux récupérer chaque champ de cette façon : $user['nom_du_champ'];

Le $this->user()est un raccourci pour récupérer directement l'information du membre connecté à l'instant T sur ton site.
C'est avec cette petite fonction qu'on peut vérifier si un utilisateur est connecté ou non, adminsitrateur ou non :

if ($this->user()) = membre connecté
if ($this->user('admin')) = administrateur

echo $this->user('username'); = affiche le pseudo de l'utilisateur connecté
etc ...
lkndckjdc

23 sujets, 285 réponses

Message non lu
@eResnova serait t'il possible de faire la meme chose pour le module "membre en ligne" ?
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Merci pour tout ces détails, j'y vois un peu plus clair ! :)

Il reste plusieurs points à expliquer, on pourra les voir suivant tes besoins ;).
Suivant mes besoins comme ? :P
French Family
Gnesis

12 sujets, 71 réponses

Donateurs
Message non lu
Re ! :D

J'ai une autre petite question, dans les informations du membre, j'ai ajouté son lien mais j'aimerai pousser la chose légèrement plus loin.

À la base, j'ai affiché un fa-link comme icone pour précéder le lien, mais j'aimerai afficher l'icone en fonction du lien que la personne à indiqué, youtube un fa-youtube, twitch un fa-twitch, facebook un fa-facebook, etc...

Le bout de mon code:

$site = "<a href='".$user['website']."'>Accéder à sa page</a>";

echo "<div class='badge-site'><i class='fa fa-link'></i>";
if ($user['website'] == null){
echo "Pas de lien";
}elseif ($user['website'] == 'https://www.youtube.com/') {
echo "<i class='fa fa-youtube-play'></i>".$site." ";
}else{
echo $site;
}
echo "</div>";

Quand je copie le lien du membre en entier, ça fonctionne, mais du coup, est-il possible de demander à la condition de chercher dans le lien si youtube est indiqué ou non pour validé la condition ?

Pour être clair :

if ($user['website'] == 'Recherche le mot youtube') {
echo " ";
}

Thanks :D
French Family
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Tu peux faire comme ça :

if (preg_match("/youtube/", $user['website']))
{
$link = icon('fa-youtube').' <a href="'.$user['website'].'">Accéder à sa page</a>';
}
else if (preg_match("/facebook/", $user['website']))
{
$link = icon('fa-facebook').' <a href="'.$user['website'].'">Accéder à sa page</a>';
}
else if (preg_match("/twitch/", $user['website']))
{
$link = icon('fa-twitch').' <a href="'.$user['website'].'">Accéder à sa page</a>';
}
else
{
$link = icon('fa-link').' <a href="'.$user['website'].'">Accéder à sa page</a>';
}


Après tu as juste à afficher la variable $link dans ta vue :)