Используем Яндекс.Склонятор в doit-cms

Однажды у меня появилась надобность склонить имя пользователя на сайте, в родительный падеж. В поисках подобной возможности я перерыл весь интернет, но многие сервисы были слишком объемными или слишком сложными в использовании. В последствии был найден оптимальный вариант – Яндекс.Склонятор.

Яндекс.Склонятор  - сервис от Яндекса, который склоняет русские имена во все падежи. Сервис довольно таки удобный и простой в использовании. Разберем на примере.

У нас в базе данных есть пользователь с именем Анисимов Кирилл Валерьевич. На одной из страниц сайта необходимо выводить текст, типа: “ООО “Название фирмы” в лице Анисимова Кирилла Валерьевича ...”. Получается из имени Анисимов Кирилл Валерьевич, я должен получить Анисимова Кирилла Валерьевича. Для этого нужно в папке app создать файл с именем padezhi.func.php.

Код файла padezhi.func.php будет следующим:

<?php
define ( 'ABSPATH', dirname(__FILE__).'/' );
define ( 'INFLECT_CACHE', ABSPATH . 'cache/inflect.%s.txt' );
function inflector ( $name ) {
    // Getting Cachable ID
    $nid = md5( $name );
    // Checking for Cached Version
    if ( file_exists(sprintf(INFLECT_CACHE, $nid)) ) {
        // Loading form Cache
        $cases = file_get_contents( sprintf(INFLECT_CACHE, $nid) );
        $cases = unserialize( $cases );
        return $cases;
    } else {
        // Building Request URL
        $url = 'http://export.yandex.ru/inflect.xml?name='.urlencode($name);
        // Processing CURL Request
        $curl = curl_init( $url );
        curl_setopt( $curl, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.61' );
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
        $result = curl_exec( $curl );
        curl_close( $curl );
        // Preparing Inflections
        $cases = array ();
        preg_match_all( '#\<inflection\s+case\=\"([0-9]+)\"\>(.*?)\<\/inflection\>#si', $result, $m );
        // Creating Inflection List
        if ( count($m[0]) ) {
            foreach ( $m[1] as $i => &$id ) {
                $cases[ (int) $id ] = $m[2][$i];
            } unset ( $id );
        } else return false;
        // Saving Result and Sending back to User
        file_put_contents( sprintf(INFLECT_CACHE, $nid), serialize($cases) );
        return $cases;
    }
}

Не буду объяснять, как работает эта функция, но она работает. Что бы получить массив имени во всех падежах, мы используем следующий код:

$inflection = inflector(‘Анисимов Кирилл Валерьевич’);

В результате, в переменной $inflection будет храниться массив с именем во всех падежах.

Удачных склонений. ;)


Скачать padezhi.func.zip