2010-11-23 3 views
0

Я реализую собственный источник данных в своем приложении CakePHP, я реализовал основные функции для источника данных (read(), , describe()). Источник данных использует Xml в качестве входных данных, и я бы очень хотел использовать find («соседи») в Xml и задавался вопросом, реализует ли Cake «автоматически» эту функцию (потому что функция есть), или если мне нужно расширить источник данных как-то. Я пока не нашел конкретного примера, поэтому я надеюсь, что сообщество SO сможет помочь.Реализация операций CakePHP find() в источнике данных

Ниже приведена текущая реализация источника данных.

<?php 
App::import('Core', 'Xml'); 

class AppdataSource extends DataSource { 
    protected $_schema = array(
    'apps' => array(
    'id' => array(
    'type' => 'integer', 
    'null' => true, 
    'key' => 'primary', 
    'length' => 11, 
    ), 
    'type' => array(
    'type' => 'string', 
    'null' => true, 
    'length' => 140 
    ), 
    'title' => array(
    'type' => 'string', 
    'null' => true, 
    'length' => 255 
    ), 
    'subtitle' => array(
    'type' => 'string', 
    'null' => true, 
    'length' => 255 
    ), 
    'body' => array(
    'type' => 'text', 
    'null' => true, 
    ), 
    'date' => array(
    'type' => 'date', 
    'null' => true, 
    ), 
) 
); 

    public function listSources() { 
    return array('apps'); 
} 

    public function describe($model) { 
    return $this->_schema['apps']; 
} 

    function calculate(&$model, $func, $params = array()) { 
    return '__'.$func; 
    } 

    function __getPage($items = null, $queryData = array()) { 
    if (empty($queryData['limit'])) { 
    return $items; 
    } 
    $limit = $queryData['limit']; 
    $page = $queryData['page']; 
    $offset = $limit * ($page-1); 
    return array_slice($items, $offset, $limit); 
} 

    function __sortItems(&$model, $items, $order) { 
    if (empty($order) || empty($order[0])) { 
    return $items; 
    } 

    $sorting = array(); 
    foreach($order as $orderItem) { 
    if (is_string($orderItem)) { 
    $field = $orderItem; 
    $direction = 'asc'; 
    } 
    else { 
    foreach($orderItem as $field => $direction) { 
    continue; 
    } 
    } 

    $field = str_replace($model->alias.'.', '', $field); 

    $values = Set::extract($items, '{n}.'.$field); 
    if (in_array($field, array('lastBuildDate', 'pubDate'))) { 
    foreach($values as $i => $value) { 
    $values[$i] = strtotime($value); 
    } 
    } 
    $sorting[] = $values; 

    switch(low($direction)) { 
    case 'asc': 
    $direction = SORT_ASC; 
    break; 
    case 'desc': 
    $direction = SORT_DESC; 
    break; 
    default: 
    trigger_error('Invalid sorting direction '. low($direction)); 
    } 
    $sorting[] = $direction; 
    } 

    $sorting[] = &$items; 
    $sorting[] = $direction; 
    call_user_func_array('array_multisort', $sorting); 

    return $items; 
} 

    public function read($model, $queryData = array()) { 
    $feedPath = 'xml/example.xml'; 
    $xml = new Xml($feedPath); 
    $xml = $xml->toArray(); 
    foreach ($xml['Items']['Item'] as $record) { 
    $record = array('App' => $record); 
    $results[] = $record; 
    } 
    $results = $this->__getPage($results, $queryData); 
    //Return item count 
    if (Set::extract($queryData, 'fields') == '__count') { 
    return array(array($model->alias => array('count' => count($results)))); 
    } 
    return $results; 
} 
} 
?> 

Базовая структура Xml:

<items> 
<item id="1"> 
    <type>Type</type> 
    <title>Title</title> 
    <subtitle>Subtitle</subtitle> 
    <date>15-12-2010</date> 
    <body>Body text</body> 
</item> 
</items> 

Edit:

должен был прочитать руководство более тщательно:

И это в значительной степени все, что нужно Это. Соединив этот источник данных с моделью , вы сможете использовать Model :: find()/save(), как вы бы, , и соответствующие данные и/или параметры, используемые для вызова этих методов . на источник , где вы можете решить, какие функции вам нужны (например, Model :: find options , такие как «анализ условий», «ограничение» или даже ваши собственные пользовательские параметры).

ответ

2

Я подозреваю, что вы должны будете показать Cake как найти соседей, определив метод в источнике данных.

+0

Итак, нет «автоматических» тогда ... :( – mensch 2010-11-23 15:58:09