2015-04-08 4 views
0

Я хотел бы начать с того, что я новичок в разработке Silver Stripe и PHP/MySQL в целом, поэтому, пожалуйста, будьте добрыми.Доступ к Silverstripe has_many из отдельного типа страницы

У меня есть сайт, который требует, чтобы у меня была страница с ценой, в которой отображаются планы ценообразования компании как на странице цены (duh), так и на домашней странице. Таким образом, цель состоит в том, чтобы иметь доступ к данным из моего типа Pricing.php с моим HomePage.ss.

Я пытаюсь сделать это в будущем доказательства, насколько это возможно, поэтому я создал ServicePlan.php, который расширяет DataObject и использует FieldList создать ценовые рекорды и связать их с типом Pricing страницы с помощью отношения $has_many и $has_one. Основываясь на моих ограниченных знаниях, это кажется лучшим способом достичь этого.

Вот код, который я написал для этого.

ServicePlan.php

class ServicePlan extends DataObject { 

private static $db = array (
    'PlanColor' => 'Varchar', 
    'PlanName' => 'Varchar', 
    'PlanPrice' => 'Varchar', 
    'PlanRenewal' => 'Varchar', 
); 

private static $has_one = array (
    'Pricing' => 'Pricing' 
); 
private static $summary_fields = array (
    'PlanName' => 'Name of Plan', 
    'PlanPrice' => 'Price', 
    'PlanRenewal' => 'Renewal Period', 
); 
public function getCMSFields() { 
    $fields = FieldList::create(
     TextField::create('PlanName'), 
     TextField::create('PlanRenewal'), 
     TextField::create('PlanPrice'), 
     TextField::create('PlanColor') 
    ); 
    return $fields; 
} 

public function getServicePlans() { 
    return $this->Pricing(); 
} 

Pricing.php

class Pricing extends Page { 
private static $has_many = array (
    'ServicePlans' => 'ServicePlan', 
); 

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


    $fields->addFieldsToTab('Root.Plans', GridField::create(
     'ServicePlans', 
     'Orenda Force Service Plan Information', 
     $this->ServicePlans(), 
     GridFieldConfig_RecordEditor::create() 
    )); 

    return $fields; 
    } 
} 

class Pricing_Controller extends Page_Controller { 

} 

HomePage.php

class HomePage extends Page { 
} 

class HomePage_Controller extends Page_Controller { 
    public function ServiceTeasers($count = 2) { 
     $holder = ServicesHolder::get()->First(); 
     return ($holder) ? ServicesPage::get()->limit($count) : false; 
    } 

    public function MembershipPlans() { 
     $Pricing = Pricing::get(); 
     return $plan; 
    } 
} 

Layout/HomePage.ss

...// 

<% loop $MembershipPlans %> 
    <div class="col-1-3 card pricing"> 
     <div class="pricing__header primary $PlanColor"> 
      <p class="pricing__plan-name">$PlanName</p> 
      <p class="pricing__price">$PlanPrice<sub>$PlanRenewal</sub></p> 
     </div> 
     <div class="card__contents"> 
      <h3 class="title-06">Plan details</h3> 
      <ul> 
       <li>unlimited training</li> 
       <li>individual nutrition/meal plans</li> 
      </ul> 
     </div> 
    </div> 
    $Content 
<% end_loop %> 

...// 

Я не имею никаких проблем с доступом содержание

Layout/Pricing.ss

<section class="body pricing"> 
    <div class="content"> 
    <h2 class="title-02 text-monochrome">Pricing</h2> 
     <% loop $ServicePlans %> 
      <div class="col-1-3 card pricing"> 
       <div class="pricing__header $PlanColor"> 
        <p class="pricing__plan-name">$PlanName</p> 
        <p class="pricing__price">$PlanPrice<sub>$PlanRenewal</sub></p> 
       </div> 
       <div class="card__contents"> 
        <h3 class="title-06">Plan details</h3> 
        <ul> 
         <li>unlimited training</li> 
         <li>individual nutrition/meal plans</li> 
        </ul> 
       </div> 
      </div> 
     <% end_loop %> 
    </div> 
</section> 

Я очень признателен за любую помощь, которую вы можете Предоставляю, я пытался понять это на пару дней, и я снова и снова сталкивался с кирпичной стеной. Что я делаю не так?

This question самый близкий, который я получил, и он, похоже, не разрешил мою проблему. Должен ли я переместить FieldList на страницу Pricing.php?

ответ

0

Похоже, что для вашей домашней страницы у вас есть большая часть того, что вам нужно. Вам просто не хватает цикла для has_many, что и на странице Price. Так как ваша функция MembershipPlans() в HomePage_Controller возвращает все ценовые страницы как DataList, вы можете получить доступ к связанным объектам, перейдя по имени отношения, в данном случае <% loop $ServicePlans %>.

HomePage.ss

<% loop $MembershipPlans %><!-- loop Price pages --> 
<% loop $ServicePlans %><!-- this is your loop for the ServicePlans related to the particular Price page --> 
<div class="col-1-3 card pricing"> 
    <div class="pricing__header primary $PlanColor"> 
     <p class="pricing__plan-name">$PlanName</p> 
     <p class="pricing__price">$PlanPrice<sub>$PlanRenewal</sub></p> 
    </div> 
    <div class="card__contents"> 
     <h3 class="title-06">Plan details</h3> 
     <ul> 
      <li>unlimited training</li> 
      <li>individual nutrition/meal plans</li> 
     </ul> 
    </div> 
</div> 
<% end_loop %><!-- end ServicePlans relation loop --> 
$Content<!-- Content for particular Price page --> 
<% end_loop %><!-- end Price pages loop --> 
+0

БУМ! Это сработало ОТЛИЧНО! – Dom

+0

@ пользователь4765523 BOOM! вы должны пометить ответ как правильный, чтобы решить эту проблему! –

+0

Упс, наверное, я забыл ... – Dom