Mustache.php рендеринг многомерных данных

Я использую Mustache для создания шаблонов XML-ответов для API. Мне было интересно, как я могу использовать XML-шаблон ниже для отображения данных из этого массива? Данные вообще не отображаются при использовании этого кода:

$result = $m->render($template, $r);             
echo $result;

Вот преобразованные данные JSON:

[
    {
        "UUID": "655482ab-38ee-433f-b310-1f6f227113b9",
        "RefUUID": "92a8ecf6-8eb6-4d1e-b88d-59b50c3b0cc9",
        "company":"UAR",
        "itemname":"DOOR ",
        "daysinstock":"41",
        "condition":"A",
        "stocknumber":"F0049356",
        "ic":"120-00409AL",
        "price":"750.00",
        "quantity":"1",
        "location":"U3020",
        "comments": "comment for #0"
    },
    {
        "UUID": "655482ab-38ee-433f-b310-1f6f227113b9",
        "RefUUID": "92a8ecf6-8eb6-4d1e-b88d-59b50c3b0cc9",
        "company":"UAR",
        "itemname":"DOOR ",
        "daysinstock":"68",
        "condition":"C",
        "stocknumber":"F0048586",
        "ic":"120-00409AL",
        "price":"750.00",
        "quantity":"1",
        "location":"KEEP"
        "comments": "comment for #1"
    },
    {
        "UUID": "655482ab-38ee-433f-b310-1f6f227113b9",
        "RefUUID": "92a8ecf6-8eb6-4d1e-b88d-59b50c3b0cc9",
        "company":"UAR",
        "itemname":"DOOR ",
        "daysinstock":"280",
        "condition":"B",
        "stocknumber":"171013",
        "ic":"120-00409AL",
        "price":"750.00",
        "quantity":"1",
        "location":"YCR4"
        "comments": "comment for #2"
    }
]

Шаблон XML пытается отобразиться

$template = '<SupplierResponse>
    <QuotedPartList>
        {{#parts}}
        <QuotedPart>
            <BMSObject>
                <UUID>{{UUID}}</UUID>
                <RefUUID>{{RefUUID}}</RefUUID>
            </BMSObject>
            <SupplierResponseCode>AsRequested</SupplierResponseCode>
            <SupplierRefLineNum>{{SupplierRefLineNum}}</SupplierRefLineNum> 
            <PartNumInfo>
                <PartNumType>Stock</PartNumType>
                <PartNum>{{stocknumber}}</PartNum>
            </PartNumInfo>
            <PartNumInfo>
                <PartNumType>IC</PartNumType>
                <PartNum>{{ic}}</PartNum>
            </PartNumInfo>
            <PartType>PAL</PartType>
            <PartDesc>{{itemname}}</PartDesc>
            <PriceInfo>
                <UnitListPrice>{{price}}</UnitListPrice>
                <UnitNetPrice>{{price}}</UnitNetPrice>
            </PriceInfo>
            <RInfo>
                <Grade>{{condition}}</Grade>
                <DaysInStock>{{daysinstock}}</DaysInStock>
                <PartLocation>{{location}}</PartLocation>
                <PartStore>{{company}}</PartStore>
            </RInfo>
            <Availability>
                <Quantity>{{quantity}}</Quantity>
                <InventoryStatus>Available</InventoryStatus>
                <AvailableShipDate>2018-05-10</AvailableShipDate>
            </Availability>
            <LineNoteInfo>
                <LineNoteMemo>{{comments}}</LineNoteMemo>
            </LineNoteInfo>
        </QuotedPart>
        {{/parts}}
    </QuotedPartList>
</SupplierResponse>';

person MB34    schedule 09.05.2018    source источник


Ответы (2)


Редактировать: На основе новой информации, которая стала известна после того, как я опубликовал этот ответ, ваша проблема возникла из-за того, что Mustache требует хранения данных в ассоциативном массиве.

// Not correct
$data = [
    [
        'Foo' => 'Bar'
    ],
    [
        'Biz' => 'Buz'
    ],        
]

// Correct
$data = [
    'MyData' => [
        [
            'Foo' => 'Bar'
        ],
        [
            'Biz' => 'Buz'
        ]
    ]        
]

Вы можете попробовать что-то вроде этого:

<?php

$objectToPassIn = [
    'parts' => [
        // .. your data here
    ]
];

// Load template and initialize Mustache
$m = new Mustache_Engine(array(
                'loader' => new Mustache_Loader_FilesystemLoader('path/to/where/template/is/stored', array('extension' => '.xml'))
            ));

$rendered = $m->render(
                    'template-name-without-file-extension',
                    $objectToPassIn
                );
person Alex Mulchinock    schedule 10.05.2018
comment
Нет, проблема в том, что передаваемые данные неправильно отформатированы, см. мой опубликованный ответ. - person MB34; 10.05.2018
comment
Из вашего вопроса: мне было интересно, как я могу использовать приведенный ниже XML-шаблон для отображения данных из этого массива... - вы ничего не упомянули об ошибках или неожиданном поведении. Не могли бы вы отредактировать свой вопрос, чтобы уточнить, в чем проблема на самом деле :) - person Alex Mulchinock; 10.05.2018
comment
Ошибок не было, просто результат без отображения данных. Проблема заключалась в данных, как я уже упоминал. - person MB34; 10.05.2018
comment
Тогда, пожалуйста, отредактируйте свой вопрос, чтобы отразить это. Это сделает его более понятным для других, которые найдут этот вопрос и нуждаются в помощи по аналогичной / той же проблеме. - person Alex Mulchinock; 10.05.2018

Наконец исправили. Данные были отформатированы неправильно:

Данные:

$r = array("parts"=> array(
                "UUID"=> "655482ab-38ee-433f-b310-1f6f227113b9",
                "RefUUID"=> "92a8ecf6-8eb6-4d1e-b88d-59b50c3b0cc9",
                "company"=>"UAR",
                "itemname"=>"DOOR ",
                "daysinstock"=>"41",
                "condition"=>"A",
                "stocknumber"=>"F0049356",
                "ic"=>"120-00409AL",
                "price"=>"750.00",
                "quantity"=>"1",
                "location"=>"U3020",
                "comments"=> "comment for #0",
                "SupplierRefNum"=> 1
            ),
            array(
                "UUID"=> "655482ab-38ee-433f-b310-1f6f227113b9",
                "RefUUID"=> "92a8ecf6-8eb6-4d1e-b88d-59b50c3b0cc9",
                "company"=>"UAR",
                "itemname"=>"DOOR ",
                "daysinstock"=>"68",
                "condition"=>"C",
                "stocknumber"=>"F0048586",
                "ic"=>"120-00409AL",
                "price"=>"750.00",
                "quantity"=>"1",
                "location"=>"KEEP",
                "comments"=> "comment for #1",
                "SupplierRefNum"=> 2
            ),
            array(
                "UUID"=> "655482ab-38ee-433f-b310-1f6f227113b9",
                "RefUUID"=> "92a8ecf6-8eb6-4d1e-b88d-59b50c3b0cc9",
                "company"=>"UAR",
                "itemname"=>"DOOR ",
                "daysinstock"=>"280",
                "condition"=>"B",
                "stocknumber"=>"171013",
                "ic"=>"120-00409AL",
                "price"=>"750.00",
                "quantity"=>"1",
                "location"=>"YCR4",
                "comments"=> "comment for #2",
                "SupplierRefNum"=> 3
            }
        }
    );

Код:

$result = $m->render($template, $r); // Used same template as in my original post.
person MB34    schedule 10.05.2018