2017-09-07 1 views
0

Je tente de créer un support/page dans silverstripe qui n'indique pas d'ID d'action uniquement, tout comme les pages de blog, s'il n'y a pas d'ID (mydomain.com/programs/) montre une liste de tous les programmes s'il y a un ID (mydomain.com/programs/spinning-with-chris/) que je veux une page de détails avec le programme.silverstripe comment créer un support/une page sans action

Est-ce que quelqu'un a un exemple de comment faire cela?

Répondre

1

En supposant que vous n'avez pas défini un gestionnaire d'URL personnalisée dans votre contrôleur, la valeur par défaut est la suivante:

private static $url_handlers = array(
    '$Action//$ID/$OtherID' => 'handleAction', 
); 

Cela signifie que votre itinéraire sera routetocontroller/action alors rien après ce sera en option (more info). La première partie de la route serait définie dans la configuration YAML, par exemple:

Director: 
    rules: 
    routetocontroller: YourControllerName 

Par conséquent, votre contrôleur a besoin d'exposer une action index:

private static $allowed_actions = array('index'); 

public function index(SS_HTTPRequest $request) 
{ 
    // Handle an ID passed 
    if ($id = $this->urlParams['ID']) { 
     return $this->doSomethingWithYourId($id); 
    } 

    // Otherwise, show all of your data 
    return $this->renderWith(array('YourTemplateName', array(
     'YourDataList' => YourModel::get() 
    )); 
} 

Et vous pouvez boucle et afficher ensuite dans YourTemplateName.ss:

<% loop $YourDataList %> 
    <li><a href="$Link">$Title</a></li> 
<% end_loop %> 

Ce ne sont que des exemples de points de départ, vous devrez bien sûr l'ajuster à vos besoins.

+0

Très bien, cela fonctionne le seul problème que je l'ai qu'il rend seulement le contenu de la page, pas le cadre. ProgramSchedulePage_Controller étend Page_Controller, mais ne prend pas le modèle de page, aucune idée de comment faire cela ou dois-je faire le modèle "ProgramSchedulePage" un modèle de page complète? – Mi32dogs

+0

@ Mi32dogs peut-être que votre modèle est 'templates/ProgramSchedulePage.ss' - cela remplacera entièrement le modèle de page. Vous devriez le stocker comme 'templates/Layout/ProgramSchedulePage.ss' à la place afin qu'il ne couvre que le contenu –

+1

Je l'avais dans le dossier layout mais il était toujours en train de surcharger le template de la page, j'ai aussi perdu toutes les données de la page. Je l'ai obtenu en obtenant d'abord les données de la page $ dObj = Page :: get() -> byID ('8'); puis rendez-le avec les deux modèles return $ this-> customize ($ dObj) -> renderWith (array ('ProgramSchedulePage', 'page')); ce n'est pas la meilleure solution mais ça marche – Mi32dogs