2016-03-24 17 views
0

DashboardPage üzerinde PastEvent veri ağım için $has_many ilişkim var. DashboardPage.ss şablonumda, tüm PastEvents aracılığıyla döngü yapabilmek istiyorum. Ben çünkü DashboardPage.ss şablona aşağıdakileri yapın gerekir $ has_many ilişkinin inanıyoruz:

<% loop $PastEvents %> 
    <div> 
     <div>$EventName</div> 
     <div>$ClassType</div> 
     etc... 
    </div> 
<% end_loop %> 

Ancak hiçbir şey gösteriyor

DashboardPage.ss. Neyi kaçırıyorum?

DashboardPage.php

<?php 

class DashboardPage extends Page implements TemplateGlobalProvider { 

    private static $db = array(
     'Testing' => 'Varchar(255)' 
    ); 

    private static $has_many = array(
     'PastEvents' => 'PastEvent' 
    ); 

    public function getCMSFields() { 
     $fields = parent::getCMSFields(); 

     $fields->removeByName('Content'); 

     return $fields; 
    } 

    public static function get_template_global_variables() { 
     return array('DashboardLink' => 'getDashboardLink'); 
    } 

    public static function getDashboardLink($action='') { 
     $page = DashboardPage::get()->first(); 
     return $page ? $page->Link($action) : ''; 
    } 

} 

class DashboardPage_Controller extends Page_Controller { 

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


    public function init() { 
     parent::init(); 

     Requirements::css('themes/' . SSViewer::current_theme() . '/owl-carousel/owl.carousel.css'); 
     Requirements::css('themes/' . SSViewer::current_theme() . '/owl-carousel/owl.theme.css'); 
     Requirements::css('themes/' . SSViewer::current_theme() . '/owl-carousel/owl.transitions.css'); 
    } 

    public function show(){ 
     dd('Coming here'); 
    } 

} 

PastEvent.php Sen ano dan geçmiş olayları ekleyebilir

public function getCMSFields() { 
... 
    $fields->push(GridField::create('PastEvents', 'Past Events', 
     $this->PastEvents(), 
     singleton('PastEvent')->canEdit() 
      ? GridFieldConfig_RecordEditor::create() 
      : GridFieldConfig_RecordViewer::create() 
    )); 
... 
} 

Pano sayfasında PastEvent yönetmesi gereken

<?php 

class PastEvent extends DataObject { 

    private static $db = array(
     'EventName' => 'Varchar(255)', 
     'ClassType' => 'Varchar(255)', 
     'Instructor' => 'Varchar(255)', 
     'EmbedCode' => 'Text', 
     'EventDate' => 'Date', 
     'Time' => 'Time' 
    ); 

    private static $has_one = array(
     'BranchLocation' => 'BranchLocation', 
     'DashboardPage' => 'DashboardPage' 
    ); 

    private static $summary_fields = array(
     'EventName' => 'EventName', 
     'BranchLocation.Name' => 'Branch Location', 
     'ClassType' => 'ClassType', 
     'Instructor' => 'Instructor', 
     'EventDate' => 'Event Date', 
     'Time' => 'Time', 
    ); 

    public function getCMSFields() { 
     $fields = new FieldList(
      TextField::create('EventName'), 
      TextField::create('ClassType'), 
      TextField::create('Instructor'), 
      DropdownField::create(
       'BranchLocationID', 
       'Branch Location', 
       BranchLocation::get()->map('ID', 'Name')->toArray() 
      ), 
      TextareaField::create('EmbedCode'), 
      DateField::create('EventDate')->setConfig('showcalendar', true)->setDescription('Click inside textbox to open calender'), 
      TimePickerField::create('Time') 
     ); 

     return $fields; 
    } 

    public function Link() { 
     return $this->DashboardPage()->Link('show/'.$this->ID); 
    } 

} 
+0

ifusion, DashboardPage ile PastEvent arasındaki ilişkiyi nasıl ayarlıyorsunuz? – muskie9

+0

@ muskie9 - DashboardPage öğesindeki PastEvent nesnesinde $ has_one var ve DashboardPage '$ PastEvents => $ PastEvent ' – ifusion

+0

@ifusion'da $ has_many var. Burada neye karar vermek için' PastEvent '' DashboardPage 'ekliyorsunuz? PastEvent's, "DashboardPage" ile ilişkilidir? –

cevap

2

Sayfanızı '/ dashboard' url ile oluşturduğunuz varsayılarak.

$dashboard = SiteTree::get_by_link('dashboard'); 
$events = $dashboard->PastEvents(); 
$events->add($this->createNewEvent()); 

Sen (örtük index() eylem varsayılan olarak kullanılır) DashboardPage görüntülemek için show() eylemi gerekmez. Sayfa eylemleri, sayfa URL'sini genişletir, bu nedenle eyleminiz, /dashboard/show isteğinde bulunduğunuzda çağrılır.

etkinlik olduğunu göstermek için şablon geliştirin:

<% if $PastEvents.Count %> 
    <ul> 
    <% loop $PastEvents %> 
     <li> 
      <a href="$Link">$EventName</a> 
      <div>$ClassType</div> 
      ... 
     </li> 
    <% end_loop %> 
    </ul> 
<% else %> 
    <p>There are no past events.</p> 
<% end_if %> 

sayfanızın uygun bağlantı sağladığından eylem show için

public function Link() { 
    return $this->DashboardPage()->Link('show/'.$this->ID); 
} 

Şovunuz eylem bu

public function show($eventID = 0) { 
    $event = $this->PastEvents()->byID($eventID); 
    if (!$event) { 
     $this->httpError(404); 
    } 

    // render with templates/Page.ss and templates/Layout/PastEventDetails.ss 
    return $event->renderWith(array('PastEventDetails', 'Page')); 
} 
gibi olabilir
+0

Güzel! Yardımınız için teşekkürler :) Şimdi çalışıyorum. PastEvents için bir sayfa olarak bir veri nesnesi oluşturmaya çalışıyordum (üzgünüm, bu soruyu sormalıydı). Bu nedenle PastEvents veri nesnesinde Link() yöntemini kullanmıştım. Bu eğitimi takip ediyordum: https: //www.silverstripe.org/learn/lessons/controller-actions-dataobjects-as-pages - Sadece isimleri değiştirdim, örneğin RegionsPage.php = DashboardPage.php ve Region.php = PastEvent. php – ifusion

İlgili konular