Страница 2 из 3

Re: Кулинария

Добавлено: Чт мар 19, 2015 8:30 am
Ivan
Есть вариант с наливом. Тысяч за 20 :)

Re: Кулинария

Добавлено: Чт мар 19, 2015 11:26 am
sergejey
где-то в стопке старых бумажек у меня даже есть структура модуля планирования меню на неделю с базой рецептов "дежурных" блюд. там суть сводилась к тому, что с помощью этого модуля можно (было бы) планировать, что готовить каждый день, с учётом (или без) имеющихся продуктов или с составлением списка покупок того, чего не хватает (связь с модулем Продукты). но руки так и не дошли...

Re: Кулинария

Добавлено: Чт мар 19, 2015 11:36 am
Amarok
Amarok писал(а):
Dark_Veter писал(а):Я думаю сделать не особо сложно, опишите, как это должно работать. Мне пока в голову ничего интересного не пришло :-)
Думаю должно быть примерно так:
- Алиса, давай что-нибудь приготовим?
- Давай. Что?
- Пельмени.
Алиска роется в базе и выдает рецепты.
- 1) Пельмени по уральски. 2) Пельмени по сибирски. 3) Пельмени жареные
- Будем готовить №1
Алиса выдает рецепт №1
Хотелось бы такой модуль тоже)

Re: Кулинария

Добавлено: Вт апр 07, 2015 6:00 pm
Dark_Veter
Вот написал скрипт, правда его еще допиливать надо, но в целом работает.
Как использовать: Создаем примерно такой шаблон поведения

Код: Выделить всё

(Д|д)авай приготовим (.+) 
Затем вставляем в него следующий код:

Код: Выделить всё

$queryString = $matches[2];

/*
  $findParams = array(
  'aerogrill' => '22', // Рецепты для аэрогриля
  'waffle' => '27', // Для вафельницы
  'yoghurt' => '28', // Для йогуртиницы
  'multivarka' => '25', //Рецепты для мультиварки
  'steamer' => '15', //Для пароварки
  'pressureCooker' => '46', //Для скороварки
  'breadMaker' => '23', //Для хлебопечки
  'fondue' => '24'  //Рецепты фондю
  );

 */
$findParams = array();

$recipeNumber = rand(0, 5);

$recipesList = findRecipes($queryString, $findParams);

if (!empty($recipesList)) {
    $recipe = getRecipes($recipesList[$recipeNumber]['link']);
    $recipe['link'] = $recipesList[$recipeNumber]['link'];
    $recipe['name'] = $recipesList[$recipeNumber]['text'];
    sayRecipe($recipe);
} else {
    say('Ничего не найдено.');
}

function OpenRecipeURL($link) {
    $rec=array();
    $rec['EVENT_TYPE']='openurl'; // команда может быть ещё newwindow
    $rec['WINDOW']='alice';
    $rec['TERMINAL_TO']='*'; //здесь можно конкретный терминал указать
    $rec['ADDED']=date('Y-m-d H:i:s');
    $rec['EXPIRE']=date('Y-m-d H:i:s', time()+10);
    $rec['DETAILS']=$link;
    $rec['ID']=SQLInsert('events', $rec); 
}

function sayRecipe($recipe) {
    OpenRecipeURL($recipe['link']);

    say($recipe['name']);

    if (!empty($recipe['description'])) {
        foreach ($recipe['description'] as $e) {
            say($e);
        }
    }

    $ingrstr = 'Нам понадобится: ';
    foreach ($recipe['ingredients'] as $e) {
        $ingrstr .= $e . ', ';
    }
    
    say($ingrstr);

    say('Способ приготовления:');

    foreach ($recipe['preparing'] as $e) {
        say($e);
    }
}

function getRecipes($recipeLink) {
    if (empty($recipeLink)) {
        return FALSE;
    }

    $html = @file_get_contents($recipeLink);

    $doc = new DOMDocument();
    @$doc->loadHTML($html);

    $xpath = new DOMXpath($doc);
    $ingredients = array();
    $description = array();

    $ingredientsDom = $xpath->query('//table[@class="rec-ingred-table"]/tr');
    if ($ingredientsDom->length > 0) {
        foreach ($ingredientsDom as $item) {
            $ingredients[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
        }

        $descriptionDom = $xpath->query('//div[@class="b-page_block__outside"]/p');
        foreach ($descriptionDom as $item) {
            $description[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
        }
    } else {
        $ingredientsDom = $xpath->query('//div[@class="b-page_block__outside"]/p');
        foreach ($ingredientsDom as $item) {
            $ingredients[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
        }
    }
    $preparingDom = $xpath->query('//div[@class="b-list__clause__text"]/p');
    $preparing = array();
    foreach ($preparingDom as $item) {
        $preparing[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
    }

    $recipe = array(
        'description' => $description,
        'ingredients' => $ingredients,
        'preparing' => $preparing
    );

    return $recipe;
}

function findRecipes($queryString, $params) {
    if (empty($queryString)) {
        return FALSE;
    }

    $url = 'http://www.edimdoma.ru/search?utf8=%E2%9C%93&asset=recipes&index=title_search&query=' . urlencode($queryString) . '&search%5Bmain_category_id%5D=&search%5Bcuisine_id%5D=';

    if (!empty($params)) {
        foreach ($params as &$value) {
            $url .= '&cooking_method_ids%5B%5D=' . $value;
        }
    }

    $url .= '&user_name=';

    $html = @file_get_contents($url);
    $doc = new DOMDocument();
    @$doc->loadHTML($html);

    $xpath = new DOMXpath($doc);
    $articles = $xpath->query('//div[@class="b-page_block__header"]');

    $links = array();
    foreach ($articles as $container) {
        $arr = $container->getElementsByTagName("a");
        foreach ($arr as $item) {
            if ($item->parentNode->tagName == "h2") {
                $href = $item->getAttribute("href");
                $text = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
                $links[] = array(
                    'link' => $href,
                    'text' => $text
                );
            }
        }
    }

    return $links;
}
 
Работать будет только при наличии интернета, т.к. парсит сайт http://www.edimdoma.ru/

И сразу вопросик :-) Может кто подскажет, как программно открывать страницу на каком либо терминале? Можно бы было открывать страницу с рецептом при запросе.

Re: Кулинария

Добавлено: Вт апр 07, 2015 8:16 pm
slgeo
Как подгрузить на конкретном терминале - не подскажу, но в url домашней страницы можно записать свойство объекта, например, %ThisComputer.KitchenUrl%, и подгружать уже необходимую страницу.

Re: Кулинария

Добавлено: Пт апр 10, 2015 4:10 pm
Bagir
Dark_Veter писал(а):как программно открывать страницу на каком либо терминале?
Это можно, вот пример

Код: Выделить всё

$rec=array();
$rec['EVENT_TYPE']='openurl'; // команда может быть ещё newwindow
$rec['WINDOW']='alice';
$rec['TERMINAL_TO']='*'; //здесь можно конкретный терминал указать
$rec['ADDED']=date('Y-m-d H:i:s');
$rec['EXPIRE']=date('Y-m-d H:i:s', time()+10);
$rec['DETAILS']='my_site.ru';
$rec['ID']=SQLInsert('events', $rec); 

Re: Кулинария

Добавлено: Пт апр 10, 2015 8:18 pm
Dark_Veter
Bagir, Спасибо! Добавил в код для открытия страницы с рецептом.

Re: Кулинария

Добавлено: Вт июл 19, 2016 10:23 pm
Roman_13j
Никак не могу заставить работать данный скрипт. Все время говорит, что "Я не знаю такого рецепта". В чем может быть проблема?

Re: Кулинария

Добавлено: Ср июл 20, 2016 10:03 am
Dark_Veter
Странно, только что проверил у себя, работает. А шаблон у вас срабатывает?

Re: Кулинария

Добавлено: Ср июл 20, 2016 11:22 am
Roman_13j
Проверил, при шаблоне "(Д|д)авай приготовим (.+)" шаблон не отрабатывает, если задать "давай приготовим (.+)" и выставить $matches[1], срабатывает нормально и ищет рецепт. Если поставить галочку на Use morphology перестает срабатывать.