für ein Adressbuch wollte ich eine alphabetische Paginierung.
Also nicht z.B. 4 Einträge pro Seite, sonder alle Nachnamen die mit 'A' beginnen auf einer Seite usw.
Hier die Lösung:
- Code: Alles auswählen
<?php
class NamesController extends AppController {
var $components = array('Letter');
function index($letter = null) {
$letters = $this->Letter->getLetters();
$this->set('letters', $letters);
if (isset($letter)) {
$count = $this->Name->find('count', array('conditions' => 'name like "' . $letter . '%"'));
if ($count != 0) {
$this->paginate = array(
'conditions' => array('name like "' . $letter . '%"'),
'limit' => $count,
'order' => 'name ASC'
);
} else {
$this->paginate = array(
'conditions' => array('name like "' . $letter . '%"')
);
}
$this->set('letter', $letter);
} else {
$this->set('letter', 'Übersicht');
}
$names = $this->paginate('Name');
$this->set('names', $names);
}
}
?>
- Code: Alles auswählen
<?php
class LetterComponent extends Object {
var $helpers = array('Paginator');
function getLetters() {
$letterstmp = array();
for ($i = 65; $i <= 90; $i++) {
$letterstmp[] = chr($i);
if ($i == 65) { //A
$letterstmp[] = 'Ä';
} else if ($i == 79) { //O
$letterstmp[] = 'Ö';
} else if ($i == 85) { //U
$letterstmp[] = 'Ü';
}
}
App::import('Model', 'Name');
$this->Name = new Name();
$tmpArr = $this->Name->query('select left(name, 1), count(left(name, 1)) from names group by left(name, 1)');
$results = array();
foreach ($tmpArr as $tmp) {
$results[$tmp[0]['left(name, 1)']] = $tmp[0]['count(left(name, 1))'];
}
$letters = array();
foreach ($letterstmp as $letter) {
foreach ($results as $key => $value) {
if (strcmp($letter, $key) == 0) { // Strings sind gleich
$letters[$letter] = $value;
break;
} else {
$letters[$letter] = 0;
}
}
}
return $letters;
}
}
?>
index.ctp
- Code: Alles auswählen
<h2>Names</h2>
<?php echo '<strong>' . $letter . '</strong>'; ?>
<table>
<tr>
<th>Name</th>
<th>Vorname</th>
</tr>
<?php foreach ($names as $name) { ?>
<tr>
<td><?php echo $name['Name']['name']; ?></td>
<td><?php echo $name['Name']['firstname']; ?></td>
</tr>
<?php } ?>
</table>
<?php
foreach ($letters as $key => $value) {
if ($value == 0) {
echo $key . '&nbsp;';
} else {
echo $html->link($key, array(
'action' => 'index',
$key
),
null,
null,
false);
echo '&nbsp;';
}
}
?>

