вторник, 28 февраля 2012 г.

Автоматическое склонение слов для drupal

Представьте, что у вас интернет-магазин с огромным количеством товаров. Вы делаете шаблонное описание ко всем товарам и робот при выводе подставляет в него наименование и категорию данного товара. И все, вроде бы, хорошо, но у вас всегда название и категория будут неизменными (как правило в именительном падеже) что не очень хорошо сказывается на читабельности данного текста, да и с точки зрения СЕО такой текст будет хуже, нежели текст в котором есть несколько словоформ одного и того же слова. Так что нам необходимо, чтобы слова в тексте заменялись на слова в нужном падеже.

Делаем это.

Собственно сама функция и вызов.

function sklon($word,$padeg) {

$url = "http://morpher.ru/WebService.asmx/GetXml?s=$word";

$hash=md5($word);

if (file_exists($hash.'.xml')) {$tmp=file($hash.'.xml'); $rod=$tmp[0]; $dat=$tmp[1]; $vin=$tmp[2]; $tvor=$tmp[3]; $predl=$tmp[4];} else {

$xml = simplexml_load_file($url);
$im = $word;
$rod = trim($xml->Р);
$dat = trim($xml->Д);
$vin = trim($xml->В);
$tvor = trim($xml->Т);
$predl = trim($xml->П);
$k=fopen($hash.'.xml',"w");
fwrite($k,$rod."\n".$dat."\n".$vin."\n".$tvor."\n".$predl."\n");
fclose($k);

}

if ($padeg == 'rod') {return $rod;} elseif ($padeg == 'dat') {return $dat;} elseif ($padeg == 'vin') {return $vin;} elseif ($padeg == 'tvor') {return $tvor;} elseif ($padeg == 'predl') {return $predl;} else {return FALSE;}
}

$text = 'sklon(бурый медведь,rod) часто видят в лесу, так часто, что даже забывают о sklon(маленький еж,predl)';

$sklonoutarr = array();
$sklonpattern = '/sklon\((.*?),(.*?)\)/';
preg_match_all($sklonpattern, $text, $sklonarray);

for ($i=0; $i<(count($sklonarray[0])); $i++) {
$text=str_replace($sklonarray[0][$i],sklon($sklonarray[1][$i], $sklonarray[2][$i]),$text);
}
echo $text;


Саму функцию нужно вставить в template.php, а вызов делаем через theme_preprocess_node:

if ($vars['page']) {

$sklonoutarr = array();
$sklonpattern = '/sklon\((.*?),(.*?)\)/';
preg_match_all($sklonpattern, $vars['content'], $sklonarray);

for ($i=0; $i $vars['content']=str_replace($sklonarray[0][$i],sklon($sklonarray[1][$i], $sklonarray[2][$i]),$vars['content']);
}

Вызов такой sklon(слово в именительном падеже, падеж)

Обращаю внимание, что необходимо создать папку для размещения кэша, потому что она сама не создается.

Комментариев нет:

Отправить комментарий