Gå til innhold

Utvidet bruk av foreach()


Anbefalte innlegg

Heisann!

 

Prøver meg med ett spørsmål til her, da jeg driver med litt sysling med foreach og databaser. Bruker rammeverket Codeigniter.

 

Har nå klart å koble sammen flere tabeller som har relevans med JOIN, takket være hyggelige folk her på forumet. :)

 

Neste utfordring jeg har møtt på etter litt koding, er å kunne hente ut fra databasen via en dynamisk id, via denne(har en til som henter ut fag):

 

$data['chapter'] = $this->courses_model->get_chapters_list(null, '55', null);

 

Den tredje parameteren, altså den som er satt til 55 her, er den jeg ønsker å få dynamisk, ettersom denne bestemmer hvilket fag jeg skal hente ut kapitler fra. Dette veit jeg ikke åssen jeg kan gjøre.

 

Jeg har altså en foreach loop, som henter ut litt diverse, blant annet fag med kapitler. La oss si en loop ser ala slik ut:

 

<ul>
 <?php foreach ($courses as $course_row): ?>
 <li><?php echo $course_row->coursename; ?></li>
 <ul>
   <?php foreach ($chapters as $chapter_row): ?>
   <li><?php echo $chapter_row->chaptername; ?></li>
   <?php endforeach; ?>
 </ul>
 <?php endforeach; ?>
</ul>

 

Dette blir en slags nested greie, brukte bare ul og li tagger her i eksempelet, men tenkte å benytte tabell etterhvert.

 

Uansett, denne henter ut alle fagene fra databasen, og alle kapitlene fra databasen. Men den skal ikke hente ut alle kapitlene(slik som den gjør nå i eksempelet), men de kapitlene som hører til det kurset som akkurat ble hentet ut. Om jeg setter parameteren statisk til ett fag, så henter den jo ut de riktige kapitlene, men dette vil jeg jo ha dynamisk, slik at den skjønner dette automatisk.

 

Er det noen kloke hoder som veit om en løsning på dette?

 

EDIT: DER ja, klarte å messe opp eksempelet mitt. Tydeligvis en forum bug. Retter opp nå!

EDIT2: Da var det fikset igjen!

Endret av AnaXyd
Lenke til kommentar
Videoannonse
Annonse

Mulig jeg er helt naut nå, men hvordan skal jeg kunne definere denne variablen, slik at controlleren henter den opp?

 

F.eks om jeg setter $var = '123'; i viewen min som jeg kjører foreach loopen jeg tenker på, og kjører en echo $var; i controlleren, vil jo ikke dette funke?

 

Det jeg eventuelt KAN gjøre, er å legge denne inn i foreach loopen i viewen, og sette på en variabel slik som du tenker:

 

$data['chapter'] = $this->courses_model->get_chapters_list(null, $var, null);

 

Men det blir vel feil med tanke på strukturen av Codeigniter?

Lenke til kommentar

Du skal ikke definere den. $_GET-arrayet er en superglobal på linje på $_POST. Det er altså opp til deg å definere "variablen" i get, f. eks via lenker du spytter ut fra databasen på forhånd.

 

Linken vil da f. eks se slik ut:

 

http://domene.com/controller/action?chapter=34

 

34 er da $_GET-variablen som brukes av controlleren din.

 

if ( isset($_GET['chapter'])
{
   $id = $_GET['chapter']; // Husk å validere input btw....

   $data['chapter'] = $this->courses_model->get_chapters_list(null, $id, null);
}
else
{
   // Så kan du f.eks vise frem en liste over tilgjengelige chapters om get ikke er satt
   $data['chapter'] = $this->courses_model->get_all_chapters();
}

Lenke til kommentar

Takk for svar! :)

 

Tror jeg har funnet frem til noe ala hvordan jeg tenkte, nemlig å flytte foreachen til selve kontrolleren. I kontrolleren har jeg jo mulighet til å gjøre det meste, så da får jeg hentet ut de tingene jeg ønsker. Deretter kjører jeg en ny foreach i viewen, som henter ut dataen som allerede er lagt i en stor array.

 

Men jeg har møtt på et problem, og det er at jeg ikke får lagt til nok data i arrayen min. Eksempelkode:

 

foreach ($data['courses'] as $row) {

  //echo $row->id;

  $data['chapters'] = $this->courses_model->get_chapters_list(null, $row->id, $this->session->userdata('user_id'));


}

 

Her kjøres altså foreach loopen to ganger, siden det er to entries i 'courses' arrayen. Her tenkte jeg at den skulle legge inn igjen en ny array 'chapters' med så mange chapters som tilhører dette faget. (det er 3 chapters jeg ønsker å hente ut akkurat her)

 

Slik ser var_dumpen ut:

 

["chapters"]=> array(1) { [0]=> object(stdClass)#26 (8) { ["id"]=> string(2) "61" ["course_id"]=> string(2) "53" ["chapter_name"]=> string(4) "Test" ["chapter_intro"]=> string(0) "" ["chapter_description"]=> string(0) "" ["status"]=> string(9) "published" ["uploader_id"]=> string(2) "19" ["course_title"]=> string(10) "Tittel" } } }

 

Jeg får altså kun til å legge inn 1 av de ønskede 3 entryene fra databasen. Er det noen åpenbar feil jeg har gjort i koden her?

Lenke til kommentar

$data['chapters'] er bare en key. Nå vil den bare lagre objektet fra den siste iterasjonen din. Trikset er å legge på et par brackets til slik at chapters også er et array.

 

foreach ($data['courses'] as $row) {
	  $data['chapters'][] = $this->courses_model->get_chapters_list(null, $row->id, $this->session->userdata('user_id'));
    }

 

Du blir lurt ettersom du kjører echo i loopen. Den vil selvsagt printe all id-er, men det du gjorde var altså å overskrive i hver runde. Koden ovenfor vil legge til objektet tilsvarende:

 

$data['chapters'][0] = new stdClass();
$data['chapters'][1] = new stdClass();
$data['chapters'][2] = new stdClass();

 

osv, osv.

Lenke til kommentar

Ah, genialt! Takk for tips! Den gjorde susen ja!

 

Men fremdeles bød det på ganske store utfordringer når jeg skulle hente ut dette av arrayen igjen i viewen, så det ville blitt en relativt kraftig foreach loop med diverse finurligheter.

 

Så kom jeg på noe, som kanskje er det enkleste, men muligens ikke det beste når det kommer til objektorientert kode.

 

Rett og slett hente ut query direkte i viewen, for da får man jo mulighet til å legge inn den id'en man ønsker som allerede er hentet ut i foreach loopen fra før. F.eks:

 

               <?php $children = $this->model->load_things($id); ?>

			<?php foreach ($children as $children_row): ?>
			<div>

			  <p><?php echo $children_row->tittel; ?></p>
			  <p><?php echo $children_row->desc; ?></p>

			</div>
			<?php endforeach; ?>

 

Dette er altså i en view. Er dette "lov"? Det funker jo, men dette er vel kanskje noe controlleren egentlig skal gjøre?

Lenke til kommentar

Alt er lov. Å ta i bruk en arkitektur som MVC handler jo bare om å få splittet opp kode så den er enklere å vedlikeholde, gjenbruke og forstå. Du har rett at controlleren egentlig bør gjør denne jobben.

 

Spørsmålet er om du ikke bare kan gjenbruke denne metoden i controlleren også. Det er ikke noe problem, og kalles rekursjon. Absolutt noe du som kommer til sin rett til tider. (Vi har i hvert fall delegasjonen til rekursjon her)

 

Jeg tror jeg ville sett på om det ikke er mulig å lage metoder i modellen som kan hjelpe deg med å gjøre jobben enklere. Metoder i modellen kan godt levere ferdige arrays til controlleren, før de sendes ferdige til viewet. (Hvor du da kjører foreach som før, bare med ferdige data. Foreachen har du nok rett i at kan bli komplisert uansett.)

 

Er litt vanskelig å hjelpe det uten å vite hvordan dataene ser ut. Jeg tror allikevel du skal klare dette på egenhånd om du setter deg ned og tenker litt. Dette er god trening.

Endret av Sono Juventino
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...