Főoldal   Súgó Bejelentkezés Regisztráció  
Üdvözlünk, Vendég. Kérlek jelentkezz be vagy regisztrálj.

Jelentkezz be a felhasználóneveddel, jelszavaddal és add meg a munkamenet hosszát
1 évet fizetsz kettőt kapsz a CakePHP tárhely programban!
Silver csomag pl.: 1000MB tárhely, MySQL vagy PostgreSQL.
.hu domain címmel - 12.900 Ft + Áfa / 2év
Hírek: Exkluzív bejelentés CSAK CakePHP.hu fórumlátogatóknak!  Általános blabla...
Oldalak: [1]   Le
Nyomtatás
Téma: Három tábla mentése egy űrlapról  (Megtekintve 180 alkalommal)
« Dátum: 2011. November 07. - 14:20:29 »
kisspepe Nem elérhető
Kölyök tag

Profil megtekintése E-mail
**
Hozzászólások: 88



Sziasztok!

Adott az alábbi adatbázis kapcsolat:



- user -  tábla tárolja a felhasználók alap adatait.
- user_feature_names - tábla tárolja a felhasználóknál külön bekért adatokat, valamint hogy ez milyen típusú és kötelező-e megadni
- user feature tartalmazza a user_feature_names-ben lévő kérdésre a választ felhasználónként, és tárolja, hogy melyik kérdés-válasz, melyik felhasználóhoz tartozik.

A regisztrációs adatlap bekéri az alap adatokat és a user_feature_names-ben kért adatokat. Hogyan tudom ennek megoldani a mentését?

Le kell menteni a user-t, a user_feature_names - user_features párosokat, és ezekhez hozzákapcsolni a user_id-t.
« Utoljára szerkesztve: 2011. November 07. - 14:28:08 írta kisspepe » Naplózva
« Válasz #1 Dátum: 2011. November 07. - 14:40:22 »
sipiatti Nem elérhető
Újonc

Profil megtekintése E-mail
*
Hozzászólások: 43



ha jól vannak definiálva a kapcsolatok, és az űrlap inputok, akkor a $this->Model->saveAll($this->data) megcsinálja neked.

ha a form user alapú, akkor $this->Form->input('UserFeatures.field1') egy userfeature-höz tartozó inputot hoz létre a field1 mezőhöz.

Miért nem tárolod a user táblában ezeket a dolgokat? Tényleg ilyen nyakatekert módon akarod tárolni a user adatokat? Minek a kérdéseknek egy külön tábla? Annyit fog dinamikusan változni hogy szükség van rá? Annyi usered lesz, hogy a db queryket optimatizálni kell?
Naplózva
« Válasz #2 Dátum: 2011. November 07. - 14:48:15 »
kisspepe Nem elérhető
Kölyök tag

Profil megtekintése E-mail
**
Hozzászólások: 88



Azért így csinálom, mert ez egy szakdolgozat. Egy webáruház CMS lenne, és ennek az lenne a lényege, hogy az adminisztrátor ha szeretne még valamit tudni a felhasználóktól, akkor felvesz egy új adatot a user_feature_names táblába, és onnantól a regisztrációs adatlapon az is egy kérdés lesz.

A probléma az még ott van, hogy az input mezőket, amik a user_feature_names alapján megjelennek, azt egy foreach ciklussal generálom. Namost hol kellene megadnom a user_feature_names egyes mezőinek id-ét, hogy a saveAll tudja melyik id-t kell párosítani a user_features id-vel?
Naplózva
« Válasz #3 Dátum: 2011. November 07. - 17:50:07 »
sipiatti Nem elérhető
Újonc

Profil megtekintése E-mail
*
Hozzászólások: 43



gondolom egy arrayon lépkedsz végig, ha finddal kérted ki a modelből akkor van id meződ, bár ez elég bonyolult, lehet a saveAll nem tudja megoldani.
Ha így van, akkor a kapott form adatokból kiveszed a user adatokat egy tömbbe és először megcsinálod a usert, majd az idjét felhasználva elmentegeted egy ciklussal a válaszokat
Naplózva
« Válasz #4 Dátum: 2011. November 07. - 18:14:52 »
kisspepe Nem elérhető
Kölyök tag

Profil megtekintése E-mail
**
Hozzászólások: 88



Igen én is azt néztem a leírások alapján, hogy külön külön lementeni lenne a legegyszerűbb.

Igen egy tömbön lépkedek végig foreach-el, és így állítom elő az input mezőt. Az if-es ellenőrzés a típust ellenőrzi, ez egy egysoros szövegmező lesz. A $counter pedig egy számláló, mely 0-ról indul és minden ciklusban egyel nő. Valószínű mindegyikhez ugyan ezzel a sorszámmal csinálni kellene egy hidden mezőt, mely a user_feature_names id-jét tárolja, és akkor végülis megvan minden adat, csak össze kell rakni és lementeni.

Kód:
if($userFeatureName['UserFeatureName']['type_id'] == 1) {
echo $this->Form->input('UserFeatures.'.$counter.'._value', array(
'label' => $userFeatureName['UserFeatureName']['name'],
'type' => 'text'
)
);
}

Ami még jó lenne, leellenőrizni a mezőbe írt értéket (user_feature_names kérdésre adott választ), hogy megfelelő-e, csakhogy mivel változó a típusa így ezt nem tudom hogy lehet megoldani. Maga az adat egy TEXT mezőben van letárolva, de lehet egysoros szöveg, többsoros szöveg, szám, boolean és dátum.
« Utoljára szerkesztve: 2011. November 07. - 18:17:47 írta kisspepe » Naplózva
« Válasz #5 Dátum: 2011. November 08. - 08:29:32 »
kisspepe Nem elérhető
Kölyök tag

Profil megtekintése E-mail
**
Hozzászólások: 88



Odáig eljutottam, hogy az űrlapot azt le tudom generálni foreach-al.

Kód:
foreach($userFeatureNames as $userFeatureName):
/*Legeneráljuk a user_feature_names tábla alapján
* az egyéni kérdéseket amit feltettünk a usernek.*/
if($userFeatureName['UserFeatureName']['required'] == true) {
//Típus ellenőrzés 1 = VARCHAR
if($userFeatureName['UserFeatureName']['type_id'] == 1) {
//Rejtett mező, mely tárolja a user_feature_names id-ét
echo $this->Form->input('UserFeatureNames.'.$counter.'.id', array(
'type' => 'hidden',
'value' => $userFeatureName['UserFeatureName']['id']
)
);

A $ counter számláló, mely minden ciklusban 1-el nő. Ezek előtt az inputok előtt ugye ott vannak azok az inputok, amik a user táblába kerülnek mentésre.

Majd ezt a következőképpen menteném:

Kód:
function registration() {
if(!empty($this->data)) {
if($this->data['User']['password'] == $this->Auth->password($this->data['User']['password_confirm'])) {
$this->data['User']['group_id'] = 2;
$this->User->create();
$this->User->save($this->data);

$counter = 0;
foreach($this->data as $data1):
$this->UserFeature->create();

$data2 = array(
'_value' => $data1['UserFeatures'][$counter]['_value'],
'user_feature_name_id' => $data1['UserFeatureNames'][$counter]['id'],
'user_id' => $this->User->id
);

$this->UserFeature->save($data2);
$counter++;
endforeach;
}

else {
$this->Session->setFlash(__('The two passwords do not match!', true));
}
}

else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); //Ha a data tömb üres, akkor nem tudtunk menteni
}

Azonban ez így nem jó, mert kidobja hibának, hogy Undefined index: UserFeatures és Undefined index: UserFeatureNames.

A Controllerből valahogy ki tudom íratni képernyőre a $this->data tömböt, hogy lássam mi van benne?
Naplózva
« Válasz #6 Dátum: 2011. November 08. - 09:01:19 »
sipiatti Nem elérhető
Újonc

Profil megtekintése E-mail
*
Hozzászólások: 43



igen a cakephp debug függvénye pont erre való
debug($this->data);die();

a die nem fontos, de célszerű, hogy amíg csak próbálgatod, addig ne dolgozza föl, meg view-ra sem vagy úgysem kíváncsi mikor a controlleren belüli állapotot vizsgálod
Naplózva
« Válasz #7 Dátum: 2011. November 08. - 14:58:35 »
kisspepe Nem elérhető
Kölyök tag

Profil megtekintése E-mail
**
Hozzászólások: 88



A mentés most már működik. Elmenti az adatokat a megfelelő helyre.

A mentés ugye úgy történik, hogy lementi a user alapadatait, hogy visszakapjam a user id-ért, majd a user id és a többi adat alapján összeállítom a megfelelő tömböt és lementem.

Viszont mi van akkor, ha a második mentést nem tudja megcsinálni. Akkor a user adatok egy része lesz csak elmentve, ami nem a legjobb, mert a többi adatnál is meg lehet adni, hogy kötelező-e.

Néztem, hogy a saveAll metódus az tranzakciókezelést használ. A három táblát azt a saveAll-al nem tudom lementeni, viszont tudok-e tranzakciót indítani, hogyha nem sikerülne a második mentés, akkor az előzőt is vissza tudja vonni?
« Utoljára szerkesztve: 2011. November 08. - 15:42:39 írta kisspepe » Naplózva
« Válasz #8 Dátum: 2011. November 09. - 12:21:14 »
sipiatti Nem elérhető
Újonc

Profil megtekintése E-mail
*
Hozzászólások: 43



Akkor a mentési műveletek előtt fel kell építened a tömböket, és validálni az adatokat.
Ha emlékeim nem csalnak van $this->Model->validate($data) metódus, minden cuccot validálsz, aztán ha gáz van, akkor nem mented, hanem kiírod a júzernek.
Mivel a form összetett, szerintem a beépített validálási üzenetek nem fognak neked megjelenni, ezeket a validálások után össze kell gyűjteni, és vagy beleépíted a $this->data-ba a megfelelő helyekre (de még így is kétségeim vannak, hogy jól teszi ki a formhelper) vagy kiírod te magad a viewban
Naplózva
Oldalak: [1]   Fel
Nyomtatás
Ugrás:  

2007 CakePHP Magyarország Fóruma
Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC
Magyar fordítás: SMF Magyarország
| Üzemelteti / Hosting: Elite Media     -     Támogatóink: Loovers Szexshop | És a HHO generátor