Komunikacja Między Użytkownikami

Witam.

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.

Cześć

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 :D

adresat - model testowy dla wiadomości

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.

Ostatnio robiłem u siebie system prywatnych wiadomości, więc mogę ci podpowiedzieć jak ma to wyglądać.

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

Dzięki wielkie. Zastanawiałem się jak to zrobić myśląc nad bardzo złożonymi sposobami a można to zrobić tak prosto…

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.yiiframework.com/extension/extckeditor czy pozostawiłeś tak jak jest oryginalnie?

Zostawiłem oryginalne, ale jeżeli chcesz jakiś edytor to bierz ckeditor bo ja z niego korzystałem i był dobry

Nie zapominajcie, że jako użykownicy Yii mamy prawo do skorzystania z licencji oemowej na Imperavi Redactor.

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.

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 :)