Pergunta

Estou implementando uma fonte de dados customizada em minha aplicação CakePHP, implementei as funções básicas para uma fonte de dados (read(), listSources(), describe()).A fonte de dados usa Xml como entrada e eu realmente gostaria de usar find('neighbours') no Xml e queria saber se o Cake implementa "automagicamente" esse recurso (porque o read() existe) ou se eu precisar estender a fonte de dados de alguma forma.Ainda não encontrei um exemplo específico, então espero que a comunidade SO possa ajudar.

Abaixo está a implementação atual da fonte de dados.

<?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;
 }
}
?>

Estrutura XML básica:

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

Editar:

Deveria ter lido o manual com mais atenção:

E isso é praticamente tudo o que há para isso.Ao associar esta fonte de dados a um modelo, poderás então utilizar Model::find()/save() como faria normalmente, e os dados adequados e/ou parâmetros utilizados para chamar aqueles métodos serão passados para o datasource em si, onde pode decidir implementar quaisquer recursos necessita (p. ex.Modelo::encontrar opções como a análise 'conditions', 'limit' ou mesmo os seus próprios parâmetros personalizados).

Foi útil?

Solução

Eu suspeito que você terá que mostrar Cake como encontrar vizinhos definindo um método na fonte de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top