/**
  * Returns a struct containing the following values:
  *      - limit the number of element by page
  *      - offset the current offset
  *      - items array, each element contains
  *          - has_child boolean
  *          - can_create boolean
  *          - node eZContentObjectTreeNode
  *      - has_prev boolean, true if there's a previous page
  *      - has_next boolean, true if there's a next page
  *
  * @param eZContentObjectTreeNode $start the node where the browse will start
  * @param eZContentClass $class class of the object to be created
  * @param int $offset
  * @return array
  */
 private static function getBrowseItems( eZContentObjectTreeNode $start, eZContentClass $class, $offset = 0 )
 {
     $result = array(
         'limit' => 10,
         'offset' => $offset,
         'items' => array(),
         'has_prev' => ( $offset != 0 ),
         'has_next' => false
     );
     $containerClasses = eZPersistentObject::fetchObjectList(
         eZContentClass::definition(), null,
         array(
             'version' => eZContentClass::VERSION_STATUS_DEFINED,
             'is_container' => 1
         )
     );
     $classFilterArray = array();
     foreach ( $containerClasses as $c )
     {
         $classFilterArray[] = $c->attribute( 'identifier' );
     }
     $children = $start->subTree(
         array(
             'ClassFilterArray' => $classFilterArray,
             'ClassFilterType' => 'include',
             'Depth' => 1,
             'Limit' => $result['limit'],
             'Offset' => $offset
         )
     );
     $count = $start->subTreeCount(
         array(
             'ClassFilterArray' => $classFilterArray,
             'ClassFilterType' => 'include',
             'Depth' => 1
         )
     );
     if ( $count > ( $offset + $result['limit'] ) )
     {
         $result['has_next'] = true;
     }
     foreach( $children as $node )
     {
         $elt = array();
         $elt['node'] = $node;
         $canCreateClassist = $node->canCreateClassList();
         foreach( $canCreateClassist as $c )
         {
             if ( $c['id'] == $class->attribute( 'id' ) )
             {
                 $elt['can_create'] = true;
                 break;
             }
         }
         if ( !isset( $elt['can_create'] ) )
         {
             $elt['can_create'] = false;
         }
         $childrenContainerCount = $node->subTreeCount(
             array(
                 'ClassFilterArray' => $classFilterArray,
                 'ClassFilterType' => 'include',
                 'Depth' => 1
             )
         );
         $elt['has_child'] = ( $childrenContainerCount > 0 );
         $result['items'][] = $elt;
     }
     return $result;
 }
 /**
  * Clears the view cache for a subtree
  *
  * @param eZContentObjectTreeNode $node
  * @param bool $clearForRootNode
  * @return bool
  */
 static function clearViewCacheForSubtree(eZContentObjectTreeNode $node, $clearForRootNode = true)
 {
     // Max nodes to fetch at a time
     static $limit = 200;
     if ($clearForRootNode) {
         $objectID = $node->attribute('contentobject_id');
         eZContentCacheManager::clearContentCacheIfNeeded($objectID);
     }
     $offset = 0;
     $params = array('AsObject' => false, 'Depth' => false, 'Limitation' => array());
     // Empty array means no permission checking
     $subtreeCount = $node->subTreeCount($params);
     while ($offset < $subtreeCount) {
         $params['Offset'] = $offset;
         $params['Limit'] = $limit;
         $subtreeChunk = $node->subTree($params);
         $nNodesInChunk = count($subtreeChunk);
         $offset += $nNodesInChunk;
         if ($nNodesInChunk == 0) {
             break;
         }
         $objectIDList = array();
         foreach ($subtreeChunk as $curNode) {
             $objectIDList[] = $curNode['id'];
         }
         unset($subtreeChunk);
         eZContentCacheManager::clearContentCacheIfNeeded(array_unique($objectIDList));
     }
     return true;
 }
 public static function fetchImages(eZContentObjectTreeNode $node)
 {
     $images = array();
     $ini = eZINI::instance('xrowsitemap.ini');
     $params = array('Limit' => 999, 'ClassFilterType' => 'include', 'ClassFilterArray' => $ini->variable('SitemapSettings', 'ImageClasses'));
     $nodeArray = $node->subTree($params);
     foreach ($nodeArray as $imageNode) {
         $imageadd = self::getImageConverter()->addImage($imageNode);
         if (!empty($imageadd)) {
             $images = array_merge($images, $imageadd);
         }
     }
     return $images;
 }
 public function fetch()
 {
     return $this->mainNode->subTree($this->fetchParameters);
 }
 function doDeliveries($quiet = false)
 {
     $cli = eZCLI::instance();
     $issueLimit = 5;
     // Number of issues the script will process each time
     $deliveredCount = 0;
     $deliveryLimit = 200;
     // Number of deliveries the script will do each time. Should be multiples of 50
     $newsletterIni = eZINI::instance('jajnewsletter.ini');
     $newsletterIssuesNodeID = $newsletterIni->variable('ContentSettings', 'NewsletterIssuesNode');
     $subscriptionUsersNodeID = $newsletterIni->variable('ContentSettings', 'SubscriptionUsersNode');
     $fromName = $newsletterIni->variable('NewsletterSettings', 'FromName');
     $fromEmail = $newsletterIni->variable('NewsletterSettings', 'FromEmail');
     $replyTo = $newsletterIni->variable('NewsletterSettings', 'ReplyTo');
     // Get list of newsletter issues with status In Progress
     //$newsletterIssues =& eZContentObjectTreeNode::subTreeByNodeID(
     $newsletterIssues =& eZContentObjectTreeNode::subTree(array('ClassFilterType' => 'include', 'ClassFilterArray' => array('newsletter_issue'), 'AttributeFilter' => array(array('newsletter_issue/status', '=', JAJ_NEWSLETTER_ISSUE_STATUS_PENDING)), 'Limit' => $issueLimit), $newsletterIssuesNodeID);
     if (!$quiet) {
         $cli->output('Newsletter issues awating delivery: ' . count($newsletterIssues) . ' (' . $issueLimit . ' max)');
     }
     foreach ($newsletterIssues as $issue) {
         // Get newsletter and prepare
         $issueObject = $issue->object();
         $issueDatamap = $issueObject->dataMap();
         $newsletterSubject = $issueDatamap['subject']->content();
         if (!$quiet) {
             $cli->output();
             $cli->output('Delivering newsletter \'' . $newsletterSubject . '\' (Object id: ' . $issueObject->ID . ')');
         }
         $newsletterBody = JAJNewsletterOperations::prepareNewsletterIssue($issueObject);
         if ($newsletterBody == false) {
             if (!$quiet) {
                 $cli->notice('Failed to generate newsletter \'' . $newsletterSubject . '\' (Object id: ' . $issueObject->ID . ')');
             }
             continue;
         }
         // Go though users in delivery que in batch and deliver newsletter
         $userLimit = 50;
         while (true) {
             // Get users in delivery que for current newsletteer
             // TODO: Should only get items where jajdelivery.tstamp > 1 hour or something
             //$userNodes =& eZContentObjectTreeNode::subTreeByNodeID(
             $userNodes =& eZContentObjectTreeNode::subTree(array('ClassFilterType' => 'include', 'ClassFilterArray' => array('subscription_user'), 'ExtendedAttributeFilter' => array(id => 'jajdeliveryfilter', params => array('newsletter_object_id' => $issueObject->ID, 'status' => array(JAJ_NEWSLETTER_DELIVERY_STATUS_PENDING))), 'Limit' => $userLimit, 'Limitation' => array()), $subscriptionUsersNodeID);
             $userCount = count($userNodes);
             if (!$quiet) {
                 $cli->output('     Users found for batch delivery: ' . $userCount . ' (' . $userLimit . ' max in batch)');
             }
             foreach ($userNodes as $userNode) {
                 $userObject = $userNode->object();
                 $userDatamap = $userObject->dataMap();
                 $userEmail = $userDatamap['email']->content();
                 if (!$quiet) {
                     $cli->output('     Delivereing to: ' . $userEmail, false);
                 }
                 $htmlNewsletter = $newsletterBody['html'];
                 $plainNewsletter = $newsletterBody['plain'];
                 $htmlNewsletter = str_replace("__remote_id", $userObject->remoteID(), $htmlNewsletter);
                 $htmlNewsletter = str_replace("__object_id", $userObject->ID, $htmlNewsletter);
                 $plainNewsletter = str_replace("__remote_id", $userObject->remoteID(), $plainNewsletter);
                 $plainNewsletter = str_replace("__object_id", $userObject->ID, $plainNewsletter);
                 $newsletterDeliveryResult = JAJNewsletterOperations::deliver($newsletterSubject, $htmlNewsletter, $plainNewsletter, $fromName, $fromEmail, $replyTo, $userEmail);
                 $deliveryResult = JAJDelivery::fetchDelivery($issueObject->ID, $userObject->ID);
                 $delivery = $deliveryResult['result'];
                 $delivery->setAttribute('tstamp', time());
                 if ($newsletterDeliveryResult) {
                     if (!$quiet) {
                         $cli->output(' => OK');
                     }
                     $delivery->setAttribute('status', JAJ_NEWSLETTER_DELIVERY_STATUS_SENT);
                 } else {
                     $tries = $delivery->attribute('tries') + 1;
                     $delivery->setAttribute('tries', $tries);
                     if ($tries >= 3) {
                         $delivery->setAttribute('status', JAJ_NEWSLETTER_DELIVERY_STATUS_FAILED);
                     }
                     if (!$quiet) {
                         $cli->output(' => FAILED, tries: ' . $tries);
                     }
                 }
                 $delivery->sync();
                 $deliveredCount++;
             }
             eZContentObject::clearCache();
             if ($userCount < $userLimit || $deliveredCount >= $deliveryLimit) {
                 break;
             }
         }
         if ($deliveredCount >= $deliveryLimit) {
             if (!$quiet) {
                 $cli->output('Reached delivery limit for script (' . $deliveredCount . '/' . $deliveryLimit . ')');
             }
             break;
         }
         // Change status to archived if delivery que for newsletter is empty
         if (JAJDelivery::emptyDeliveryQue($issueObject->ID)) {
             if (!$quiet) {
                 $cli->output('Delivery que for newsletter empty, changing status to archived');
             }
             $status = $issueDatamap["status"];
             $status->setAttribute('data_text', JAJ_NEWSLETTER_ISSUE_STATUS_ARCHIVED);
             $status->sync();
         }
     }
 }
/**
 * Delete childrens nodes of the nodeID specified
 * @param eZContentObjectTreeNode $parentNode
 */
function deleteNodes($parentNode)
{
    $cli = eZCLI::instance();
    try
    {
        /* @type $nodeArray eZContentObjectTreeNode[] */
        $nodeArray = $parentNode->subTree();

        foreach ($nodeArray as $node)
        {
            $cli->output(
                "Deleting node " . $node->attribute('main_node_id') . ' , "' . $node->attribute('url_alias') . "'\n"
            );

            //delete node
            $objectID = $node->attribute('contentobject_id');
            $node->remove();
            $object =& eZContentObject::fetch($objectID);
            $object->purge();
        }
    }
    catch (Exception $e)
    {
        $cli->output($e->getMessage());
    }
}
 function subTreeByEmail($email)
 {
     $users = eZContentObjectTreeNode::subTree(array('ClassFilterType' => 'include', 'ClassFilterArray' => array('subscription_user'), 'AttributeFilter' => array(array('subscription_user/email', '=', $email)), 'Limitation' => array()), JAJSubscriptionUser::subscriptionUsersNodeID());
     return $users;
 }
// Get list of users the newsletter allready has been delivered to
$rows = eZPersistentObject::fetchObjectList(JAJDelivery::definition(), array('subscription_user_id'), array('newsletter_issue_id' => $object->ID), array('subscription_user_id' => 'asc'), null, false);
// Extract user_ids
$delivered = array();
foreach ($rows as $row) {
    array_push($delivered, $row['subscription_user_id']);
}
// Status for users we should send newsletter to
$valid_status = array(JAJ_USER_STATUS_PENDING, JAJ_USER_STATUS_CONFIRMED, JAJ_USER_STATUS_APPROVED);
$limit = 50;
$offset = 0;
// Loop through users, 50 at a time to avoid excessive memory usage
$recipient_count = 0;
while (true) {
    //$users =& eZContentObjectTreeNode::subTreeByNodeID(
    $users =& eZContentObjectTreeNode::subTree(array('ClassFilterType' => 'include', 'ClassFilterArray' => array('subscription_user'), 'AttributeFilter' => array(array('subscription_user/status', 'in', $valid_status)), 'ExtendedAttributeFilter' => array(id => 'eorfilter', params => array(array('subscription_user/subscriptions', $distributionLists, 'or'))), 'Limit' => $limit, 'Offset' => $offset, 'LoadDataMap' => false), $subscriptionUsersNode);
    foreach ($users as $user) {
        if (in_array($user->ContentObjectID, $delivered)) {
            continue;
        }
        $row = array('newsletter_issue_id' => $object->ID, 'subscription_user_id' => $user->ContentObjectID);
        $delivery = new JAJDelivery($row);
        $delivery->store();
        $recipient_count++;
    }
    eZContentObject::clearCache();
    if (count($users) < $limit) {
        break;
    } else {
        $offset += $limit;
    }
Example #9
0
     eZContentObject::clearCache();
 }
 $row[0] = trim($row[0]);
 $row[1] = trim($row[1]);
 if (!in_array($index, $rowSelection)) {
     continue;
 }
 if (strlen($row[0]) == 0) {
     $warnings[] = "Row " . ($index + 1) . " skipped, missing name";
     continue;
 }
 if (!eZMail::validate($row[1])) {
     $warnings[] = "Row " . ($index + 1) . " skipped, invalid email: '" . htmlspecialchars($row[1]) . "'";
     continue;
 }
 $users =& eZContentObjectTreeNode::subTree(array('ClassFilterType' => 'include', 'ClassFilterArray' => array('subscription_user'), 'AttributeFilter' => array(array('subscription_user/email', '=', $row[1]))), $subscriptionUsersNode);
 if (count($users) > 1) {
     $warnings[] = "Row " . ($index + 1) . " skipped, found multiple subscribers with email: '" . htmlspecialchars($row[1]) . "'";
     continue;
 }
 if (count($users) == 1) {
     $user = $users[0];
     $userObject = $user->object();
     $userDataMap = $userObject->DataMap();
     $userStatus = $userDataMap['status']->toString();
     if (!in_array($userStatus, array('Approved', 'Confirmed', 'Pending'))) {
         $warnings[] = "Row " . ($index + 1) . " skipped, subscriber exists with invalid status." . " Email: '" . htmlspecialchars($row[1]) . "'";
         continue;
     }
     if ($userDataMap['subscriptions']->toString()) {
         $userSubscriptions = explode("-", $userDataMap['subscriptions']->toString());