Nějaký star rating do Nette 2?
- Radimorous
- Člen | 30
Chci si nechat zobrazit galerii obrázků s tím, že u každého obrázku bych chtěl star-rating třeba v rozmezí 1–5 se zapisováním hodnocení do databáze. Co jsem se díval na komponenty, tak jediný rating, co tu je, nefunguje pro Nette 2. Neřešil někdo něco podobného v poslední době? Jestli jo, tak podle kterého návodu? Za nějaký odkaz na tutorial bych byl vděčný – google sice vyhledá dost řešení, ale pokud někdo má nějaký funkční a vhodný do Nette 2, budu rád.
EDIT: Případně by stačilo i hodnocení +/-, když by nebyl star rating.
Editoval Radimorous (10. 1. 2012 17:45)
- Radimorous
- Člen | 30
No je to pech, že RatingControl pro Nette 2 nefunguje a jiná alternativa není. Třeba někdy někdo RatingControl aktualizuje, když ho bude sám potřebovat :)
- Michal Vyšinský
- Člen | 608
Já bych se na to klidně podíval – ale moc se nevyznám
v licencích – můžu ten kód upravovat?
Tak jsem si našel že můžu :)
Tak tady je demo (na
nejnovější betě)
A tady je samotný „control“: http://cherryboss.php5.cz/…gControl.zip
Použití je stejné jako původní, akorát je zde jedna změna:
$rating->setRatingModel(new RatingModel);
Změnit na:
$rating->setRatingModel(new RatingModel($this->getService("session")));
Respektive předat modelu službu session
Editoval CherryBoss (12. 1. 2012 11:50)
- Radimorous
- Člen | 30
iguana007: Bylo by to bohužel nad moje síly… :)
CherryBoss: Díky díky! Dnes se na Tvé řešení podívám a zkusím si ho naimplementovat.
redhead: Pokud to bude fungovat, tak je mi vcelku jedno jak :-)
- Radimorous
- Člen | 30
CherryBoss: Ještě dotaz než se pustím do změn kódu, půjde těch star ratingů mít na stránce víc? Potřeboval bych jich třeba deset, nebude to problém?
- Michal Vyšinský
- Člen | 608
Ano funguje to (přidal jsem to do dema). Můžeš mít více ratingů. Použiješ na to jedinou továrničku:
protected function createComponentRating($name) {
$rating = new RatingControl($this, $name);
$rating->setRatingModel(new RatingModel($this->getService("session")));
}
A v šabloně:
{control rating testRating}
{control rating testRatingTwo}
A máš dva různé rating.
Ad model: Ten si musíš udělat vlastní (resp. upravit RatingModel) – ten jsem neupravoval – nyní vrací statické hodnoty.
Editoval CherryBoss (14. 1. 2012 13:16)
- Radimorous
- Člen | 30
CherryBoss: Díky za úpravu, má to jen menší vadu, že když mám na stránce více ratingů, odhlasuji první, tak vyskočí „thank you for voting!“. Když pak odhlasuji druhý, tak to „thank you for voting!“ zmizí u prvního ratingu. Ale to je jen detail, funkčnosti to neubližuje, takže to nevadí.
- Michal Vyšinský
- Člen | 608
Upraveno: přesunul jsem poslání flash zprávičky do render metody – kdy bylo hlasováno → pošle se zprávička (thank you…). Tím pádem bude „thank you…“ vidět po celou dobu (až do vymazání cookies v prohlížeči)
Editoval CherryBoss (15. 1. 2012 11:24)
- Radimorous
- Člen | 30
CherryBoss: Teď to funguje výborně, díky za úpravy! Takže už „jen“ musím zprovoznit připojení do databáze, aby mi nefungovalo jen v app\Models\Model.php, ale i v app\controls\RatingModel.php
Sice offtopic dotaz, ale nechci zakládat zbytečně nový vlákno. V app\Models\Model.php pracuji s databazí jednoduše takto:
<?php
class Model extends \Nette\Object
{
public $database;
public function __construct(Nette\Database\Connection $database)
{
$this->database = $database;
}
public function getOdkazy()
{
return $this->database->query('select .........');
}
?>
Jak co nejjednodušeji zprovozním databázový připojení i do app\controls\RatingModel.php abych mohl zase jedním řádkem kódu přes sql dotaz přistoupit k datům?
Editoval Radimorous (15. 1. 2012 22:44)
- Michal Vyšinský
- Člen | 608
Modelu přidej privátní proměnnou $database;
Kontruktor modelu uprav takto:
public function __construct($session_service, Nette\Database\Connection $database) {
$this->session = $session_service;
$this->database = $database;
}
A pak změň v továrničce toto:
$rating->setRatingModel(new RatingModel($this->getService("session")));
na toto:
$rating->setRatingModel(new RatingModel($this->getService("session"), $this->getService("database")));