24 сентября 2018, 00:59 Установил новую версию, после обновления при попытке зайти в меню пишет: Could not find action file at: controllers/default/index.php И пустое приложение, Новые дополнения и их версии / [easyBlacklist] Очень простой чёрный список IP 22 0
30 августа 2018, 22:05 А Вы готовы были бы поделиться доработанной версией? Вопросы / блокировка ip адреса 6 0
08 августа 2018, 01:27 У сервисом есть неприятная особенность — они рядом с постом добавляют ссылку на себя — и это гипер стремно: реакция у многих на такие посты — негативная;( Готовые решения / [mSocial]mSocialVK - постинг в Вконтакте. 69 0
07 августа 2018, 16:24 Я как раз хотел добить вк и купить модуль fb — нет смысла покупать? не работает? Готовые решения / [mSocial]mSocialVK - постинг в Вконтакте. 69 0
07 августа 2018, 16:22 Я попробовал так и сделать — запустить файл из консоли — но ему не хватает объектов мод х Fatal error: Call to a member function get() on a non-object Готовые решения / [mSocial]mSocialVK - постинг в Вконтакте. 69 0
07 августа 2018, 05:24 Так как сейчас для соц. сетей важно — во сколько вы публикуете пост (и чтобы не ждать этого времени — есть идея реализовать автоматический постинг по расписанию. Для этого создал отдельный TV, в который записывается время последнего поста данного ресурса. Для автоматического постинга проверяется не превышено ли максимальное количество постов в сутки. И берется самый старый ресурс из дочерних опубликованных. Осталось разобраться — как запустить его из cron — мб кто-то подскажет? При запуске вручную — код работает: <?php /*Автоматический постинг в вконтакте. Общие параметры*/ $MaxPostsPerDay = 10; $TopParentRes=2; $ChildLevel=2; $SortByFild= 'createdon'; /**/ $tv_vkPostDate_type = $modx->getObject('modTemplateVar',array('name' => 'vkPostDate' )); $tv_vkPostDate_id = $tv_vkPostDate_type->get('id'); $time_now = time(); $time_yesterday = $time_now - 24*60*60; $output=''; $PostedId = Array(); $Sort_by = Array(); $tvs_where = array( 'tmplvarid' => $tv_vkPostDate_id, 'value:>' => $time_yesterday ); $tvs_day = $modx->getCollection('modTemplateVarResource', $tvs_where); if (count($tvs_day) < $MaxPostsPerDay) { $tvs_posted = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => $tv_vkPostDate_id)); foreach ($tvs_posted as $tv) { $PostedId[] = $tv->contentid; } $allChildren = $modx->getChildIds($TopParentRes,$ChildLevel,array('context' => 'web')); if(count($allChildren)) { $where = array( 'hidemenu' => false, 'published' => true, 'deleted' => false, 'id:IN' => $allChildren, 'id:NOT IN' => $PostedId ); $resources = $modx->getCollection('modResource',$where); foreach ($resources as $k => $res) { $Sort_by[$k] = $res->get($SortByFild); } $min_value=min($Sort_by); $id = array_search($min_value, $Sort_by); $resource = $modx->getObject('modResource',$id); if ($modx->loadClass('mSocial', MODX_CORE_PATH . 'components/msocial/model/msocial/', true, true)) { //Получаем лексиконы $modx->lexicon->load('msocial:default'); /* Список полей для постинга */ $setting['allField'] = $resource->toArray(); $setting['activeSoc'][] = 'vk'; // Определяем метод действий $setting['method'] = 'posting'; $mSocial = new mSocial($modx, $setting); }else{ $modx->log(modX::LOG_LEVEL_ERROR, "Не удалось подключить класс mSocial в ".MODX_CORE_PATH."/components/msocial/model/"); return false; } } } ?> Готовые решения / [mSocial]mSocialVK - постинг в Вконтакте. 69 0
06 августа 2018, 11:13 Спасибо за комментарий, не разобрался сразу: Можно тогда еще ссылку на публикацию в пост добавить, Я сделал через ссылку в чанке: <postlink href="[[~[[+id]]? &scheme=`full`]]"/>Специально не брал стандартный Тег «a», так как ссылка должна быть одна — иначе ошибка. Вконтакте пока из этой ссылки картинки не подгружают из og:image, но я в поддержку написал, мб поправят. msocial.class.php <?php /** * Класс mSocial для инициализации и подключение классов постинга в соцсети. Текущий набор соцсетей: Tw. * @copyright Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru */ set_time_limit(0); class mSocial { /** * @var mixed */ public $setting; /** * @var mixed */ public $modx; /** * @var string */ public $soc; /*@var object $modx обьект modx */ public function __construct(modX & $modx, $setting) { require_once MODX_CORE_PATH . 'components/msocial/model/msocial/socials.class.php'; $this->modx = $modx; $this->setting = $setting; foreach($setting['activeSoc'] as $soc) { $this->soc = $soc; $this->checkSocialAndDock(); } } /** * Определяем что есть класс соцсети и подключаем его */ public function checkSocialAndDock() { if (file_exists(MODX_CORE_PATH . 'components/msocial/custom/network/'.$this->soc.'/'.$this->soc.'.class.php')) { $modx = $this->modx; if($modx->loadClass($this->soc, MODX_CORE_PATH . 'components/msocial/custom/network/'.$this->soc.'/', true, true)){ $this->getAndParseChunk($this->soc); $initSocial[$this->soc] = new $this->soc($modx, $this->setting); if($this->setting['method'] == 'posting'){ $initSocial[$this->soc]->posting(); } } } } /** * Парсим шаблоны соцсетей */ public function getAndParseChunk() { $chunkName = trim($this->modx->getOption('msocial_'.$this->soc.'_tp')); $this->setting['message'] = $this->modx->getChunk($chunkName, $this->setting['allField']); $this->modx->getParser()->processElementTags('', $this->setting['message'], true, true, '[[', ']]', array(), 10); $this->setting['message'] = html_entity_decode($this->setting['message']); $this->parseAttach(); $this->clearMess(); } /** * Чистим сообщение от html */ public function clearMess(){ // $this->setting['message'] = strip_tags(trim($this->setting['message'])); } /** * Ищем и дергаем файлы для отправки */ public function parseAttach() { $this->setting['attach'] = array(); preg_match_all("/(<img )(.+?)( \/)?(>)/", $this->setting['message'],$images); foreach ($images[2] as $val) { if (preg_match("/(src=)('|\")(.+?)('|\")/",$val,$matches) == 1) { if(file_exists(MODX_BASE_PATH.$matches[3])) { $this->setting['attach'][] = $matches[3]; } } } if (preg_match("/(<postlink )(.+?)( \/)?(>)/", $this->setting['message'],$link_src) == 1) { if (preg_match("/(href=)('|\")(.+?)('|\")/",$link_src[2],$link) == 1) { $this->setting['link']=$link[3]; } } } } ?>И vk.class.php <?php /** * Класс vk для постинга в соответствующую соцсеть. * @copyright Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru */ class vk extends socials { /** * @var array */ public $vkKeys; public function __construct(modX & $modx, $setting) { $this->modx = $modx; $this->setting = $setting; $this->vkKeys['owner_id'] = trim($this->modx->getOption('msocial_vk_id')); $this->vkKeys['access_token'] = trim($this->modx->getOption('msocial_vk_at')); $this->vkKeys['from_group'] = trim($this->modx->getOption('msocial_im_fg')); $this->vkKeys['message'] = $this->setting['message']; $this->vkKeys['v'] = '5.0'; } /** * Метод для постинга */ public function posting() { $param = $this->vkKeys; if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1) { $count = 1; foreach($this->setting['attach'] as $file) { if($count <= 4) { if (version_compare(phpversion(), '5.5.0', '<')) { $attrImg['file'.$count] = '@'.MODX_BASE_PATH.$file; }else{ $attrImg['file'.$count] = new CURLFile(MODX_BASE_PATH.$file); } } $count++; } $imgList = $this->uploadImg($attrImg); if($imgList){ foreach($this->uploadImg($attrImg) as $img){ $attachments .= 'photo'.$img->owner_id.'_'.$img->id.','; } } } if(isset($this->setting['link'])) { if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1) { $param['attachments'] = $attachments.$this->setting['link']; } else { $param['attachments'] = $this->setting['link']; } } else { if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1) { $param['attachments'] = substr($attachments, 0, -1); } } $return = $this->request('https://api.vk.com/method/wall.post',$param); /* Вызываем обработчик ошибок */ if(isset($return->error)){ $errorMsg = $return->error->error_code.' ('.$return->error->error_msg.')'; $this->modx->log(modX::LOG_LEVEL_ERROR, $this->modx->lexicon('msocial_error_posting').' Vk '.$errorMsg); } } /** * Загрузка изображений * $file array массив файлов */ public function uploadImg($file) { $group_id = $this->vkKeys['owner_id']; $version = $this->vkKeys['v']; $album_id = '{ID альбома}'; $access_token = $this->vkKeys['access_token']; if($group_id[0] == '-'){ $group_id = substr($group_id, 1); } $server = $this->request('https://api.vk.com/method/photos.getWallUploadServer', array( 'group_id' => $group_id, 'access_token' => $this->vkKeys['access_token'], 'v' => $version, 'album_id' => $album_id )); $vkPhoto = $this->request($server->response->upload_url, $file); $result = $this->request('https://api.vk.com/method/photos.saveWallPhoto', array( 'group_id' => $group_id, 'photo' => $vkPhoto->photo, 'server' => $vkPhoto->server, 'hash' => $vkPhoto->hash, 'access_token' => $this->vkKeys['access_token'], 'v' => $version )); return $result->response; } } ?> Готовые решения / [mSocial]mSocialVK - постинг в Вконтакте. 69 0
06 августа 2018, 05:51 Исправленный модуль с постингом картинок vk.class.php: Необходимо в несколько мест добавить версию v=5.0 и album_id={id Альбома} <?php /** * Класс vk для постинга в соответствующую соцсеть. * @copyright Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru */ class vk extends socials { /** * @var array */ public $vkKeys; public function __construct(modX & $modx, $setting) { $this->modx = $modx; $this->setting = $setting; $this->vkKeys['owner_id'] = trim($this->modx->getOption('msocial_vk_id')); $this->vkKeys['access_token'] = trim($this->modx->getOption('msocial_vk_at')); $this->vkKeys['from_group'] = trim($this->modx->getOption('msocial_im_fg')); $this->vkKeys['message'] = $this->setting['message']; $this->vkKeys['v'] = '5.0'; } /** * Метод для постинга */ public function posting() { $param = $this->vkKeys; if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1) { $count = 1; foreach($this->setting['attach'] as $file) { if($count <= 4) { if (version_compare(phpversion(), '5.5.0', '<')) { $attrImg['file'.$count] = '@'.MODX_BASE_PATH.$file; }else{ $attrImg['file'.$count] = new CURLFile(MODX_BASE_PATH.$file); } } $count++; } $imgList = $this->uploadImg($attrImg); if($imgList){ foreach($this->uploadImg($attrImg) as $img){ $attachments .= 'photo'.$img->owner_id.'_'.$img->id.','; } $param['attachments'] = substr($attachments, 0, -1); } } $return = $this->request('https://api.vk.com/method/wall.post',$param); /* Вызываем обработчик ошибок */ if(isset($return->error)){ $errorMsg = $return->error->error_code.' ('.$return->error->error_msg.')'; $this->modx->log(modX::LOG_LEVEL_ERROR, $this->modx->lexicon('msocial_error_posting').' Vk '.$errorMsg); } } /** * Загрузка изображений * $file array массив файлов */ public function uploadImg($file) { $group_id = $this->vkKeys['owner_id']; $version = $this->vkKeys['v']; $album_id = '{id Альбома}'; $access_token = $this->vkKeys['access_token']; if($group_id[0] == '-'){ $group_id = substr($group_id, 1); } $server = $this->request('https://api.vk.com/method/photos.getWallUploadServer', array( 'group_id' => $group_id, 'access_token' => $this->vkKeys['access_token'], 'v' => $version, 'album_id' => $album_id )); $vkPhoto = $this->request($server->response->upload_url, $file); $result = $this->request('https://api.vk.com/method/photos.saveWallPhoto', array( 'group_id' => $group_id, 'photo' => $vkPhoto->photo, 'server' => $vkPhoto->server, 'hash' => $vkPhoto->hash, 'access_token' => $this->vkKeys['access_token'], 'v' => $version )); return $result->response; } } ?> Готовые решения / [mSocial]mSocialVK - постинг в Вконтакте. 69 0
18 июля 2018, 10:05 На маке тоже есть Control — но Control-Enter — перехватывается системой. Хоткеи приняты с CMD — и лучше с буковой. CMD — это как кнопка Windows — тот же код. Новые дополнения и их версии / Редактирование выделенных элементов 69 0
17 июля 2018, 14:12 Добрый день, интересный функционал — а можно ли для Mac OS добавить другое сочетание клавиш, например CMD-Enter? Спасибо. Новые дополнения и их версии / Редактирование выделенных элементов 69 0
Возможно ли реализовать возможность предоплаты за доставку на сайте? Так ради этого мне и нужно это все, чтобы клиент платил сразу при оформлении заказа, чтобы избавить себя от мусорных заявок (когда человек оставляет заявку, а предоплату делать не ...
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 18 px. Да и текст комментариев можно таким сделать. Для меня лично 16 — мелковато на больших экранах (в комментариях вообще 15 ...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Дополнение доступно modstore.pro/packages/photos-and-files/imageoptimizer
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены уведомления о заявках SendIt через hook-...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
Could not find action file at: controllers/default/index.php
И пустое приложение,
Fatal error: Call to a member function get() on a non-object
Для этого создал отдельный TV, в который записывается время последнего поста данного ресурса.
Для автоматического постинга проверяется не превышено ли максимальное количество постов в сутки. И берется самый старый ресурс из дочерних опубликованных.
Осталось разобраться — как запустить его из cron — мб кто-то подскажет?
При запуске вручную — код работает:
Можно тогда еще ссылку на публикацию в пост добавить,
Я сделал через ссылку в чанке:
Специально не брал стандартный Тег «a», так как ссылка должна быть одна — иначе ошибка.
Вконтакте пока из этой ссылки картинки не подгружают из og:image, но я в поддержку написал, мб поправят.
msocial.class.php
И vk.class.php
Необходимо в несколько мест добавить версию v=5.0 и album_id={id Альбома}
<?php
/**
* Класс vk для постинга в соответствующую соцсеть.
* @copyright Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru
*/
class vk extends socials
{
/**
* @var array
*/
public $vkKeys;
public function __construct(modX & $modx, $setting)
{
$this->modx = $modx;
$this->setting = $setting;
$this->vkKeys['owner_id'] = trim($this->modx->getOption('msocial_vk_id'));
$this->vkKeys['access_token'] = trim($this->modx->getOption('msocial_vk_at'));
$this->vkKeys['from_group'] = trim($this->modx->getOption('msocial_im_fg'));
$this->vkKeys['message'] = $this->setting['message'];
$this->vkKeys['v'] = '5.0';
}
/**
* Метод для постинга
*/
public function posting()
{
$param = $this->vkKeys;
if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1)
{
$count = 1;
foreach($this->setting['attach'] as $file)
{
if($count <= 4)
{
if (version_compare(phpversion(), '5.5.0', '<')) {
$attrImg['file'.$count] = '@'.MODX_BASE_PATH.$file;
}else{
$attrImg['file'.$count] = new CURLFile(MODX_BASE_PATH.$file);
}
}
$count++;
}
$imgList = $this->uploadImg($attrImg);
if($imgList){
foreach($this->uploadImg($attrImg) as $img){
$attachments .= 'photo'.$img->owner_id.'_'.$img->id.',';
}
$param['attachments'] = substr($attachments, 0, -1);
}
}
$return = $this->request('https://api.vk.com/method/wall.post',$param);
/* Вызываем обработчик ошибок */
if(isset($return->error)){
$errorMsg = $return->error->error_code.' ('.$return->error->error_msg.')';
$this->modx->log(modX::LOG_LEVEL_ERROR, $this->modx->lexicon('msocial_error_posting').' Vk '.$errorMsg);
}
}
/**
* Загрузка изображений
* $file array массив файлов
*/
public function uploadImg($file)
{
$group_id = $this->vkKeys['owner_id'];
$version = $this->vkKeys['v'];
$album_id = '{id Альбома}';
$access_token = $this->vkKeys['access_token'];
if($group_id[0] == '-'){
$group_id = substr($group_id, 1);
}
$server = $this->request('https://api.vk.com/method/photos.getWallUploadServer', array(
'group_id' => $group_id,
'access_token' => $this->vkKeys['access_token'],
'v' => $version,
'album_id' => $album_id
));
$vkPhoto = $this->request($server->response->upload_url, $file);
$result = $this->request('https://api.vk.com/method/photos.saveWallPhoto', array(
'group_id' => $group_id,
'photo' => $vkPhoto->photo,
'server' => $vkPhoto->server,
'hash' => $vkPhoto->hash,
'access_token' => $this->vkKeys['access_token'],
'v' => $version
));
return $result->response;
}
}
?>
CMD — это как кнопка Windows — тот же код.
Спасибо.