We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 7924
    • 11 Posts
    Ситуация такая, есть плагин, который создает документ при добавлении web юзера или обновлении его профиля(по событию OnWebSaveUser). Подскажите как сделать чтобы он не создавал дублирующие страницы при сохранении профиля, а просто обновлял существующую страницу. huh

    global $modx;
    
    if($modx->event->name == 'OnWebSaveUser')
    {
        require_once('assets/libs/docmanager/document.class.inc.php');
        global $modx;
        $u = $modx->event->params['user'];
        
        $doc = new Document(); 
        // Сервисные параметры документа
        $doc->Set('hidemenu',0);
        $doc->Set('parent',2); 
        
        // Данные документа
        $doc->Set('pagetitle',$u['firmname']); 
        $doc->Set('alias',$u['username']); // 
      
    
        // Сохраняем документ
        $doc->Save();
        $modx->clearCache();
    }
      • 785
      • 2,113 Posts
      И какую страницу надо обновлять? Наверное, программы угадывать желания не умеют, им надо явным образом указать id документа, который требуется обновить.
      Кстати, $modx->clearCache, несмотря на название, в действительности должным образом кэш не чистит.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 7924
        • 11 Posts
        Quote from: AKots at Apr 13, 2010, 02:05 PM

        И какую страницу надо обновлять? Наверное, программы угадывать желания не умеют, им надо явным образом указать id документа, который требуется обновить.
        Кстати, $modx->clearCache, несмотря на название, в действительности должным образом кэш не чистит.


        Спасибо, моя невнимательность.

        global $modx;
        
        if($modx->event->name == 'OnWebSaveUser')
        {
            require_once('assets/libs/docmanager/document.class.inc.php');
            global $modx;
            $u = $modx->event->params['user'];
            
                
            global $modx; 
            $doc = new Document($u['firmid']); 
            // Сервисные параметры документа
            $doc->Set('hidemenu',0);
            $doc->Set('parent',2); 
            
            // Данные документа
            $doc->Set('pagetitle',$u['firmname']); 
            $doc->Set('alias',$u['username']);
          
        
            // Сохраняем документ
            $doc->Save();
        
        }
            


        Все благополучно обновляется, ничего не дублируется.
          • 785
          • 2,113 Posts
          А по очистке кэша тут написано
          http://modxcms.com/forums/index.php/topic,48061.msg281730.html#msg281730
            Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
            Статьи о MODx, регулярно новые публикации
            • 7924
            • 11 Posts
            Поторопился я, даже при указании id (и через переменную и явным образом), создание или обновление не происходит.
            если:
            $doc = new Document(); 


            то соответственно создается новый документ...
              • 7924
              • 11 Posts
              Разобрался. Может кому интересно будет, привожу код:

              global $modx;
              
              if($modx->event->name == 'OnWebSaveUser')
              {
                  require_once('assets/libs/docmanager/document.class.inc.php');
                
                  $u = $modx->event->params['user'];
              
              
                 // Проверяем на существование документа с id
                  $sql = "SELECT id FROM ".$modx->getFullTableName("site_content")." WHERE `id`='".$u['firmid']."' LIMIT 1";
                     if($modx->recordCount($modx->dbQuery($sql)) > 0) {
              
              // Если документ с таким id есть, то обновляем
                   $doc = new Document($u['firmid']); 
                  // Сервисные параметры документа
                  $doc->Set('hidemenu',0);
                  $doc->Set('parent',2); 
                  $doc->Set('pagetitle',$u['firmname']); 
                  $doc->Set('alias',$u['username']);
              
                           }
                      else
                       {
              //Если документа с таким id не существует, то создаем новый с этим id
                   $doc = new Document(); 
                  // Сервисные параметры документа
                  $doc->Set('hidemenu',0);
                  $doc->Set('parent',2); 
                  $doc->Set('id',$u['firmid']); 
                  $doc->Set('pagetitle',$u['firmname']); 
                  $doc->Set('alias',$u['username']);
                    
                       }
                 
              
                  // Сохраняем документ
                  $doc->Save();
                  $modx->clearCache();
              }
                • 785
                • 2,113 Posts
                Ужас!!! Чтобы узнать, существует ли страница с номером $id, не надо делать запросы к базе, можно определить примерно так
                if (isset($modx->aliasListing[$id]))
                или так
                if (in_array($id, $modx->documentListing))

                кроме того не надо дублировать одинаковые вещи и что-то добавлять. Если при выполнении new Document в качестве параметра передать 0, то будет генерироваться новый документ, а если не ноль, то будет заменен конкретный документ, и $doc->Set(’id’,$u[’firmid’]) не нужно. При этом, если создан новый документ, надо узнать его ID и записать в данные пользователя, что не делается, так что работать правильно все равно не должно.

                Кстати, а что вообще такое $u[’firmid’] и откуда оно берется?
                  Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                  Статьи о MODx, регулярно новые публикации
                  • 7924
                  • 11 Posts
                  Вы сильно не ругайтесь, я еще только изучаю api smiley , предложили рациональное решение, спасибо.

                  А насчет добавления - все работает, документы добавляются, если существуют обновляются...

                  $u[’firmid’] - это присвоенное id пользователя, назначается оно так:

                  global $modx;
                   $strSQL='select max('.id.') as max_value from '.modx_site_content;
                     if ($result=$modx->dbQuery($strSQL))
                     {
                        while( $row = $modx->db->getRow( $result ))
                       {
                           return $row['max_value']+1;
                        };
                     };




                  еще бы удаление документа вместе с профилем прикрутить... rolleyes
                    • 785
                    • 2,113 Posts
                    Да что мне ругаться – мне, в общем-то, безразлично. Просто такие программы заведомо ведут к трудно отлавливаемым ошибкам. Добавление в таблицу MySQL происходит не с номером на единицу большим максимального, а в соответствии со значением Auto_increment, которое в общем случае не всегда на единицу больше максимального. Нормальным считается получение ID после добавления записи, то есть получить значение $doc->fields[’id’] после сохранения, а также можно пользоваться напрямую API MODx. В принципе можно заранее узнать значение Auto_increment, но если между его получением и использованием пройдет какое-то время, есть вероятность, что кто-то другой добавит запись в таблицу и значение изменится.
                      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                      Статьи о MODx, регулярно новые публикации