Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja budująca tablicę plików do wczytania
Forum PHP.pl > Forum > Przedszkole
XP'ek
Witam wszystkich,

zbudowałem sobie taki skrypcik w którym tworzę Tablicę css'ów do wczytania dla danego controlera wygląda to tak:

controler welcome.php

  1. public function __construct()
  2. {
  3. parent::__construct();
  4. $admin = new Admin();
  5. $admin->load();
  6.  
  7. View::setCSS('{$base_url}public/css/styles/dashboard.css', "text/css");
  8. }


model view.php

  1.  
  2. public $_css = array();
  3. public $_jq = array();
  4.  
  5. /**
  6.   * przygotowanie tablicy stylu CSS
  7.   */
  8. public function setCSS($data, $type = false, $media = false) {
  9. View::$this->_css[] = array("href"=>$data, "type"=>$type, "media"=> $media);
  10. }
  11.  
  12. /**
  13.   * przygotowanie tablicy stylu jQuery
  14.   */
  15. public function setJQ($data) {
  16. View::$this->_jq[] = array("href"=>$data);
  17. }
  18.  
  19. /**
  20.   * przygotowanie tablicy stylu jQuery
  21.   */
  22. public function gets() {
  23. $jq = View::$this->_jq;
  24. $css = View::$this->_css;
  25. if($css)Smarty::assign("_CSS", $css);
  26. if($jq) Smarty::assign("_JQ", $jq);
  27. }


model admin.php
  1. function load(){
  2. /* Wczytanie domyślnych CSS'ów */
  3. View::setCSS('public/css/style.css', "text/css");
  4. View::setCSS('public/css/bootstrap/bootstrap-responsive.css', "text/css");
  5. View::setCSS('public/css/bootstrap/bootstrap.css', "text/css");
  6. View::setCSS('public/css/fonts.css', "text/css");
  7.  
  8. /* Wczytanie domyślnych JS'ów */
  9. View::setJQ("public/js/html5shiv-printshiv.js");
  10. View::setJQ("public/js/jquery/jquery-1.6.4.min.js");
  11. View::setJQ("public/js/jquery/jquery-ui-1.8.16.custom.min.js");
  12.  
  13. /* przkezanie parametrów */
  14. View::gets();
  15. }


no i oczywiście wszystko było by pięknie ale tak nie jest dostaję zwrotne takie błędy

Cytat
A PHP Error was encountered

Severity: Notice

Message: Undefined property: Welcome::$_css

Filename: core/Model.php

Line Number: 51

A PHP Error was encountered

Severity: Notice

Message: Indirect modification of overloaded property Admin::$_css has no effect

Filename: models/view.php

Line Number: 52


proszę o pomoc w rozwiązaniu problemu całość ma polegać na tym, że wstawiam sobie w index.tpl
Kod
    <!-- Style -->
    {foreach from=$_CSS item=css}
    <link rel="stylesheet" href="{$css.href}"{if $css.type} type="{$css.type}"{/if}{if $css.media} type="{$css.media}"{/if}>
    {/foreach}


i odpowiednio na moje potrzeby zostaną wczytane te pliki które sobie wpiszę w danym controllers
Mlodycompany
w pliku model view.php masz błędy tzn
  1. View::$this->_css[] = array("href"=>$data, "type"=>$type, "media"=> $media);

odwołujesz się do klasy View statycznie ale jednak nie, w sumie to w ogóle nie rozumiem tego zapisu. Popraw go na
  1. $this->_css[] = array("href"=>$data, "type"=>$type, "media"=> $media);
XP'ek
Twój sposób nie rozwiązuje błędu.
nospor
Poniewaz robisz jeszcze inne bledy, jak np.:
View::setCSS('{$base_url}public/css/styles/dashboard.css', "text/css");
View nie ma metody statycznej setCSS. Ta metoda jest metodą obiektu a nie klasy.

masz stworzyć obiekt $view i przez niego to dodawać
$view->setCSS(....);

Albo masz w klasie View zrobić metodę statycznę poprawnie. Wówczas metoda statyczna moze korzystać ze zmiennych statycznych klasy a nie wlasciwosci obiektu.

Teraz mieszasz ze sobą dwa pojęcia.
XP'ek
OK dzięki za podpowiedź zaraz tym się zajmę mam jeszcze jedno pytanie a dokładniej chodzi o budowę drzewka.

np. w controllers welcome
wczytuję bazę

  1. public function __construct()
  2. {
  3. parent::__construct();
  4. $admin = new Admin();
  5. $admin->load();
  6.  
  7. View::setCSS('{$base_url}public/css/styles/dashboard.css', "text/css");
  8. }


ale np. dla funkcji logowanie chce doczytać logowanie.css
  1. public function logowanie()
  2. {
  3. View::setCSS('{$base_url}public/css/styles/logowanie.css', "text/css");
  4. }


i w tym momencie jak daje gets'a to zostaje mi tylko wczytany logowanie.css jak usprawnić mogę model View'a aby przechwytywał mi w ten sposób tablicę ?
nospor
Metoda setCSS wydaje się być ok - wg. kodu z pierwszego posta. Podejrzewam więc, że robiąc poprawki popsułes tę metodę. Pokaż więc kod na nowo z poprawkami smile.gif
XP'ek
ok więc tak wyglądają moje pliki

controllers
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Inbox extends CI_Controller {
  4.  
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. $admin = new Admin();
  9. $admin->admin();
  10. $admin->lang();
  11. $admin->uri();
  12.  
  13. $view = new View();
  14. $view->setCSS(base_url().'public/css/style.css', "text/css");
  15. $view->setCSS(base_url().'public/css/bootstrap/bootstrap-responsive.css', "text/css");
  16. $view->setCSS(base_url().'public/css/bootstrap/bootstrap.css', "text/css");
  17. $view->setCSS(base_url().'public/css/fonts.css', "text/css");
  18. $view->setCSS(base_url().'public/css/styles/helper.css', "text/css");
  19. $view->setCSS(base_url().'public/css/styles/colors.css', "text/css");
  20. $view->setCSS(base_url().'public/css/styles/agenda.css', "text/css");
  21. $view->setCSS(base_url().'public/css/size/480.css', "text/css","only all and (min-width: 480px)");
  22. $view->setCSS(base_url().'public/css/size/768.css', "text/css","only all and (min-width: 768px))");
  23. $view->setCSS(base_url().'public/css/size/992.css', "text/css","only all and (min-width: 992px)");
  24. $view->setCSS(base_url().'public/css/size/1200.css', "text/css","only all and (min-width: 1200px)");
  25.  
  26. /* Wczytanie domyślnych JS'ów */
  27. $view->setJQ(base_url()."public/js/jquery-1.8.2.min.js");
  28. $view->setJQ(base_url()."public/js/setup.js");
  29. $view->setJQ(base_url()."public/js/bootstrap/bootstrap.js");
  30. $view->setJQ(base_url()."public/js/tinycon.js");
  31.  
  32. $view->gets();
  33. }
  34.  
  35. public function index(){
  36. $view = new View();
  37. $view->setCSS(base_url().'public/css/styles/messages.css', "text/css");
  38.  
  39. $this->smarty->view('inbox/index.tpl');
  40. }
  41.  
  42. }


model view.php
  1. <?php
  2. class View extends CI_Model{
  3.  
  4. private $_output = array(
  5. 'status' => 1,
  6. 'message' => '',
  7. 'timestamp' => '',
  8. 'errorCode' => 0,
  9. 'executionTime' => 0,
  10. 'data' => array()
  11. );
  12.  
  13. private $_data = array();
  14. private $_css = array();
  15. private $_jq = array();
  16.  
  17. /**
  18.   * przygotowanie tablicy stylu CSS
  19.   */
  20. public function setCSS($data, $type = false, $media = false) {
  21. $this->_css[] = array("href"=>$data, "type"=>$type, "media"=> $media);
  22. }
  23.  
  24. /**
  25.   * przygotowanie tablicy stylu jQuery
  26.   */
  27. public function setJQ($data) {
  28. $this->_jq[] = $data;
  29. }
  30.  
  31. /**
  32.   * przygotowanie tablicy stylu jQuery
  33.   */
  34. public function gets() {
  35. $jq = $this->_jq;
  36. $css = $this->_css;
  37. if($css) $this->smarty->assign("_CSS", $css);
  38. if($jq) $this->smarty->assign("_JQ", $jq);
  39. }
  40.  
  41. /**
  42.   * Metoda dodaje dane do wyjścia
  43.   * @param mixed $data wartość wysyłana na wyjście
  44.   * @param string $key klucz pod którym umieścić dene
  45.   * @param bool $append flaga czy dodajemy do istniejącej już struktury
  46.   */
  47. public function setData($data, $key = false, $append = false) {
  48. if ($key) {
  49. if ($append) {
  50. $this->_output['data'][$key][] = $data;
  51. } else {
  52. $this->_output['data'][$key] = $data;
  53. }
  54. } else {
  55. if ($append) {
  56. $this->_output['data'][] = $data;
  57. } else {
  58. $this->_output['data'] = $data;
  59. }
  60. }
  61. }
  62.  
  63.  
  64. }
  65. ?>


ostatecznie zrezygnowałem z modelu admin load i dałem to do __construct
nospor
No ale panie kolego... obiekt $view masz tworzyć raz i korzystać z niego tam gdzie chcesz, a nie ty tworzysz x obiektów $view - przecież każdy z nich ma własną tablicę css
XP'ek
ale jak w index() wywalę
  1. $view = new View();
to automatycznie dostaje błąd

Cytat
A PHP Error was encountered

Severity: Notice

Message: Undefined variable: view

Filename: controllers/inbox.php

Line Number: 42


możesz mnie nakierować bardziej co jest źle questionmark.gif albo jak przerobić to by ominąć kodowo wywołanie $view->gets(); i w inny sposó tworzyć tą tablicę do przekazania questionmark.gif
nospor
1) Poczytaj o zasięgu zmiennych - w manualu masz to bardzo dobrze wyjaśnione przy zmiennych
2) Możesz użyć wzorca faktory do pobierania $view
3) Możesz użyć wzorca Singleton do pobierania zawsze tego samego $view
4) Obiekt $view możesz przekazywać do innych obiektów, które z niego korzystają
5) No i możesz wkoncu wszystko zamienic na STATIC wowczas będzie się odwoływał przez klase VIEW a nie przez obiekt - wówczas klasa będzie miało wszystko to samo jako static

Do wyboru do koloru
XP'ek
ok dzięki faktycznie wystarczyło zmienić

Cytat
private $_css = array();
private $_jq = array();


na
Cytat
private static $_css = array();
private static $_jq = array();


ale pozostaje kwestia jak najlepiej rozwiązać opcję z View::gets(); by pobierać elementy bo jeśli zostawię nawet tak
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Inbox extends CI_Controller {
  4.  
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. $admin = new Admin();
  9. $admin->admin();
  10. $admin->lang();
  11. $admin->uri();
  12.  
  13. View::setCSS(base_url().'public/css/style.css', "text/css");
  14. View::setCSS(base_url().'public/css/bootstrap/bootstrap-responsive.css', "text/css");
  15. View::setCSS(base_url().'public/css/bootstrap/bootstrap.css', "text/css");
  16. View::setCSS(base_url().'public/css/fonts.css', "text/css");
  17. View::setCSS(base_url().'public/css/styles/helper.css', "text/css");
  18. View::setCSS(base_url().'public/css/styles/colors.css', "text/css");
  19. View::setCSS(base_url().'public/css/styles/agenda.css', "text/css");
  20. View::setCSS(base_url().'public/css/size/480.css', "text/css","only all and (min-width: 480px)");
  21. View::setCSS(base_url().'public/css/size/768.css', "text/css","only all and (min-width: 768px))");
  22. View::setCSS(base_url().'public/css/size/992.css', "text/css","only all and (min-width: 992px)");
  23. View::setCSS(base_url().'public/css/size/1200.css', "text/css","only all and (min-width: 1200px)");
  24.  
  25. /* Wczytanie domyślnych JS'ów */
  26. View::setJQ(base_url()."public/js/jquery-1.8.2.min.js");
  27. View::setJQ(base_url()."public/js/setup.js");
  28. View::setJQ(base_url()."public/js/bootstrap/bootstrap.js");
  29. View::setJQ(base_url()."public/js/tinycon.js");
  30.  
  31. View::gets();
  32. }
  33.  
  34. public function index(){
  35. View::setCSS(base_url().'public/css/styles/messages.css', "text/css");
  36.  
  37. $this->smarty->view('inbox/index.tpl');
  38. }
  39.  
  40. }
  41.  


to nie wczyta mi SetCSS z index'a znowuż nie chce w każdej funkcji rozpoczynać od View::gets(); bo wtedy owszem to działa i wszystko co mam nad gets'em jest poprawnie wczytane

próbowałem wykorzystać http://ellislab.com/codeigniter/user-guide...re_classes.html

  1. <?php
  2. class MY_Controller extends CI_Controller {
  3.  
  4. function __construct()
  5. {
  6. parent::__construct();
  7. View::gets();
  8. }
  9.  
  10. }
  11. ?>


i w controllerze wywołałem extends MY_C.. zamiast CI ale znowu dostaje
Cytat
A PHP Error was encountered

Severity: Notice

Message: Undefined property: Inbox::$_jq

Filename: models/view.php

Line Number: 66

A PHP Error was encountered

Severity: Notice

Message: Undefined property: Inbox::$_css

Filename: models/view.php

Line Number: 67
nospor
Cytat
znowuż nie chce w każdej funkcji rozpoczynać od View::gets()
A kto ci każe w każdej funkcji? Robić to masz raz, tuż przed generowaniem głównego szablonu
XP'ek
no tak zgadza się smile.gif ale to muszę teraz przerobić $this->smarty->view
ponieważ wstawienie View::gets(); w classę odpowiadającą za wczytanie i ustawienie smarty dla CodeIgniter to niestety pokazuje mi identyczny błąd.
nospor
No a metodę gets zmieniłeś na statyczną? Zmieniłeś w niej odwołania do css i jq? Z komunikatu błędu widać jakby nie....
XP'ek
nie nie zmieniłem na statyczną i nie wiem jak zmienić odwołanie ponieważ $this-> mi nie działa
nospor
no skoro masz funkcje statyczną, to już nie $this-> a self::$zmienna
no takie podstawy trzeba ci wyjaśniać?
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.