Szukanie Id Spełniających Kryteria

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.

http://www.yiiframework.com/forum/index.php/topic/41922-convert-model-with-relations-to-php-array-and-json/page__p__199571__fromsearch__1#entry199571

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;

}