Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [smarty] Funkcja w funkcjii
Forum PHP.pl > Forum > PHP
Bajki
Witam
mam pewien problem...mianowicie w pliku .tpl mam pętle, która wyświetla zawartość tablicy (dokładniej liste komentarzy do newsa) jednak skrypt nie pobiera z bazy danych zadnych informacji o autorze komentarza ...jedynie jego ID. Musiałem więc napisać funkcje do smarty, która mając id, pobiera z bazy email i login uzytkownika. W plikach .tpl ma ona taką składnie :

  1. {userinfo w=login id=numer_id}
  2. {userinfo w=email id=numer_id}


W swoim serwisie korzystam z serwisu www.gravatar.com więc zainstalowałęm sobie plugina/funkcje, który mając taką składnie :
  1. {gravatar email=adres_email}

zamienia podany email na adres avatara w serwisie gravatar.com

Problem w tym, że nie wiem jak połączyć te dwie funkcje. Funkcja {gravatar} musi korzystać z funkcjii {userinfo} do otrzymania emaila użytkownika a ja troche nie wiem jak to napisać winksmiley.jpg Jeśli nie rozumiecie oco mi chodzi (troche zagmatwałem winksmiley.jpg ) to powiedzcie a napisze jeszcze raz biggrin.gif

Pozdrawiam i z góry dzięki
nospor
Ja troszke nie na temat ale...
Cytat
ednak skrypt nie pobiera z bazy danych zadnych informacji o autorze komentarza ...jedynie jego ID

A nie mozesz tego skryptu poprawic? Przeciez to jest szalenie nieoptymalne pobierac z bazy ID a dopiero potem robic kolejne zapytanie dla kazdego ID by pobrac reszte jego pol.
Bajki
hehe no wlasnie sie zastanawialem czy to wydajne ;D

dlamnie bomba tylko ze nie widze kompletnie jak to zrobic ;/ ledwo uporalem sie z jedna tablica a jakbym mial ja jeszcze polaczyc z 2 ... musial by mi ktos w tym pomoc winksmiley.jpg

oto kod :

funkcja get_comments() :
  1. <?php
  2. function get_comments ( $id, $type ) {
  3.  
  4. global $comments;
  5. include "db_connect.php";
  6. $result = mysql_query ("SELECT * FROM comments WHERE object_id = '$id' AND type = '$type' ORDER BY date") or die(mysql_error());
  7.  
  8. $comments = array ();
  9. while ($row = mysql_fetch_array($result)) {
  10. $comments[] = $row;
  11. }
  12. return $comments;
  13.  
  14. }
  15. ?>


tablica $comments jest przypisana do tablicy $comments w smarty (przez assign oczywiscie winksmiley.jpg )

plik comments.tpl :
  1. {section name=item loop=$comments}
  2. {strip}
  3. <div style="background-color: {cycle values='#EFEFEF,#FFFFFF'}; padding: 10px; margin: 10px 0px 10px 0px;">
  4. <tr>
  5. <td rowspan="2" valign="top"><img style="margin-top: -2px; margin-right: 5px; border: 0px;" src="{gravatar email=$smarty.session.user_email size="50"}" alt="Avatar" /></td>
  6. <td class="comment_details"><a href="user.php?id={$comments[item].user_id}"><b>{userinfo w=login id=$comments[item].user_id}</b></a> ( {$comments[item].date|date_format:"%d %m %Y %H:%M"} )</td>
  7. </tr>
  8. <tr style="margin: 0px; padding: 0px; line-height: 10px;">
  9. <td valign="top" style="padding-top: 5px;">{$comments[item].content}</td>
  10. </tr>
  11. </div>
  12. {/strip}
  13. {/section}


jesli ktos podpowiedzial by mi jak to zrobic, bylbym bardzo wdzieczny winksmiley.jpg

pozdrawiam
nospor
musisz do zapytania dodac kolejna tabele przy pomocy left join. Tabele oczywiscie z userami

http://dev.mysql.com/doc/refman/5.0/en/join.html
Bajki
o super, szukalem czegos takiego ! smile.gif jednak jestem w tym zielony ...zmodyfikowałem funkcje :

  1. <?php
  2. function get_comments ( $id, $type ) {
  3.  
  4. global $comments;
  5. include "db_connect.php";
  6. $result = mysql_query ("SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users 
    u ON c.user_id=u.id WHERE c.object_id='$id' AND c.type='$type' ORDER BY c.date"
    ) or die(mysql_error());
  7.  
  8. $comments = array ();
  9. while ($row = mysql_fetch_array($result)) {
  10. $comments[] = $row;
  11. }
  12. return $comments;
  13.  
  14. }
  15. ?>


ale wywala mi błąd
Cytat
Something is wrong in your syntax obok '' w linii 1
nospor
wyswietl jeszcze to zapytanie:
  1. <?php
  2. $sql = "SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users 
    u ON c.user_id=u.id WHERE c.object_id='$id' AND c.type='$type' ORDER BY c.date"
    ;
  3. echo $sql;
  4. $result = mysql_query ($sql) or die(mysql_error());
  5. ?>

I na przyszlosc zapamietaj to.
Bajki
hm stworzylem taki plik :
  1. <?php
  2. function get_comments ( $id, $type ) {
  3.  
  4. global $comments;
  5. include "includes/db_connect.php";
  6. $result = "SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users 
    u ON c.user_id=u.id WHERE c.object_id='$id' AND c.type='$type' ORDER BY c.date"
    ;
  7.  
  8. $sql = mysql_query($result) or die(mysql_error());
  9. return($result);
  10.  
  11. }
  12.  
  13. get_comments(1, 'news');
  14. ?>


ale on mi nic nie zwraca tongue.gif pusta strona sie pojawia...
nospor
o litosci... przeciez ja tam dalem jeszcze echo $sql. a ty gdzie to dales?

  1. <?php
  2. $result = "SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users 
    u ON c.user_id=u.id WHERE c.object_id='$id' AND c.type='$type' ORDER BY c.date"
    ;
  3. echo $result;
  4. $sql = mysql_query($result) or die(mysql_error());
  5. ?>

tak ma byc.

pozatym co skrypt nie pokazesz to ma inne dane
raz jest include "includes/db_connect.php";
a raz include "db_connect.php";
co ty tak zmieniasz wszystko?
Bajki
hehe no dobra teraz zwróciło
Cytat
SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users u ON c.user_id=u.id WHERE c.object_id='1' AND c.type='news' ORDER BY c.date
czyli zasadniczo chyba okej...ale co mi to dało ? ;/

edit--
to przez to ze stworzylem plik testowy w innym folderze i musialem inna sciezke w includzie podac ;D
nospor
Na poczatku funkcja get_comments() zwracala ci tablice komentarzy, teraz zwraca ci wynik mysql_query(). Tak ma byc?
Bajki
tzn wynik mysql_query() czy treść zapytania ? bo jak wynik to zgadza sie biggrin.gif

przypisalem wynik funkcjii do zmiennej {$blad} no i wyswietlilem ja i otrzymalem takie cos :

  1. SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users u ON c.user_id=u.id WHERE c.object_id='1' AND c.type='news' ORDER BY c.date


Jak skopiuje to do SQL w phpmyadminie i 'wykonam' to wszystko działa okej...więc ja już naprawde nie wiem w czym jest problem biggrin.gif
nospor
oj...
na poczatku miales tak:
  1. <?php
  2. $comments = array ();
  3. while ($row = mysql_fetch_array($result)) {
  4. $comments[] = $row;
  5. }
  6. return $comments;
  7. ?>

Zwracasz tu tablice komentarzy.

A potem miales tak:
  1. <?php
  2. $sql = mysql_query($result) or die(mysql_error());
  3. return($result);
  4. ?>

Tu zwraczasz zupelnie co innego. Napewno tak ma byc?
Bajki
Cytat(nospor @ 10.06.2008, 16:36:04 ) *
Tu zwraczasz zupelnie co innego. Napewno tak ma byc?

ja juz sie pogubilem w takim razie...bo ja zmodyfikowałem skrypt zgodnie z twoimi wskazówkami ... a Twoje pytanie brzmi tak jakbyś sie mnie pytał czy to co robie napewno jest okej snitch.gif hehe i teraz ja nie wiem czy rzeczywiscie słuchałem Twoich wskazówek czy wogóle gdzies na początku źle zrozumiałem co napisałeś i cała ta rozmowa to jedno wielkie nieporozoumienie ... biggrin.gif jeśli jednak wszystko jest ok to tak - tak wlasnie wyglada teraz ta funkcja winksmiley.jpg

do tego, stworzyłęm sobie kolejny plik do sprawdzenia co nie gra w tym kodzie :
test.php :
  1. <?php
  2. include('includes/db_connect.php');
  3.  
  4. $id = 1;
  5. $type = 'news';
  6. $zapytanie = "SELECT u.login, u.email, c.date, c.content FROM comments c LEFT JOIN users 
    u ON c.user_id=u.id WHERE c.object_id=$id AND c.type='$type' ORDER BY c.date"
    ;
  7. $wykonaj = mysql_query($zapytanie) or die(mysql_error());
  8. while($wiersz = mysql_fetch_array($wykonaj))
  9. {
  10. print "Pole pierwsze".$wiersz['login']."<br>";
  11. print "Pole drugie".$wiersz['email']."<br>";
  12. print "Pole trzecie".$wiersz['date']."<br>";
  13. print "Pole czwarte".$wiersz['content']."<br><br>";
  14. }
  15. ?>


no i on działa dobrze...a zapytanie jest skopiowane z funkcjii get_comments() ;/
nospor
Cytat
ja juz sie pogubilem w takim razie...bo ja zmodyfikowałem skrypt zgodnie z twoimi wskazówkami ...
oj... latwo sie gubisz tongue.gif
owszem , ja ci powiedzialem bys rozbudowal zapytanie o pobieranie userow i to zrobiles bardzo dobrze. Ale z wiadomych tylko tobie powodow wyciales kod, ktory budowal tablice i ją zwracal. Teraz po modyfikacjach ty zwracasz wynik mysql_query() a wczesniej zwracales przetworzoną juz tablice. Teraz nagle wywalies to z kodu. Rozumiesz? Po dodaniu do zapytania usera nadal masz zwracac tablice komentarzy. Tylko ta tablica ma teraz dodatkowo zawierac jeszcze info o userze ktore pobierasz juz w zapytaniu.

Nie podam ci gotowego rozwiązania bo je miales a po poprawkach wyrzuciles. Musisz to zrozumiec bo to jest naprawde proste smile.gif Zobacz na moj poprzedni post - tam ci napisalem konretnie o jakiej tablicy mowie ktorej juz nie ma teraz a byc powinna.
Bajki
aha no to ja zrozumialem ze mam usunac ta budowe tablicy i poprostu zwrocic tresc zapytania ;D ale nawet kiedy mialem kod tworzacy tablice to i tak miałem ten błąd ;/ (wsumie to nadal go mam bo już poprawiłem tongue.gif)

EDIT==
hehe ok juz wszystko wiem. Błąd wynikał z tego, że w pliku tpl w petli probowałęm wyświetlić zawartość pola user_id a w zapytaniu w funkcji get_comments nie pobierałem wogóle tego pola z bazy winksmiley.jpg

nie dokońca rozumiem dlaczego akurat błąd o takiej treści ale ważne, że teraz wszystko działa biggrin.gif dzięki za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.