1. dc006
  2. Bugs
  3. Tuesday, 24 March 2015
  4.  Subscribe via email
Iam not sure whether my problem relates to CMandrill or to SobiPro, but I would like to let you know that they do not play well together.
The notification plugin in SobiPro is sending emails that are triggered upon some events (entry update, entry approval an so on).
SobiPro entry edit, approval and other functions do not work when CMandrill plugin is enabled. Notification that is triggered by Ajax call within SobiPro gets stack, the page shows just loading progress in window overlay. When I disable CMandrill plugin it works OK.

I've attached the helper files from SobiPro notification plugin for you to take a look in hope that you will provide some hints on how to fix this issue.

I would also like to see feature that would allow us to exclude CMandrill for certain components as pointed in other forum posts.



Thank you for great plugin.


<?php
/**
* @version: $Id: helper.php 3591 2013-07-24 11:26:13Z Radek Suski $
* @package: Notifications Application
* @author
* Name: Sigrid Suski & Radek Suski, Sigsiu.NET GmbH
* Email: sobi[at]sigsiu.net
* Url: http://www.Sigsiu.NET
* @copyright Copyright (C) 2006 - 2013 Sigsiu.NET GmbH (http://www.Sigsiu.NET). All rights reserved.
* @license GNU/GPL Version 3
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3
* as published by the Free Software Foundation, and under the additional terms according section 7 of GPL v3.
* See http://www.gnu.org/licenses/gpl.html and http://sobipro.sigsiu.net/licenses.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
* $Date: 2013-07-24 13:26:13 +0200 (Mi, 24 Jul 2013) $
* $Revision: 3591 $
* $Author: Radek Suski $
*/
defined( 'SOBIPRO' ) || exit( 'Restricted access' );

/**
* @author Radek Suski
* @version 1.0
*/
abstract class SPNotificationHelper
{
const debug = false;

public static function Trigger( $action, $args, $triggers, $handlers = array() )
{
self::debug( "Incoming request. Action: {$action}", __FUNCTION__ );
$action = preg_split( '/([A-Z][a-z]+)/', $action, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
$subject = $action[ 0 ];
array_shift( $action );
$a = null;
if ( count( $action ) ) {
foreach ( $action as $p ) {
$a = $a . $p;
}
}
switch ( strtolower( $subject ) ) {
case 'entry':
$params = array();
self::payment( $a, $args, $triggers[ 'payment' ], $params );
self::entry( $a, $args, $triggers[ 'entry' ], $params );
break;
default:
$customHandler = self::checkHandler( strtolower( $subject ), $handlers );
if ( !( $customHandler ) ) {
self::custom( $a, $args, $triggers[ strtolower( $subject ) ] );
}
else {
self::customHandler( $a, $args, $triggers[ strtolower( $subject ) ], $customHandler, strtolower( $subject ) );
}
break;
}
}


private static function customHandler( $action, $args, $triggers, $handler, $subject )
{
$messages = array();
foreach ( $triggers as $trigger => $label ) {
if ( strstr( $trigger, $action ) ) {
$settings = array();
if ( method_exists( $handler, 'prepareMessageSettings' ) ) {
$handler->prepareMessageSettings( $trigger, $settings, $args[ 0 ] );
}
else {
$settings = self::loadMessages( $trigger, $subject, $args[ 0 ] );
}
if ( count( $settings ) && self::messageEnabled( $settings[ 'enabled' ] ) ) {
if ( method_exists( $handler, 'prepareMessageArgs' ) ) {
$handler->prepareMessageArgs( $trigger, $settings, $args[ 0 ] );
}
foreach ( $settings as $k => $v ) {
if ( method_exists( $handler, 'parseMessage' ) ) {
$v = $handler->parseMessage( $trigger, $args[ 0 ] );
}
$messages[ $trigger ][ $k ] = self::parse( $v, $args[ 0 ] );
}
}
}
}
self::sendMessages( $messages );
}

private static function checkHandler( $subject, $handlers )
{
if ( isset( $handlers[ $subject ] ) ) {
if ( SPLoader::translatePath( $handlers[ $subject ] ) ) {
$handler = SPFactory::Instance( $handlers[ $subject ] );
if ( method_exists( $handler, 'parseMessage' ) || method_exists( $handler, 'prepareMessageArgs' ) || method_exists( $handler, 'prepareMessageSettings' ) ) {
return $handler;
}
}
}
return false;
}


private static function payment( $action, &$args, $triggers, &$params )
{
if ( !( $args[ 0 ] instanceof SPEntry ) ) {
$sid = $args[ 0 ];
}
else {
$sid = $args[ 0 ]->get( 'id' );
}
$entry = SPFactory::Entry( $sid );
$args[ 0 ] = $entry;
$payment = SPFactory::payment()->summary( $entry->get( 'id' ) );
$methods = array();
$HTMLmethods = array();
Sobi::Trigger( 'AppPaymentMessage', 'Send', array( &$methods, $args[ 0 ], &$payment ) );
Sobi::Trigger( 'AppPaymentMessage', 'Send', array( &$HTMLmethods, $args[ 0 ], &$payment, true ) );
$payment[ 'methods' ] = $methods;
$payment[ 'html_methods' ] = $HTMLmethods;
$params = array(
'entry' => $entry,
'user' => SPFactory::user(),
'payment' => $payment,
'author' => SPFactory::Instance( 'cms.base.user', $args[ 0 ]->get( 'owner' ) )
);
if ( $action == 'AfterSave' && SPFactory::payment()->count( $entry->get( 'id' ) ) ) {
$messages = array();
foreach ( $triggers as $trigger => $label ) {
$settings = self::loadMessages( $trigger, 'payment', $params );
if ( !( count( $settings ) ) ) {
// in case we still have some old stuff
$settings = self::loadMessages( $trigger, null, $params );
}
if ( count( $settings ) && self::messageEnabled( $settings[ 'enabled' ] ) ) {
foreach ( $settings as $k => $v ) {
$messages[ $trigger ][ $k ] = self::parse( $v, $params );
}
$messages[ $trigger ][ 'sid' ] = $entry->get( 'id' );
}
}
self::sendMessages( $messages );
}
}

private static function entry( $action, $args, $triggers, &$params )
{
$messages = array();
$state = 0;
/* get the right message id */
if ( $action == 'AfterChangeState' ) {
foreach ( $triggers as $trigger => $label ) {
if ( !( strstr( $trigger, $action . ( $args[ 1 ] ? '.on' : '.off' ) ) ) ) {
unset( $triggers[ $trigger ] );
}
}
} /* if the action is "Un-Approve" entry - do nothing */
elseif ( $action == 'AfterApprove' && !( $args[ 1 ] ) ) {
return true;
}
/* determine if saving a new entry or updating an existing one */
if ( ( SPRequest::sid() || SPRequest::int( 'entry_id', 'post' ) ) && ( $args[ 0 ]->get( 'updatedTime' ) != $args[ 0 ]->get( 'createdTime' ) ) ) {
$action = str_replace( 'Save', 'Update', $action );
}
foreach ( $triggers as $trigger => $label ) {
if ( strstr( $trigger, $action ) ) {
// this is the new method with subject
$settings = self::loadMessages( $trigger, 'entry', $params );
if ( !( count( $settings ) ) ) {
// in case we still have some old stuff
$settings = self::loadMessages( $trigger, null, $params );
}
if ( count( $settings ) && self::messageEnabled( $settings[ 'enabled' ] ) ) {
foreach ( $settings as $k => $v ) {
$messages[ $trigger ][ $k ] = self::parse( $v, $params );
}
$messages[ $trigger ][ 'sid' ] = $args[ 0 ]->get( 'id' );
}
}
}
self::sendMessages( $messages );
}

private static function parse( $txt, $params )
{
// self::debug( "Parsing text. {$txt}", __FUNCTION__ );
preg_match_all( '/{([a-zA-Z0-9\-_\:\.\[\],]+)}/', $txt, $placeHolders );
if ( count( $placeHolders[ 1 ] ) ) {
SPLang::load( 'SpApp.notifications' );
foreach ( $placeHolders[ 1 ] as $placeHolder ) {
/* handle special application placeholders */
$replacement = null;
switch ( $placeHolder ) {
case 'entry.url':
if ( isset( $params[ 'entry' ] ) ) {
$pid = $params[ 'entry' ]->get( 'primary' );
if ( $pid ) {
$replacement = Sobi::Url( array( 'title' => Sobi::Cfg( 'sef.alias', true ) ? $params[ 'entry' ]->get( 'nid' ) : $params[ 'entry' ]->get( 'name' ), 'pid' => $pid, 'sid' => $params[ 'entry' ]->get( 'id' ) ), false, true, true, true );
}
else {
$replacement = Sobi::Url( array( 'title' => Sobi::Cfg( 'sef.alias', true ) ? $params[ 'entry' ]->get( 'nid' ) : $params[ 'entry' ]->get( 'name' ), 'sid' => $params[ 'entry' ]->get( 'id' ) ), false, true, true, true );
}
}
break;
case 'entry.edit_url':
if ( isset( $params[ 'entry' ] ) ) {
$replacement = Sobi::Url( array( 'task' => 'entry.edit', 'sid' => $params[ 'entry' ]->get( 'id' ) ), false, true, true, true );
}
break;
case 'entry.state':
if ( isset( $params[ 'entry' ] ) ) {
$replacement = ( $params[ 'entry' ]->get( 'state' ) == 0 ) ? Sobi::Txt( 'NOTA.ENTRY_DISABLED' ) : Sobi::Txt( 'NOTA.ENTRY_ENABLED' );
}
break;
case 'entry.approval':
if ( isset( $params[ 'entry' ] ) ) {
$replacement = ( $params[ 'entry' ]->get( 'approved' ) == 0 ) ? Sobi::Txt( 'NOTA.ENTRY_UNAPPROVED' ) : Sobi::Txt( 'NOTA.ENTRY_APPROVED' );
}
break;
case 'payment.methods.out':
if ( isset( $params[ 'payment' ] ) && isset( $params[ 'payment' ][ 'methods' ] ) ) {
foreach ( $params[ 'payment' ][ 'methods' ] as $method ) {
$replacement .= $method[ 'title' ] . '<hr/>';
$replacement .= $method[ 'content' ];
}
}
break;
case 'payment.methods.html':
if ( isset( $params[ 'payment' ] ) && isset( $params[ 'payment' ][ 'html_methods' ] ) ) {
foreach ( $params[ 'payment' ][ 'html_methods' ] as $method ) {
$replacement .= $method[ 'title' ] . '<hr/>';
$replacement .= $method[ 'content' ];
}
}
break;
default:
if ( strstr( $placeHolder, 'payment.columns' ) && isset( $params[ 'payment' ][ 'positions' ] ) && count( $params[ 'payment' ][ 'positions' ] ) ) {
preg_match_all( '/:\[([a-zA-Z0-9,]+)\]/', $placeHolder, $cols );
if ( count( $cols[ 1 ] ) ) {
$cols = explode( ',', $cols[ 1 ][ 0 ] );
if ( count( $cols ) ) {
$replacement .= "\n" . '<div style="min-width: 600px;">';
$w = 100 / count( $cols );
foreach ( $cols as $col ) {
$replacement .= "\n\t" . '<div style="width:' . $w . '%; float:left; font-weight:bold; text-align: center;">';
$replacement .= Sobi::Txt( 'NOTA.PAYMENT_' . strtoupper( $col ) );
$replacement .= "\n\t" . '</div>';
}
$replacement .= "\n\t" . '<div style="clear:both;"></div>';
foreach ( $params[ 'payment' ][ 'positions' ] as $data ) {
if ( count( $data ) ) {
foreach ( $cols as $col ) {
$replacement .= "\n\t" . '<div style="width:' . $w . '%; float:left; text-align: center;">';
if ( isset( $data[ $col ] ) ) {
$replacement .= $data[ $col ];
}
$replacement .= /*"\n\t".*/
'</div>';
}
$replacement .= "\n\t" . '<div style="clear:both;"></div>';
}
}
$replacement .= "\n" . '</div>';
}
}
}
break;
}
if ( strlen( $replacement ) ) {
$txt = str_replace( '{' . $placeHolder . '}', ( string )$replacement, $txt );
}
}
}
return preg_replace( '/{([a-zA-Z0-9\-_\:\.\[\],]+)}/', null, SPLang::replacePlaceHolders( $txt, $params ) );
}

private static function custom( $action, $args, $triggers )
{
$messages = array();
foreach ( $triggers as $trigger => $label ) {
if ( strstr( $trigger, $action ) ) {
$settings = self::loadMessages( $trigger, null, $args[ 0 ] );
if ( count( $settings ) && self::messageEnabled( $settings[ 'enabled' ] ) ) {
foreach ( $settings as $k => $v ) {
$messages[ $trigger ][ $k ] = self::parse( $v, $args[ 0 ] );
}
}
}
}
self::sendMessages( $messages );
}

private function stripTags( $txt )
{
$txt = str_replace( '<hr/>', "\n-------------------------------------\n", $txt );
$txt = str_replace( '<li>', "\n - ", $txt );
$txt = str_replace( '</div>', "\n", $txt );
$txt = str_replace( '</p>', "\n", $txt );
return strip_tags( $txt );
}

private static function messageEnabled( $setting )
{
return ( defined( 'SOBIPRO_ADM' ) ) ? ( ( $setting == 1 ) || ( $setting == 3 ) ) : ( $setting == 1 ) || ( $setting == 2 );
}

private static function sendMessages( $messages )
{
if ( count( $messages ) ) {
self::debug( $messages, __FUNCTION__ );
foreach ( $messages as $message ) {
$send = false;
$err = 'none';
if ( !( $message[ 'html' ] ) ) {
$message[ 'body' ] = self::stripTags( $message[ 'body' ] );
}
if ( self::validMail( $message[ 'fromMail' ] ) && self::validMail( $message[ 'toMail' ] ) ) {
$mail = SPFactory::Instance( 'services.mail' );
$mail->setSender( array( $message[ 'fromMail' ], $message[ 'from' ] ) );
$mail->setSubject( $message[ 'subject' ] );
$mail->setBody( $message[ 'body' ] );
// doesn't works in J16 - no idea why
// $mail->addRecipient( ( strlen( $message[ 'to' ] ) ? "{$message[ 'to' ]} <{$message[ 'toMail' ]}>" : $message[ 'toMail' ] ) );
$mail->AddAddress( $message[ 'toMail' ], $message[ 'to' ] );
$mail->IsHTML( $message[ 'html' ] );
$mail->addCC( explode( ',', $message[ 'cc' ] ) );
$mail->addBCC( explode( ',', $message[ 'bcc' ] ) );
$send = $mail->Send();
if ( $send instanceof Exception ) {
$err = $send->getMessage();
$send = false;
}
else {
$send = true;
}
unset( $mail );
}
else {
$err = SPLang::e( 'NO_VALID_EMAIL_ADDRESS_FOUND' );
Sobi::Error( 'Notifications', $err, SPC::WARNING, 0, __LINE__, __FILE__ );
}
SPFactory::db()
->insert(
'spdb_notifications',
array(
'mid' => null,
'sid' => ( isset( $message[ 'sid' ] ) ? $message[ 'sid' ] : 0 ),
'mailFrom' => $message[ 'fromMail' ],
'mailFromName' => $message[ 'from' ],
'mailTo' => $message[ 'toMail' ],
'mailToName' => $message[ 'to' ],
'mailSubject' => $message[ 'subject' ],
'mailBody' => $message[ 'body' ],
'mailCC' => $message[ 'cc' ],
'mailBCC' => $message[ 'bcc' ],
'mailDate' => 'FUNCTION:NOW()',
'mailHTML' => $message[ 'html' ],
'error' => $err,
'send' => $send,
'uid' => Sobi::My( 'id' ),
'pid' => Sobi::Section(),
)
);
if ( $send ) {
if ( SPRequest::cmd( 'spsid' ) ) {
SPFactory::message()->setReport( Sobi::Txt( 'NOTA.STATUS_EMAIL_SENT', $message[ 'toMail' ], '' ), SPRequest::cmd( 'spsid' ), SPC::SUCCESS_MSG );
if ( $message[ 'cc' ] ) {
SPFactory::message()->setReport( Sobi::Txt( 'NOTA.STATUS_EMAIL_SENT', $message[ 'cc' ], '[CC]' ), SPRequest::cmd( 'spsid' ), SPC::SUCCESS_MSG );
}
if ( $message[ 'bcc' ] ) {
SPFactory::message()->setReport( Sobi::Txt( 'NOTA.STATUS_EMAIL_SENT', $message[ 'bcc' ], '[BCC]' ), SPRequest::cmd( 'spsid' ), SPC::SUCCESS_MSG );
}
}
elseif( SPFactory::user()->isAdmin() ) {
SPFactory::message()->success( Sobi::Txt( 'NOTA.STATUS_EMAIL_SENT', $message[ 'toMail' ], '' ), false );
if ( $message[ 'cc' ] ) {
SPFactory::message()->success( Sobi::Txt( 'NOTA.STATUS_EMAIL_SENT', $message[ 'cc' ], '[CC]' ), false );
}
if ( $message[ 'bcc' ] ) {
SPFactory::message()->success( Sobi::Txt( 'NOTA.STATUS_EMAIL_SENT', $message[ 'bcc' ], '[BCC]' ), false );
}
}
}
else {
if ( SPRequest::cmd( 'spsid' ) ) {
if ( $err ) {
SPFactory::message()->setReport( Sobi::Txt( 'NOTA.STATUS_EMAIL_NOT_SENT', $message[ 'toMail' ], $err ), SPRequest::cmd( 'spsid' ), SPC::ERROR_MSG );
}
else {
SPFactory::message()->setReport( Sobi::Txt( 'NOTA.STATUS_EMAIL_NOT_SENT', $message[ 'toMail' ], 'Unknown Error' ), SPRequest::cmd( 'spsid' ), SPC::ERROR_MSG );
}
}
elseif( SPFactory::user()->isAdmin() ) {
if ( $err ) {
SPFactory::message()->error( Sobi::Txt( 'NOTA.STATUS_EMAIL_NOT_SENT', $message[ 'toMail' ], $err ), false );
}
else {
SPFactory::message()->error( Sobi::Txt( 'NOTA.STATUS_EMAIL_NOT_SENT', $message[ 'toMail' ], 'Unknown Error' ), false );
}
}
}
}
}

}

private static function customMailList( &$def, $args )
{
if ( strlen( $def[ 'customList' ] ) ) {
$file = SPLoader::translatePath( 'etc.napp_cfg.' . $def[ 'customList' ], 'front', true, 'xml', false );
if ( $file ) {
$xml = DOMDocument::load( $file );
$root = $xml->getElementsByTagName( 'notifications' )->item( 0 );
/** @var DOMNode $node */
foreach ( $root->childNodes as $node ) {
if ( $node->nodeName == 'rule' ) {
$trigger = $node->attributes->getNamedItem( 'trigger' ) ? $node->attributes->getNamedItem( 'trigger' )->nodeValue : null;
$value = $node->attributes->getNamedItem( 'value' ) ? $node->attributes->getNamedItem( 'value' )->nodeValue : null;
if ( $trigger === null || self::compareArgs( $args, $trigger, $value ) ) {
/** @var DOMNode $recipient */
$ccs = array();
if ( $def[ 'cc' ] ) {
$ccs = explode( ',', $def[ 'cc' ] );
}
$bccs = array();
if ( $def[ 'bcc' ] ) {
$bccs = explode( ',', $def[ 'bcc' ] );
}
foreach ( $node->childNodes as $recipient ) {
switch ( $recipient->nodeName ) {
case 'to':
$def[ 'toMail' ] = $recipient
->attributes
->getNamedItem( 'mail' )
->nodeValue;
if ( $recipient->attributes->getNamedItem( 'name' ) ) {
$def[ 'to' ] = $recipient
->attributes
->getNamedItem( 'name' )
->nodeValue;
}
break;
case 'cc':
$ccs[ ] = $recipient
->attributes
->getNamedItem( 'mail' )
->nodeValue;
break;
case 'bcc':
$bccs[ ] = $recipient
->attributes
->getNamedItem( 'mail' )
->nodeValue;
break;
}
}
$def[ 'cc' ] = implode( ',', array_unique( $ccs ) );
$def[ 'bcc' ] = implode( ',', array_unique( $bccs ) );
}
}
}
}
}
}

private static function compareArgs( $args, $trigger, $value )
{
$trigger = explode( '.', $trigger );
$var = $args;
// xml true / false
if ( strtolower( $value ) == 'true' ) {
$value = true;
}
elseif ( strtolower( $value ) == 'true' ) {
$value = false;
}
if ( count( $trigger ) ) {
foreach ( $trigger as $property ) {
if ( ( $var instanceof SPDBObject ) || ( method_exists( $var, 'get' ) ) ) {
if ( strstr( $property, 'field_' ) && $var instanceof SPEntry ) {
try {
$v = $var->getField( $property )->data();
if ( !( $v ) ) {
$v = $var->getField( $property )->getRaw();
}
$var = $v;
} catch ( SPException $x ) {
Sobi::Error( 'Notifications', $x->getMessage(), SPC::WARNING, 0, __LINE__, __FILE__ );
}
}
elseif ( ( $property == 'name' ) && ( $var instanceof SPEntry ) && !( strlen( $var->get( $property ) ) ) ) {
$var = $var->getField( ( int )Sobi::Cfg( 'entry.name_field' ) )->data();
}
else {
$var = $var->get( $property );
}
}
elseif ( is_array( $var ) && isset( $var[ $property ] ) ) {
$var = $var[ $property ];
}
elseif ( $var instanceof stdClass ) {
$var = $var->$property;
}
}
}
if ( is_string( $var ) && $var == $value ) {
return true;
}
elseif ( is_array( $var ) && ( isset( $var[ $value ] ) || array_key_exists( $value, $var ) ) ) {
return true;
}
// if we just checking if there was anything
elseif ( $value === null ) {
if ( is_string( $var ) && strlen( $var ) ) {
return true;
}
elseif ( is_array( $var ) && count( $var ) ) {
return true;
}

}
else {
return false;
}
}

private function validMail( $mail )
{
return preg_match( '/[a-z0-9\.\-\_]+@[a-z0-9\.\-\_]{2,}\.[a-z]{2,5}/i', $mail );
}

private static function loadMessages( $nid, $subject = null, $args = null )
{
static $data = array();
if ( $subject ) {
$nid = $subject . '.' . $nid;
}
if ( isset( $data[ $nid ] ) ) {
return $data[ $nid ];
}
self::debug( "Loading messages. Nid: {$nid}", __FUNCTION__ );
SPFactory::registry()->loadDBSection( 'notifications' );
$setting = Sobi::Reg( 'notifications.settings.params' );
if ( strlen( $setting ) ) {
$setting = SPConfig::unserialize( $setting );
}
self::debug( $setting, __FUNCTION__ );

if ( is_array( $setting ) && isset( $setting[ Sobi::Section() ] ) && isset( $setting[ Sobi::Section() ][ $nid ] ) ) {
$setting = $setting[ Sobi::Section() ][ $nid ];
}
elseif ( is_array( $setting ) && isset( $setting[ -1 ] ) && isset( $setting[ -1 ][ $nid ] ) ) {
$setting = $setting[ -1 ][ $nid ];
}

$ids = array(
'from' => '{cfg:mail.fromname}',
'fromMail' => '{cfg:mail.from}',
'to' => '{user.name}',
'toMail' => '{user.email}',
'subject' => 'Message Subject',
'body' => 'Message Body',
'cc' => null,
'bcc' => null,
'html' => true,
'enabled' => false,
'customList' => null,
);
foreach ( $ids as $id => $v ) {
$value = SPLang::getValue( $nid . '.' . $id, 'application', Sobi::Section() );
if ( !( strlen( $value ) ) ) {
$value = SPLang::getValue( $nid . '.' . $id, 'application', -1 );
}
if ( strlen( $value ) ) {
$ids[ $id ] = $value;
}
else {
if ( isset( $setting[ $id ] ) ) {
$ids[ $id ] = $setting[ $id ];
}
else {
$ids[ $id ] = $v;
}
}
}
self::customMailList( $ids, $args );
self::debug( $ids, __FUNCTION__ );
$data[ $nid ] = $ids;
return $ids;
}

private static function debug( $msg, $f )
{
if ( self::debug ) {
SPConfig::debOut( '[ ' . date( DATE_RFC822 ) . ' ] [ ' . $f . ' ] ', false, false, true );
SPConfig::debOut( $msg, false, false, true );
}
}
}
Responses (2)
Daniel Dimitrov
Support team
Accepted Answer Pending Moderation
Are you on joomla 3.4? CMandrill generates a notice and this most probably breaks the ajax response.
Go to your joomla global config and disable error reporting (set it to none). Try to send a mail with sobiPRO and let me know if it works.
Regards,
Daniel
Please if you use our extensions be so kind and review them at JED
Matukio | Hotspots Pro | CComment Pro
  1. more than a month ago
  2. Bugs
  3. # 1
Accepted Answer Pending Moderation
Thank you for reply. Iam on Joomla 3.3.6 nevertheless I've tried to disable error reporting and it is not helping.
  1. more than a month ago
  2. Bugs
  3. # 2
  • Page :
  • 1


There are no replies made for this post yet.
However, you are not allowed to reply to this post.

Last questions

How can I integrate the CComment input field into
I’ve created com_content and a module for displaying the latest comments, which ...
3 Replies
Posted on Friday, 06 December 2024
  • New
    • #CComment
    • #comments
    • #module
    • #comments editor
    • #Ccomment Pro
    • #Joomla 5
    Fehlermeldung nach Buchung
    Wir erhalten folgende Fehlermeldung nach einer Buchung: https://www.tsg1873.d...
    4 Replies
    Posted on Sunday, 08 December 2024
  • New
  • Nach Update zeigt Eventkalender nur 2025 an
    obhwohl noch Events für 2024 vorhanden sind. Bisher zeigte er alles an....
    3 Replies
    Posted on Tuesday, 10 December 2024
  • New
    • #Alle Veranstaltungen
    • #Calendar
    HotSpots Pro 6.0.12 crashes on FrontEnd with Conso
    Hi there, Not sure what happened but all of a sudden nothing shows up and giv...
    0 Replies
    Posted on Wednesday, 11 December 2024
  • New
  • COM_MATUKIO_NO_TEMPLATE
    Hallo, wir haben vor kurzem von Matukio 5 auf die aktuelle Version geupdatet. Se...
    11 Replies
    Posted on Friday, 16 December 2016
  • Resolved