mishanya Опубликовано 18 июня, 2015 Жалоба Поделиться Опубликовано 18 июня, 2015 (изменено) Что делает: возвращает все формы слова/нескольких слов в нужные падежи.Как делает: для склонения используется 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 Изменено 20 июня, 2015 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Rash Опубликовано 18 июня, 2015 Жалоба Поделиться Опубликовано 18 июня, 2015 Благодарю за труды! То, что было нужно! Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 19 июня, 2015 Жалоба Поделиться Опубликовано 19 июня, 2015 (изменено) вы нереально помогли — спасибо! Особенно для тайтлов и дескриптонов и заголовков, супеР! Изменено 19 июня, 2015 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 19 июня, 2015 Жалоба Поделиться Опубликовано 19 июня, 2015 вопрос — если долго отвечает Яндекс, как это сказывается на загрузке страницы?как ведет себя при ошибке и т.д.. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 19 июня, 2015 Автор Жалоба Поделиться Опубликовано 19 июня, 2015 вопрос — если долго отвечает Яндекс, как это сказывается на загрузке страницы?как ведет себя при ошибке и т.д.. при ошибке возвращает false. впринципе можно сделать чтобы возвращало изначальный текст. надо заменить return false; на return $text; тогда если не будет ответа от сервера, выведеться оригинальный текст. Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 19 июня, 2015 Жалоба Поделиться Опубликовано 19 июня, 2015 Супер. Спасибо огромное. Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 (изменено) при ошибке возвращает false. впринципе можно сделать чтобы возвращало изначальный текст. надо заменить Помогите плиз — в случае со словосочетанием "Сатин с вышивкой с отделкой гобеленом", ничего не возвращает... даже после того как сделал return $text; У меня такая вот категория есть Не критично, просто хотел добавить в h1 словосочетание с ключевыми словами, для этого названия категорий бы в родительский просклонять.... А так все супер - в метатегах круто пошло ) Изменено 20 июня, 2015 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2015 Автор Жалоба Поделиться Опубликовано 20 июня, 2015 (изменено) Помогите плиз — в случае со словосочетанием "Сатин с вышивкой с отделкой гобеленом", ничего не возвращает... даже после того как сделал return $text; У меня такая вот категория есть Не критично, просто хотел добавить в h1 словосочетание с ключевыми словами, для этого названия категорий бы в родительский просклонять.... А так все супер - в метатегах круто пошло ) у этого словосочитания есть одна форма http://goo.gl/Li2KOz. первая. как вы вызываете ф-ю? с каким параметром. тоесть получается, сервер дает ответ, поэтому вам не возвращается return $text; Изменено 20 июня, 2015 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 у этого словосочитания есть одна форма http://goo.gl/Li2KOz. первая. как вы вызываете ф-ю? с каким параметром. тоесть получается, сервер дает ответ, поэтому вам не возвращается return $text; Вызываю так {$category->name|escape|declination:1} Как сделать проверку, если одна форма слова/словосочетания, вернуть ее назад?... Еще вопрос про огранирчения — сколько тысяч в день? Как увеличить если их не много, я как-то натыкался в Яндекс АПИ на ограничения и видел там, что нужно регаться... тут не надо? Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2015 Автор Жалоба Поделиться Опубликовано 20 июня, 2015 (изменено) попробуйте заменить ф-ю в 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; } добавил проверку, существует ли тот вид падежа для фразы. если нет, возвращать изначально переданый текст Изменено 20 июня, 2015 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 попробуйте заменить ф-ю в api/Design.php на такую: добавил проверку, существует ли тот вид падежа для фразы. если нет, возвращать изначально переданый текст Все получилось — спасибо большое! А что на счет ограничений? Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 Все получилось — спасибо большое! А что на счет ограничений?И что можно придумать для записи в БД, чтобы случайно при массовом потоке людей не получить бан? Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 попробуйте заменить ф-ю в api/Design.php на такую: добавил проверку, существует ли тот вид падежа для фразы. если нет, возвращать изначально переданый текст Я так понял тут https://xml.yandex.ru/settings/ мне указать IP сайта? И как то в запросе токен еще дописать? Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2015 Автор Жалоба Поделиться Опубликовано 20 июня, 2015 Еще вопрос про огранирчения — сколько тысяч в день? Как увеличить если их не много, я как-то натыкался в Яндекс АПИ на ограничения и видел там, что нужно регаться... тут не надо? я знаю что для айпи поиска нужно регистрироваться. и там есть 1000 результатов поиска в выдаче за раз ограничение. тут же я не нашел ниодного объяснения о работе этого сервиса. есть ли ограничения, немного непонятно. на выдачу результатов не думаю, там больше 6 никогда не будет. на количество запростов в день - это нужно тестировать. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2015 Автор Жалоба Поделиться Опубликовано 20 июня, 2015 Я так понял тут https://xml.yandex.ru/settings/ мне указать IP сайта? И как то в запросе токен еще дописать? это для поиска апи. я не уверен что оно будет работать для этого сервиса. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2015 Автор Жалоба Поделиться Опубликовано 20 июня, 2015 И что можно придумать для записи в БД, чтобы случайно при массовом потоке людей не получить бан? вы хотите записывать в БД что? склонения? тогда какой смысл в сервисе, как проверять актуально ли сравнение в базе или нет. Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 вы хотите записывать в БД что? склонения? тогда какой смысл в сервисе, как проверять актуально ли сравнение в базе или нет.тут согласен, не нужно это мне... а вот про ограничения надо бы где-то поискать, в понедельник в Яндекс постучу... Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 И что можно придумать для записи в БД, чтобы случайно при массовом потоке людей не получить бан?Видимо, создавать историю запросов, записывая запросы и их результаты в таблицу БД.При следующем запросе проверять в базе, есть ли там такое слово, и если есть, не делать внешний запрос.И частоту внешних запросов ограничить.Можно еще учитывать даты запросов и некоторый предельный срок.Недостаток: возрастет число запросов к БД. С недостатком можно бороться индивидуально. Например, если планируется применять {$product->name|declination:2}, то в таблице товаров завести новые поля по падежам... Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2015 Автор Жалоба Поделиться Опубликовано 20 июня, 2015 Видимо, создавать историю запросов, записывая запросы и их результаты в таблицу БД.При следующем запросе проверять в базе, есть ли там такое слово, и если есть, не делать внешний запрос.И частоту внешних запросов ограничить.Можно еще учитывать даты запросов и некоторый предельный срок.Недостаток: возрастет число запросов к БД. С недостатком можно бороться индивидуально. Например, если планируется применять {$product->name|declination:2}, то в таблице товаров завести новые поля по падежам... ну таблицу падежей можно сделать и делать туда запрос. проблем нет. ближе к вечеру напишу. только есть ли смысл заводить новые поля по падежам в товарах, не будет ли это тем лишним запросом при добавлении в товар этих падежей. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 20 июня, 2015 Жалоба Поделиться Опубликовано 20 июня, 2015 ну таблицу падежей можно сделать и делать туда запрос. проблем нет. ближе к вечеру напишу. только есть ли смысл заводить новые поля по падежам в товарах, не будет ли это тем лишним запросом при добавлении в товар этих падежей. Не будет (если, конечно, все правильно сделать). Потому что лишнее поле и лишний запрос - совсем не одно и то же... Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 27 июня, 2015 Автор Жалоба Поделиться Опубликовано 27 июня, 2015 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; } } В лучае если фраза уже есть в базе, она выбирается из базы. если ее нет, делается запрос к АПИ, после чего записывается результат в базу. Использовать так же как и первую версию! Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 27 июня, 2015 Жалоба Поделиться Опубликовано 27 июня, 2015 (изменено) UPD 2.0 С записью падежей в базу 1. Делаем запрос к базе: 2. Регистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем: $this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier')); 3. Дальше добавим в самый конец функцию для обработки яндекс апи и возвращения падежей: Это я полагаю для названия товаров? Или именно для склоняемого слова? И это запрсо лишний? Изменено 27 июня, 2015 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 27 июня, 2015 Автор Жалоба Поделиться Опубликовано 27 июня, 2015 Это я полагаю для названия товаров? без разницы. в базу записывается фраза которую вы склоняете и результат склонения. тоесть если у вас название категории Шапки или товар - Шапки, в базу запишеться фраза - Шапки и результат. и уже при втором обращении функция посмотрит что в базе уже есть Шапки и вернет вам результат из базы. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 27 июня, 2015 Автор Жалоба Поделиться Опубликовано 27 июня, 2015 вы можете склонять любую переменную и она запишеться в базу. или простой текст {'Главная'|declination:5} Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 27 июня, 2015 Жалоба Поделиться Опубликовано 27 июня, 2015 (изменено) без разницы. в базу записывается фраза которую вы склоняете и результат склонения. тоесть если у вас название категории Шапки или товар - Шапки, в базу запишеться фраза - Шапки и результат. и уже при втором обращении функция посмотрит что в базе уже есть Шапки и вернет вам результат из базы.Насколько это ресурсоемко если склонять по 2 свойства товара ...а товаров 5тыс? Можно ли это вызывать только в случае ошибки при связи с Яндексом? Изменено 27 июня, 2015 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.