Отложенные посты в mSocial Новый


Имеется большое количество ресурсов, которые публикуются по расписанию. Прикрутил mSocialVK для постинга этих ресурсов в соц.сеть.
Проблема в том, что mSocialVK не работает с отложенной публикацией. Ставил события OnDocPublished и OnResourceAutoPublis — не помогло.

Разработчик сказал, нужно колдовать с mSocial.
Кто-нибудь может подсказать, в какую сторону колдовать? ) хотя бы временный способ, до обновления.
15 сентября 2016, 17:26    Александр   G+  
1    374 0

Комментарии (20)

  1. Александр 16 сентября 2016, 15:00 # 0
    Может есть ещё какие-то системные события, на которые можно повесить плагин?
    1. Роман Садоян 16 сентября 2016, 16:36 # 0
      Ну нужно будет плагин mSocial немного переделать, для начала глянь есть ли объект $resource на событии OnResourceAutoPublish, попробуй в модиксовый лог скинуть что то, например:

      if( $name = $resource->get('name')){
      $this->modx->log(1, 'resource name autosave = '.$name);
      }
      
      Ну естественно сделав всякие обработчики, что бы это срабатывало только при событии OnResourceAutoPublish
      1. Александр 16 сентября 2016, 18:01 # 0
        Я правильно понял, нужно так прописать?

        switch($modx->event->name) {
          case 'OnResourceAutoPublish':
            if( $name = $resource->get('name')){
              $this->modx->log(1, 'resource name autosave = '.$name);
            }
          break;
        }
        После автоматической публикации в лог ничего не выводится.
        1. Роман Садоян 16 сентября 2016, 18:06 # 0
          Правильно, но событие я подсказал не правильное.

          Выполни тот же самый код только на событие OnDocPublished
          1. Александр 16 сентября 2016, 18:08 # 0
            Пост в группу ушел, но в логах по-прежнему ничего.
            1. Роман Садоян 16 сентября 2016, 18:12 # 0
              Упс, так name то не существует у нас)))
              Чет я заработался… у ресурсов же pagetitle
              if( $name = $resource->get('pagetitle')){
                    $this->modx->log(1, 'resource name autosave = '.$name);
                  }
              1. Александр 16 сентября 2016, 18:17 # 0
                А я уже пробовал и pagetitle ставить… без толку )
                Более того с pagetitle и посты не уходят в ВК, и админка глючить начинает.
                1. Роман Садоян 16 сентября 2016, 18:19 # 0
                  Ничего не должно глючить, просто в лог должно писаться что-нибудь.
                  Мы же никаких действий не делаем больше, кроме как просто в лог пишем.
                  1. Александр 16 сентября 2016, 18:23 # 0
                    Ну то, что посты не выходят — это понятно, почему.
                    А админка не то чтобы глючит, просто если ресурс через контекстное меню в дереве публиковать, то ничего не происходит.

                    В логах тишина.

                    switch($modx->event->name) {
                      case 'OnDocPublished':
                        if( $name = $resource->get('pagetitle')){
                          $this->modx->log(1, 'resource name autosave = '.$name);
                        }
                      break;
                    }
                    
                    1. Роман Садоян 16 сентября 2016, 18:41 # 0
                      switch($modx->event->name) {
                        case 'OnDocPublished':
                          if( $name = $resource->get('pagetitle')){
                            $modx->log(1, 'resource name autosave = '.$name);
                          }
                        break;
                      }
                      
                      Вот так работает, теперь необходимо mSocial передать то что нужно, ну в общем так как у него в плагине.
                      1. Александр 16 сентября 2016, 19:19 # 0
                        Т.е. обернуть весь плагин mSocial в switch?
                        Работает, только если публиковать вручную.

                        На событие OnResourceAutoPublish не реагирует, как и раньше
                        1. Роман Садоян 16 сентября 2016, 20:49 # 0
                          Забудь про это событие! Вот правильно событие — OnDocPublished.
                          Я не знаю код mSocial, поэтому вынужден гадать, что же там делает этот плагин у него.
                          Как я думаю, он просто получает какие то данные ресурса и передает их куда-то.

                          Так вот, нужно взять этот код по работе с данными ресурса и вставить сюда, В этот плагин, между этими строчками:
                          case 'OnDocPublished':
                          	сюда код
                          break;
                          Можно даже поменять событие в самом плагине mSocial, только нужно тестить.
                          1. Роман Садоян 16 сентября 2016, 21:31 # 0
                            Ну вот собственно плагин на событие onDocPublished
                            Должен выглядеть как то так:

                            switch($modx->event->name) {
                              case 'OnDocPublished':
                            if ($modx->loadClass('mSocial', MODX_CORE_PATH . 'components/msocial/model/msocial/', true, true)) 
                            {
                                //Получаем лексиконы
                                $modx->lexicon->load('msocial:default');
                                                
                                /* Список полей для постинга */
                                $setting['allField'] = $resource->toArray();
                                	
                                	
                                /* Список tv полей для постинга */
                                $tv_query = $modx->newQuery('modTemplateVarResource');
                                $tv_query->leftJoin('modTemplateVar','modTemplateVar',array("modTemplateVar.id = tmplvarid"));
                                $tv_query->where(array('contentid'=>$resource->get('id')));
                                $tv_query->select($modx->getSelectColumns('modTemplateVarResource','modTemplateVarResource','',array('id','tmplvarid','contentid','value')));
                                $tv_query->select($modx->getSelectColumns('modTemplateVar','modTemplateVar','',array('name')));
                                $tvars = $modx->getCollection('modTemplateVarResource',$tv_query);
                                foreach ($tvars as $tvar) {
                                    $tvar = $tvar->toArray();
                                    if (!empty($tvar['value']))
                                            $setting['allField'][$tvar['name']] = $tvar['value'];
                                }
                                	
                                // добавляем твиттер  	
                                if($resource->getTVValue('twPost')){ 
                                    $setting['activeSoc'][] = 'tw';
                                }
                                
                                // добавляем вк
                                if($resource->getTVValue('vkPost')){ 
                                    $setting['activeSoc'][] = 'vk';
                                }
                                 
                                // добавляем fb
                                if($resource->getTVValue('fbPost')){ 
                                    $setting['activeSoc'][] = 'fb';
                                }   
                                            	
                                // Определяем метод действий
                                $setting['method'] = 'posting';
                                	
                                if(count($setting['activeSoc']) > 0){
                                	$mSocial = new mSocial($modx, $setting);
                                }
                                              
                            }else{
                                $modx->log(modX::LOG_LEVEL_ERROR, "Не удалось подключить класс mSocial в ".MODX_CORE_PATH."/components/msocial/model/");
                                return false;
                            }
                              break;
                            }
                            
                            github компонента

                            Нужно только потестить, что будет с постами при мгновенной публикации.
                            1. Александр 17 сентября 2016, 09:05 # 0
                              У меня так и было прописано, просто как вариант проверял ещё и OnResourceAutoPublis.

                              Сейчас даже специально скопипастил твой код — результат всё тот же. Посты выходят только если делать мгновенную публикацию. Для отложенной публикации этот код, к сожалению, не работает.
                              1. Роман Садоян 17 сентября 2016, 17:50 # 0
                                В общем ответ мой таков — без вклинивания в ядро MODX, отследить id ресурсов. которые будут публиковаться автоматически не получится.
                                Мне самому стало интересно как это реализовать, поэтому я порылся в коде MODX и итог моих поисков ниже.

                                У modx нет стандартного события по отслеживанию подобных ресурсов, есть функция:
                                autoPublish() которая получает данные этих ресурсов и публикует их. В конце этой функции вызывается событие OnResourceAutoPublish которое просто выводит информацию о количестве обработанных ресурсов.

                                Ту или коммит в modxRevo с предложением добавить новое событие onAfterAutoPublishResource (или типа такого, где можно получить данные тех ресурсов которые были затронуты) или пилить Ядро в ручную, добавив самому туда необходимый код.

                                P.S.: Я могу нагородить чуши, т.к. не сильно разбираюсь в Ядре MODX, поэтому хотелось бы услышать мнение знающих людей, например Василия, Ивана или Филоофа.

                                Возможно это можно сделать проще и я ушел совсем не туда.
                                1. Александр 17 сентября 2016, 17:55 # 0
                                  Ох ты ж…
                                  Не думал, что всё настолько сложно )
                                  В любом случае, спасибо за помощь!
                                  1. Роман Садоян 17 сентября 2016, 17:58 # 0
                                    Да нет проблем, я тоже думал что там всё просто)
                                    1. Роман Садоян 17 сентября 2016, 22:43 # 0
                                      Версия Модикс 2.5?
                                      Если 2.5.0 и выше, то вот такой плагин — вернет id ресурсов которые были опубликованы автоматически:
                                      Только я не знаю массив там или что.
                                      switch($modx->event->name) {
                                        case 'OnResourceAutoPublish':
                                              $modx->log(1, 'IDS = '.print_r($results['published_resources'],1));
                                              break;
                                      }
                                      
                                      1. Александр 18 сентября 2016, 08:42 # 0
                                        2.4.3 )
                                        1. Роман Садоян 19 сентября 2016, 11:43 # 0
                                          В 2.5.0 добавили возврат id ресурсов, которые были автоматически опубликованы. Обновись, потом можно будет покастовать что-нибудь.
                        Вы должны авторизоваться, чтобы оставлять комментарии.