Используем Яндекс.Склонятор в 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