Komunikacja Między Użytkownikami
#1
Posted 31 July 2013 - 01:32 AM
Chciałbym stworzyć coś na zasadzie systemu komunikacji między użytkownikami opartym na bazie danych. Moja główna koncepcja wygląda tak, że tworze formularz, w którym jednym z pól będzie user_id do którego będzie adresowana wiadomość. Następnie z bazy danych pobrać wszystkie wiersze w których user_id = aktualnemu zalogowanemu id i wyświetlić to.
Tu pojawia się pytanie, czy takie coś w ogóle ma sens ? Nie próbowałem nigdy wcześniej niczego w tym stylu więc nie wiem czy takie rozwiązanie się sprawdzi.
#2
Posted 31 July 2013 - 01:41 AM
Wszystko ma sens, jeżeli tylko spełani twoje założenia. Po twoim poscie widzę jednak, że po prostu potrzebujesz motywacji, więc weź się do roboty i nie marudź

p.s jak Ci nie wyjdzie, to zacznij od początku.
#3
Posted 31 July 2013 - 01:45 AM
.viktor., on 31 July 2013 - 01:41 AM, said:
Wszystko ma sens, jeżeli tylko spełani twoje założenia. Po twoim poscie widzę jednak, że po prostu potrzebujesz motywacji, więc weź się do roboty i nie marudź

p.s jak Ci nie wyjdzie, to zacznij od początku.
Ta coś w tym jest ^^ Trochę marudzę, ale tylko dlatego, że ostatnio długo męczyłem się z czymś co okazało się nietrafione

#4
Posted 31 July 2013 - 03:04 AM
adres_user_id - id usera do którego będzie wysyłana wiadomość
Udało mi się uzyskać już to co chciałem. Wysyłam wiadomość do użytkownika wybierając jego imie z dropDownList, następnie w view/adresat/index.php wyświetlam tylko te wiadomości w których adres_user_id = id usera zalogowanego.
controller:
public function actionIndex() { $current_id = Yii::app()->user->getId(); $dataProvider=new CActiveDataProvider('Adresat', array( 'criteria'=>array( 'condition'=>'adres_user_id='.$current_id, 'order'=>'data_utworzenia DESC', ) )); $this->render('index',array( 'dataProvider'=>$dataProvider, )); }
model:
public function getAllUser() { $model = User::model()->findAll(array('order'=>'id')); $list = CHtml::listdata($model, 'id','firstname'); return $list; }
form:
<div class="form"> <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'adresat-form', 'enableAjaxValidation'=>false, )); ?> <p class="note">Fields with <span class="required">*</span> are required.</p> <?php echo $form->errorSummary($model); ?> <div class="row"> <?php echo $form->labelEx($model,'tytul'); ?> <?php echo $form->textField($model,'tytul',array('size'=>45,'maxlength'=>45)); ?> <?php echo $form->error($model,'tytul'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'tresc'); ?> <?php echo $form->textArea($model,'tresc',array('rows'=>6, 'cols'=>50)); ?> <?php echo $form->error($model,'tresc'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'podpis'); ?> <?php echo $form->textField($model,'podpis',array('size'=>45,'maxlength'=>45)); ?> <?php echo $form->error($model,'podpis'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'adres_user_id'); ?> <?php echo $form->dropDownList($model,'adres_user_id',$model->getAllUser()); ?> <?php echo $form->error($model,'adres_user_id'); ?> </div> <div class="row buttons"> <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> </div> <?php $this->endWidget(); ?> </div><!-- form -->
Teraz mam 2 pytana, na które nie znam odpowiedzi.
1) Jak wykombinować żeby wysyłać wiadomość jednocześnie do kilku użytkowników ??
2) Wysyłać też np. też do grupy użytkowników, tzn: mam w tabeli user kolumne group_id, która pobiera wartość z tabeli group. Chciałbym zaznaczyć np checkbox w stylu "Wyślij do grupy nr 1" i w ten sposób wyłapie mi wszystkie user_id należące do tej grupy.
#5
Posted 01 August 2013 - 11:03 AM
Tabela message: id, sender_id, receiver_id, owner, title, message, readed, readed_time, time
Myslę że nie muszę reszty tłumaczyć, a jedynie kolumne owner. Jeżeli jest wartość 0 to znaczy że należy ona do nadawcy, jeżeli 1 to należy do adresata, a 2 to należy do wszystkich. I każdą wiadomość wstawiasz dwa razy do bazy, aby inni nie kasowali nam tej samej wiadomości
#6
Posted 01 August 2013 - 12:35 PM
Nie do końca jeszcze wiem jak dobrze to zrobić z kasowaniem tych wiadomości (póki co najprawdopodobniej zablokuje możliwość usuwania)
Takie jeszcze pytanie, czy do twojego systemu używałeś rozszerzenia do edytowania tekstu w wiadomościach ? Coś na styl http://www.yiiframew...ion/extckeditor czy pozostawiłeś tak jak jest oryginalnie?
#7
Posted 01 August 2013 - 01:40 PM
#8
Posted 02 August 2013 - 01:22 AM
"Never memorize what you can look up in books."
Albert Einstein
#9
Posted 02 August 2013 - 02:21 AM
andrzej1_1, on 01 August 2013 - 11:03 AM, said:
Tabela message: id, sender_id, receiver_id, owner, title, message, readed, readed_time, time
Myslę że nie muszę reszty tłumaczyć, a jedynie kolumne owner. Jeżeli jest wartość 0 to znaczy że należy ona do nadawcy, jeżeli 1 to należy do adresata, a 2 to należy do wszystkich. I każdą wiadomość wstawiasz dwa razy do bazy, aby inni nie kasowali nam tej samej wiadomości
Wydaje mi sie, że redundancja danych nie ma tu uzasadnienia. Jeśli wiadomość ma trafiać do więcej niż jednego adresata to należy utworzyć relację między tabelami Message i User:
User->messagesSent, HAS_MANY
Message->sender, BELONGS_TO
User->messagesReceived, MANY_MANY
Message->recipients, MANY_MANY
Skasowanie wiadomości w skrzynce danego użytkownika będzie wtedy odbywało się poprzez skasowanie rekordu (bądź umowne oznaczenie go jako skasowany) w tabeli pomocniczej.
#10
Posted 02 August 2013 - 03:32 AM
sidewinder, on 02 August 2013 - 01:22 AM, said:
Dzięki za info, nie miałem o tym pojęcia

Co do rozdzielania tego na Many_Many to też jeden ze sposobów. Póki co w wersji podstawowej myślę, że pierwszy pomysł wystarczy
