Implementieren von CakePHP find () Operationen in Datenquelle
-
27-09-2019 - |
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).
Lösung
Ich vermute, dass Sie haben werden Show Cake, wie Nachbarn zu finden, indem sie ein Verfahren in der Datenquelle zu definieren.