Witamy na polskiej stronie wsparcia CodeIgniter. Nie zapomnij odwiedzić naszej strony głównej
Nie jesteś zalogowany na forum.
Strony: 1
Mam pytanie.
Za pomoca funkcji row_array() sciagam sobie pojedyncze wiersze z odpowiednich tabel wersji jezykowych.
Dla danej sekcji strony mam przykladowo dwie takie tabele. jedna ze stalymi labelami, natomiast druga tabela z wynikami dzialan na bazie danych.
Do "odpalenia" widoku danej sekcji musze dwa wiersze polaczyc w jeden i "zapodac" go do html'owej templatki wywolywanej sekcji. Proboje to uzyskac za pomoca funkcji array_merge() tworzac cos w tym stylu :
$row_s = array_merge($row_t,$row_s);
Niestety wywala mi nastepujacy blad :
<p>Severity: Warning</p>
<p>Message: array_merge() [<a href='function.array-merge'>function.array-merge</a>]: Argument #1 is not an array</p>
<p>Filename: core/MY_Controller.php</p>
<p>Line Number: 30</p>
Czym sa zatem wyniki dzialania funkcji row_array() jesl php nie traktuje ich jako tablic ?
Offline
Argumenty muszą być tablicami, najwyraźniej przekazujesz inny typ. sprawdź co zwraca $row_t. Poza tym o ile dobrze zrozumiałem to chcesz zrobić złączenie. Jeśli tak to robisz to źle. Użyj do tego funkcji join, która da Ci w rezultacie to co chcesz osiągnąć. Przykład zapytania:
$this->db->select($this->db->dbprefix('nazwa_pierwszej_tabeli').'.*')
->select($this->db->dbprefix('druga_tabela').'.kolumna')
->from($this->db->dbprefix('nazwa_pierwszej_tabeli'))
->join($this->db->dbprefix('nazwa_pierwszej_tabeli'), $this->db->dbprefix('nazwa_pierwszej_tabeli').'.obce_id = '.$this->db->dbprefix('druga_tabela').'.id', 'left');
Wówczas nie musisz się martwić o łączenie wyników. Dalsza część zapytania wygląda tak samo.
Ostatnio edytowany przez maniakphp (19-03-2013 19:58:47)
Offline
OK ROZWIAZANE
Pracuje teraz nad czyms w rodzaju uniwersalnego silnika, ktorego zadaniem jest uporzadkowane ladowanie kolejnych segmentow skladajacych sie na widok strony.
Tak jak mowilem niektore segmenty zawieraja jedynie labele dla tag'ow html, a niektore zawieraja wyniki operacji przeprowadzanych na bazie danych.
Caly wist polegal na tym ze silnik korzysta ze specjalnego konfiga ktory, ktory nie dla wszystkich rodzajow tabel (co zrozumiale) podaje ich konkretne odnosniki w bazie danych. Zatem jesli funkcja :
$row_s = array_merge($row_t,$row_s);
jest uruchamiana niezaleznie od tego czy tabela w bazie wystepuje czy nie dochodzi do sytuacji w ktorej faktycznie zamiast argumentu w postaci "array" pobierany jest argument '' (pusty), ktory ta tablica nie jest. Ostatecznie wystarczylo nalozyc prosty warunek :
if ( $row_t != '')
{
$row_s = array_merge($row_t,$row_s);
}
Offline
A czemu w tym przypadku nie możesz skorzystać z kodu który podałem?
Offline
Sorry, pisalismy w tym samym czasie .
Bardzo Ci dziekuje za reakcje. Moje rozwizane (biorac pod uwage moje doswiadczenie) jednak lepiej mi odpowiada bo jest po prostu banalnie proste . Ja nawet nie rozumiem o czym Ty do mnie tam u gory rozmawiasz
. Dlatego chwilowo (caly czas Ci dziekujac) poprzestane na swoim rozwiazaniu. Zobacz oto gotowy silnik :
$section = array_keys($data['frame']);
foreach ($section as $s_id) // dla kazdej sekcji
{
$row_s = array('init'=>'init');;
foreach ($data['frame'][$s_id] as $table) // kazda tablice
{
if ( $table != '')
{
$row_t = $this->Page_model->_get_table_row($table,$data['language']);
if ( $row_t != '')
{
$row_s = array_merge($row_s, $row_t);
}
}
}
$this->load->view('templates/'.$s_id.$data['mode'].'.php',$row_s);
}
plus ladowanie danych z bazy w modelu :
// Get Table row - pobierz wiersz z tabeli dla wartosci id = $language :
function _get_table_row($table,$language)
{
$rows = $this->db->count_all($table);
if ($rows != 0)
{
$sql = "SELECT * FROM ".$table." WHERE ".'id'." = ?";
return $this->db->query($sql,array($language))->row_array();
}
}
plus odpowiedni config ladowany w kontrolerze do $data :
$config = array(
'hp_'=>array(
's1'=>array(
'lab_'=>'',
'lab_m'=>'',
'var_'=>'',
'var_m'=>''
),
's2'=>array(
'lab_'=>'s2_lab_',
'lab_m'=>'s2_lab_',
'var_'=>'',
'var_m'=>''
),
's3'=>array(
'lab_'=>'',
'lab_m'=>'s3_lab_v',
'var_'=>'',
'var_m'=>''
),
's4'=>array(
'lab_'=>'s4_lab_',
'lab_m'=>'',
'var_'=>'',
'var_m'=>''
),
'hd1_'=>array(
'lab_'=>'',
'lab_m'=>'',
'var_'=>'hd1_var_',
'var_m'=>''
),
'hp_'=>array(
'lab_'=>'hp_lab_',
'lab_m'=>'',
'var_'=>'',
'var_m'=>''
),
's7'=>array(
'lab_'=>'s7_lab_',
'lab_m'=>'',
'var_'=>'s7_var_',
'var_m'=>''
)
),
'rtc'=>array(
)
);
To razm daje juz calkiem sprytny motorek mimo ze banalnie prosty.
Offline
if ( $row_t != '') { $row_s = array_merge($row_t,$row_s); }
Ładniej byłoby skorzystać z rzutowania:
array_merge((array)$row_t, $row_s);
@maniakphp - jeśli korzystamy z AR, to prefiks dla tabeli jest dodawany automatycznie (o ile jest zdefiniowany). Metodę dbprefix stosujemy podczas pracy ze "zwykłymi" zapytaniami do bazy.
Offline
renholder
Dziekuje bardzo.
Najpierw jednakmusze sobie poczytac co to w ogole jest "rzutowanie" .
Offline
@maniakphp - jeśli korzystamy z AR, to prefiks dla tabeli jest dodawany automatycznie (o ile jest zdefiniowany). Metodę dbprefix stosujemy podczas pracy ze "zwykłymi" zapytaniami do bazy.
A mi w codziennej pracy powtarzają: pamiętaj o dbprefix, jest on dawany ze względu na specyfikę projektu - dla bezpieczeństwa. Ta moja propozycja użycia join chyba tu nie ma zastosowania, dzięki tj_gumis za kod, byłem ciekawy czy dobrze Cię zrozumiałem, ale niestety źle A rzutowanie w największym skrócie to wymuszenie danego typu dla zmiennej, spowoduje to że ta zmienna będzie zawsze tablicą, nawet jeśli pustą. Tak samo możesz rzutować jako string, int itd. Ocztwiście to taka moja skrócona wersja definicji, więc poczytaj dokładniej
Offline
maniakphp
Dzieki, oszczedziles mi kupe czasu . Jestem juz tak padniety ze moge sie w koncu polozyc, a tak siedzialbym jeszcze i "studiowal"
.
Offline
Strony: 1