php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.12.2011, 09:57  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard Problem mit MVC und Ajax Request, responseText kommt als gesamtes Layout zurück

Hallo Jungs,

ich habe ein Problem wo ich es schon seit ein paar Tagen versuche selber zu lösen, aber ich bin nun an dem Punkt wo ich nicht mehr weiter weis.

Ich habe eine Anwendung die auf dem MVC aufbaut. Im Front Controller wird das MVC zusammengebaut und die View am Ende in das Layout gerendert.

Wenn ich eine Action über die Browseradressleiste oder über das klicken auf einen Link anfordere dann klappt das auch super. Aber wenn ich dann einen Ajax Request absende dann rendert er mir das komplette Layout in mein Layoutdokument noch mal rein. Aber die view.phtml die ander Ajax Action hängt ist nirgends im Dokument zu sehen.

Kurzes Beispiel wo das so auftritt ist.

Ich habe die Kundenregistrierung folgendermaßen aufgerufen.
Zitat:
http://localhost/WendtNeu/User/User/regist/reg/customer
Alles ok. So dann gibts da ein Textfeld plz und bei der Eingabe der 3 Zahl wird ein Ajax Request gesendet und der soll dann alle Orte und Plz ausgeben. Aber das passiert eben nicht, der rendert auf einmal da das ganze Layout rein.
Ich habe es mit einer Methode in der View versucht wo das rendern unterdrückt werden soll und dann beim Rednerprzess mit eingebunden.

PHP-Code:
//Methode in der View
/**
     * (non-PHPdoc)
     * @see I_View::render()
     */
    
public function render($pAction null)
    {
        if(
false !== $this->getRender()) {
            
ob_start();
            include 
$this->_viewPath $this->_viewFile;
            return 
ob_get_clean();
        }
    } 
Und so wird das in der Action gesetzt.

PHP-Code:
public function plzAction()
    {
        
$this->_view->setRender(false);
    } 
Und hier wird dann im Front Controller die View ins Layout gerendert, was nicht immer sein soll, z.B. in meinem Beispiel.

PHP-Code:
/**
     * 
     *     Laden des Layouts
     */
    
protected function _loadLayout()
    {    
        
$controller strtolower($this->getRequest()->getController());
        
$layoutPath APPLICATION_PATH $this->_config->layouts->path;
        
        if(!
file_exists($layoutPath $controller '.phtml')) {
            
            if(!
file_exists($layoutPath 'default.phtml')) {
                require_once 
LIB_PATH 'View/ViewException.php';
                throw new 
ViewException('Layout File failed. You must create a default.phtml File.');
            }
            
            
$layout $layoutPath 'default.phtml';
        } else {
            
$layout $layoutPath $controller '.phtml';
        }
        
        
$this->_layout->setView($this->_view);
        
$this->_layout->setRequest($this->_request);
        
$this->_layout->setLayout($layout);
        
$this->_layout->content $this->_view->render();
        
$this->_layout->getLayout();
    } 
Also meine Frage, wie kann ich es erreichen das wenn ich ein Autocomplete laden will z.B. den Plz, das dann auch nur die View geladen wird aber nicht das komplette Layout gerendert wird?

Vielen Dank für eure Hilfe, ich hoffe ich konnte mich verständlich ausdrücken.

Gruß der Litter

Ps.:
Noch eine Bemerkung, ich habe für Ajax Geschichten ein eigenes Modul angelegt, wenn diese in der Anwendung oft benutzt werden. Aber das Problem tritt auch auf wenn ich einem Modul Ajax spezielle Actions habe. So sieht es aus wenn ich den Request mit Ajax absende.

Im Bild Anhang seht ihr was passiert wenn ich den Ajax Request absende.

Code:
ajaxRequest.open("GET", "http://localhost/WendtNeu/Ajax/Autocomplete/plz" + requestString);
Miniaturansicht angehängter Grafiken
problem-mit-mvc-und-ajax-request-responsetext-kommt-als-gesamtes-layout-zurueck-layout_view.jpg  
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de

Geändert von litterauspirna (29.12.2011 um 10:00 Uhr).
litterauspirna ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.12.2011, 10:04  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

also im KOhana Framework, gibt es da methoden wie before() und after() , der Request ablauf funktioniert etwa so

http://localhost/mein_porojekt/testc...ler/testaction

wird aufgerufen, danach wird der testcontroller geladen, danach wird erst die funktion before() aufgerufen dann die testaction() dann after().

in before kann man dann im hauptcontroller $this->auto_render auf false setzen. Dadurch wird das Layout nicht geladen sondern es wird erwartet dass die testaction eine ausgabe macht.

Hier mal ein Beispiel von meinem Map Controller.

PHP-Code:
<?php

defined
('SYSPATH') or die('No direct script access.');
//Controller_Game == Front Controller
class Controller_Map extends Controller_Game {

    public function 
before() {
       
        
//Disable Layout
        
$this->auto_render FALSE;
        if (!
$this->request->is_ajax()) {
            
//Disable to load the Page without Ajax
            
throw new HTTP_Exception_404();
        }
       
parent::before();
    }

    public function 
action_index() {
        
//If XSRF is right
        
if ($$this->request->post('xsrf') == $this->session->get('xsrfToken')) {
            
$data = array('result'=>'cool stuffs');
           
//$response Objekt wird zum schluss ausgegeben
            
$this->response->body(json_encode($data));
        }
       
    }

}
Vielleicht hilft es dir weiter

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (29.12.2011 um 10:09 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 29.12.2011, 10:25  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Hmm so richtig kann ich dem nicht wirklich folgen.

Ich mache das ja auch, nur meine Render Methode in der Action aufgerufen wird.

Wäre es denn besser so ein Autocomplete wie bei der PLZ als View Helper zu implementieren?

Aber dann besteht das Problem eben noch bei einer Ajax Suche zum Beispiel.

Wenn man links etwas eingibt oder eine Checkbox angewählt wird, dann soll der Content nur aktualisiert werden. Aber dann würde der auch das Layout neu ins bestehende Layout rein rendern.

Ich stehe momentan vor einem kleinen Loch.
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 29.12.2011, 10:53  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Geht es dir um eine Lösung auf der konzeptionellen Ebene? Nun, auch an anderen Stellen muss nicht immer das gesamte Layout zurückgegeben werden, sondern teilweise auch nur die View der einzelnen Action. Das ist etwa bei HMVC-Stacks der Fall. In meinem Framework setze ich für einen HMVC-Aufruf einen internen Request: (Alles schematisch)

PHP-Code:
public function loginAction() {
    
// ...
    
$this->getView()->weatherWidget InternalRequest::factory('widgetController::weatherAction/plz:12345')->execute();
   
// ...

Der InternalRequest basiert auf der regulären Request-Klasse, mit der Ausname dass dieser Request die Antwort des Controllers nicht sofort ausgibt, sondern nur zurückgibt. Desweiteren hat jeder Controller Zugriff auf den Request, welcher wiederum die boolschen Methoden "isInternal()" und "isAjax()" bereitstellt. Ich kann also in der betreffenenden Action darauf reagieren:

PHP-Code:
public function weatherAction($plz) {
    
// ...
    
$this->getView()->weatherData $weatherData;
    
    
$content = ($this->getRequest()->isAjax() || $this->getRequest()->isInternal())
              ? 
$this->getView()->renderPartial()
              : 
$this->getView()->render();

    return new 
Response($content$header);

Auf diese Weise kann jede Action die View entweder komplett (mit Layout) oder nur die Einzelview (partial) zurückgeben. Vielleicht hilft dir das ja weiter.
__________________
dsentker ist offline   Mit Zitat antworten
Alt 29.12.2011, 11:10  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

naja was ich sagen will

PHP-Code:
      $this->_layout->setView($this->_view); //Wieso muss man dem Layout ein View übergeben? ein Layout ist auch nur ein View

        
$this->_layout->setRequest($this->_request); //Wieso wird dem Layout ein Request übergeben, eigentlich kümmert sich der Controller was das View erhalten soll
        
$this->_layout->setLayout($layout); 
        
$this->_layout->content $this->_view->render(); //Dieser Part müsste im Controller passieren
        
$this->_layout->getLayout(); 
Schau dir vorhandene Frameworks an.

In Kohana gibt es 2 Front Controller, einmal Controller und Controller_Template

der Controller_Template ist der Controller der das Layout in der before() action setzt und es dann in der after() methode es rendert und das Ergebnis an das Response Objekt weiter gibt

http://pastebin.com/9LK2nQ3p

Danach erstellt man ein Front_Controller der vom Controller_Template erbt. Dadurch hat man das $template objekt im Front_Controller und man kann im view dann $content definieren und in der action $this->template->content = 'inhalt' setzen.

Wenn man aber dann in der Before action das auto_render auf false setzt, wird es kein template objekt in before() erzeugt und response objekt in der after() action erhält auch kein inhalt.

somit kann man in seiner action dann den response->body mit seinem eigenen inhalt füllen, welcher am ende ausgegeben wird.

Hoffe jetzt ist einiges etwas klarer

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 29.12.2011, 15:04  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Mal davon abgesehen wie das andere Frameworks machen, will ich erst mal erfragen ob ich grad mein Problem auch richtig verstanden habe. Ich bin nun immer hin und her zwischen euren Antworten und meinem Code.

Kann das Problem daran liegen das ich in jedem Fall immer das Layout mit rendere weil ich das schon seperat im Front Controller immer mit aufrufe?

Es wäre also richtiger das rendern eines Dokumentes oder eben nur einer View immer in der Action Methode eines Action Controllers zu machen, weil ich dann in der Action entscheiden kann ob mir nur eine einzelne View bei der Action Ausführung gerendert werden soll oder eben ein ganzes Layout mit der View?

Habe ich das in etwa so richtig verstanden?

In HMVC zu denken fällt mir doch noch reichlich schwer, von daher wäre es schon mal gut wenn ich das jetzt im gängigen MVC richtig verstanden habe.

Danke für eure Antworten

Ps.:
Weil es da die Methode isAjax() gibt, ich schätze die sagt mir das ein Ajax Request abgesendet wurde, wie kann ich denn ermitteln das ein Ajax Request gesendet wurde?
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 29.12.2011, 15:09  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Kann das Problem daran liegen das ich in jedem Fall immer das Layout mit rendere weil ich das schon seperat im Front Controller immer mit aufrufe?
Richtig. Der FrontController hat mit Views nichts am Hut.


Zitat:
Es wäre also richtiger das rendern eines Dokumentes oder eben nur einer View immer in der Action Methode eines Action Controllers zu machen, weil ich dann in der Action entscheiden kann ob mir nur eine einzelne View bei der Action Ausführung gerendert werden soll oder eben ein ganzes Layout mit der View?
Korrekt.
Zitat:
Weil es da die Methode isAjax() gibt, ich schätze die sagt mir das ein Ajax Request abgesendet wurde, wie kann ich denn ermitteln das ein Ajax Request gesendet wurde?
PHP-Code:
    function isAjax() {
        return (isset(
$_SERVER['HTTP_X_REQUESTED_WITH']) &&
               (
$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));
    } 
Alternativ kannst du auch bei Ajax-Requests einen Parameter mitsenden (etwa 'is_ajax' => true)
__________________
dsentker ist offline   Mit Zitat antworten
Alt 29.12.2011, 15:14  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Ok dann habt erst mal vielen Dank.

Dann denke ich kann ich mir das seperate Layout Objekt ja auch sparen und wegschmeißen und alles in der View steuern richtig?

Ich werde mich dann mal an eine Problemlösung machen und hier noch mal posten. Ist schon erst mal gut das ich jetzt verstanden habe wo das eigentlliche Problem liegt, dass habe ich seit Tagen bis jetzt nicht gerafft.

Gruß der Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 29.12.2011, 15:27  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Kann das Problem daran liegen das ich in jedem Fall immer das Layout mit rendere weil ich das schon seperat im Front Controller immer mit aufrufe?
Das ist nicht das Problem, du hast halt keine Möglichkeit erstellt dass in deinem Front Controller das Automatische rendern ausgestellt werden kann
Zitat:
Zitat von litterauspirna Beitrag anzeigen
Es wäre also richtiger das rendern eines Dokumentes oder eben nur einer View immer in der Action Methode eines Action Controllers zu machen,
was ist ein Action Controller? Es wäre richtiger das Layout View in dem frontcontroller zu rendern und zwar nach dem die action aufgerufen wurde.
Die View klasse soll ledeglich parameter an das zu rendernde dokument übergeben und das ganze dann rendern.
Zitat:
Zitat von litterauspirna Beitrag anzeigen
weil ich dann in der Action entscheiden kann ob mir nur eine einzelne View bei der Action Ausführung gerendert werden soll oder eben ein ganzes Layout mit der View?
Es wäre flexibler, wenn das View in deinem Front Controller keinen $content parameter erhalten würde, sonder man müsste den selber in eigenen controller setzen.


Zitat:
Zitat von litterauspirna Beitrag anzeigen
In HMVC zu denken fällt mir doch noch reichlich schwer, von daher wäre es schon mal gut wenn ich das jetzt im gängigen MVC richtig verstanden habe.
In den Geposteten code, steht nichts vom HMVC. Aber du könntest es doch so nachbauen bei dir

eine Klasse Controller , diese Klasse ist leer und hat ledeglich before und after actions.
eine Klasse Controller_Layout die von Controller erbt. Dort setzt du das View in der action before und renderst es in action after der HTML code des views soll aber nicht ausgegeben werden, sondern an die klasse Request übergeben werden.
eine Klasse Controller_Front die von Controller_Layout erbt. der Front Controller hat zb eine indexAction. da du ja von Controller_Layout erbst, hast du zugrif auf $this->layout. und in der indexAction des Front controllers machste dann $this->layout->content = 'Content';
Danach brauchste eine klasse Request. diese Request klasse holt sich die URL, parst diese um zu ermitteln welcher controller, welche action und welche parameter geladen werden sollen. und dann rufst du die Action before des aufgerufenen controllers auf, dann die action aus der url und dann die action after. in der after action renderst du ja dein layout und dort kannst du es dann ausgeben.

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Ps.:
Weil es da die Methode isAjax() gibt, ich schätze die sagt mir das ein Ajax Request abgesendet wurde, wie kann ich denn ermitteln das ein Ajax Request gesendet wurde?
Bei einem Ajax request, steht oft im header "xmlhttprequest" dadurch kannst du erkennen ob der aktuelle request ein ajax request ist oder nicht.

In kohana steht in der index.php ganz unten folgendes:

PHP-Code:
echo Request::factory()
    ->
execute()
    ->
send_headers()
    ->
body(); 
execute() verarbeitet die URL und ruft controller/action auf mit eventuellen parametern
send_headers() die headers können in Controllern gesetzt werden
body() gibt das View aus. im grunde hat Request eine statische variable und diese wird durch view erweitert.

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 29.12.2011, 15:31  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von BlackScorp
Es wäre richtiger das Layout View in dem frontcontroller zu rendern und zwar nach dem die action aufgerufen wurde.
Einspruch! Würde die Layout View vom FrontController gerendert werden, hätte der eigentliche Controller keinen Zugriff auf diese. Es kann aber durchaus vorkommen, dass ein Controller das Layout ändert.

Zitat:
Zitat von BlackScorp
In kohana steht in der index.php ganz unten folgendes: [...]
Naja. Mir gefällt es da eher, dass der Controller ein Respone Objekt zurückliefert, bestehend aus Content und Header(n). Der Request hat m.E. damit nichts zu tun.
__________________
dsentker ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] jquery ajax request ist immer null taurus JavaScript, Ajax und mehr 3 29.08.2011 00:00
Problem: Auslesen eines dynamischen Formulars auf AJAX Basis Messenger PHP Einsteiger 5 18.07.2011 14:49
AJAX Problem beim IE bei Übergabe gleicher Parameter ernesto PHP Einsteiger 7 28.04.2011 17:44
Problem beim Layout coden RanMórii Sonstige 3 08.02.2011 20:26
[Erledigt] AJAX Request funktioniert nicht Nickstar JavaScript, Ajax und mehr 6 10.11.2010 20:21
AJAX: Webbrowser zurück, aber wie jackie1983 JavaScript, Ajax und mehr 2 04.02.2010 18:20
Javascript in Ajax responseText funktioniert nicht Plague PHP Tipps 2007 6 03.07.2007 21:08
Problem mit CSS Layout Kein Genie HTML, Usability und Barrierefreiheit 3 16.03.2007 10:52
innerHTML funktioniert nicht bei AJAX request Plague HTML, Usability und Barrierefreiheit 1 21.12.2006 14:30
ajax / popup problem flflfl HTML, Usability und Barrierefreiheit 11 11.06.2006 20:05
vor und zurück problem Crypi PHP Tipps 2006 4 10.01.2006 18:52
[Erledigt] Problem mit Layout bei Firefox HTML, Usability und Barrierefreiheit 3 14.11.2005 15:42
Problem mit CSS Layout HTML, Usability und Barrierefreiheit 5 15.10.2005 21:46
problem mit layout Beitragsarchiv 12 13.10.2005 12:41
3 Div Layout, Problem da Mitte zu lang faragerri HTML, Usability und Barrierefreiheit 3 11.08.2005 10:17

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mvc php was kommt wo rein, ajax result wieder posten, ajaxrequest() with parameters mvc, wie binde ich ajax anfragen in php mvc ein, mvc ajax controller result, ajax response nur inhalt, http request responsetext ausgeben, ajax call mvc, der gesamte rsponsetext, ajax request response, php mvc ajax, ajax php response problems, responsetext gibt php inhalt aus, request.responsetext ganze seite, ajax.request render, ajax request url auslesen, ajax .responsetext hat keinen inhalt, php mvc $this->request, ajax response ausgeben

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum