2016-02-19 1 views
0

Disons que j'ai la fonction suivante:Comment appeler une fonction avec des arguments de modèle dans SilverStripe

function fruit ($request) { 
    ... 
    $response = array('apple' => '1dollars', 'mango' => '2dollars'); 
    return json_encode($response); 
} 

Je veux accéder à quelque chose comme $response.apple dans mon modèle.

J'ai essayé ce qui suit, mais cela ne fonctionne pas comme rien montre sur ma page:

<% control response %> 
    <h1>$response.apple<h2>; 
<% end_control %> 

Si je tente d'accéder à la fonction fruit de mon modèle, fruit me donner une erreur. fruit(request) me donne aussi une erreur.

Mais si je vais aux fruits qui retourne mes données tout à fait bien:

["apple":"1dollar","mango":"2dollar"] 

Répondre

1

Vous devez faire deux choses différemment:

  1. Vous devez envelopper votre tableau de données dans un ArrayData ou ArrayList objet si vous voulez qu'il soit accessible dans un modèle.
  2. Vous devez renvoyer un tableau brut (auquel cas le modèle Nom_Ordinateur_NomAction.ss sera rendu automatiquement) ou renvoyer explicitement un modèle rendu.

donc plus comme:

function fruit ($request) { 
    ... 
    return $this->customise(array(
     'response' => new ArrayData(array(
      'apple' => '1dollars', 
      'mango' => '2dollars' 
     )); 
    ))->renderWith(array('YourTemplate')); 
} 

Notez que la dénomination de "réponse" est là tout à fait arbitraire. L'autre façon possible de le faire est de faire « réponse » une méthode sur votre contrôleur (évidemment je ce nom à tout moment, je suis juste garder vos noms pour plus de clarté):

public function response() { 
    return new ArrayData(array(
      'apple' => '1dollars', 
      'mango' => '2dollars' 
     )); 
} 

Dans ce cas, vous pouvez Renvoyez juste ce qui suit dans votre action:

return $this->renderWith(array('MyTemplate'));