We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 26709
    • 4 Posts
    Спасибо smiley Будем думать. На днях выложу обновленную версию с доработками и исправлениями. Будет один общий сниппет + готовая система формирования заказа. которая отправляет заказ на мыло менеджеру и покупателю + делает CVS файл, который потом можно просмотреть в екселе.
      • 6475
      • 2 Posts
      Вот сделал загрузку рубрикатора из файла csv в меню, модифицировав wayfinder.inc.php
      Думаю пригодится, правда работает пока только с двумя уровнями вложенности в файле.

      Описание полей файла на примере:
      Array (
      [id] => 1
      [menutitle] => Home
      [pagetitle] => Home
      [introtext] => Create and do amazing things with MODx
      [menuindex] => 1
      [published] => 1
      [hidemenu] => 0
      [parent] => 0
      [isfolder] => 0
      [description] => Introduction to MODx
      [alias] => index
      [longtitle] => Welcome to MODx
      [type] => document
      [content] =>
      [template] => 6
      [link_attributes] => )

      содержимое файла для примера:
      100;test;test;;30;1;0;0;0;;test;test;document;;6;
      101;test1;test1;;30;1;0;100;0;;test1;test1;document;;6;
      102;test2;test2;;30;1;0;100;0;;test2;test2;document;;6;
      нужно положить файл rubr.csv в каталог assets\Price

      В скрипте wayfinder.inc.php заменяем функцию getData() и добавляем функцию getDataRow
      в getData() также включил оптимизацию, подсмотренную на одной из веток форума... smiley

             //Get all of the documents from the database
              function getData() {
                      global $modx;
                      $ids = array();
                      // Оптимизация
                      //$ids = $modx->getChildIds($this->_config['id'],$this->_config['level']);
                     if (!$this->_config['hideSubMenus']) {
                         $ids = $modx->getChildIds($this->_config['id'],$this->_config['level']);
                      } else { // then hideSubMenus is checked, we don`t need all children
                          $parents = $this->parentTree;
                          //remove parents higher than startId
                         $parents = array_diff($parents, $modx->getParentIds($this->_config['id']));
                          foreach($parents as $p)
                             $ids = $modx->getChildIds($p, 1, $ids);
                      }
                      //Get all of the ids for processing
                      if ($this->_config['displayStart'] && $this->_config['id'] !== 0) {
                              $ids[] = $this->_config['id'];
                      }
                      if (!empty($ids)) {
                              //Setup the fields for the query
                              $fields = "sc.id, sc.menutitle, sc.pagetitle, sc.introtext, sc.menuindex, sc.published, sc.hidemenu, sc.parent, sc.isfolder, sc.description, sc.alias, sc.longtitle, sc.type,if(sc.type='reference',sc.content,'') as content, sc.template, sc.link_attributes";
                      //Get the table names
                      $tblsc = $modx->getFullTableName("site_content");
                      $tbldg = $modx->getFullTableName("document_groups");
                      //Add the ignore hidden option to the where clause
                      if ($this->_config['ignoreHidden']) {
                          $menuWhere = '';
                      } else {
                          $menuWhere = ' AND sc.hidemenu=0';
                      }
                              //add the include docs to the where clause
                              if ($this->_config['includeDocs']) {
                                      $menuWhere .= " AND sc.id IN ({$this->_config['includeDocs']})";
                              }
                              //add the exclude docs to the where clause
                              if ($this->_config['excludeDocs']) {
                                      $menuWhere .= " AND (sc.id NOT IN ({$this->_config['excludeDocs']}))";
                              }
                              //add the limit to the query
                              if ($this->_config['limit']) {
                                      $sqlLimit = " LIMIT 0, {$this->_config['limit']}";
                              } else {
                                      $sqlLimit = '';
                              }
                              //Determine sorting
                              if (strtolower($this->_config['sortBy']) == 'random') {
                                      $sort = 'rand()';
                                      $dir = '';
                              } else {
                                      // modify field names to use sc. table reference
                                      $sort = 'sc.'.implode(',sc.',preg_replace("/^\s/i","",explode(',',$this->_config['sortBy'])));
                              }
      
                      // get document groups for current user
                      if($docgrp = $modx->getUserDocGroups()) $docgrp = implode(",",$docgrp);
                      // build query
                      $access = ($modx->isFrontend() ? "sc.privateweb=0" : "1='{$_SESSION['mgrRole']}' OR sc.privatemgr=0").(!$docgrp ? "" : " OR dg.document_group IN ({$docgrp})");
                              $sql = "SELECT DISTINCT {$fields} FROM {$tblsc} sc LEFT JOIN {$tbldg} dg ON dg.document = sc.id WHERE sc.published=1 AND sc.deleted=0 AND ({$access}){$menuWhere} AND sc.id IN (".implode(',',$ids).") GROUP BY sc.id ORDER BY {$sort} {$this->_config['sortOrder']} {$sqlLimit};";
                              //run the query
                              $result = $modx->dbQuery($sql);
      
                              $numResults = @$modx->recordCount($result);
                              $level = 1;
                              //Setup startlevel for determining each items level
                              if ($this->_config['id'] == 0) {
                                      $startLevel = 0;
                              } else {
                                      $startLevel = count($modx->getParentIds($this->_config['id']));
                                      $startLevel = $startLevel ? $startLevel+1 : 1;
                              }
                              $prevParent = -1;
                              $resourceArray = array();
                              $resultIds = array();
                              //loop through the results
                              for($i=0;$i<$numResults;$i++)  {
                                      $tempDocInfo = $modx->fetchRow($result);
                                      $resultIds[] = $tempDocInfo['id'];
                                      $tempDocInfo_ = array_keys ($tempDocInfo);
                                      //determine the level, if parent has changed
                                      if ($prevParent !== $tempDocInfo['parent']) {
                                              $level = count($modx->getParentIds($tempDocInfo['id'])) + 1 - $startLevel;
                                      }
                                      //add parent to hasChildren array for later processing
                                      if (($level > 1 || $this->_config['displayStart']) && !in_array($tempDocInfo['parent'],$this->hasChildren)) {
                                              $this->hasChildren[] = $tempDocInfo['parent'];
                                      }
                                      //set the level
                                      $tempDocInfo['level'] = $level;
                                      $prevParent = $tempDocInfo['parent'];
                                      $this->getDataRow($tempDocInfo,$resourceArray,$tempResults);
                               }
                              //add menu from file
                              $startLevel = 0;
                              $dir_price = "assets/Price/";
                              $fp = fopen ($dir_price."rubr.csv","r");
                              while ($data = fgetcsv ($fp, 1000, ";")) {
                                      $tempDocInfo=array_combine($tempDocInfo_,$data);
                                      $resultIds[] = $tempDocInfo['id'];
                                      if ($prevParent !== $tempDocInfo['parent']) {
                                              $level = 1 + 1 - $startLevel;
                                              $prevParent = $tempDocInfo['parent'];
                                      }
                                      //add parent to hasChildren array for later processing
                                      if (($level > 1 || $this->_config['displayStart']) && !in_array($tempDocInfo['parent'],$this->hasChildren)) {
                                              $this->hasChildren[] = $tempDocInfo['parent'];
                                      }
                                      $tempDocInfo['level'] = $level;
                                      $this->getDataRow($tempDocInfo,$resourceArray,$tempResults);
                                      $row++;
                              }
                              fclose ($fp);
      
                              //Process the tvs
                              if (!empty($this->tvList) && !empty($resultIds)) {
                                      $tvValues = array();
                                      //loop through all tvs and get their values for each document
                                      foreach ($this->tvList as $tvName) {
                                              $tvValues = array_merge_recursive($this->appendTV($tvName,$resultIds),$tvValues);
                                      }
                                      //loop through the document array and add the tvar values to each document
                                      foreach ($tempResults as $tempDocInfo) {
                                              if (array_key_exists("#{$tempDocInfo['id']}",$tvValues)) {
                                                      foreach ($tvValues["#{$tempDocInfo['id']}"] as $tvName => $tvValue) {
                                                              $tempDocInfo[$tvName] = $tvValue;
                                                      }
                                              }
                                              $resourceArray[$tempDocInfo['level']][$tempDocInfo['parent']][] = $tempDocInfo;
                                      }
                              }
                      }
                      //return final docs
              return $resourceArray;
              }
      
              function getDataRow(&$tempDocInfo,&$resourceArray,&$tempResults) {
                                      global $modx;
                                      //Create the link
                                      $linkScheme = $this->_config['fullLink'] ? 'full' : '';
                                      if ($this->_config['useWeblinkUrl'] !== 'FALSE' && $tempDocInfo['type'] == 'reference') {
                                              if (is_numeric($tempDocInfo['content'])) {
                                                      $tempDocInfo['link'] = $modx->makeUrl(intval($tempDocInfo['content']),'','',$linkScheme);
                                              } else {
                                                      $tempDocInfo['link'] = $tempDocInfo['content'];
                                              }
                                      } elseif ($tempDocInfo['id'] == $modx->config['site_start']) {
                                              $tempDocInfo['link'] = $modx->config['site_url'];
                                      } else {
                                              $tempDocInfo['link'] = $modx->makeUrl($tempDocInfo['id'],'','',$linkScheme);
                                      }
                                      //determine other output options
                                      $useTextField = (empty($tempDocInfo[$this->_config['textOfLinks']])) ? 'pagetitle' : $this->_config['textOfLinks'];
                                      $tempDocInfo['linktext'] = $tempDocInfo[$useTextField];
                                      $tempDocInfo['title'] =$tempDocInfo[$this->_config['titleOfLinks']];
                                      //If tvs were specified keep array flat otherwise array becomes level->parent->doc
                                      if (!empty($this->tvList)) {
                                              $tempResults[] = $tempDocInfo;
                                      } else {
                                              $resourceArray[$tempDocInfo['level']][$tempDocInfo['parent']][] = $tempDocInfo;
                                      }
                                      return;
               }
      


      Теперь надо бы универсальный модуль для обработки меню и вывода прайса по выбранной категории
      и возможность обновления кэша по некой ссылке... smiley



        • 785
        • 2,113 Posts
        Небольшие мысли вслух о возможностях интеграции с 1С.
        Если не рассматривать полностью on-line работу с базами 1С (а это кроме сложности реализации вызывает огромные проблемы безопасности), доступен достаточно простой подход. Допустим, через интернет продаются физические товары, а оплата производится наличными курьерам. Так как реально торговля ведется не через интернет, а в каком-то физическом месте курьеры получают товар и пробивают кассовые чеки, вводить в 1С ничего не нужно – только выводить некоторые данные. Так что же нужно выводить?
        При поступлении товара на склад оформляется документ «Поступление товаров и услуг». Из него можно распечатать (или вывести в формате Excel, текста или HTML) приходную накладную. Оттуда данные следует ввести в базу, расположенную в интернете. То есть так описывается количество и номенклатура имеющегося товара.
        Аналогично, после того как товар продан, оформляется документ «Реализация товаров и услуг», на основании которого можно получить расходную накладную. На основе этих данных удаляется товар из базы в интернете.
        В принципе, лучше создать собственные документы в нужном формате, а не пользоваться накладными – я думаю, что это не так сложно (для каждого документа 1С можно разработать свою форму вывода).
        Дополнительно может потребоваться описание инвентаризации и списания, но это уже мелочи.
        Для правильного функционирования не только бухгалтерии, но и продавцов, необходимо добавить операции установки и снятия резерва.

        Может быть, у кого-то есть еще мысли на эту тему?
          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 12327
          • 31 Posts
          Quote from: AKots at Apr 17, 2008, 09:43 AM

          Небольшие мысли вслух о возможностях интеграции с 1С.
          Может быть, у кого-то есть еще мысли на эту тему?


          Когда я был маленьким я не парился с вопросом синхронизации с 1С.

          Писал кучу различных вариантов синхронизаций , от самых простых до сложных.


          • Посылка письма на ящик по факту заказа ,где в тело письма вставлялся сам заказ с парсингом из 1С почтового ящика на наличе писем и создания нужных документов по оным.
          • Выгрузка заказов в файл xml,txt,xls,csv. Забор файла из 1С через фтп парсинг рождение документов и заливка обратно изменений по заказам.
          • Установки XMLRPC на сайт и полной синхронизации через написанного клиента.

          Выбирай любой вариант .
            • 26709
            • 4 Posts
            Выложил новую версию. Значительные изменения. Качать всем. Есть функция оформления покупки и отсылка на мыло обеим сторонам + запись в файл
              • 19164
              • 1,215 Posts
              Шаблонизация хромает, и это очень слабый момент. Часть дизайна жестко зашита в сниппет, часть в js-файл. Все нужно обязательно вынести в отдельные, понятные MODx-пользователю конструкции - чанки, возможность сохранять в файлы. Хорошая тенденция у MODx разработчиков в последнее время - возможность сохранения всех параметров в файлы конфигурации.

              У меня использование таблиц в верстке вызывает нездоровые позывы в организме.
                DirectResize 0.9 beta. PHPThumb, sets of configurations, configuration, binded to specific path. No backward compatibility. | DirectResize 0.9. PHPThumb, наборы параметров, параметры, привязанные к определенным путям. Без обратной совместимости.

                Unfortunately, DirectResize project is closed. If you want to continue development, PM me for access to project page on Google Code. К сожалению, проект DirectResize закрыт. Если вы желаете продолжить разработки, обращайтесь через ПМ для получения доступа к репозиторию на Google Code.

                [PLUGIN] DirectResize - as Maxigallery but for single images :: Download :: [url=http://modxcms.com/forums/index.php/topic,21490]
                • 26709
                • 4 Posts
                По поводу шаблонизации - согласен. Просто основной код был написан не мной. а разработчиками самого движка корзины. Сам же я из готовых кусков и частично самостоятельно написал сам сниппет. Поэтому идея табличной верстки и внесения дизайна в код - не моя. Чесно говоря, у меня самого руки чешутся все заново переписать. Но нету времени. Сейчас основное время уходит на саму программную часть корзины, устранение багов и т.д. Но как только все более-менее решиться, я вынесу дизайн в шаблоны. Кстати, об этом я и писал в документации к сниппету
                  • 19164
                  • 1,215 Posts
                  Документацию я еще не читал smiley

                  Мне кажется, что если уж корзина создается на основании уже готового кода, может быть стоило подыскать что-то более современное и гибкое, возможно с аяксом? Посмотрел демо-сайт оригинального скрипта, не очень понравились эти ява-скриптовые попапы с сообщением о том что товар добавлен в корзину.

                  Если говорить об исполнении, мне очень понравилось как сделана корзина на foxycart.com
                    DirectResize 0.9 beta. PHPThumb, sets of configurations, configuration, binded to specific path. No backward compatibility. | DirectResize 0.9. PHPThumb, наборы параметров, параметры, привязанные к определенным путям. Без обратной совместимости.

                    Unfortunately, DirectResize project is closed. If you want to continue development, PM me for access to project page on Google Code. К сожалению, проект DirectResize закрыт. Если вы желаете продолжить разработки, обращайтесь через ПМ для получения доступа к репозиторию на Google Code.

                    [PLUGIN] DirectResize - as Maxigallery but for single images :: Download :: [url=http://modxcms.com/forums/index.php/topic,21490]
                    • 26709
                    • 4 Posts
                    Quote from: Metaller at Apr 21, 2008, 08:23 AM

                    Документацию я еще не читал smiley

                    Мне кажется, что если уж корзина создается на основании уже готового кода, может быть стоило подыскать что-то более современное и гибкое, возможно с аяксом? Посмотрел демо-сайт оригинального скрипта, не очень понравились эти ява-скриптовые попапы с сообщением о том что товар добавлен в корзину.

                    Если говорить об исполнении, мне очень понравилось как сделана корзина на foxycart.com

                    дело в том, что всплывающие подсказки можно отключить в файле конфигурации. Но я выбрал ее потому что она реализована предельно просто и нету лишних яваскриптов, которые помимо аякса еще нагружают страницу кучей дополнительных файлов. Лишние скрипты только усложняют и появляется потенциальная дыра для сбоев в работе. Хотя можно реализовать добавление товара через аякс. чтобы не перезагружать страницу. Остальное - не вижу особого смысла. Хотя слово за большинством smiley
                    Ребята, ваши замечания и пожелания
                      • 26709
                      • 4 Posts
                      На днях выложу новую версию. Введен файл стилей для изменения внешнего вида, также введена технология аякс для добавления товара без перезагрузки окна. Ждите.