[Модуль] Продукты (app_products)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Модуль Продукты

Сообщение fandaymon » Чт фев 22, 2018 1:11 am

И ещё такая вещь - если добавлять распознавание конструкций одну бутылку, 2 ящика и т.д., то не понятно что с этим количеством делать дальше, так как в списках покупки нету поля количество. Лично мне было бы удобнее пользоваться списком, где есть количество и единицы изменения. Тогда можно было дополнить функцию addToList 2 параметрами Qty, Ed_Izm и соответственно сразу же и заполнять голосом.

Сейчас модуль как-то очень переусложнен, возможно имеет смысл сделать какой-то упрощенный модуль Simple_Products, где есть

Категория продуктов
Продукты
Список покупок

т.е. 2 справочника (Категории, продукты), режим редактирования списка продуктов (добавление из справочника, редактирование количества, удаление из списка) и режим В магазине, где выводится список Продуктов для покупки с галочкой. Когда галочка ставится продукт зачеркивается и перемещается в низ списка.
И совсем голубая мечта, если бы список можно было передать в мобильник, где галочки ставить в какой-нибудь простенькой програмке. Если бы у Google Keep был api, то сделать это было бы очень просто, но api нету... 8-(
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Модуль Продукты

Сообщение fandaymon » Чт фев 22, 2018 3:58 am

Нашел неофициальный клиент на питоне https://github.com/kiwiz/gkeepapi
Сделал сохранение списка в текстовый файл и отправку содержимого в лист Google Keep путем запуска скрипта на питоне. То что надо

Теперь есть 4 шаблона
Надо купить
Прочти список
Отправь список
Всё купили
Аватара пользователя
lanket
Сообщения: 1168
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 260 раз
Поблагодарили: 163 раза

Re: Модуль Продукты

Сообщение lanket » Чт фев 22, 2018 10:05 am

fandaymon писал(а):И ещё такая вещь - если добавлять распознавание конструкций одну бутылку, 2 ящика и т.д., то не понятно что с этим количеством делать дальше, так как в списках покупки нету поля количество. Лично мне было бы удобнее пользоваться списком, где есть количество и единицы изменения. Тогда можно было дополнить функцию addToList 2 параметрами Qty, Ed_Izm и соответственно сразу же и заполнять голосом.
...
Да именно это и не хватает для счастья. На данный момент в модуле есть реализация с количеством продуктов. Но не в этом русле. Сейчас количество подразумевается это текущее наличие продуктов в холодильнике. Неудобно хочу сказать. Не думаю что беря какой либо продукт, например яблоко, будешь кнопки топтать или кричать Алисе что минус одно яблоко. А если готовишь что то. На каждый индигридиент надо отчитываться Алисе.

Заказ продуктов с количеством необходим как воздух. Мне и супруге приходится вручную править нужное количество.
fandaymon писал(а):...
Сейчас модуль как-то очень переусложнен, возможно имеет смысл сделать какой-то упрощенный модуль Simple_Products, где есть

Категория продуктов
Продукты
Список покупок

т.е. 2 справочника (Категории, продукты), режим редактирования списка продуктов (добавление из справочника, редактирование количества, удаление из списка) и режим В магазине, где выводится список Продуктов для покупки с галочкой. Когда галочка ставится продукт зачеркивается и перемещается в низ списка.

И совсем голубая мечта, если бы список можно было передать в мобильник, где галочки ставить в какой-нибудь простенькой програмке. Если бы у Google Keep был api, то сделать это было бы очень просто, но api нету... 8-(
Так мажордроид и есть для работы и отметки в магазине что надо купить, и галочки с переносом вниз списка, как у Гугла киип, с пометкой что уже в карзине. Единственное что сейчас модуль не вычеркивает из списка покупок а только отмечает что уже в карзине. Что бы вычеркнуть надо потыкать в каждый что мол надо удалить из списка.

А ещё галочка работает как +1 шт к количеству. Это как я понял задумка была контроль текущего количества продуктов, отсюда и закладка с 'закончившимся' продуктами.

В общем как то недаработан механизм. Для меня не идеально, тоже думал что надо переделать.

Отправлено с моего Redmi Note 4 через Tapatalk
Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: gitHub 2й версии терминала
:arrow: GitHub модуля для МД
gitHub сырого модуля 2й версии
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Модуль Продукты

Сообщение fandaymon » Чт фев 22, 2018 11:40 am

У меня нет доступа к мажордомо извне, да и Google Keep на мой вкус идеально работает со списком - никаких лишних телодвижений

Не знаю - заметил ли ты новую версию файла - там добавлена твоя хотелка с хлеба белого. Пробуй! 8-)
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: Модуль Продукты

Сообщение webms » Чт фев 22, 2018 1:36 pm

Добавлю свои пять копеек :)
если в шаблоне products_search_admin добавить перед <td width="85%"> строку

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

 <td style="text-align:center;">[#if IMAGE!=""#]<img style='max-height:45px; max-width: 26px;' src='/cms/products/[#IMAGE#]'>[#endif#]</td>  
то выведите рядом с названием картинку товара

ps: рекомендую добавить шаблон в папку templates_alt чтоб не пропали изменения после обновления
Вложения
Clip2net_180222133549.png
Clip2net_180222133549.png (19.84 КБ) 3547 просмотров
Последний раз редактировалось webms Чт фев 22, 2018 2:31 pm, всего редактировалось 2 раза.
За это сообщение автора webms поблагодарил:
lanket (Чт фев 22, 2018 1:42 pm)
Рейтинг: 1.16%
Аватара пользователя
lanket
Сообщения: 1168
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 260 раз
Поблагодарили: 163 раза

Re: Модуль Продукты

Сообщение lanket » Чт фев 22, 2018 1:46 pm

webms писал(а):Добавлю свои пять копеек :)
если в шаблоне products_search_admin добавить перед <td width="85%"> строку

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

 <td>[#if IMAGE!=""#]<img style='width: 26px; ' src='/cms/products/[#IMAGE#]'>[#endif#]</td>
то выведите рядом с названием картинку товара

ps: рекомендую добавить шаблон в папку templates_alt чтоб не пропали изменения после обновления
Хорошая идея.

Так может это добавить в родной шаблон? Никто не против?


Отправлено с моего Redmi Note 4 через Tapatalk
За это сообщение автора lanket поблагодарил:
Shk (Пт мар 02, 2018 10:31 am)
Рейтинг: 1.16%
Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: gitHub 2й версии терминала
:arrow: GitHub модуля для МД
gitHub сырого модуля 2й версии
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: Модуль Продукты

Сообщение webms » Чт фев 22, 2018 2:20 pm

я не против)

еще я закомментировал вот это

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

 <!--td>
 <div id="product_[#ID#]_ok"[#if IN_CART!="1"#] style="display:none"[#endif#]>
 <a href="#" onClick="return notInCart([#ID#]);"><img class="crug" src="<#ROOTHTML#>img/btn/ok.png" border="0"></a>
 </div>
 <div id="product_[#ID#]_notok"[#if IN_CART="1"#] style="display:none"[#endif#]>
 <a href="#" onClick="return inCart([#ID#]);"><img class="crug" src="<#ROOTHTML#>img/btn/notok.png" border="0"></a>
 </td--> 
мне не нрав что добавляется +1
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: Модуль Продукты

Сообщение webms » Пт фев 23, 2018 11:47 am

Вот так теперь выглядит модуль :)
Свайпом влево появляются кнопки чтоб отметить если продукт в корзине

PS: Только что появилось идея убрать из корзины кнопки +/- и тогда влезет и "отмечалка"
Вложения
2018-02-23 11-43-19.PNG
2018-02-23 11-43-19.PNG (103.81 КБ) 3480 просмотров
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Модуль Продукты

Сообщение fandaymon » Вс фев 25, 2018 5:22 am

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

По поводу количества. Вопрос к lanket
Заказ продуктов с количеством необходим как воздух. Мне и супруге приходится вручную править нужное количество.
А вручную это где именно правится?

СпойлерПоказать

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

<?php

//$command='черный молотый перец белого лука гель для душа йогурт марки денон красные розы';
require_once(ROOT . "lib/phpmorphy/common.php");
$opts = array(
 'storage' => PHPMORPHY_STORAGE_MEM,
 'predict_by_suffix' => true,
 'predict_by_db' => true,
 'graminfo_as_text' => true,
 );
$dir = ROOT . 'lib/phpmorphy/dicts';
$lang = 'ru_RU';
        try {
            $morphy = new phpMorphy($dir, $lang, $opts);
            $this->morphy =& $morphy;
        } catch (phpMorphy_Exception $e) {
            die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e);
        }
        $words = explode(' ', $command);
        $base_forms = array();
        $partsOfSpeech=array();
        $f_word=array();
        $totals = count($words);
        for ($is = 0; $is < $totals; $is++) {
            if (preg_match('/^(\d+)$/', $words[$is])) {
                $base_forms[$is] = array($words[$is]);
            } else {
                $Word = mb_strtoupper($words[$is], 'UTF-8');
                $base_forms[$is] = $morphy->getBaseForm($Word);
                $partsOfSpeech[$is] = $morphy->getPartOfSpeech($Word);
                $f_word[$is] = $morphy->getGramInfo($Word);
            if ( count($partsOfSpeech[$is])==2) {
                 if ($partsOfSpeech[$is][0]=="С" and $partsOfSpeech[$is][1]=="П") {
                  $partsOfSpeech[$is][0]="П";
                 } 
                elseif ($partsOfSpeech[$is][0]=="Г" and $partsOfSpeech[$is][1]=="С") {
          $partsOfSpeech[$is][0]="С";
                 $base_forms[$is][0]=$base_forms[$is][1];
         $chislo=array_intersect($f_word[$is][1][0]['grammems'],['ЕД', 'МН']);
         $chislo=reset($chislo);
          $rod=array_intersect($f_word[$is][1][0]['grammems'],['МР', 'ЖР', 'СР']);
          $rod=reset($rod);
                 $f_word[$is][0][0]['grammems'][0]=$cislo;
                 $f_word[$is][0][0]['grammems'][1]=$rod;
                  
                 }
                }
                $base_forms[$is][]=$words[$is];
            } 
        }


say('Добавляю в список покупок',2);

for ($is = 0; $is < $totals; $is++) {
    if ($base_forms[$is][0]=='ВОД') $base_forms[$is][0]='ВОДА';
    if ($partsOfSpeech[$is][0]=='С') {
    $chislo=array_intersect($f_word[$is][0][0]['grammems'],['ЕД', 'МН']);
    $chislo=reset($chislo);
        if (($is+1)<$totals) {
            if ($partsOfSpeech[$is+1][0]=='С') {
        if ($base_forms[$is+1][0]=='МАРКА' or $base_forms[$is+1][0]=='ФИРМА') {
            $product=$base_forms[$is][0]. ' ' . $words[$is+1] . ' ' . $words[$is+2];
            $is=$is+2;
        }
        else {
            $product=$morphy->castFormByGramInfo($base_forms[$is][0],'С',[$chislo,'ИМ']);
            $product=$product[0]['form'];
        }
            }
            elseif ($partsOfSpeech[$is+1][0]=='ПРЕДЛ') {
                $product=$base_forms[$is][0] . ' ' . $words[$is+1] . ' ' . $words[$is+2];
                $is=$is+2;
            }
             elseif ($partsOfSpeech[$is+1][0]=='П') {
        $rod=array_intersect($f_word[$is+1][0][0]['grammems'],['МР', 'ЖР', 'СР']);
        $rod=reset($rod);
        // Выбираем форму прилагательного правильного рода
        if ($chislo=='ЕД') {
            $adjective=$morphy->castFormByGramInfo($base_forms[$is+1][0],"П",[$rod,'ЕД','ИМ']);
        }
        else {
            $adjective=$morphy->castFormByGramInfo($base_forms[$is+1][0],"П",['МН','ИМ']);
        }
        $adjective=$adjective[0]['form'];
        $noun=$morphy->castFormByGramInfo($base_forms[$is][0],'С',[$chislo,'ИМ']);
        $noun=$noun[0]['form'];
        if (Get_Product_ID($adjective . " " . $noun)>0) {
            $product=$adjective . " " . $noun;
            $is=$is+1;
        }
        else {
            $product=$noun ;
        }
            }

        }
        else {
        
        $noun=$morphy->castFormByGramInfo($base_forms[$is][0],'С',[$chislo,'ИМ']);
        $noun=$noun[0]['form'];
            $product=$noun;
        }
    }
    elseif ($partsOfSpeech[$is][0]=='П') {
    $rod=array_intersect($f_word[$is][0][0]['grammems'],['МР', 'ЖР', 'СР']);
    $rod=reset($rod);
    $chislo=array_intersect($f_word[$is][0][0]['grammems'],['МН', 'ЕД']);
    $chislo=reset($chislo);
    
    // Выбираем форму прилагательного правильного рода
    if ($chislo=='ЕД') {
        $adjective=$morphy->castFormByGramInfo($base_forms[$is][0],"П",[$rod,'ЕД','ИМ']);
    }
    else {
        $adjective=$morphy->castFormByGramInfo($base_forms[$is][0],"П",['МН','ИМ']);
    }
    $adjective=$adjective[0]['form'];
        if (($is+1)<$totals) {
            if ($partsOfSpeech[$is+1][0]=='С') {
                if (count($base_forms[$is+1])>2){
                 // выбираем форму согласованную по роду
                 for ($kk= 0; $kk < count($base_forms[$is+1])-1; $kk++) {
                       $rod1=array_intersect($f_word[$is+1][$kk][0]['grammems'],['МР', 'ЖР', 'СР']);
                    $rod1=reset($rod1);
                    if ($rod==$rod1) break;
                 }
         $noun=$morphy->castFormByGramInfo($base_forms[$is+1][$kk],'С',[$chislo,'ИМ']);
         $noun=$noun[0]['form'];

                 $product=$adjective .' ' . $noun ;
                 $is=$is+1; 
                }
                else {
         $noun=$morphy->castFormByGramInfo($base_forms[$is+1][0],'С',[$chislo,'ИМ']);
         $noun=$noun[0]['form'];

                 $product=$adjective .' ' . $noun ;
                 $is=$is+1; 
                } 
            }
            elseif ($partsOfSpeech[$is+1][0]=='П') {
                if ($chislo=='ЕД') {
                    $adjective1=$morphy->castFormByGramInfo($base_forms[$is+1][0],"П",[$rod,'ЕД','ИМ']);
                }
                else {
                    $adjective1=$morphy->castFormByGramInfo($base_forms[$is+1][0],"П",['МН','ИМ']);
                }

                $adjective1=$adjective1[0]['form'];
                if (($is+2)<$totals) {
                    if ($partsOfSpeech[$is+2][0]=='С') {

                        if (count($base_forms[$is+2])>2){
                            // выбираем форму согласованную по роду
                            for ($kk= 0; $kk < count($base_forms[$is+2])-1; $kk++) {
                                $rod1=array_intersect($f_word[$is+2][$kk][0]['grammems'],['МР', 'ЖР', 'СР']);
                                $rod1=reset($rod1);
                            }
                 $noun=$morphy->castFormByGramInfo($base_forms[$is+2][$kk],'С',[$chislo,'ИМ']);
                 $noun=$noun[0]['form'];
 
                            $product=$adjective .' ' . $adjective1 . ' ' . $noun ;
                            $is=$is+2; 
                 
                        }
                        else {
                 $noun=$morphy->castFormByGramInfo($base_forms[$is+2][0],'С',[$chislo,'ИМ']);
                 $noun=$noun[0]['form'];

                            $product=$adjective .' ' . $adjective1 .' ' . $base_forms[$is+2][0];
                            $is=$is+2; 
                        }
                    }
                    else {
                        $product=$adjective .' ' . $adjective1;
                        $is=$is+1;
                    }    
                }
                else {
                    $product=$adjective .' ' . $adjective1;
                    $is=$is+1;
                }    
            }                
        }
        else {
            $product=$adjective;
        }    
    }        

    $product = strtolower($product);

    say($product,2);
     
    if($debugEnabled) debmes('Products produkt:'. $product);
                
    $id=Get_Product_ID( $product);
    if ($id > 0){
        $this->addToList($id);
        if($debugEnabled) debmes('Products produkt '.$product.' found, ID:'. $id);
    }
    Else {
        if($debugEnabled) debmes('Products produkt '.$product.' not found, adding');
        $category_id = Get_Category_ID("Неотсортированные");
        if ($category_id > 0){
            if($debugEnabled) debmes('Products category exiting unknown');
            $this->category_id = $category_id;
        } 
        Else {
            if($debugEnabled) debmes('Products creating unknown');
               $Record = Array();
               $Record['TITLE'] = "Неотсортированные";
               $Record['ID']=SQLInsert('product_categories', $Record);
            $category_id = $Record['ID'];
                            
            if($debugEnabled) debmes('Products produkt '.$product.' adding to created unknown');
        }

           $Record = Array();
           $Record['TITLE'] = $product;
          $Record['CATEGORY_ID'] = $category_id;
          $Record['QTY'] = 1;
           $Record['ID']=SQLInsert('products', $Record);
        $id = $Record['ID'];

        $this->addToList($id);
        if($debugEnabled) debmes('Products produkt '.$product.' not found, added to category id '.$category_id);
    }


} 

function Get_Product_ID($product) {
$res=SQLSelectOne("select ID from products where TITLE='" . $product . "'");

$id=0;
if ($res['ID']) {
 $id=$res['ID'];
}  

return $id;
}

function Get_Category_ID($category) {
$res=SQLSelectOne("select ID from product_categories where TITLE='" . $category . "'");
$id=0;
if ($res['ID']) {
 $id=$res['ID'];
}
return $id;

}

?>
Кстати опробовал весь цикл с Google Keep - жена наговорила что нужно купить в магазине, сказала чтобы список отправился, я получил его в Google Keep, пришёл в магазин, брал товар, кликал на галочку в кипере, зачёркнутый тут же перемещался в низ списка. Вверху оставалось то, что надо купить - очень удобно. Со списком на бумажке или в смске не сравнить. Рекомендую 8-) Картинок правда нету
Аватара пользователя
lanket
Сообщения: 1168
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 260 раз
Поблагодарили: 163 раза

Re: Модуль Продукты

Сообщение lanket » Пн фев 26, 2018 12:42 am

fandaymon писал(а):...

По поводу количества. Вопрос к lanket

...
Так количество между + и -
Идея создателя модуля была в учёте наличия. Отсюда и вкладка с выборкой где количество =0
Но как то неудобно для меня.
По мне как это поле больше подходит к количеству что надо купить.

Отправлено с моего Redmi Note 4 через Tapatalk
Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: gitHub 2й версии терминала
:arrow: GitHub модуля для МД
gitHub сырого модуля 2й версии
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
Ответить