Перейти к содержимому


Фото
* * * * * 2 голосов

Склонение по падежам

Склонение Падежи Simpla 2.3.x

Best Answer mishanya , 13.05.2016 - 09:26

UPD 3.0 с новым апи и записью падежей в базу

 
 
1. делаем запрос в базу
CREATE TABLE IF NOT EXISTS `s_declination` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phrase` varchar(255) NOT NULL,
  `declination` varchar(1024) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

2. Регистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем:

$this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier'));
3. Дальше добавим в самый конец функцию для обработки нового апи и возвращения падежей (если у вас была старая ф-я версии 1 или 2, нужно ее удалить):
public function declination_modifier($text, $numForm = null, $numType = 'О') {

	// Смотрим есть ли в базе сколонение
	$query = $this->db->placehold("SELECT d.id, d.phrase, d.declination FROM __declination d WHERE d.phrase=? LIMIT 1", $text);
	$this->db->query($query);
	$d = $this->db->result();

	if($d) {
		$result = unserialize($d->declination);
	} else {
		$urlXml = "https://ws3.morpher.ru/russian/declension?s=".urlencode($text);
		$d = @simplexml_load_file($urlXml);
		$d = (array)$d;
	    if(!empty($d)){
	        $arrData = array();

	        $arrData['И']['О'] = (string) $text;
	        foreach ($d as $key=>$val) {
	        	if(!is_object($val))
	            	$arrData[$key]['О'] = (string) $val;
	            else {
	            	$multiple = (array)$val;
	            	foreach ($multiple as $key=>$m) {
	            		$arrData[$key]['М'] = (string) $m;
	            	}
	            }
	        }
	        $result = $arrData;

			$query = $this->db->placehold("INSERT INTO __declination SET ?%", array('phrase'=>$text, 'declination'=>serialize($result)));
			$this->db->query($query);
	    }
	}

    if($numForm) {
    	if( isset($result[$numForm][$numType]) ) {
    	     return $result[$numForm][$numType];
    	} else
    	     return $text;
   	} else {
    	return $result;
    }
}

 

Как использовать: для нужной переменной добавляем модификатор |declination:падеж:тип_падежа

например:

{$product->name|declination:'Д':'О'}
{'Главная'|declination:'Р':'М'}

Список падежей:

И - Именительный падеж
Р - Родительный падеж
Д - Дательный падеж
В - Винительный падеж
Т - Творительный падеж
П - Предложный падеж
 
Тип падежа:
О - единственный
М - множественный
Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
50 ответов в теме

#1 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 18.06.2015 - 20:43

Что делает: возвращает все формы слова/нескольких слов в нужные падежи.

Как делает: для склонения используется yandex api.

 

Для того чтобы подлючить нужно сделать следующее:

 

1. зарегистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем после:

$this->smarty->registerPlugin('modifier', 'time', array($this, 'time_modifier')); 

 

регистрацию нашего плагина:

$this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier'));

 

2. дальше добавим в самый конец функцию для обработки яндекс апи и возвращения падежей, после:

	public function time_modifier($date, $format = null)
	{
	    return date(empty($format)?'H:i':$format, strtotime($date));
	}

 

вставляем ДО последней закрывающей фигурной скобки:

	public function declination_modifier($text, $numForm = null) {
	    $urlXml = "http://export.yandex.ru/inflect.xml?name=".urlencode($text);

	    $result = @simplexml_load_file($urlXml);
	    if($result){
	        $arrData = array();
	        foreach ($result->inflection as $one) {
	           $arrData[] = (string) $one;
	        }
	        if($numForm)
	        	return $arrData[$numForm];
	        else
	        	return $arrData;
	    }
	    return false;
	}

 

Как использовать: для нужной переменной добавляем модификатор |declination:номер_падежа

например:

{$product->name|declination:2} 

можно передавать не только переменные но и просто строку вида:

{'Главная'|declination:5} 

 

Все падежи и их номера:

0 - Именительный падеж
1 - Родительный падеж
2 - Дательный падеж
3 - Винительный падеж
4 - Творительный падеж
5 - Предложный падеж
 
Также можно использовать |declination без номера падежа, в этом случае функция передаст все падежи в виде массива, что потом можно использовать на странице чтобы не делать несколько запросов к апи для склонения в разные падежи одной и той же переменной.
{$dec = $product->name|declination}
{foreach $dec as $d}
  {$d}
{/foreach}

Недостатки:

  - одно слово/фраза - новый запрос к апи

  - зависимость от yandex api


Изменено: mishanya, 20.06.2015 - 08:31


#2 Rash

Rash
  • Пользователь
  • 450 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x
  • Откуда:Russian Federation

Опубликовано 18.06.2015 - 20:48

Благодарю за труды! То, что было нужно!  ;)



#3 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 19.06.2015 - 06:03

вы нереально помогли — спасибо! Особенно для тайтлов и дескриптонов и заголовков, супеР!


Изменено: Maksclub, 19.06.2015 - 06:04


#4 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 19.06.2015 - 19:09

вопрос — если долго отвечает Яндекс, как это сказывается на загрузке страницы?

как ведет себя при ошибке и т.д..



#5 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 19.06.2015 - 19:25

вопрос — если долго отвечает Яндекс, как это сказывается на загрузке страницы?

как ведет себя при ошибке и т.д..

 

при ошибке возвращает false. впринципе можно сделать чтобы возвращало изначальный текст. надо заменить

 

return false;

на 

return $text;

тогда если не будет ответа от сервера, выведеться оригинальный текст.



#6 koteyka

koteyka

    Фрилансер

  • Пользователь
  • 1 341 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Днепропетровск

Опубликовано 19.06.2015 - 19:51

Супер. Спасибо огромное.



#7 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 20.06.2015 - 08:05

при ошибке возвращает false. впринципе можно сделать чтобы возвращало изначальный текст. надо заменить

 

Помогите плиз — в случае со словосочетанием "Сатин с вышивкой с отделкой гобеленом", ничего не возвращает... даже после того как сделал

return $text;

У меня такая вот категория  есть ;) Не критично, просто хотел добавить в h1 словосочетание с ключевыми словами, для этого названия категорий бы в родительский просклонять....

 

А так все супер - в метатегах круто пошло ;))


 


Изменено: Maksclub, 20.06.2015 - 08:06


#8 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.06.2015 - 08:10

Помогите плиз — в случае со словосочетанием "Сатин с вышивкой с отделкой гобеленом", ничего не возвращает... даже после того как сделал

return $text;

У меня такая вот категория  есть ;) Не критично, просто хотел добавить в h1 словосочетание с ключевыми словами, для этого названия категорий бы в родительский просклонять....

 

А так все супер - в метатегах круто пошло ;))


 

 

у этого словосочитания есть одна форма http://goo.gl/Li2KOz. первая. как вы вызываете ф-ю? с каким параметром. тоесть получается, сервер дает ответ, поэтому вам не возвращается return $text;


Изменено: mishanya, 20.06.2015 - 08:11


#9 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 20.06.2015 - 08:16

у этого словосочитания есть одна форма http://goo.gl/Li2KOz. первая. как вы вызываете ф-ю? с каким параметром. тоесть получается, сервер дает ответ, поэтому вам не возвращается return $text;

 

Вызываю так

{$category->name|escape|declination:1}

Как сделать проверку, если одна форма слова/словосочетания, вернуть ее назад?...


Еще вопрос про огранирчения — сколько тысяч в день? Как увеличить если их не много, я как-то натыкался в Яндекс АПИ на ограничения и видел там, что нужно регаться... тут не надо?

 


 



#10 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.06.2015 - 08:17

попробуйте заменить ф-ю в api/Design.php на такую:

	public function declination_modifier($text, $numForm = null) {
	    $urlXml = "http://export.yandex.ru/inflect.xml?name=".urlencode($text);
 
	    $result = @simplexml_load_file($urlXml);
	    if($result){
	        $arrData = array();
	        foreach ($result->inflection as $one) {
	           $arrData[] = (string) $one;
	        }
	        if($numForm)
	        	if( isset($arrData[$numForm]) )
	        	     return $arrData[$numForm];
	        	else
	        	     return $text;
	        else
	        	return $arrData;
	    }
	    return $text;
	}

добавил проверку, существует ли тот вид падежа для фразы. если нет, возвращать изначально переданый текст


Изменено: mishanya, 20.06.2015 - 08:18


#11 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 20.06.2015 - 08:19

попробуйте заменить ф-ю в api/Design.php на такую:

	  

добавил проверку, существует ли тот вид падежа для фразы. если нет, возвращать изначально переданый текст

 

Все получилось — спасибо большое! А что на счет ограничений?



#12 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 20.06.2015 - 08:21

Все получилось — спасибо большое! А что на счет ограничений?

И что можно придумать для записи в БД, чтобы случайно при массовом потоке людей не получить бан?



#13 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 20.06.2015 - 08:25

попробуйте заменить ф-ю в api/Design.php на такую:

	 

добавил проверку, существует ли тот вид падежа для фразы. если нет, возвращать изначально переданый текст

 

Я так понял тут https://xml.yandex.ru/settings/ мне указать IP сайта? И как то в запросе токен еще дописать?



#14 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.06.2015 - 08:28

Еще вопрос про огранирчения — сколько тысяч в день? Как увеличить если их не много, я как-то натыкался в Яндекс АПИ на ограничения и видел там, что нужно регаться... тут не надо?

 

 

я знаю что для айпи поиска нужно регистрироваться. и там есть 1000 результатов поиска в выдаче за раз ограничение. тут же я не нашел ниодного объяснения о работе этого сервиса. есть ли ограничения, немного непонятно. на выдачу результатов не думаю, там больше 6 никогда не будет. на количество запростов в день - это нужно тестировать.
 



#15 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.06.2015 - 08:29

Я так понял тут https://xml.yandex.ru/settings/ мне указать IP сайта? И как то в запросе токен еще дописать?

 

это для поиска апи. я не уверен что оно будет работать для этого сервиса.



#16 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.06.2015 - 08:30

И что можно придумать для записи в БД, чтобы случайно при массовом потоке людей не получить бан?

 

вы хотите записывать в БД что? склонения? тогда какой смысл в сервисе, как проверять актуально ли сравнение в базе или нет.



#17 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 20.06.2015 - 09:05

вы хотите записывать в БД что? склонения? тогда какой смысл в сервисе, как проверять актуально ли сравнение в базе или нет.

тут согласен, не нужно это мне...  а вот про ограничения надо бы где-то поискать, в понедельник в Яндекс постучу...



#18 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 20.06.2015 - 09:39

И что можно придумать для записи в БД, чтобы случайно при массовом потоке людей не получить бан?

Видимо, создавать историю запросов, записывая запросы и их результаты в таблицу БД.
При следующем запросе проверять в базе, есть ли там такое слово, и если есть, не делать внешний запрос.

И частоту внешних запросов ограничить.
Можно еще учитывать даты запросов и некоторый предельный срок.
Недостаток: возрастет число запросов к БД.

С недостатком можно  бороться индивидуально. Например, если планируется применять {$product->name|declination:2}, то в таблице товаров завести новые поля по падежам...



#19 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.06.2015 - 09:51

Видимо, создавать историю запросов, записывая запросы и их результаты в таблицу БД.
При следующем запросе проверять в базе, есть ли там такое слово, и если есть, не делать внешний запрос.

И частоту внешних запросов ограничить.
Можно еще учитывать даты запросов и некоторый предельный срок.
Недостаток: возрастет число запросов к БД.

С недостатком можно  бороться индивидуально. Например, если планируется применять {$product->name|declination:2}, то в таблице товаров завести новые поля по падежам...

 

ну таблицу падежей можно сделать и делать туда запрос. проблем нет. ближе к вечеру напишу. только есть ли смысл заводить новые поля по падежам в товарах, не будет ли это тем лишним запросом при добавлении в товар этих падежей.



#20 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 20.06.2015 - 09:54

ну таблицу падежей можно сделать и делать туда запрос. проблем нет. ближе к вечеру напишу. только есть ли смысл заводить новые поля по падежам в товарах, не будет ли это тем лишним запросом при добавлении в товар этих падежей.

 

Не будет (если, конечно, все правильно сделать). Потому что лишнее поле и лишний запрос - совсем не одно и то же...







Также с меткой «Склонение, Падежи, Simpla 2.3.x»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых