【问题标题】:Silverstripe accessing has_many data from a separate page typeSilverstripe 从单独的页面类型访问 has_many 数据
【发布时间】:2015-04-08 18:56:07
【问题描述】:

首先我想说的是,我是 Silver Stripe 开发和 PHP/MySQL 的新手,所以请善待。

我有一个网站,要求我有一个定价页面,该页面在定价页面 (duh) 和主页上都显示公司的定价计划。因此,目标是能够使用我的HomePage.ss 访问来自我的Pricing.php 页面类型的数据。

我正在努力使其成为未来的证明,因此我创建了一个扩展 DataObject 的 ServicePlan.php 并使用 FieldList 创建定价记录并通过 a 将它们与 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 %>

...//

访问内容没有问题

布局/定价.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 页面吗?

【问题讨论】:

    标签: php mysql has-many silverstripe has-one


    【解决方案1】:

    对于您的主页,您似乎已经拥有了您需要的大部分内容。您只是错过了价格页面所具有的has_many 循环。由于HomePage_Controller 中的MembershipPlans() 函数将所有价格页面作为DataList 返回,因此您可以通过循环访问关系名称来访问相关对象,在本例中为&lt;% loop $ServicePlans %&gt;

    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 -->
    

    【讨论】:

    • @user4765523 砰!您应该将答案标记为正确才能解决此问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多