Recherche de mise en œuvre CakePHP () opérations en datasource
-
27-09-2019 - |
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).
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.