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

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

Разработчик сказал, нужно колдовать с mSocial.
Кто-нибудь может подсказать, в какую сторону колдовать? ) хотя бы временный способ, до обновления.
Александр
15 сентября 2016, 14:26
modx.pro
2
2 043
0

Комментарии: 20

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

    if( $name = $resource->get('name')){
    $this->modx->log(1, 'resource name autosave = '.$name);
    }
    Ну естественно сделав всякие обработчики, что бы это срабатывало только при событии OnResourceAutoPublish
      Александр
      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;
      }
      После автоматической публикации в лог ничего не выводится.
        Роман Садоян
        16 сентября 2016, 18:06
        0
        Правильно, но событие я подсказал не правильное.

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

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

                      Так вот, нужно взять этот код по работе с данными ресурса и вставить сюда, В этот плагин, между этими строчками:
                      case 'OnDocPublished':
                      	сюда код
                      break;
                      Можно даже поменять событие в самом плагине mSocial, только нужно тестить.
                      Роман Садоян
                      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 компонента

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

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

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

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

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

                      Возможно это можно сделать проще и я ушел совсем не туда.
                      Александр
                      17 сентября 2016, 17:55
                      0
                      Ох ты ж…
                      Не думал, что всё настолько сложно )
                      В любом случае, спасибо за помощь!
                      Роман Садоян
                      17 сентября 2016, 17:58
                      0
                      Да нет проблем, я тоже думал что там всё просто)
                      Роман Садоян
                      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;
                      }
                      Александр
                      18 сентября 2016, 08:42
                      0
                      2.4.3 )
                      Роман Садоян
                      19 сентября 2016, 11:43
                      0
                      В 2.5.0 добавили возврат id ресурсов, которые были автоматически опубликованы. Обновись, потом можно будет покастовать что-нибудь.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
20