Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CodeIgniter] Problem z galerią.
Forum PHP.pl > Forum > PHP > Frameworki
kajzur
Witam, zaczyna się uczyć CodeIgniter'a smile.gif Mały problem mam:

  1. <?php
  2. function galeria()
  3. {
  4.  
  5. foreach (scandir("system/application/galeria/duze/") as $plik)
  6. {
  7.  
  8. $body['body'][].= '<a href="'.base_url() .'system/application/galeria/duze/'.$plik.'" rel="lightbox" title="Galeria"><img src="'.base_url() .'system/application/galeria/male/'.$plik.'"/></a><br>';
  9.  
  10. }
  11. $this->load->view('test', $body);
  12.  
  13.  
  14.  
  15. }
  16. ?>

1. Dostaję w widoku tablice z prawidłowymi wartościami, lecz też dostaję komunikat:

A PHP Error was encountered

Severity: Notice

Message: Undefined index: body

Filename: controllers/strona.php

Line Number: 18

Że niby zmiennej nie ma? Nie rozumiem..

2. Jeśli chce przekazać np do jednej podstrony (nazwa podstrony = nazwa funkcji) przekazać zmienną $dane, a do drugiej zmienną $tresc i chce je wyświetlić w tym samym miejscu? Jeden widok dla każdej podstrony jest..

Pozdrawiam smile.gif
jarexx
Witam. Mój pierwszy post na tym forum.
kajzur podaj kod widoku, bo mam podejrzenie, ze zle sie odnosisz do tablicy $body

Jeśli chodzi o drugie pytanie to do widoku przekazujesz wszystko w tablicy np.
Kod
$dane['tytul']="tytuł";
$dane['tresc']="jakas tresc";
$this->load->view('test', $dane);

I wtedy w widoku:
Kod
echo $tytul.'<br />.'.$tresc;

Pozdrawiam.
kajzur
Co do tamego to już wiem, co do 2 to, np mam:
Kod
      <p><?
      
      
      foreach($body as $file)
      echo $file;
      
      
      
      ?></p>
w pliku widoku.

i metoda z tej strony:

Kod
function galeria()
{
$body = array();
$body['body'] = array();
foreach (scandir("system/application/galeria/duze/") as $plik)
{

$body['body'][].= '<a href="'.base_url() .'system/application/galeria/duze/'.$plik.'" rel="gb_imageset[nice_pics]" title="Galeria"><img src="'.base_url() .'system/application/galeria/male/'.$plik.'"/></a>&nbsp;';

}

$body['body'] = array_slice ($body['body'], 2);

$this->load->view('test', $body);



}



Plik widoku jest jeden. I chce w tym samym miejscu wywołać dane wysłane przez inną metodę z kontrolera, np:

Kod
function kontakt()
{

$tekst['body'] = 'kontakt';
$this->load->view('test', $tekst);

}


To dostane: Message: Invalid argument supplied for foreach() bo będę dawał jako argument zmienna a nie tablice.. I tylko jedna podstrona będzie prawidlowo działać.. Dokładnie link w formacie:

/index.php/strona/galeria

a błąd dostane już na

/index.php/strona/kontakt

PS. Witamy na forum! smile.gif)
jarexx
No więc tak.

W klasie kontrolera masz funkcje:
  1. <?php
  2. function galeria() {
  3. $tab = array("pierwszy plik","drugi plik", "trzeci plik");
  4. $body = array();
  5. $dane = array();
  6. foreach ($tab as $plik)
  7. {
  8. $body[] = $plik;
  9. }
  10. $dane['link']=$body; //przypisujemy tablice
  11. $dane['tresc'] = $this->kontakt(); //przypisujemy wartosc zwracana przez metode kontakt()
  12.  
  13. $this->load->view('test', $dane);
  14. }
  15.  
  16. function kontakt()
  17. {
  18.  
  19. $tekst = 'kontakt';
  20. return $tekst;
  21.  
  22. }
  23. ?>


I wyświetlanie:

  1. <?php
  2. foreach($link as $war) {
  3. echo $war.'<br />';
  4. }
  5. echo '<br />'.$tresc;
  6. ?>


Działa bez problemów.
Powodzenia
kajzur
  1. <?php
  2. class Strona extends Controller
  3. {
  4.  
  5.   function index()
  6. {
  7.  $tekst['tresc_glowna'] = 'index';
  8. $this->load->view('test', $tekst);
  9.  
  10. }
  11.  
  12. function galeria()
  13. {
  14. $body = array();
  15. $body['body'] = array();
  16. foreach (scandir("system/application/galeria/duze/") as $plik)
  17. {
  18.  
  19. $body['body'][].= '<a href="'.base_url() .'system/application/galeria/duze/'.$plik.'" rel="gb_imageset[nice_pics]" title="Galeria"><img src="'.base_url() .'system/application/galeria/male/'.$plik.'"/></a>&nbsp;';
  20.  
  21. }
  22.  
  23. $body['body'] = array_slice ($body['body'], 2);
  24.  
  25. $body['tytul'] = 'Tytuł stronki.';
  26. $body['tagi'] = 'taagi';
  27. $body['autor'] = 'autor';
  28. $body['kontakt'] = $this->kontakt();
  29. $body['oferta'] = $this->oferta();
  30. $body['howdrive'] = $this->howdrive();
  31.  
  32. $this->load->view('test', $body);
  33.  
  34.  
  35.  
  36. }
  37.  
  38.  function kontakt()
  39. {
  40.  
  41. $tekst = 'kontakt';
  42. return $tekst;
  43.  
  44. }
  45.  
  46.  function oferta()
  47. {
  48.  
  49. $tekst= 'oferta';
  50. return $tekst;
  51.  
  52. }
  53.  
  54.   function howdrive()
  55. {
  56.  
  57. $tekst = 'jak dojechac';
  58. return $tekst;
  59.  
  60. }
  61. }
  62. ?>


Tak wygląda teraz kontroler.

  1. <p><?
  2.      
  3.      
  4.      foreach($body as $file)
  5.      echo $file;
  6.      
  7.      echo $oferta;
  8.      
  9.      ?></p>

A tak wyświetlanie w widoku.

Tylko że nadal na podstronie /index.php/strona/galeria jedynie działa.. Wyświetla 'oferta', oraz galerie, natomiast na innych podstronach nie ma nic - pusta biała strona, a na index.php błędy.

Chodzi mi o to jak mogę zrobić żeby móc wyświetlić odpowiednie treści dla podstron - zeby:

http://localhost/~CI/index.php/strona/oferta - pokazuje się szablon i tekst oferta.
http://localhost/~CI/index.php/strona/kontakt - pokazuje się szablon i tekst kontakt.
http://localhost/~CI/index.php/strona/howdrive - pokazuje się szablon i tekst jak dojechac.
http://localhost/~CI/index.php/strona/galeria - galeria + ew jakiś tekst.
http://localhost/~CI/index.php - tekst powitalny.

Mogę zrobić drugi widok dla galerii - i tylko do tego widoku wysyłać dane z funkcji galeria. A Przy reszcie podstron zwracać zawszę zmienną o tej samej nazwie 0 i to by załątwiło problem, ale nie sądze że to tak się robi, bo to przecież nie zaoszczędzi programiście roboty - a po to są właśnie frameworki ;>

PS. Ewentualnie mogę zrobić w widoku switch case - w zależnosci od wartości uri w segmencie 2 chyba?
jarexx
Proponuje w takim razie bys wykorzystal model (folder models) do pobierania danych.

Przykladowy plik strona_model.php
  1. <?php
  2. class Strona_model extends Model {
  3.  
  4.    function get_tresc()
  5.    {
  6.    
  7.     $query = $this->db->query('SELECT KONTAKT, OFERTA, HOWDRIVE FROM ... WHERE ID=1'); //pobieramy z bazy rekord
  8.         $row = $query->row();
  9.     $wynik = array($row->KONTAKT,$row->OFERTA,$row->HOWDRIVE); //tworzymy sobie tablice
  10.         return $wynik;
  11.    }
  12. }
  13. ?>


No i teraz zmodyfikowany plik kontrolera
  1. <?php
  2. class Strona extends Controller
  3. {
  4.  
  5. function Strona()
  6.    {
  7.        parent::Controller();    
  8.        
  9.        $this->load->model('strona_model', 'stronamodel'); // ladujemy plik strona_model.php z folderu models i mamy do dyspozycji obiekt stronamodel
  10.        
  11.    }
  12.  
  13.  function index()
  14. {
  15. $tekst['tresc_glowna'] = 'index';
  16. $this->load->view('test', $tekst);
  17.  
  18. }
  19.  
  20. function galeria()
  21. {
  22. $body = array();
  23. $body['body'] = array();
  24. foreach (scandir("system/application/galeria/duze/") as $plik)
  25. {
  26.  
  27. $body['body'][].= '<a href="'.base_url() .'system/application/galeria/duze/'.$plik.'" rel="gb_imageset[nice_pics]" title="Galeria"><img src="'.base_url() .'system/application/galeria/male/'.$plik.'"/></a> ';
  28.  
  29. }
  30.  
  31. $body['body'] = array_slice ($body['body'], 2);
  32.  
  33. $body['tytul'] = 'Tytuł stronki.';
  34. $body['tagi'] = 'taagi';
  35. $body['autor'] = 'autor';
  36.  
  37. //ponizsze dane pobieramy z modelu strona_model
  38.  
  39. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  40.  
  41. $body['kontakt'] = $tresc['KONTAKT']
  42. $body['oferta'] = $tresc['OFERTA'];
  43. $body['howdrive'] = $tresc['HOWDRIVE'];;
  44.  
  45. $this->load->view('test', $body);
  46.  
  47.  
  48.  
  49. }
  50.  
  51. function kontakt()
  52. {
  53. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  54.  
  55. $body['tekst'] = $tresc['KONTAKT'];
  56.  
  57. $this->load->view('test', $body);
  58.  
  59.  
  60. }
  61.  
  62. function oferta()
  63. {
  64.  
  65. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  66.  
  67. $body['tekst'] = $tresc['OFERTA'];
  68.  
  69. $this->load->view('test', $body);
  70.  
  71. }
  72.  
  73.  function howdrive()
  74. {
  75. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  76.  
  77. $body['tekst'] = $tresc['HOWDRIVE'];
  78.  
  79. $this->load->view(test, $body);
  80.  
  81. }
  82. }
  83. ?>


Nie sprawdzalem tego kodu w dzialaniu, ale chodzi glownie o idee...
To jedno z rozwiazan. Mozna by rowniez zrobic switcha w zaleznosci od wartosci jakiegos parametru w funkcji index
kajzur
Miałeś 2 błedy - zapomniałeś raz ";" i przy
  1. <?php
  2. $wynik = array($row->KONTAKT,$row->OFERTA,$row->HOWDRIVE);
  3. ?>

Nie zwróci to tablicy asocjacyjnej, tylko numeryczna, więc zmieniłem w kontrolerze.. Hmm, oczywiście, rozumiem to co napisałeś - przekazanie wartości z bazy pobranej w modelu do kontrolera, który natomiast ma przekazać ją do widoku, i wyświetlić.. Tylko że w takim razem, na stronie innej niż galeria dostanę warning że argument przekazany do foreach jest zły.. Więc zrobiłem tak:

Widok:
  1. <p><?
  2.      
  3.      
  4. if(is_array($body) == true)
  5. foreach ($body as $file)
  6. echo $file;
  7.  
  8. else
  9. echo $tekst;
  10.      ?></p>


I teraz działa tak jak powinno, dostaję wartości z bazy, tam, gdzie jest to potrzebne, a tam gdzie galeria tam mam galerię.. Powiedz mi proszę, czy takie rozwiązanie jest profesjonalne?

PS. Kontroler:
  1. <?php
  2. class Strona extends Controller
  3. {
  4.  
  5. function Strona()
  6.   {
  7.       parent::Controller();    
  8.      
  9.       $this->load->model('strona_model', 'stronamodel'); // ladujemy plik strona_model.php z folderu models i mamy do dyspozycji obiekt stronamodel
  10.      
  11.   }
  12.  
  13. function index()
  14. {
  15. $tekst['tresc_glowna'] = 'index';
  16. $this->load->view('test', $tekst);
  17.  
  18. }
  19.  
  20. function galeria()
  21. {
  22. $body = array();
  23. $body['body'] = array();
  24. foreach (scandir("system/application/galeria/duze/") as $plik)
  25. {
  26.  
  27. $body['body'][].= '<a href="'.base_url() .'system/application/galeria/duze/'.$plik.'" rel="gb_imageset[nice_pics]" title="Galeria"><img src="'.base_url() .'system/application/galeria/male/'.$plik.'"/></a> ';
  28.  
  29. }
  30.  
  31. $body['body'] = array_slice ($body['body'], 2);
  32.  
  33. $body['tytul'] = 'Tytuł stronki.';
  34. $body['tagi'] = 'taagi';
  35. $body['autor'] = 'autor';
  36.  
  37. //ponizsze dane pobieramy z modelu strona_model
  38.  
  39. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  40. /*
  41. $body['kontakt'] = $tresc['kontakt'];
  42. $body['oferta'] = $tresc['oferta'];
  43. $body['howdrive'] = $tresc['howdrive'];;
  44. */
  45. $this->load->view('test', $body);
  46.  
  47.  
  48.  
  49. }
  50.  
  51. function kontakt()
  52. {
  53. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  54.  
  55. $body['tekst'] = $tresc[0];
  56.  
  57. $this->load->view('test', $body);
  58.  
  59.  
  60. }
  61.  
  62. function oferta()
  63. {
  64.  
  65. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  66.  
  67. $body['tekst'] = $tresc[1];
  68.  
  69. $this->load->view('test', $body);
  70.  
  71. }
  72.  
  73. function howdrive()
  74. {
  75. $tresc = $this->stronamodel->get_tresc(); //teraz w zmiennej $tresc mamy tablice
  76.  
  77. $body['tekst'] = $tresc[2];
  78.  
  79. $this->load->view(test, $body);
  80.  
  81. }
  82. }
  83. ?>


O i wyłączyłem to denerwujące Notice:

  1. <?php
  2. error_reporting(E_ERROR | E_WARNING | E_PARSE);
  3. ?>
jarexx
Czy to rozwiązanie jest profesjonalne?

Zapewne tak nie jest.
Nie jestem zawodowcem i tak jak ty dopiero zaczynam przygodę z frameworkami.
Na pewno jest jakieś lepsze rozwiązanie...
W każdym bądź razie w powyższym przykładzie otarłeś się o MVC i to jest najważniejsze.

pozdrawiam
kajzur
Masz racje smile.gif A jeszcze jedno pytanie, przy walidacji formularza dostaję błąd:

Cytat
An Error Was Encountered

Unable to load the requested language file: language/polish_lang.php


A mam pliki języków, chodz pliku o jaki on prosi, nie mam, w folderze language mam folder polish.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.