Silverstripe получает доступ к данным has_many с отдельного типа страницы

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

У меня есть сайт, который требует, чтобы у меня была страница с ценами, которая отображает тарифные планы компании как на странице ценообразования, так и на домашней странице. Итак, цель — получить доступ к данным из моего 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;
}
}

Макет / 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 %>

...//

У меня нет проблем с доступом к контенту

Макет / 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>

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

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

0

Решение

Кажется, что для вашей домашней страницы у вас уже есть то, что вам нужно. Вы просто пропускаете цикл для has_many что страница прайс имеет. Так как ваш 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]