/**
  * Depending on the new parent node visibility, recompute "is_invisible" attribute for the given node and
  * its children. (used after content/move or content/copy)
  *
  * @param eZContentObjectTreeNodeNoLanguage $node
  * @param eZContentObjectTreeNodeNoLanguage $parentNode
  * @param bool $recursive
  */
 static function updateNodeVisibility($node, $parentNode, $recursive = true)
 {
     if (!$node) {
         eZDebug::writeWarning('No such node to update visibility for.');
         return;
     }
     if (!$parentNode) {
         eZDebug::writeWarning('No parent node found when updating node visibility');
         return;
     }
     if ($node->attribute('is_hidden') == 0 && $parentNode->attribute('is_invisible') != $node->attribute('is_invisible')) {
         $parentNodeIsVisible = $parentNode->attribute('is_invisible');
         $nodeID = $node->attribute('node_id');
         $db = eZDB::instance();
         $db->begin();
         $db->query("UPDATE ezcontentobject_tree SET is_invisible={$parentNodeIsVisible} WHERE node_id={$nodeID}");
         if ($recursive) {
             // update visibility for children of the node
             if ($parentNodeIsVisible) {
                 eZContentObjectTreeNodeNoLanguage::hideSubTree($node, $modifyRootNode = false);
             } else {
                 eZContentObjectTreeNodeNoLanguage::unhideSubTree($node, $modifyRootNode = false);
             }
         }
         $db->commit();
     }
 }