MVC: come utilizzare l'elenco dei modelli di dati nelle viste ricorsive

1

Sto cercando di imparare l'MVC di applicazioni web in PHP. La maggior parte degli articoli discussi sul pattern MVC 1-a-1 è stata fornita sotto

  • Controller: ottiene la richiesta utente & aggiorna il modello,
  • Modello: riceve gli ordini da Controller & aggiorna i dati.
  • Visualizza: riceve i dati aggiornati da Model & mostralo.

Tuttavia, nel mio progetto MVC ho bisogno di creare una gerarchia di Views che mostri i loro dati corrispondenti dal livello Model come la struttura data sotto: [Nota: qui, tutti i tipi di modello e vista sono uguali. Non esiste un tipo diverso.]

$models = array();
$models[0] = array("id"=>1, "parent_id"=>null,    "title"=>"R1","content"=>"This is Root content 1");
$models[1] = array("id"=>2, "parent_id"=>1,       "title"=>"c2","content"=>"This is content 2");
$models[2] = array("id"=>3, "parent_id"=>1,       "title"=>"c3","content"=>"This is content 3");
$models[3] = array("id"=>4, "parent_id"=>2,       "title"=>"c4","content"=>"This is content 4");
$models[3] = array("id"=>5, "parent_id"=>3,       "title"=>"c5","content"=>"This is content 5");
<div class="top-view-1"> 

 <div class="child-2">
   <div class="child-4">
         <!-- And next <div>s Continues So on .... -->
   </div>
 </div>

 <div class="child-3">
           <div class="child-5">
         <!-- And next <div>s Continues So on .... -->
   </div>
 </div>
</div>

Ho i dati e amp; Elenco di modelli figlio all'interno del livello del modello come indicato di seguito:

//Model Layer 
public $Models = array(); // array of child models
public $data = array("id"=>1, "parent_id"=>null, "title"=>"C1","content"=>"This is a content");

Tuttavia, il problema si verifica nel livello vista in cui è necessario inviare i dati del modello in una funzione di visualizzazione ricorsiva che genera quella gerarchia di <div>s

//View Layer:

function ShowAsChild($nextChildModel)
    {

        echo '<div class="data".' .$nextChildModel->data["content"]';
                   $this->ShowChild($nextChildModel);
        echo '</div>';

    }

    function ShowChild()
    {

        if (count($this->controller->model->childModels ) > 0)
        {
            echo '<div class="child">';
            foreach ($this->controller->model->childModels  as $child){
                /* below code line is the key problem.
                   it should be like $child-->ShowAsChild();
                */
                $this->ShowAsChild($child);
            }
            echo '</div>';
        }
        else
          return;
    }

Se osservi il codice sopra, allora noterai che la stessa vista si chiama da sola diversi dati del modello !. Di conseguenza, la ricorsione diventa infinita. Penso che sia necessario per trasferire dalla vista corrente alla vista successiva, che chiamerà le proprie funzioni con il proprio modello. Inoltre, queste funzioni non possono spostarsi sul livello del modello, perché creano direttamente la visualizzazione della vista HTML. Quindi, a questo punto, non so come risolvere questo problema.

Quindi per favore aiutatemi a risolvere questo problema. Si prega di mostrare alcuni esempi di codice. Grazie

    
posta user5005768 26.07.2018 - 13:58
fonte

1 risposta

1

Il problema principale è che ogni volta che entri ShowChild () stai riavviando il conteggio sulla serie di modelli.

Le funzioni ricorsive devono sempre avere un modo per interrompere la ricorsione quando raggiungono la fine.

Penso che quello che vuoi sia passare una serie di dati del modello alla vista, ma invece di visualizzare una vista per modello, si desidera che ogni vista essere nidificati all'interno dell'altro.

Il frammento di seguito mostra un ciclo ricorsivo che si fermerà. Ho eseguito questo dalla riga di comando PHP. Dovresti essere in grado di adattarlo alla tua applicazione, se ho compreso correttamente la tua esigenza.

<?php

$models = array();
$models[0] = array("id"=>1, "title"=>"D1","content"=>"This is content 1");
$models[1] = array("id"=>2, "title"=>"D2","content"=>"This is content 2");
$models[2] = array("id"=>3, "title"=>"D3","content"=>"This is content 3");
$models[3] = array("id"=>4, "title"=>"D4","content"=>"This is content 4");

class View {
    private $models=array();

    public function setModelArray($Models){  // the controller passes the array of model data to view
        $this->models = $Models;
    }

    public function ShowHierarcyOfViews ($level){  
        if (current($this->models) != false){
            $model = current($this->models);
            for ($n=0; $n<$level; $n++) echo "\t"; // for indenting
            echo '<div class="data">'.'content= '.$model["content"].PHP_EOL;
            next($this->models);
            $this->ShowHierarcyOfViews ($level+1); // recursive call
            for ($n=0; $n<$level; $n++) echo "\t";    // for indenting    
            echo '</div>'.PHP_EOL;;
        }
    }
}

$view = new View;
$view->SetModelArray($models);
$view->ShowHierarcyOfViews(0);
    
risposta data 27.07.2018 - 06:34
fonte

Leggi altre domande sui tag