Question

Je suis mise en œuvre d'une source de données personnalisée dans mon application CakePHP, je l'ai mis en œuvre les fonctions de base pour une source de données (read(), listSources(), describe()). La source de données utilise Xml en entrée et je voudrais vraiment utiliser find ( « voisins ») sur le Xml et se demandait si gâteau « automagiquement » met en œuvre cette fonction (car la fonction read() est là), ou si je dois prolonger la source de données en quelque sorte. Je ne l'ai pas encore trouvé un exemple spécifique, donc j'espère que la communauté SO sera en mesure d'aider.

Voici la mise en œuvre de la source de données actuelle.

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

Structure de base 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>

Modifier

lire le aurait dû manuel plus attentivement:

  

Et c'est à peu près tout ce qu'il ya à   il. En couplant cette source de données à un   modèle, vous êtes alors en mesure d'utiliser   Model :: find () / save () comme vous le feriez   normalement, et les données appropriées   et / ou des paramètres utilisés pour appeler les   les méthodes seront transmises à la   lui-même source de données, où vous pouvez   décider de mettre en œuvre les caractéristiques quel que soit   vous avez besoin (par exemple Model :: options de Recherche   comme le parsing 'conditions de « limite »   ou même vos propres paramètres personnalisés).

Était-ce utile?

La solution

Je soupçonne que vous aurez à show Gâteau comment trouver les voisins en définissant une méthode dans la source de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top