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?
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;
}
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?
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.
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;
}
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;
}