Frage

Ich bin die Umsetzung eine benutzerdefinierte Datenquelle in meiner CakePHP Anwendung, habe ich die Grundfunktionen für eine Datenquelle (read(), listSources(), describe()) umgesetzt. Die Datenquelle verwendet XML als Eingabe und ich würde wirklich wie zu bedienen ( ‚Nachbarn‘) auf der Xml und frag mich, ob Cake „automagically“ implementiert diese Funktion (weil die read() Funktion da ist), oder wenn ich brauche die Datenquelle zu verlängern irgendwie. Ich habe nicht ein spezielles Beispiel noch nicht gefunden, so dass ich die Gemeinschaft SO bin die Hoffnung, um zu helfen kann.

Im Folgenden finden Sie die aktuelle Datenquelle Umsetzung.

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

Grund XML-Struktur:

<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:

Should habe gelesen, das Handbuch genauer:

  

Und das ist so ziemlich alles, was es zu   es. Durch die Kopplung dieser Datenquelle ein   Modell, Sie sind dann in der Lage zu verwenden,   Modell :: find () / save (), wie Sie es   Normalerweise, und die entsprechenden Daten,   und / oder Parameter verwendet, um diejenigen zu nennen   Methoden werden an die weitergegeben   wo Datenquelle selbst, können Sie   entscheiden, je nachdem, welche Funktionen zu implementieren   Sie benötigen (zum Beispiel Modell :: find Optionen   wie Parsing ‚Bedingungen‘, ‚Limit‘   oder sogar Ihre eigenen Parameter).

War es hilfreich?

Lösung

Ich vermute, dass Sie haben werden Show Cake, wie Nachbarn zu finden, indem sie ein Verfahren in der Datenquelle zu definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top