function execute($process, $event)
 {
     // get object being published
     $parameters = $process->attribute('parameter_list');
     $objectId = $parameters['object_id'];
     eZDebug::writeDebug('Expire remote cache event begins execution for object ' . $objectId);
     $ini = eZINI::instance('ezworkflowcollection.ini');
     $object = eZContentObject::fetch($objectId);
     if ($object != null) {
         if ($ini->variable('ExpireRemoteCacheFlowSettings', 'ExpireOnlyObjectNodes') == 'enabled') {
             // basic version
             // get list of nodes this object is published with
             $assigned_nodes = $object->attribute('assigned_nodes');
         } else {
             // smart-cache enabled version
             // get list of nodes whose view-cache is expired
             $assigned_nodes = array();
             eZContentCacheManager::nodeListForObject($object, true, eZContentCacheManager::CLEAR_DEFAULT, $assigned_nodes, $handledObjectList);
             foreach ($assigned_nodes as $i => $nodeID) {
                 $assigned_nodes[$i] = eZContentObjectTreeNode::fetch($nodeID);
             }
         }
         $domains = $ini->variable('ExpireRemoteCacheFlowSettings', 'ExpireDomains');
         foreach ($assigned_nodes as $assigned_node) {
             // for every node, call eZHTTPCacheManager to clean the remote cache
             $url = $assigned_node->urlAlias();
             if (is_array($domains) && (count($domains) > 1 || count($domains) > 0 && $domains[0] != '')) {
                 eZURI::transformURI($url);
                 foreach ($domains as $domain) {
                     eZHTTPCacheManager::execute($domain . $url);
                 }
             } else {
                 eZURI::transformURI($url, false, 'full');
                 eZHTTPCacheManager::execute($url);
             }
         }
     } else {
         eZDebug::writeError('Expire remote cache event triggered for inexisting object: ' . $objectId);
         return eZWorkflowType::STATUS_WORKFLOW_CANCELLED;
     }
     return eZWorkflowType::STATUS_ACCEPTED;
 }
 /**
  * Performs necessary actions with attribute data after object is published,
  * it means that you have access to published nodes.
  *
  * @param eZContentObjectAttribute $contentObjectAttribute
  * @param eZContentObject $contentObject
  * @param array(eZContentObjectTreeNode) $publishedNodes
  * @return bool
  */
 function onPublish($contentObjectAttribute, $contentObject, $publishedNodes)
 {
     $db = eZDB::instance();
     $page = $contentObjectAttribute->content();
     foreach ($publishedNodes as $node) {
         $nodeID = $node->attribute('node_id');
         if ($page->getZoneCount() != 0) {
             foreach ($page->attribute('zones') as $zone) {
                 if ($zone->getBlockCount() != 0) {
                     if ($zone->toBeRemoved()) {
                         foreach ($zone->attribute('blocks') as $index => $block) {
                             $block->setAttribute('action', 'remove');
                         }
                     }
                     foreach ($zone->attribute('blocks') as $block) {
                         $blockID = $block->attribute('id');
                         $blockType = $block->attribute('type');
                         $escapedBlockType = $db->escapeString($blockType);
                         $action = $block->attribute('action');
                         $fetchParams = $block->attribute('fetch_params');
                         $zoneID = $block->attribute('zone_id');
                         $blockName = $block->attribute('name');
                         $escapedBlockName = $db->escapeString($blockName);
                         switch ($action) {
                             case 'remove':
                                 $db->query("UPDATE ezm_block SET is_removed='1' WHERE id='" . $blockID . "'");
                                 break;
                             case 'add':
                                 $blockCount = $db->arrayQuery("SELECT COUNT( id ) as count FROM ezm_block WHERE id='" . $blockID . "'");
                                 if ($blockCount[0]['count'] == 0) {
                                     $rotationType = 0;
                                     $rotationInterval = 0;
                                     $overflowID = null;
                                     if ($block->hasAttribute('rotation')) {
                                         $rotation = $block->attribute('rotation');
                                         $rotationType = $rotation['type'];
                                         $rotationInterval = $rotation['interval'];
                                     }
                                     if ($block->hasAttribute('overflow_id')) {
                                         $overflowID = $block->attribute('overflow_id');
                                     }
                                     $db->query("INSERT INTO ezm_block ( id, zone_id, name, node_id, overflow_id, block_type, fetch_params, rotation_type, rotation_interval )\n                                                                    VALUES ( '" . $blockID . "',\n                                                                             '" . $zoneID . "',\n                                                                             '" . $escapedBlockName . "',\n                                                                             '" . $nodeID . "',\n                                                                             '" . $overflowID . "',\n                                                                             '" . $escapedBlockType . "',\n                                                                             '" . $fetchParams . "',\n                                                                             '" . $rotationType . "',\n                                                                             '" . $rotationInterval . "' )");
                                 }
                                 break;
                             default:
                                 $rotationType = 0;
                                 $rotationInterval = 0;
                                 $overflowID = null;
                                 if ($block->hasAttribute('rotation')) {
                                     $rotation = $block->attribute('rotation');
                                     $rotationType = $rotation['type'];
                                     $rotationInterval = $rotation['interval'];
                                 }
                                 if ($block->hasAttribute('overflow_id')) {
                                     $overflowID = $block->attribute('overflow_id');
                                 }
                                 $db->query("UPDATE ezm_block SET name='" . $escapedBlockName . "',\n                                                                      overflow_id='" . $overflowID . "',\n                                                                      fetch_params='" . $fetchParams . "',\n                                                                      rotation_type='" . $rotationType . "',\n                                                                      rotation_interval='" . $rotationInterval . "'\n                                                            WHERE id='" . $blockID . "'");
                                 break;
                         }
                         if ($block->getItemCount() != 0) {
                             foreach ($block->attribute('items') as $item) {
                                 $action = $item->attribute('action');
                                 switch ($action) {
                                     case 'remove':
                                         $db->query("DELETE FROM ezm_pool\n                                                            WHERE object_id='" . $item->attribute('object_id') . "'\n                                                            AND block_id='" . $blockID . "'");
                                         break;
                                     case 'add':
                                         $itemCount = $db->arrayQuery("SELECT COUNT( * ) as count FROM ezm_pool\n                                                              WHERE block_id='" . $blockID . "'\n                                                                 AND object_id='" . $item->attribute('object_id') . "'");
                                         if ($itemCount[0]['count'] == 0) {
                                             $db->query("INSERT INTO ezm_pool ( block_id, object_id, node_id, priority, ts_publication )\n                                            VALUES ( '" . $blockID . "',\n                                                     '" . $item->attribute('object_id') . "',\n                                                     '" . $item->attribute('node_id') . "',\n                                                     '" . $item->attribute('priority') . "',\n                                                     '" . $item->attribute('ts_publication') . "'  )");
                                         }
                                         break;
                                     case 'modify':
                                         if ($item->hasAttribute('ts_publication')) {
                                             $db->query("UPDATE ezm_pool SET ts_publication='" . $item->attribute('ts_publication') . "'\n                                                                WHERE object_id='" . $item->attribute('object_id') . "'\n                                                                    AND block_id='" . $blockID . "'");
                                         }
                                         if ($item->hasAttribute('priority')) {
                                             $db->query("UPDATE ezm_pool SET priority='" . $item->attribute('priority') . "'\n                                                                WHERE object_id='" . $item->attribute('object_id') . "'\n                                                                    AND block_id='" . $blockID . "'");
                                         }
                                         //if there is ts_hidden and ts_visible, update the two fields. This is the case when add items from history
                                         if ($item->hasAttribute('ts_hidden') && $item->hasAttribute('ts_visible')) {
                                             $db->query("UPDATE ezm_pool SET ts_hidden='" . $item->attribute('ts_hidden') . "',\n                                                             ts_visible='" . $item->attribute('ts_visible') . "' \n                                                                WHERE object_id='" . $item->attribute('object_id') . "'\n                                                                    AND block_id='" . $blockID . "'");
                                         }
                                         break;
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     if (eZFlowOperations::updateOnPublish()) {
         $nodeArray = array();
         foreach ($publishedNodes as $node) {
             $nodeArray[] = $node->attribute('node_id');
         }
         eZFlowOperations::update($nodeArray);
     }
     foreach ($publishedNodes as $node) {
         $url = $node->attribute('path_identification_string');
         eZURI::transformURI($url, false, 'full');
         eZHTTPCacheManager::execute($url);
     }
     $page->removeProcessed();
     $contentObjectAttribute->content($page);
     $contentObjectAttribute->store();
     return true;
 }
Пример #3
0
    /**
     * Performs necessary actions with attribute data after object is published,
     * it means that you have access to published nodes.
     *
     * @param eZContentObjectAttribute $contentObjectAttribute
     * @param eZContentObject $contentObject
     * @param array(eZContentObjectTreeNode) $publishedNodes
     * @return bool
     */
    function onPublish( $contentObjectAttribute, $contentObject, $publishedNodes )
    {
        $db = eZDB::instance();
        $page = $contentObjectAttribute->content();

        foreach ( $publishedNodes as $publishedNode )
        {
            if ( $publishedNode->isMain() )
                $mainNode = $publishedNode;
        }

        foreach ( $publishedNodes as $node )
        {
            $nodeID = $node->attribute( 'node_id' );

            if ( $page->getZoneCount() != 0 )
            {
                foreach ( $page->attribute( 'zones' ) as $zone )
                {
                    if ( $zone->getBlockCount() != 0 )
                    {
                        if ( $zone->toBeRemoved() )
                        {
                            foreach ( $zone->attribute( 'blocks' ) as $index => $block )
                            {
                                $block->setAttribute( 'action', 'remove' );
                            }
                        }

                        $newItems = array();

                        foreach ( $zone->attribute( 'blocks' ) as $block )
                        {
                            $blockID = $block->attribute( 'id' );
                            $fetchParams = $block->attribute( 'fetch_params' );
                            $escapedBlockName = $db->escapeString( $block->attribute( 'name' ) );

                            switch ( $block->attribute( 'action' ) )
                            {
                                case 'remove':
                                    $db->query( "UPDATE ezm_block SET is_removed='1' WHERE id='" . $blockID . "'" );
                                    break;

                                case 'add':
                                    $blockCount = $db->arrayQuery( "SELECT COUNT( id ) as count FROM ezm_block WHERE id='" . $blockID ."'" );

                                    if ( $blockCount[0]['count'] == 0 )
                                    {
                                        $rotationType = 0;
                                        $rotationInterval = 0;
                                        $overflowID = null;

                                        if ( $block->hasAttribute( 'rotation' ) )
                                        {
                                            $rotation = $block->attribute( 'rotation' );

                                            $rotationType = $rotation['type'];
                                            $rotationInterval = $rotation['interval'];
                                        }


                                        if ( $block->hasAttribute( 'overflow_id' ) )
                                        $overflowID = $block->attribute( 'overflow_id' );

                                        $db->query( "INSERT INTO ezm_block ( id, zone_id, name, node_id, overflow_id, block_type, fetch_params, rotation_type, rotation_interval )
                                                                    VALUES ( '" . $blockID . "',
                                                                             '" . $block->attribute( 'zone_id' ) . "',
                                                                             '" . $escapedBlockName . "',
                                                                             '" . $nodeID . "',
                                                                             '" . $overflowID . "',
                                                                             '" . $db->escapeString( $block->attribute( 'type' ) ) . "',
                                                                             '" . $fetchParams . "',
                                                                             '" . $rotationType . "',
                                                                             '" . $rotationInterval . "' )" );
                                    }
                                    break;

                                default:
                                    $rotationType = 0;
                                    $rotationInterval = 0;
                                    $overflowID = null;

                                    if ( $block->hasAttribute( 'rotation' ) )
                                    {
                                        $rotation = $block->attribute( 'rotation' );

                                        $rotationType = $rotation['type'];
                                        $rotationInterval = $rotation['interval'];
                                    }

                                    if ( $block->hasAttribute( 'overflow_id' ) )
                                        $overflowID = $block->attribute( 'overflow_id' );

                                    // Fixes http://jira.ez.no/browse/EZP-23124 where ezm_block.node_id might be = 0
                                    // due to the way staging handles ezflow
                                    // If the block's node id is set to 0, it gets set to the main node ID
                                    $blockNodeId = $block->attribute( 'node_id' ) ?: $mainNode->attribute( 'node_id' );

                                    $db->query( "UPDATE ezm_block SET name='" . $escapedBlockName . "',
                                                                      overflow_id='" . $overflowID . "',
                                                                      fetch_params='" . $fetchParams . "',
                                                                      rotation_type='" . $rotationType . "',
                                                                      rotation_interval='" . $rotationInterval ."',
                                                                      node_id='" . $blockNodeId. "'
                                                            WHERE id='" . $blockID . "'" );
                                    break;
                            }

                            if ( $block->getItemCount() != 0 )
                            {
                                foreach ( $block->attribute( 'items' ) as $item )
                                {
                                    switch ( $item->attribute( 'action' ) )
                                    {
                                        case 'remove':

                                            $db->query( "DELETE FROM ezm_pool
                                                            WHERE object_id='" . $item->attribute( 'object_id' ) . "'
                                                            AND block_id='" . $blockID . "'" );
                                            break;

                                        case 'add':
                                            $newItems[] =  array(
                                                'blockID' => $blockID,
                                                'objectID' => $item->attribute( 'object_id' ),
                                                'nodeID' => $item->attribute( 'node_id' ),
                                                'priority' => $item->attribute( 'priority' ),
                                                'timestamp' => $item->attribute( 'ts_publication' ),
                                            );
                                            break;

                                        case 'modify':
                                            $updateQuery = array();

                                            if ( $item->hasAttribute( 'ts_publication' ) )
                                            {
                                                $updateQuery[] = " ts_publication="
                                                    . (int)$item->attribute( 'ts_publication' );
                                            }

                                            //make sure to update different node locations of the same object
                                            if ( $item->hasAttribute( 'node_id' ) )
                                            {
                                                $updateQuery[] = " node_id="
                                                    . (int)$item->attribute( 'node_id' );
                                            }

                                            if ( $item->hasAttribute( 'priority' ) )
                                            {
                                                $updateQuery[] = " priority="
                                                    . (int)$item->attribute( 'priority' );
                                            }

                                            //if there is ts_hidden and ts_visible, update the two fields. This is the case when add items from history
                                            if ( $item->hasAttribute( 'ts_hidden' ) && $item->hasAttribute( 'ts_visible' ) )
                                            {
                                                $updateQuery[] = " ts_hidden="
                                                    . (int)$item->attribute( 'ts_hidden' )
                                                    . ", ts_visible="
                                                    . (int)$item->attribute( 'ts_visible' );
                                            }

                                            if ( !empty( $updateQuery ) )
                                            {
                                                $db->query(
                                                    "UPDATE ezm_pool SET "
                                                    . join( ", ", $updateQuery )
                                                    . " WHERE object_id="
                                                    . (int)$item->attribute( 'object_id' )
                                                    . " AND block_id='" . $blockID ."'"
                                                );
                                            }
                                            break;
                                    }
                                }
                            }
                        }

                        if ( !empty( $newItems ) )
                        {
                            eZFlowPool::insertItems( $newItems );
                        }
                    }
                }
            }
        }

        if ( eZFlowOperations::updateOnPublish() )
        {
            $nodeArray = array();
            foreach ( $publishedNodes as $node )
            {
                $nodeArray[] = $node->attribute( 'node_id' );
            }
            eZFlowOperations::update( $nodeArray );
        }

        foreach ( $publishedNodes as $node )
        {
            $url = $node->attribute( 'path_identification_string' );
            eZURI::transformURI( $url, false, 'full' );
            eZHTTPCacheManager::execute( $url );
        }

        $page->removeProcessed();

        $contentObjectAttribute->content( $page );
        $contentObjectAttribute->store();

        return true;
    }