Sziasztok!
Valószínű, hogy egy nagyon kezdő kérdést teszek fel, de napok óta google-zom a dolgot és nem akadok a nyomára.
Van egy tartalomtípusom 4 mezővel:
- név
- korcsoport /lista/szöveges//
- versenyszám /lista/szöveges//
- idő /text field/
A nézetben ahol megjelenítem, a versenyszám egy felfedett szűrő és korcsoportonként rendezve jeleníti meg a versenyzőket.
Egy korcsoporthoz versenyszámonként több versenyző is tartozik különböző időkkel.
Én azt szeretném, hogy a leválogatásban korcsoportonként csak 1, a legjobb idővel rendelkező jelenjen meg.
Hogyan lehet megadni a szűrésnél, hogy a legnagyobb értéket szűrje le?
Előre is köszönöm a választ.
Zsolt
Melyik modulhoz, modulokhoz kapcsolódik a téma?:
Drupal verzió:
Fórum:
rendezés + elemszám korlátozása
Szerintem az megfelelő lenne, ha az idő alapján rendezed növekvő sorrendbe, aztán a lapozó részben beállítod, hogy megadott számú elemet (egyet) jelenítsen meg.
Ranglista szerűség
Köszönöm a válaszod.
Azt hiszem nem fejtettem ki világosan a kérdést.
Szóval van 12 korcsoportom, ami alapján növekvő sorrendbe van rendezve a táblázat. Korcsoportonként csak 1 jelenhet meg, mert ez egy olyan ranglista szerűség. Ezért szeretném először leszűrni a legjobb eredményt korcsoportonként és utána megjeleníteni mind a tizenkettőt egymás alatt.
Ott akadtam el, hogy hogyan lehet megjeleníteni szűrésnél a legmagasabb értéket?
Lehetséges hogy nem helyes a gondolatmenetem és ezért nem tudok elvonazkoztatni ettől a megoldástól.
Az SQL-ben a MIN() függvény
Az SQL-ben a MIN() függvény szolgál arra, hogy egy oszlop leválogatott értékei közül kiválaszd a legkisebbet. Azaz miután a lekérdezésben szűrtél versenyre és korcsoportra a SELECT utasításban, a maradék sorok idő értékeiből kiválaszd a legkisebbet (a nyertes idejét), majd ehhez a nevet.
Na ez a MIN() (és a fordítottja a MAX() ) szerintem nincs beépítve a Views-ba, így nem fogod tudni összerakni, amit szeretnél. Vagy csinálsz egy saját node.tpl-t és abban egy saját lekérdező függvénnyel összerakod, amit szeretnél vagy beveted a Vews PHP modult, amiről le fognak beszélni.
Csökönyi Ferenc
views_get_result
Javagyúgy, félreértettem. Namost a következő megoldás bizonyára nem a legjobb, alighanem már gányolásnak minősül és a teljesítményre sincs jó hatással. De jobbat, elegánsabbat sajnos nem tudok létrehozni.
Készítesz egy nézetet, ami adott korcsoportnál megjeleníti az első legjobbat, a korcsoport id-ját szövegkörnyezeti szűrőként megadva neki. Aztán készítesz egy másik nézetet, amiben szükség lesz a views_php modulra. Ebben a nézetben csak a korcsoportok id-ját (meg a nevét) kérdezed le. Továbbá hozzáadsz egy PHP-mezőt, amiben a views_get_result() függvénnyel meghívod az első nézetet és átadod neki argumentumként az adott korcsoport id-ját.
Attól félek erre egyszerűbb
Attól félek erre egyszerűbb egy saját query-t írni.
Itt találsz egy jópofa megoldást a problémára: http://stackoverflow.com/questions/12102200/get-records-with-max-value-f...
itt találsz rá példást, hogy egy kis query_alterrel hogyan tudod átírni a views query-t.
http://drupal.stackexchange.com/questions/73/custom-query-in-views
(ehhez már modult kell fejleszteni.)
Persze, lehet hogy van egyszerűbb megoldás.
pp
Palócz István
https://palocz.hu | https://tanarurkerem.hu
tanácstalanság :(
Hú, nagyon köszönöm mindenkinek.
Sajnos az én tudományom nem ér túl a kattingatós megoldásoknál. Azt hittem, hogy a legnagyobb érték szűrése sokkal hétköznapibb kérdés, minthogy valami új dolgot kelljen összeszegelni.
Nekifekszem ennek a views php dolognak, vagy valami egyszerűen beépíthető lekérdezésnek.
Jelenleg tanácstalan vagyok.
Views Field View, ha a modulfejlesztés nem barát
Én modult írnék rá, de ha ez sok, akkor esetleg a következő megoldás jó lehet.
Felteszed a Views Field View modult. Ezzel egy views lekérdezésbe egy másik views lekérdezést lehet beilleszteni mezőként.
Kulcsszavakban:
korcsoportok_legjobbjai views
mezők: korcsoport, név
rendezés: idő
pager: Display a specified number of items 1
contextual filters: versenyszám
versenyszam views
mezők: versenyszám, Global: Views (ebben megadod az előző views lekérdezést)
Tehát az egyik lekérdezésen belül lesz egy másik lekérdezés, ami szövegkörnyezeti szűrőként meg fogja kapni a külső lekérdezés megadott mezőjét. Ezen felül sorbarendezzük idő szerint és csak egy rekordot engedünk megjeleníteni.
Remélem érthetően hadováltam...
Kiss Norbert
adatmentespecs.hu
remény
Köszi, ez megvalósíthatónak tűnik számomra, este nekifekszem és referálok az eredményről.
Views 3 aggregation
Van kattintgatós módszer is. Views 3-ban a 'Use aggregation' bekapcsolása után elérhetővé válnak a mezők min/max/sum stb. lehetőségei. Tehát nem a szűrőknél, hanem a mezők beállításainál.
Count, sum, average, min, max in Views
Ha ez valamiért nem lenne elég: views_aggregator.
aggregation modul
Köszönöm, erre a modulra pár napja már ráakadtam, de sajnos nem tudom rávenni hogy azt tegye amit én szeretnék.
Ha van vele tapasztalatod, egy pár szóban megosztanád légyszíves?
az alap Views modul is meg tudja oldani
Sajnos személyes tapasztalatom nincs vele, ha nem volt elég a Views modul és inkább saját modullal oldottam meg.
Viszont az alap Views modul is meg tudja oldani a problémádat. Ha nem működik megfelelően a MAX(idő) az aggregáció beállítása után (ebben tudok segíteni), akkor próbáld meg átallítani az idő mezőt szövegesről számmá. Kattintgatós megoldáshoz használhatod pl. ezt: hms_field modul.
és az alap views-beállítás?
Nekem pont most volt hasonlóra szükségem (megszámolni, hogy egy tartalomhoz hány másik tartalmat csatoltak) és a views összevonás funkciója teljesen jól működött:
- A views felületének jobb oldalán, a haladó szekció > Egyebek-ben bekapcsolod az Összevonás használatá-t
- Ekkor a mezők, szűrök, rendezés minden eleme mellett megjelenik az összevonás beállítása link
- Amelyik elemnél erre szükség van, ezen belül választhat néhány statisztikai jellemző (mennyiség, összeg, min, max, szórás) közül. Erősen meglepődnék, ha egy dátum/idő formátumú mező értékeiből nem számolná ki a minimumot.
- Még arra lenne szükség, hogy a Formátum > Formátum > Beállításokban csoportosíts a korcsoportok szerint. Azt gondolom, így minden korcsoportban csak a legjobb időeredmény jelenne meg.
Összevonás angolul Use aggregation
igen, az Összevonás angolul az a Use aggregation amiről korábban írtam. Hirtelen nem ugrott be magyarul.
kattintós módszerrel is megy ez
csak úgy elég manuális lesz. korcsoportonként egy-egy blokk van berakva egymás alá, ez ahány korcsoport, annyi views block lesz, mert mindegyikben másik szűrő kell majd a korcsoportra.
vagy egy page manager oldal, amibe egymás alatt 12x szerepel ugyan az a view, ami kapott érték alapján adott korcsoport legjobbját visszaadja. ekkor csak egy nézet kell és azt kell "csak" berakni 12x és mindig beállítani hogy a contextual filter most éppen melyik korcsoport legyen. hátránya többek között leginkább az lesz, hogy ha holnap lesz egy új korcsoport, mégegyszer hozzá kell adni a nézetet a page manager oldalhoz.
de legalább egy betü kódot nem kell írni. :)
-
clear: both;
Megszületett a megoldás
Először is köszönöm nektek, hogy ilyen sokan foglalkoztatok a problémával. Végigpróbáltam az ötleteket, az elsőket sajna nem mert kódokba belebabrálni sajna nem megy. A views field view nagyon hasonló mint amit aboros ajánlott csak modul formában. A kimenetük nem tetszett és azok az extra szűrések amiket hozzá kell még adnom, nagyon megbonyolította volna.
Sok próbálkozás után végül is megszületett a megoldás kattingatósan és tisztán.
A kulcsszó: Views Aggregator Plus.
Ez a modul kiterjeszti a nézet formátumait egy Table with aggregation options lehetőséggel. Ennek a beállításaiban meg lehet adni, hogy soronként vagy oszloponként hogyan reagáljon.
Leírom, hogy mit tettem, mások okulására.
Formátum:Table with aggregation options
MEZŐK
Tartalom: Korcsoport (Korcsoport)
Tartalom: Név (Név)
Tartalom: Versenyszám (Versenyszám)
Tartalom: Versenyidő (Versenyidő)
SZŰRÉSI FELTÉTEL
Tartalom: Közzétéve (Igen)
Tartalom: Típus (= aktuális típus)
Tartalom: Versenyszám (felfedett)
RENDEZÉSI SZEMPONT
Tartalom: Korcsoport (növekvő)
Tartalom: Versenyidő:format (növekvő)
Table with aggregation options beállítása:
A korcsoport mezőnél be kell pipálni a Apply group function-t és a megjelenő ablakban bejelölni a Display first member és a Group and compress lehetőségeket.
A lapozónál kiválasztani a minden elem megjelenítése opciót.
Ezzel kész is
Mi is történik. Gyakorlatilag mint a views field view és aboros megoldásában, csak elegánsabban.
Nem a legkisebb értéket kell kiválasztani, hanem sorba rendezni először korcsoport, majd versenyidő szerint, utána a Table with aggregation options korcsoportok sorában csoportosít és leválasztja az első értéket, ami a legkisebb.
Lehet hogy nem ez a legprofibb megoldás, de ez működik textfield mezőben lévő számmal és a hms_field modul által generált mezőben lévővel is.
Sajna nem jöttem rá, hogy a minimum kiválasztását hogyan oldhatom meg egyenesen. Sőt egy csomó megválaszolatlan kérdés van a fejemben, de azokat máshol, máskor.
Update: Miközben ezeket a sorokat írtam beugrott, hogy nem próbáltam idő sorbarendezés nélkül a Table with aggregation options kategória sorában a Group and Compress és a Minimum beállítást, ami a legkézenfekvőbb lenne. Megtettem, láss csodát működik :). Mentségemre amíg megértettem a modult nagyon sok beállítást próbáltam és elkavarodtam.
Természetesen ahogy aboros írta valahol, azért szeretjük a Drupal-t, mert nagyon sokféle megoldást kínál.
Mégegyszer köszönöm mindenkinek