1 Formulier in 2 tabellen opslaan
ik ben bezig met een website voor mijn jeugdteam voetbal.
Als ik een nieuwe club wil aanmaken heeft die club een eigen tabel.
club
- clubnaam
- clublogo
- clubadres_id
en de adressen in een aparte tabel.
voor beide tabellen heb ik een klasse gemaakt.
tot nu toe wordt alles via een controller class in een array gepakt en verwerkt.
class Club extends Controller {
function __construct() {
parent::__construct();
}
function index() {
$this->view->render('club/index');
}
public function create() {
$data = array(
'club_name' => $_POST['club_name'],
'club_logo' => $_POST['club_logo'],
'address_street' => $_POST['address_street'],
'address_zipcode' => $_POST['address_zipcode'],
'address_city' => $_POST['address_city'],
'address_phone' => $_POST['address_phone'],
'address_fax' => $_POST['address_fax'],
'address_email' => $_POST['address_email'],
'address_homepage' => $_POST['address_homepage'],
);
$this->model->create($data);
header('location: ' . URL . 'club');
}
En vervolgens in een model wordt het pas verwerkt in de database.
class Club_Model extends Model {
public function __construct() {
parent::__construct();
}
public function create($data) {
$this->db->insert('address', array(
'address_street' => $data['address_street'],
'address_zipcode' => $data['address_zipcode'],
'address_city' => $data['address_city'],
'address_phone' => $data['address_phone'],
'address_fax' => $data['address_fax'],
'address_email' => $data['address_email'],
'address_homepage' => $data['address_homepage']
));
$lastID = $this->db->lastInsertId();
$this->db->insert('club', array(
'club_name' => $data['club_name'],
'club_logo' => $data['club_logo'],
'club_address_id' => $lastID
));
}
Model is de database verbinding.
Hoe krijg ik dit werkent dat alle adres gedeeltes in een class Address verwerkt worden en dat het deel in club terugpakt op een methode in adres om die gegevens daar te verwerken?
MvG,
Even geheel van het probleem af, is dit codeigniter, zo ja waarom dan een verouderde versie?
Ik gok zomaar dat dit versie 1.7x is terwijl we al op 2.1.3 zitten.
Je zegt dat Model de database verbinding is, en dat is niet waar.
In de map /application/config/database.php daarin moet je je database configuratie aanpassen.
Verder vind ik het niet logisch wat je doet.
Ik zou het allemaal ietsje anders in elkaar zetten, en de juiste benaming voor insert_id() gebruiken.
Verder heb ik een helper url in de constructor gezet, want dan kan je redirect() gebruiken want die constructie die je nu hebt klinkt ook niet logisch daar.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Club extends Controller
{
function __construct()
{
parent::__construct();
$this->load->model('club_model');
$this->load->helper('url');
}
public function index()
{
$this->view->render('club/index');
}
public function create()
{
$this->club_model->create();
// dit kan ook met redirect('club');
header('location: ' . URL . 'club');
exit();
}
}
?>
class Club extends Controller
{
function __construct()
{
parent::__construct();
$this->load->model('club_model');
$this->load->helper('url');
}
public function index()
{
$this->view->render('club/index');
}
public function create()
{
$this->club_model->create();
// dit kan ook met redirect('club');
header('location: ' . URL . 'club');
exit();
}
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class Club_Model extends Model
{
public function create()
{
$aData = array(
'club_name' => $_POST['club_name'],
'club_logo' => $_POST['club_logo'],
'address_street' => $_POST['address_street'],
'address_zipcode' => $_POST['address_zipcode'],
'address_city' => $_POST['address_city'],
'address_phone' => $_POST['address_phone'],
'address_fax' => $_POST['address_fax'],
'address_email' => $_POST['address_email'],
'address_homepage' => $_POST['address_homepage']
);
$this->db->insert('adres', $aData);
$iLastId = $this->db->insert_id();
$aClub = array(
'club_name' => $_POST['club_name'],
'club_logo' => $_POST['club_logo'],
'club_address_id' => $iLastId
);
$this->db->insert('club', $aClub);
}
}
?>
class Club_Model extends Model
{
public function create()
{
$aData = array(
'club_name' => $_POST['club_name'],
'club_logo' => $_POST['club_logo'],
'address_street' => $_POST['address_street'],
'address_zipcode' => $_POST['address_zipcode'],
'address_city' => $_POST['address_city'],
'address_phone' => $_POST['address_phone'],
'address_fax' => $_POST['address_fax'],
'address_email' => $_POST['address_email'],
'address_homepage' => $_POST['address_homepage']
);
$this->db->insert('adres', $aData);
$iLastId = $this->db->insert_id();
$aClub = array(
'club_name' => $_POST['club_name'],
'club_logo' => $_POST['club_logo'],
'club_address_id' => $iLastId
);
$this->db->insert('club', $aClub);
}
}
?>
edit:
Even wat meer uitleg.
Stelregel is eigenlijk altijd: slim controllers en fat models.
Een controller zorgt alleen voor het regelen van wat er met de data gedaan moet worden. Het uiteindelijke gebeuren doe je in je models.
Als dat is gedaan, dan geeft je controller het weer door aan je view.
Wat jij aan het proberen bent/was is een mix van wat in de models moet gebeuren te doen in de controller.
Gewijzigd op 15/02/2013 09:28:40 door Bart V B
function __construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}
}
De DB en zijn verwerkingen worden in de database.php gedaan, priecies zoals je al dacht.
en niet logisch... daar zit ja het probleem, ik probeer de logica te vinden door uit te proberen en als het niet lukt vragen te stellen. Met dit probleem zit ik al twee dagen en met google had ik nog niet een bevredigend resultaat gevonden.
Maar ter verduideliking voor mij: ik hoef geen aparte controller en model te maken voor adres? Ik dacht dat je zoveel mogelijk in eigen klassen moest verwerken.
Voor alle hulp ben ik dankbaar om me zelf ook verder te ontwikkelen.
Gewijzigd op 15/02/2013 11:41:31 door Jacob Koornneef
Quote:
Maar ter verduideliking voor mij: ik hoef geen aparte controller en model te maken voor adres? Ik dacht dat je zoveel mogelijk in eigen klassen moest verwerken.
Jawel, alleen wat jij aan het doen bent is je framework verkeerd inzetten.
Zo werkt codeigniter niet.
Codeigniter werkt met MVC.
Wat wil zeggen Model, Controller, View.
Een controller is simpel gezegd het onderdeel die het allemaal regelt.
Een Model daar moeten de dingen gebeuren die de data verwerkt.
Een View is de output die het weergeeft op je scherm.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
class Model {
function __construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}
}
?>
class Model {
function __construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}
}
?>
Daar ben je veel te moeilijk aan het doen:
/application/config/database.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
?>
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
?>
Daar maak je connectie met je database.
/application/config/autoload.php
Daar autoload je de database.
Dus dat geheel wat je nu in Class Model hebt staan heb je totaal niet nodig.
Immers heb je bijna altijd je database nodig, dus is autoloading een betere optie.
Indien je graag voor dat ene object een database verbinding nodig hebt, kan je dat ook anders doen als je geen autoloading wenst te gebruiken. Dan doe je hem loaden in je model.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class club extends Model
{
function __construct()
{
// nu is hij in heel het club model object beschikbaar
parent::__construct();
$this->load->database();
}
function Create()
{
// doe iets met de database
}
}
?>
class club extends Model
{
function __construct()
{
// nu is hij in heel het club model object beschikbaar
parent::__construct();
$this->load->database();
}
function Create()
{
// doe iets met de database
}
}
?>
Tip: Leg je project eens opzij en ga eens een paar uur video's zitten kijken.
Jeffry Way heeft een serie Codeigniter from scratch gemaakt, die eenvoudig te volgen zijn.
http://net.tutsplus.com/tutorials/php/codeigniter-from-scratch-day-1/
Daar leer je alle basis elementen van het codeigniter framework.
Geen taaie stof, maar gewoon simpel.
En nog een tip, ga over op een nieuwere versie van codeigniter.
Het enige verschil is dat je in plaats van extends Controller naar extends CI_Controller moet doen.
Bij een model extends CI_Model.
Mocht je er echt niet uitkomen, dan wil ik je wel eventueel meehelpen.
Ik adviseer jou jacob, om de adviezen van Bart ter harte te nemen. Je gebruikt het framework niet goed zoals Bart al zei maar je bent dus ook soms het wiel opnieuw aan het uitvinden. Ik bedoel: je stopt kostbare tijd in het schrijven van code waarin CI je al voorziet. Die tijd had je dus beter kunnen gebruiken om meer over CI te leren. Daarbij is video kijken best een snelle en makkelijke methode om je kennis te verbreden. Na het video kijken zou ik nog eens door de userguide van CI wandelen om zo te beleven welke classen en methodes er nu al standaard meegeleverd worden met CI en waar je dus heel makkelijk gebruik van kunt maken.
de userguide vindt je hier: http://ellislab.com/codeigniter/user-guide/
(Let op de tab 'Table of contents' helemaal boven in het scherm)
groeten
Gewijzigd op 16/02/2013 08:37:57 door Frank Nietbelangrijk
MVC), dus daar was ik al mee bezig. probber dat uit te bouwen en met dit soort tips verder te verbeteren.
Dit soort tips en hulp is toppie.
Zo ben videos aan het kijken.
Bedankt zover.
mijn MVC had ik van een video (Dit soort tips en hulp is toppie.
Zo ben videos aan het kijken.
Bedankt zover.
Gewijzigd op 16/02/2013 11:58:51 door Jacob Koornneef