Перейти к содержанию
Официальный форум поддержки Simpla

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


Перейти к решению Решено mishanya,

Рекомендуемые сообщения

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

Как делает: для склонения используется 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
Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 53
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

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

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

return false;

на 

return $text;

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

return $text;

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

 

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

 

 

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

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

return $text;

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

 

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

 

 

 

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

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

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

 

Вызываю так

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

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

 

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

 

 

 

Ссылка на сообщение
Поделиться на другие сайты

попробуйте заменить ф-ю в 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
Ссылка на сообщение
Поделиться на другие сайты

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

	  

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

	 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

 

 

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

 

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

И частоту внешних запросов ограничить.

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

Недостаток: возрастет число запросов к БД.

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

И частоту внешних запросов ограничить.

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

Недостаток: возрастет число запросов к БД.

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

UPD 2.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. Дальше добавим в самый конец функцию для обработки яндекс апи и возвращения падежей:

	public function declination_modifier($text, $numForm = null) {

		// Смотрим есть ли в базе сколонение
		$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 = "http://export.yandex.ru/inflect.xml?name=".urlencode($text);
			$d = @simplexml_load_file($urlXml);
		    if($d){
		        $arrData = array();
		        foreach ($d->inflection as $one) {
		           $arrData[] = (string) $one;
		        }
		        $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]) ) {
        	     return $result[$numForm];
        	} else
        	     return $text;
       	} else {
        	return $result;
        }
	}

В лучае если фраза уже есть в базе, она выбирается из базы. если ее нет, делается запрос к АПИ, после чего записывается результат в базу.

 

Использовать так же как и первую версию!

Ссылка на сообщение
Поделиться на другие сайты

 

UPD 2.0 С записью падежей в базу

 

1. Делаем запрос к базе:

 

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

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

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

	 
		

 

Это я полагаю для названия товаров? Или именно для склоняемого слова? И это запрсо лишний?

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

Это я полагаю для названия товаров?

 

без разницы. в базу записывается фраза которую вы склоняете и результат склонения.

 

тоесть если у вас название категории Шапки или товар - Шапки, в базу запишеться фраза - Шапки и результат. и уже при втором обращении функция посмотрит что в базе уже есть Шапки и вернет вам результат из базы.

Ссылка на сообщение
Поделиться на другие сайты

без разницы. в базу записывается фраза которую вы склоняете и результат склонения.

 

тоесть если у вас название категории Шапки или товар - Шапки, в базу запишеться фраза - Шапки и результат. и уже при втором обращении функция посмотрит что в базе уже есть Шапки и вернет вам результат из базы.

Насколько это ресурсоемко если склонять по 2 свойства товара ...а товаров 5тыс? Можно ли это вызывать только в случае ошибки при связи с Яндексом?

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...