[Noob] Co Ten Fragment Kodu Ma Dać

Być może wyda się Wam ten post strasznie niskiego lotu, być może nie powinienem w ogóle poruszać tego temat, jednak nie umiem zrozumieć co się tutaj dzieje.

Jestem w sytuacji świeżo po wygenerowaniu aplikacji za pomocą yiic, która utworzyła mi szkielet/trzon aplikacji, a że zaczynam z YII to gmeram po plikach, zmieniam, porównuję, zaprzyjaźniam się z błędami i ogólnie próbuję poznać tego FW

W kodzie kontrolera Site jest opisana funkcja actionLogin




public function actionLogin()

	{

		$model=new LoginForm();

		echo '<pre>';

		print_r($_POST);

		echo '</pre>';


		// if it is ajax validation request

		if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')

		{

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}


		// collect user input data

		if(isset($_POST['LoginForm']))

		{

			$model->attributes=$_POST['LoginForm'];

			echo '<pre>';

				print_r($model->getAttributes);

			echo '</pre>';

			// validate user input and redirect to the previous page if valid

			if($model->validate() && $model->login())

				$this->redirect(Yii::app()->user->returnUrl);

		}

		// display the login form

		$this->render('login',array('model'=>$model));

	}



Najbardziej interesuje mnie linia:




$mode->attributes = $_POST[;LoginForm'];



Rozumiem, że jest tworzony obiekt na podstawie modelu LoginForm, warunek dotyczący AJAX’a mnie nie interesuje i później jest sprawdzenie czy jest ustawione pole LoginForm w zmiennej $_POST i tu jest coś czego nie do końca ogarniam. Wydaje mi się, że tablicę przesyła do atrybutów utworzonego modelu - te które są public username,password,rememberMe jednak nie umiem tego jakoś sobie udowodnić.

Widze, że jest properties attributes dla CModel, którego zadaniem - wg mnie - jest "ułożenie" przekazanego mu parametru w zmiennych modelu, które są później wykorzystywane przy funkcji validate. Ale czy tak jest faktycznie ?

$_POST[‘LoginForm’] jest tablicą wartości pól formularza. Zauważ, że w źródle formularza masz przykładowo


<input name="LoginForm[username]" id="LoginForm_username" type="text" />

$model->attributes jest właściwością obiektu gromadzącą wszystkie właściwości w postaci tabeli. Można użyć mniej bezpośrednio $model->setAttributes($_POST[‘LoginForm’]) z takim samym skutkiem.

Można też się bawić dłużej i dać:




$model->username = $_POST['LoginForm']['username'];

$model->password = $_POST['LoginForm']['password'];

$model->rememberMe = $_POST['LoginForm']['rememberMe'];



ale po co, skoro można wszystko od razu?

OK, czyli jest tak jak myślałem. CModel->attributes przypisuje to właściwości obiektu wartości, które się tam przypisują "magicznie" (każde do swojego pola). Pytanie #2 w jaki sposób mam sprawdzić, że faktycznie mi się one przypisały. Próbowałem CModel->getAttributes echować, jednak bez zadowalającego skutku.

PS. Dzięki za cierpliwość w tłumaczeniu tej podstawowo-podstawowej wiedzy.

Np.


echo $model->username;

echo $model->password;

echo $model->rememberMe;

lub


CVarDumper::dump($model, 10, true);

lub


CVarDumper::dump($model->attributes, 10, true);

Pamiętaj, że za pomocą $model->attributes=$_POST[‘LoginForm’]; “magicznie” zostaną przypisane tylko te atrybuty, które w modelu oznaczone są jako “safe”.

Jeśli atrybuty są wymienione w tablicy rules() w modelu to zazwyczaj są jako "safe" (wyjątek to reguła unsafe).

Lektura obowiązkowa: http://www.yiiframework.com/doc/guide/1.1/en/form.model

Jeśli zaczynasz z Yii, to zacznij z tego miejsca: http://www.yiiframework.com/doc/guide/1.1/en/index - jest też polska wersja.

:) właśnie dotarłem do tego, że rules() w modelu to konieczna sprawa bo w innym wypadku CModel->attributes był ciągle pusty - jedno z moich poprzednich pytań. Odnośnie lektury obowiązkowej zapoznam się, a drugi link ( w wersji PL ) zatrzymałem się w miejscu, z którego post rusza.