1

Я использую шаблон MVC, чтобы реализовать раздел на моем сайте, чтобы купить выставленные статьи. Однако у меня есть большая проблема для реализации этого раздела и, в частности, для обмена данными между моими контроллерами и использования этих данных во всех представлениях.как передать данные beetwen контроллер в шаблон MVC (PHP)

На сейчас, я попробовал два решения, чтобы передать эти данные между контроллерами:

  • первый заключается в создании, в верхней части кода мой контроллер, какой-то предмет из моих классов модели, которые могут быть изменен из всех ветвей коммутатора (и так из всей части моего контроллера). Я не могу понять, почему, переходя от представления к другому, всегда через один и тот же контроллер, мой объект сбрасывается и принимает значение null.
  • второе, не слишком полезное решение, заключается в использовании большого массива, переданного от представления к другому (от ветви коммутатора одного и того же контроллера до другой ветки), через форму или, кроме того, суперглобал переменные.

Я покажу вам вид и код:

Первое изображение является Войти ракурса; пользователь не авторизованы, уже определены форматы, в которых он хочет получить объект и должен войти.

http://i60.tinypic.com/2nq9rfd.jpg

второго снимка является вид после этого пользователь вошел в систему. Все данные пользователя и объектов получаются через запрос, но мне нужно помнить форматы, в которых пользователь хочет получать изображения!

Форматы ... выбранный способ оплаты и т. Д.

http://i61.tinypic.com/2v2xkt3.jpg

код ..

Мой MVC шаблон состоит в одном index.php (единственная точка доступа на мой сайт), что экземпляр объекта класса «X» -Controller что popolates мой master.php.

Это master.php является динамической пополнением страницы под удобством от моих контроллеров, что instantiantes все переменные и переменные объекта, чтобы составить запрошенное представление.

В частности, это код секции при покупке:

Контроллер

(полное (относительное) URL = /index.php?page=works & подстраницы = & оплата ImageID = 00000001)

class WorksController 
{ 
    public static $counter = 0; 

    public function __construct(&$request, &$session) 
    { 
     self::$counter++; 
     $this -> handle_input($request, $session); 

    } 

    private function handle_input(&$request, &$session) 
    { 
     //It create a new Album (class RaccoltaImmagini), that include all pictures (class Immagine) that have to be sell 
     if(!isset($raccoltaImmagini)) 
     { 

      $raccoltaImmagini = PicturesCollectionConstructor::buildNewCollection("AllPictures"); 

     } 

     if(!isset($riepilogoOrdine)) 
     { 
      //IT creates a new object (class Ordine) that include all infos to complete and to manage the transaction 
      $riepilogoOrdine = new Ordine(null, null, null, null, null, null, null, null, null); 

     } 

     if(!isset($userOBJ)) 
     { 
      //It creates a new object that rappresent the user logged in and all the data associated (like credential, name, adress, credit card..) 
      $userOBJ = new AuthenticatedUser(null, null, null, null, null, null,null, null, null, null, null, null, null, null); 
     } 

     switch($request["subpage"]) 
     { 
      default: include("PHP/view/content-not-found.php"); 
        break; 

      case "payment": //This part of the Controller manage the view to select the payment method:    
          //if the user is not logged in, the view charge the secondary form for the login 
          //else the view show a short recap about the options already selected, and the method of payments registered to choose 


          if(isset($request["imageID"])) //Step 1 - The authenticated user has to choose the payment's method 
          { 
           if(isset($_SESSION["loggedIn"]) && $_SESSION[ "loggedIn"]) 
           { 
            if(isset($session["username"]) && isset($session["password"]))//User authenticated 
            { 
             //It show which formats have been selected (it store an array of booleans, where array[$i] is true if the format is requested)           
        $formati = $riepilogoOrdine -> getAllReservedFormats(); 


             //It initialize the object that represent the authenticated User 
             $userOBJ = UserConstructor::buildUser($session["username"], $session["password"]); 

             //It initialize the object that represent the pictures that has to be sell 
             $describedOBJ = $raccoltaImmagini -> getImagesByID($request["imageID"]); 

             //- It update, newly, the information about the order: 

             //-- It associates the user-id to ther order 
             $riepilogoOrdine -> setUserID($userOBJ -> getID()); 

             //-- it associates the image-id to ther order 
             $riepilogoOrdine -> setArticleID($describedOBJ -> getID()); 

             //-- it associates the partial import to ther order 
             $riepilogoOrdine -> setTotalImport($describedOBJ -> getPrice()); 



             $style = "PHP/view/TransactionsStyle.php"; 
             $header = "PHP/view/Header.php"; 
             $loginFormContent = "PHP/view/loggedUserMenu.php"; 
             $slideshow=null; 
             $works = "PHP/view/Works.php"; 
             $preview250="PHP/view/preview250.php"; 
             $SecondaryLoginForm = null; 
             $summaryPayments = "PHP/view/summaryPayments.php"; 
             $ToPay = "PHP/view/ToPay.php"; 
             $footer="PHP/view/footer.php"; 


             include("master.php"); 
            } 
           } 
           else //Step 0 - The user is not still logged in 
           { 

            //It initialize the object that represent the pictures that has to be sell 
            $describedOBJ = $raccoltaImmagini -> getImagesByID($request["imageID"]); 


            //- It update the information about the order: 

            //-- it associates the partial import to ther order 
            $riepilogoOrdine -> setTotalImport($describedOBJ -> getPrice()); 

            //-- It associates to the order the formats select (obtained trough a previous submit) 
            if(isset($_REQUEST["formats"])) 
            { 
             $formats = array(); 
             $formats = $_REQUEST["formats"]; 


             if(isset($formats[0])) //online formats 
             { 
              $riepilogoOrdine -> setOnlineFormat(True); 
             } 

             if(isset($formats[1])) //gallery1 format 
             { 
              $riepilogoOrdine -> setGallery1Format(True); 
             } 

             if(isset($formats[2])) //gallery2 format 
             { 
              $riepilogoOrdine -> setGallery2Format(True); 
             } 

            } 


            //It show which formats have been selected (it store an array of booleans, where array[$i] is true if the format is requested)           
            $formati = $riepilogoOrdine -> getAllReservedFormats(); 

            $style = "PHP/view/TransactionsStyle.php"; 
            $header = "PHP/view/Header.php"; 
            $loginFormContent = "PHP/view/LoginFormContent.php"; 
            $works = "PHP/view/Works.php"; 
            $preview250="PHP/view/preview250.php"; 

            $SecondaryLoginForm="PHP/view/SecondaryLoginFormContent.php"; 
            $ToPay = "PHP/view/ToPay.php"; 



            $footer="PHP/view/footer.php"; 
            include("master.php"); 
           } 
          } 
          else 
          { 
           include("PHP/view/content-not-found.php"); 
          } 

          break; 
[...] //other code omitted 
} //swith closure 

вид

<?php $IMGid = $describedOBJ -> getID(); ?> 
<!-- It contains a recap for every step of transaction --> 
<div id="Riepilogo"> 

<!-- It stores the information about the transaction --> 
<div id="Transazione"> 
    <?php if(isset ($SecondaryLoginForm)) include($SecondaryLoginForm); ?> <!-- Step 0: User is not logged in --> 

    <?php if(isset ($summaryPayments)) include($summaryPayments); ?> <!-- Step 1: User logged in and selection of payment's method --> 

    <?php if(isset ($shipments)) include($shipments); ?> <!-- Step 2: selection of the shipment's method --> 

</div> 

<!-- It contains a recap about the pictures to buy --> 
<div id="RiepilogoVisuale"> 

    <!-- close the window --> 
    <button name="chiudi" type="button" id="closingButton" onclick="javascript:chiudi();">Chiudi</button> 

    <!-- It contains details about the pictures --> 
    <article id="descrizioneImmagine"> 
     <header id="TitleAuthor"> 
      <h1><?php echo($describedOBJ -> getTitolo());?> by </h1> 
      <h2><?php echo($describedOBJ -> getAutore());?></h2> 
     </header> 

     <section id="previewImmagine"> 
      <img src="<?php echo($describedOBJ -> getPreview850());?>" alt="<?php echo($describedOBJ->getDescrizione());?>"> 
     </section> 

     <!-- information about price, formats etc --> 
     <section id="riepilogoAcquisto"> 
      <h1>Riepilogo acquisto:</h1> 

      <div id="formatiIMG"> 
       <h2>Formati Selezionati</h2> 
       <ul> 

        <?php 
         if(isset($formati["online"]) && $formati["online"]) 
         {?> 
          <li><?php echo("Formato online (High Res.)")?></li> 
        <?php } 
         if(isset($formati["gallery1"]) && $formati["gallery1"]) 
         {?> 
          <li><?php echo("Formato galleria piccolo(90x160 cm)")?></li> 
        <?php } 
         if(isset($formati["gallery2"]) && $formati["gallery2"]) 
         {?> 
          <li><?php echo("Formato galleria grande (100x200 cm)")?></li> 
        <?php }?> 
       </ul> 
      </div> 

      <div id="AdditionalInfo"> 
       <section id="prezzo"> 
        <h2>Prezzo:</h2> 
        <ul> 
         <li><?php echo($riepilogoOrdine -> getTotalImport())?>€</li> 
        </ul> 
       </section> 

       <section id="spedizione"> 
        <h2>Metodo di spedizione:</h2> 
        <ul> 
         <li>Corriere Espresso</li> 
        </ul> 
       </section> 

      </div> 

     </section> 
    </article> 
</div> 

Я надеюсь, что вы могли бы мне помочь, спасибо всем за ваше терпение

EDIT: я добавил код моего индекса.PHP, который вызывает все контроллеры

<?php 
    //include directives for all the controllers 
    //code omitted 


Dispatcher::dispatch($_REQUEST); 

class Dispatcher 
{ 


public static function dispatch(&$REQUEST) 
{ 

    session_start(); 

    if(isset($REQUEST["page"])) 
    { 
     switch($REQUEST["page"]) 
     { 

      default: 
        include("PHP/view/content-not-found.php"); 
        break; 

      //code from other controllers omitted 
      case "works": 
        new WorksController($REQUEST, $_SESSION); 
        break; 

     } 

    } 

} 



} 

    ?> 
+0

«Я могу» t понять, почему, переходя от представления к другому, всегда через один и тот же контроллер, мой объект сбрасывается и принимает значение null ». Если у вас есть Front Controller, убедитесь, что он не повторно инициализирует ваш объект при каждом новом запросе страницы. – NaijaProgrammer

+0

Наверное, вы правы .... глупо от меня, но по сути в index.php есть вызов статического метода, который вызывает и инициализирует все контроллеры ... Итак, каждый новый вызов index.php, если i «Правильно, создайте новый статический метод и новые контроллеры, разные от других ... Вопрос в том, как ... как решить? Большой массив прошел через суперглобал? Или что еще? – usern3t

ответ

0

Я не уверен, если может быть идеальным решением, но я думал, что на роль в массиве $ _SESSION для пользователя .. Данные, которые я должен хранить и обмениваться между контроллерами, являются данные, относящиеся только к пользователю и первой необходимости, чтобы перейти к следующему представлению ... Так что я использовал $ _SESSION [ «другие данные»], чтобы сохранить содержание моего сводного массива:

//It stores the data on the server, first than write them to the Database 
$_SESSION["otherData"] = $riepilogoOrdine; 

//where riepilogoOrdine track  
//the information, obtained from the user, about the order 
Смежные вопросы