簡體   English   中英

鋰電:如何手動填充DocumentSet?

[英]Lithium: How to manually populate a DocumentSet?

如何從外部源作為DocumentSet返回數據?

我設置了一個自定義數據源來與Amazon的Product Advertising API交互。 為此,我將substantial lithium\\data\\source\\Http子類化,並按照文檔( http://li3.me/docs/manual/working-with-data/creating-data- sources.wiki )。

但是,我的鋰版本(0.11,最新發行版)似乎沒有示例中的強制轉換方法,如果我創建一個強制轉換方法,則當我return $this->item($model, $data, $options)

因此,我做了一個自定義item函數,通過調用parent::item來創建文檔,就像文檔示例對cast所做的那樣。 然后,在遞歸調用之后,我得到一個Document對象數組,最后一次調用parent::item然后給了我一個空的DocumentSet對象 我應該如何傳遞數據以創建正確的DocumentSet?

這是我的代碼的最小示例:

// Within class Amazon extends \lithium\data\source\Http

protected function _init() {
    // Define entity classes.
    $this->_classes += array(
        'entity' => 'lithium\data\entity\Document',
        'set' => 'lithium\data\collection\DocumentSet'
    );

    parent::_init();
}

public function read($query, array $options = array()) {
    // Extract from query object.
    $parameters = $query->export($this, array('keys' => array('conditions')));
    $conditions = $parameters['conditions'];

    // Code stripped to validate conditions and prepare Amazon request (that part works).
    // results in a $queryString variable.

    // Get response from Server.
    $xml = simplexml_load_string($this->connection->get($this->_config['basePath'], $queryString));

    // Stripped response validation and reformatting -> $items contains an array of SimpleXMLElement objects.

    return $this->item($query->model(), $items, array('class' => 'set'));
}

public function item($model, array $data = array(), array $options = array()) {
    // Recursively create Documents for arrays.
    foreach($data as $key => $value) {
        if(is_array($value)) {
            $data[$key] = $this->item($model, $value, array('class' => 'entity'));
        }
        else if(is_object($value) && get_class($value) == "SimpleXMLElement") {
            // Stripped code to extract data from XML object and put it in array $docData.

            $data[$key] = $this->item($model, $docData, array('class' => 'entity'));
        }
    }
    // Works perfectly for every (recursive) call with $options['class'] == 'entity' but fails for the final call with $options['class'] == 'set' (for this final call $data contains an array of Document objects).
    return parent::item($model, $data, $options);
}

我將跟蹤master分支而不是發行版本。

在您的情況下,由於您要手動裝箱對象,因此我將執行以下操作:

return $this->_instance('set', compact('data'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM