سؤال

أنا أقوم بتطبيق مصدر بيانات مخصص في تطبيق CakePhP الخاص بي ، لقد قمت بتطبيق الوظائف الأساسية لاستلقاء بيانات (read(), listSources(), describe()). يستخدم DataSource XML كمدخلات وأرغب حقًا في استخدام Find ("الجيران") على XML وكنت أتساءل عما إذا كانت Cake "تلقائيًا" تنفذ هذه الميزة (لأن read() الوظيفة موجودة) ، أو إذا كنت بحاجة إلى تمديد مصدر البيانات بطريقة أو بأخرى. لم أجد مثالاً محددًا حتى الآن ، لذلك آمل أن يتمكن المجتمع من المساعدة.

فيما يلي تطبيق مصدر البيانات الحالي.

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

يحرر:

يجب أن يقرأ الدليل بعناية أكبر:

وهذا كل ما في الأمر. من خلال اقتران هذه البيانات على نموذج ، يمكنك بعد ذلك استخدام النموذج: ، حيث يمكنك أن تقرر تنفيذ الميزات التي تحتاجها (على سبيل المثال نموذج :: العثور على خيارات مثل تحليل "الشروط" أو "الحد" أو حتى المعلمات المخصصة الخاصة بك).

هل كانت مفيدة؟

المحلول

أظن أنه سيكون عليك ذلك تبين كعكة كيفية العثور على الجيران من خلال تحديد طريقة في مصدر البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top