Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zend Framework i model
Pozycjonowanie i Optymalizacja > Projektowanie stron > PHP i MySQL
ExPloiT
Mam taki problem, napisałem sobie model i wszystko było by super gdyby nie to, że wywala mi błąd. Krótko mówiąc, jak wgram model Album.php do katalogu application/models to go nie widzi, a jak wgram do katalogu library to wszystko chodzi elegancko. Tak wygląda model:

KOD
<?php
class Album extends Zend_Db_Table {

public $_name = "gd_pliki";

}



Tak wygląda kontroler który korzysta z modelu Album

KOD
<?php

class HelloController extends Zend_Controller_Action
{

    public function init()
    {
        $this->view->baseUrl = $this->_request->getBaseUrl();
        Zend_Loader::loadClass('Album');
    }


    public function indexAction()
    {
        $view=new Zend_View();
        $album = new Album();
        $this->view->albums = $album->fetchAll();
        
    }
    
    

    
}
Domyślam się że gdzieś zrobiłem błąd, tylko nie wiem gdzie, i pewnie lezy on w tym, że nie podałem ścieżki.
Mion
Ustawiłeś-> " Zaprezentowany tutaj został przykład użycia Zend::loadClass() do ładowania naszych klas, a działa dzięki temu, że nasz katalog modeli umieściliśmy w include_path w pliku index.php. " ?
ExPloiT
W index.php mam tak:
KOD
set_include_path('.' . PATH_SEPARATOR . './library'
   . PATH_SEPARATOR . './application/models/'
   . PATH_SEPARATOR . get_include_path());
Mion
Z tego wynika, że Zend_Loader::loadClass('Album'); szuka pliku Album.php w katalogu library.
Nie korzystam z ZF wiec Ci nie powiem jak działa te ladowanie, ale jest opisane http://www.heavymind.net/zend-framework-tu...anie-aplikacji/ nie wiem jak to wygląda w aktualnej wersji, ale jest z pewnością w dokumentacji ZF'a
---
Tak na marginesie jak zaczynasz zabawę z ZF to stracisz więcej czasu na posty na forum niż na napisanie prostej aplikacji w tym wink.gif
ExPloiT
Zabawa zabawą taki mam wymóg na etacie biggrin.gif Dzięki za pomoc smile.gif Swoją drogą są modele, ale przecież też mogę tworzyć swoje klasy i wrzucać je do katalogu library, i stamtąd je brać. Widziałem tak w kilku miejscach na temat Zenda.
Mion
Wrzucać możesz gdzie chcesz i je następnie includować w skrypcie php, ale nie o to chodzi. Chodzi o pewien podział aplikacji na elementy-pliki i umieszczenie ich w określonych miejscach w strukturze katalogów - tak jak w kohana.
---
Z samej ciekawości testowałem na przykładzie z http://akrabat.com/zend-framework-tutorial/
i w index.php dałem:
KOD
<?php

define('APPLICATION_PATH','/home/webtester/domains/webtester.pl/public_html/zend/application');

define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
set_include_path('.' . PATH_SEPARATOR . './library'. PATH_SEPARATOR . './application/modelsy/'. PATH_SEPARATOR . get_include_path());

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()->run();

index.php jest w ścieżce
/home/webtester/domains/webtester.pl/public_html/zend
/home/webtester/domains/webtester.pl/public_html/zend/library
/home/webtester/domains/webtester.pl/public_html/zend/application

I "inckudowanie modeli działa jak należy
w kontlorerze nie musisz już robić Zend_Loader::loadClass('Album'); które jest w tym wypadku zbędne
KOD
class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $this->view->title = "My Albums";
        $this->view->headTitle($this->view->title, 'PREPEND');
        $albums = new Model_DbTable_Albums();
        $this->view->albums = $albums->fetchAll();
    }
Jednym słowem wszystko zależy od prawidłowej konfiguracji i zrozumienia zasad jak działa te auto loadery klas smile.gif
garyoldman
Nie wiem jaką masz strukturę katalogów, gdzie leży Twój index.php ale ja robię tak:

KOD
application/controllers/
application/models/
application/views/
cache/
lib/
public/index.php


Wszystkie żądania idą to pliku index.php w którym mam zapis
KOD
set_include_path('.' .PATH_SEPARATOR . '../lib'. PATH_SEPARATOR . get_include_path());


Mam też swoją klasę dziedziczącą z Zend_Controller_Action i w niej ustawiam sobie dodatkowe elementy np. załadowanie modeli wszystkich poprzez set_include_path dla katalogu ../application/models/ i teraz zamiast dziedziczyć w kontrolerach po Zend_Controller_Action to dziedziczę po tej swojej klasie w której mam poustawiane wszystko.

No i nigdzie nie ładuje ręcznie klas wystarczy dać w index.php
KOD
require_once("Zend/Loader.php");  
Zend_Loader::registerAutoload();
ExPloiT
Mam tak:
Model:
KOD
<?php
class Model_Album extends Zend_Db_Table {


    public $_name = "gd_pliki";

    
}

Kontroler:
KOD
<?php

class HelloController extends Zend_Controller_Action
{

    

    public function init()
    {
        $this->view->baseUrl = $this->_request->getBaseUrl();
        
        
    }

    public function indexAction()
    {    
        $view=new Zend_View();
        $album = new Model_Album();
        $this->view->albums = $album->fetchAll();
        
    }
    
    

    
}

i plik index.php
KOD
<?php

define('APPLICATION_PATH','c:/wamp/www/application');

define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
set_include_path('.' . PATH_SEPARATOR . './library'. PATH_SEPARATOR . './application/models/'. PATH_SEPARATOR . get_include_path());

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()->run();
I dostaje taki komunikat:
CYTAT
Fatal error: Class 'Album' not found in C:\wamp\www\application\controllers\HelloController.php on line 18

Wszystko wywale i skonfiguruje na nowo
garyoldman
Z jakiego tutoriala korzystasz? Ja przerabiałem ten co dał Mion i w nim wszystko działało i się udało smile.gif więc polecam go smile.gif
ExPloiT
Teraz wszystko elegancko działa smile.gif Dzięki Panowie za pomoc smile.gif Problem leżał w złej konfiguracji smile.gif
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-2012 Invision Power Services, Inc.