Alphabetische Paginierung

Anleitungen und Quellcode-Auszüge die den Start vereinfachen sollen.

Alphabetische Paginierung

Beitragvon getit am So 8. Feb 2009, 15:18

Hi,

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 . '&amp;nbsp;';
    } else {
        echo $html->link($key, array(
            'action'    =>  'index',
            $key
        ),
        null,
        null,
        false);
        echo '&amp;nbsp;';
    }
}
?>
 
Zuletzt geändert von getit am Mi 11. Feb 2009, 11:47, insgesamt 1-mal geändert.
getit
 
Beiträge: 105
Registriert: Mo 22. Dez 2008, 13:06
CakePHP-Version: 1.2.1.8004
OS: Vista

Re: Alphabetische Paginierung

Beitragvon euromark am Mo 9. Feb 2009, 12:42

das liegt an der art, wie MYSQL damit umgeht...

lies dir dazu das ma durch:
http://www.php-faq.de/q-mysql-umlaute-sortieren.html

und bedenke vor allem den letzten Satz dazu ganz unten.
euromark
 
Beiträge: 397
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 1.2.4
OS: Windows


Zurück zu Tutorials und Snippets

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron