Witam. Widziałem że wyszukiwanie można zrobić w CGridView podając dataprovider=>$model->search() i filter=>$model, lecz ja chciałbym uzyskać coś podobnego tylko bez CGridView. Dodatkowo chciałbym , aby nie wyszukiwało i wyplowało masy danych, lecz same id. Jak to uzyskać? Nadpisać metodę search w modelu?
Witam
Możesz zrobić tak jak pisałeś, możesz napisać zwykłe zapytanie SQL i wynik będący tablicą ładujesz do obiektu http://www.yiiframework.com/doc/api/1.1/CArrayDataProvider i zwracasz jako wynik funcji. Metoda search() zwraca obiekt CActiveDataProvider, który zawiera dane w postaci aktywnych rekordów, więc tu będzie analogicznie. Oba obiekty dziedziczą z tegj samej klasy i mają taką samą obłsugę w widzetach typu CgridView i innych.
Trochę nie zrozumiałem twojej odpowiedzi. Chcę korzystać z widoku _search wygenerowanego przez CRUD i otrzymywać tylko tablice która zawiera same ‘id’ użytkowników spełniających kryteria.
Mam takie coś w modelu:
public function search() {
$criteria = new CDbCriteria;
$criteria->select='id';
...
$criteria->compare('username', $this->username, true);
...
return $criteria;
}
W widoku:
$x=User::model()->findAll($model->search());
var_dump($x)
I teraz wywala to pełno danych, a nie same id. Dodatkowo chciałbym zapytać czy takie coś w widoku nie łamie wzorca MVC? Bo nie wiem za bardzo jak to wrzucić w kontroler by działało
Dlaczego akurat metoda search() ? Ta metoda jest po to zeby uzywac aktywnego rekordu i wypluc dane wlasnie w tym formacie, Ty jak rozumiem chcesz pobrac proste dane z bazy wiec po to robic AR ?
Tak kazde wrzucenie tego typu logiki do widoku sprawi ze lamiesz wzorzec MVC. Mysle ze latwiej byloby Ci napisac jaki masz problem i bysmy zaproponowali rozwiazanie opytmalne a nie opierajace sie na metodzie search. To jak przerobienie porsche na malucha, da sie ale po co ?
Ok to od początku. Mam funkcję sendMessage() która wysyła wiadomość do użytkowników o id podanych w parametrze w postaci tablicy. Chcę, aby admin miał możliwość wyszukać sobie użytkowników o danych kryteriach i do nich wysłać wiadomość. W tym celu chciałbym użyć widoku _search wygenerowanego przez crud’a.
Mam nadzieję że teraz wszystko jasne i że uda wam się mi coś podpowiedzieć
P.s metody takie jak sendMessage() powinny byc w kontrolerze czy modelu?
Ok, teraz trochę bardziej rozumiem o co chodzi i mam nadzieję że będę w stanie pomóc.
Jednym słowem potrzebujesz zwykłego array’a ale chcesz użyc CDbCriteria dla zapytania o konkretne rekordy.
Prosty przykład:
$criteria=new CDbCriteria;
$criteria->select='title'; // wybierz tylko kolumnę 'title'
$criteria->condition='postID=:postID';
$criteria->params=array(':postID'=>10);
$post=Post::model()->findAll($criteria);
i wtedy masz obiekt który musisz zmienić na array’a np.
Tam masz fajna metodę która pozwoli Ci to zrobić. Mam nadzieje ze nakreslilem jakis obraz w razie czego pytaj jak cos jest nie jasne.
sendMessage moze byc w kontrolerze bo rozumiem ze bedziesz to ajaxem lub jakos inaczej wołał, ale te metody które ja wrzuciłem powinny już bardziej znaleźć sie w modelu i kontroler powinien tylko o nie pytac.
Pozdrawiam,
@mirunho Oto mi chodziło, dzięki.
Zabrałem się za poprawianie kodu, gdyż wszystko co dotychczas robiłem było jakby strukturalne. Wszystko siedziało w kontrolerach, bez jakichkolwiek dodatkowych metod. Na pierwszy ogień poszły wiadomości i już mam problem, a mianowicie:
Fatal error: Using $this when not in object contex
W kontrolerze mam coś takiego:
public function actionView($id) {
$model=Message::model()->user()->findByPk($id);
if($model->receiver_flag=='0') $model->saveAsRead();
$this->render('view', array('model' => $model)));
}
A w modelu Message:
public static function saveAsRead() //zmiana wiadomosci na przeczytana
{
if($this->receiver_flag=='0')
{
$this->receiver_flag='1';
$this->readed_time=new CDbExpression('NOW()');
$this->save(false);
return true;
}
return false;
}
Widzę że ten $this jest źle użyty, ale tutaj: http://www.yiiframework.com/doc/blog/1.1/pl/comment.admin jakoś działa, więc co jest grane? A i czy ten kod co wstawiłem już można nazwać zgodnym z MVC?
w metodzie zadeklarowanej jako "static" nie można się odwoływać do wskaźnika "$this". Ponieważ jednak i tak w akcji metoda nie jest wywoływana statycznie tylko w kontekście instancji obiektu, a treść metody nie sugeruje żeby to miała być faktycznie metoda statyczna - wystarczy, że usuniesz "static" z deklaracji metody i powinno zadziałać.
public function saveAsRead() //zmiana wiadomosci na przeczytana
{
if($this->receiver_flag=='0')
{
$this->receiver_flag='1';
$this->readed_time=new CDbExpression('NOW()');
$this->save(false);
return true;
}
return false;
}