Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CI] Samoczynne wypełnianie widoku danymi z kontrolera i wielojęzyczność
Forum PHP.pl > Forum > PHP > Frameworki
basu
Witam, zaczynam przygode z Code Igniter i mam 2 problemy:

1) robie 1 glowny widok i dziele go na czesci: np. czesc glowna i newsy.
Chodzi o to, ze chialbym, aby widok newsy sam pobieral dane w controlera, zebym nie musial sie nim przejmowac, tylko zajmowalbym sie wypelnianiem widoku glowny. Moze byc wiecej blokow, ktore beda wypelniac strone danymi bez mojej ingerencji. Nie wiem czy jasno pisze.

2) Jak wypelniac strone danymi w zaleznosci od wybranego jezyka?
tzn mam np tabele w bazie kategoria

  1. CREATE TABLE `kategoria` (
  2. `IDKategorii` tinyint(4) NOT NULL AUTO_INCREMENT,
  3. `kategoria_nazwa_pol` varchar(30) NOT NULL,
  4. `kategoria_nazwa_ang` varchar(30) NOT NULL,
  5. `kategoria_link` varchar(100) NOT NULL,
  6. PRIMARY KEY (`IDKategorii`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;


i teraz w zaleznosci od wyboru jezyka wyswietla mi dane z pola kategoria_nazwa_pol lub kategoria_nazwa_ang.


Prosze o pomoc, najlepiej 'łopatologicznie', jak sie da z przykladem kodu smile.gif . Z gory dziekuje.
maryaan
Cytat(basu @ 16.04.2007, 15:56:14 ) *
chialbym, aby widok newsy sam pobieral dane w controlera
widok jest generowany na podstawie danych ktore przekazujesz przy jego ladowaniu, sam sobie nic nie pobierze bo nie ma takiej mozliwosci, mozesz natomiast zrobic taki myk
  1. <?php
  2. $newsy = $this->load->view('widok_generujacy_liste_newsow', $tablica_z_newsami_z_bazy, true);
  3. ?>
i w zmiennej $newsy masz wygenerowany wycinek strony ktory zawiera liste newsow, teraz wystarczy przekazac ta zmienna do glownego widoku i w nim wyswietlic box z newsami w odpowiednim miejscu

natomiast jesli chodzi o druga rzecz to wydaje mi sie ze nienajgorszym rozwiazaniem bedzie zrobienie czegos w tym stylu:
  1. <?php
  2. function sprawdz_jezyk($in) {
  3.  
  4. $jezyki = array('pol', 'eng'); //lista dostepnych jezykow
  5.  
  6. return in_array($in, $jezyki) ? $in : $jezyki[0];
  7.  
  8. }
  9. ?>


teraz wystarczy tylko odczytac zmienna okreslajaca jezyk i przepuscic ja przez funkcje sprawdz_jezyk() wynikiem funkcji bedzie zawsze poprawny postfix tabeli z bazy danych, ktory wystarczy przekazac do funkcji ktora laduje dane z bazy. Jest to oczywiscie tylko sugestia jak problem rowiazac :] tez dopiero zaczynam z ci tongue.gif
basu
hmm, a w jaki sposob dostac dane do zmiennej $tablica_z_newsami_z_bazy bo jakos trzeba ja wypelnic danymi?

  1. <?php$newsy = $this->load->view('widok_generujacy_liste_newsow', $tablica_z_newsami_z_bazy, true);?>
maryaan
nie do konca, $tablica_z_newsami_z_bazy to jedynie taki hmm kontener na smiecie biggrin.gif moze dam przyklad
  1. <?php
  2. $tablica['pudelko1'] = 'zapalki';
  3. $tablica['pudelko2'] = 'fajki';
  4. $tablica['pudelko3'] = 'gumki';
  5.  
  6. $this->load->view('jakis_widok', $tablica);
  7. ?>


w tym momencie widok nie dostaje tablicy $tablica, a jedynie liste zmiennych czyli w tym przypadku $pudelko1, $pudelko2 i $pudelko3. Oczywiscie jako element tego naszego kontenera mozesz wladowac tablice, obiekt czy co Ci tam przyjdzie do glowy
basu
Rozumiem to, tylko ze w tym momencie chce wstawic newsy, ktore pochodza z bazy danych.

  1. <?php$newsy = $this->load->view('widok_generujacy_liste_newsow', $tablica_z_newsami_z_bazy, true);?>


Wiem jak wypelnic '$tablica_z_newsami_z_bazy danymi z bazy' i wyswietlic ja w widoku, nastepnie przekazujac do glownego widoku. Tylko ze musze wykonac jakas metode klasy, zeby ona ja wypelnila danymi. Jak bede mial 100 klas i do kazdej metody mam podpinac kod ladujacy 'widok_generujacy_liste_newsow' to sie zamecze, bo takich modolow jak newsy moge miec np 20. smile.gif .W tym momencie w kazdej metodzie musze podpinac kod ladujacy 20 widokow danymi a je z kolei wypelniac danymi.

  1. <?php $jakis_blok_1 = $this->load->view('inny_widok_1', $tablica_z_danymi_1, true);?>
  2. <?php $jakis_blok_2 = $this->load->view('inny_widok_2', $tablica_z_danymi_2, true);?>
  3. <?php $jakis_blok_3 = $this->load->view('inny_widok_3', $tablica_z_danymi_3, true);?>
  4. ...
  5. ...
  6.  $this->load->view('layout', $zmienna_jakas_ladujaca_te_widoki);


a da sie tak, zebym jakos to uniknac. W proceduralnym kodzie podpina sie jakis plik np news.php i on juz sie zajmie wypelnianiem danych, a ja juz sie nim nie zajmuje.

Dopiero zaczynam pisac kod w php5, wiec dajcie znac jak pisze glupoty smile.gif
nrm
chętnie bym ci pomógł ale w ogóle nic nie rozumiem z tego co piszesz.

skoro z bazy to zrób sobie model, wczytaj w kontrolerze, a w modelu pobierz dane z bazy i zwróć je. 15 sekund pisania.

z tymi widokami nie skumałem w ogóle. załaduj sobie widok np. newsy a w nim wczytaj inne widoki np. header, footer.
basu
to napisze jeszcze raz smile.gif zalezy mi na tym

dziele strone na 2 czesci. moja strona to portfolio z pracami (dokladniej mozna to zobaczyc na stronie (www.artfly.pl). po lewej mam linki z kategoriami (grafika, strony www, loga) i ta czesc bedzie pobierana z bazy danych, bo klikajac na jakas kategorie pokazuja mi sie prace z tej kategorii w glownej czesci strony. I teraz chodzi mi o to zeby te kategorie wypisal mi to widoku niejako sam. nie wiem jak to zrobic. Wiem ze moge zrobic kontroler, model i widok. Ale wszystkie przyklady sa ladowane jakby do czesci glownej szablonu. A ja chce zeby zrobic kilka takich modulow jak wlasnie te kategorie, czy np newsy lub dowolnie inne. Zeby mi zaladowalo do glownego widoku wszystkie naraz . Chcialbym zeby mi je ladowalo (np kategorie) z kontrolera kategorie i zeby to zrobic raz i sie tym nie zajmowac. Pozniej zajmuje sie inna czescia strony obojetnie jaka, a te moduly laduja mi sie na strone, a ja sie nimi wiecej nie zajmuje.

W kodzie procedularnym pisalem po prostu caly modul kategorie w odzielnym pliku kategorie.php i on zajmowal sie wypelnianiem tych linkow z bazy. pozniej tworzylem inny modul tez cos wypelnial na stronie. Pozniej wszystko lacze do jednego pliku i na tym koniec. Na koncu moge sobie dorabiac inne czesci strony, nie zajmujac sie tymi kategoriami czy newsami obojetnie. bo to mi juz chodiz i wypelnia.
W CI wszystkie przyklady robi sie pojedynczo (w tutorialach). ja chce wejsc na strone glowna www.artfly.pl i zeby wszystkie widoki pobraly dane i zlozyly mi ta stronke w calosc. Pozniej wchodze np w kontakt i zajmuje sie kontaktem a nie zapelnieniem danych do innych czesci strony.

Cos podobnego zanalazlem tutaj, pisza cos o bbcode, ale nie wiem jak to zastosowac http://www.php.rk.edu.pl/forum/topic/1/14/
nrm
możesz to zrobić na wiele sposobów w zależności od tego jak rozbudowana jest aplikacja i jak dużo kontrolerów będziesz miał etc.

proste portfolio można tak:

jeden kontroler, w kontruktorze wywolujesz odpowiednie metody_menuboczne();, _menuprawe(); _innemenu(); itp. więc ładują ci sie zawsze. a w nich pobierasz co potrzebujesz do tych menu.

w większych aplikacjach bardziej się sprawdza dodatkowa swoja bliblioteka. na takich samych zasadach ja tworzysz a wywolujesz np. w autostarcie.
basu
wole nie robic tego w 1 kontrolerze, wole nauczyc sie tym drugim sposobem smile.gif.
Jest moze gdzies przyklad kodu, tutka jak to robic? Zalezy mi bardzo na czasie, a najlepiej ucze sie na gotowych przykladach smile.gif
nrm
application/config/autoload.php
  1. <?php
  2. $autoload['libraries'] = array('database', 'session', 'mojabiblioteka');
  3. ?>

wrzucasz biblioteki do załadowania na starcie.

application/libraries/mojabiblioteka.php
  1. <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Mojabiblioteka {
  4.  
  5. // konstruktor
  6. function Mojabiblioteka()
  7. {
  8. $this->CI =& get_instance();
  9. log_message('debug', 'mojabiblioteka Class Initialized');
  10.  
  11. $this->_pobierzMenuBoczne();
  12. }
  13.  
  14. function _pobierzMenuBoczne()
  15. {
  16.  //wczytanie modelu
  17.  $this->CI->load->model('nazwaModelu');
  18.  
  19.  //pobranie jakis danych
  20.  $data['mojedane'] = $this->CI->nazwaModelu->getMenu();
  21.  
  22.  //wrzucenie w zmienne
  23.  $this->CI->load->vars($data);
  24. }
  25. ?>


application/models/nazwamodelu.php
  1. <?php
  2. function getMenu()
  3. {
  4. $sql = $this->db->get('twojatabela');
  5. return $sql->result();
  6. }
  7. ?>


$mojedane w dowolnym widoku wywołanym z dowolnego kontrolera.
basu
o to chodzilo. Dzieki wielkie za pomoc smile.gif

co do drugiego problemu to czesciowo sobie poradzilem, ale znowu napotkalem na problem.
Zainstalowalem do CI z wiki 'lang_select' http://codeigniter.com/wiki/Language_Selection/, dolaczylem Native session i wszystko pieknie chodzi. Kazdy kontroler musi dostac plik jezykowy. Wszystko gra i smiga.
Zaczalem robic standardowy formularz.

kontroler:

  1. <?php
  2.  
  3. class Kontakt extends Controller {
  4.  
  5. function Kontakt()
  6. {
  7. parent::Controller();
  8.  
  9. // load the associated language file
  10. $this->lang->load('kontakt');
  11. }
  12.  
  13. function index()
  14. {
  15. $this->load->library('validation');
  16. $this->validation->set_error_delimiters('<p class="error">','</p>'); 
  17.  
  18.  
  19.  //okreslenie warunkow walidacji
  20. $rules['kontakt_imie'] = 'required|min_length[3]|xss_clean';
  21. $rules['kontakt_email'] = 'required|valid_email|xss_clean';
  22. $this->validation->set_rules($rules);
  23.  
  24. // ustalanie nazw pól (zostaną one użyte przy wyświetlaniu błędów)
  25. $fields['kontakt_imie'] = 'Imię i Nazwisko';
  26. $fields['kontakt_email'] = 'Adres E-mail';
  27. $this->validation->set_fields($fields);
  28.  
  29. if ($this->validation->run() == FALSE)
  30. {
  31. //powrot do formularza i wyswietlenie bledow
  32. $content['main'] = $this->load->view('kontakt/kontakt_formularz', array(), true);
  33. $this->load->view('layout/index', $content);
  34. }
  35. else
  36. {
  37. $data = array(
  38. 'kontakt_imie' => $this->validation->kontakt_imie,
  39. 'kontakt_email' => $this->validation->kontakt_email,
  40. 'kontakt_tekst' => $this->input->post('kontakt_tekst'),
  41. 'new' => '1'
  42. );
  43.  
  44. //$query = $this->db->insert('kontakt', $data);
  45.  
  46. $this->load->model('M_kontakt');
  47. $this->M_kontakt->add_kontakt($data);
  48.  
  49. $content['main'] = $this->load->view('kontakt/kontakt_potwierdzenie', array(), true);
  50. $this->load->view('layout/index', $content);
  51. }
  52. }
  53.  
  54. }
  55. ?>



widok formularza:

  1. <h1><?=$this->lang->line('page_title');?></h1>
  2. <p><?=$this->lang->line('text_1');?></p>
  3.  
  4.  
  5. <?= form_open('kontakt/', array('id' => 'contactform')) ?>
  6.  
  7. <label for="kontakt_imie"><?=$this->lang->line('imie');?></label>
  8. <input type="text" name="kontakt_imie" title="<?=$this->lang->line('imie_title');?>" value="<?= $this->validation->kontakt_imie ?>" />
  9. <?= $this->validation->kontakt_imie_error ?>
  10. <br />
  11.  
  12. <label for="kontakt_email"><?=$this->lang->line('email');?></label>
  13. <input type="text" name="kontakt_email" title="<?=$this->lang->line('email_title');?>" value="<?= $this->validation->kontakt_email ?>" />
  14. <?= $this->validation->kontakt_email_error ?>
  15. <br />
  16.  
  17. <label for="text"><?=$this->lang->line('tekst');?></label>
  18. <textarea name="kontakt_tekst" title="<?=$this->lang->line('tekst_title');?>"><?= $this->input->post('kontakt_tekst') ?></textarea>
  19. <br />
  20. <input type="submit" id="send" value="Wyślij" />
  21. </form>


i w language/pl/kontakt_lang.php
  1. <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
  2. /* SVN FILE: $Id$ */
  3.  
  4. // welcome message texts
  5. $lang['page_title'] = "Formularz kontaktowy";
  6. $lang['text_1'] = "Jeśli masz jakieś pytanie skorzystaj z tego formularza aby się ze mną skons
    ultować."
    ;
  7. $lang['imie'] = "Imię i nazwisko";
  8. $lang['imie_title'] = "Wpisz swoje imię i nazwisko, lub swój pseudonim.";
  9. $lang['email'] = "Adres Email";
  10. $lang['email_title'] = "Musisz go podać, abym mógł Ci odpowiedzieć.";
  11. $lang['tekst'] = "Treść zapytania";
  12. $lang['tekst_title'] = "Postaraj się jak najdokładniej opisać problem. Nie ma limitu słów.";
  13.  
  14. $lang['potwierdzenie'] = "Dziękuję za zgłoszenie. Twoja wiadomość została zapisana. Odpowiem najszybc
    iej jak będę mógł."
    ;
  15.  
  16.  
  17. ?>


po odpaleniu kazal mi dolaczyc plik language/pl/validation_lang.php. Dolaczylem pusty. Teraz wchodzimy na formularz, nie wpisujemy danych i zatwierdzamy. Zamiast standardowych opisow bledow typu "wpisz imie", wyskakuja komunikaty: Unable to access an error message corresponding to your field name.

Jak to dopisac zeby wyswietlalo mi poprawnie komunikaty bledow.

Moze znacie lepszy sposob na wielojezycznosc stron?
nrm
brakuje ci tych komunikatow (dales pusty plik). pobierz polski lang z wiki albo poszukaj na forum malej przerobki biblioteki validation aby mod definiowac wlasne komunikaty bledow.
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.