false, 'ttl' => 60, ); # CCDB Suche protected static $ccdbsearch = null; public static $ccdb_config = array( 'convert_to_utf8' => false, # Kludge: Daten aus der CP1252-CCDB auf der UTF-8-Seite ausgeben ); # Debug Konfiguration protected static $debug_config = array( 'enabled' => false, 'logfile' => '/tmp/ir_debug.log', ); protected static $debug_logfile_postfix = ''; public static function error() { if (IRGlobal::$debug_config['enabled']) { $debug_logfile = null; if (is_scalar(IRGlobal::$debug_config['logfile']) && IRGlobal::$debug_config['logfile'] && !is_null(static::$debug_logfile_postfix)) { $debug_logfile = IRGlobal::$debug_config['logfile'] . (static::$debug_logfile_postfix ? '.' . static::$debug_logfile_postfix : ''); } if (!is_null($debug_logfile)) { ob_start(); } print '###FEHLER###' . "\n"; foreach (func_get_args() as $_errorinfo) { print (is_scalar($_errorinfo) ? $_errorinfo : print_r($_errorinfo, true)) . "\n"; } debug_print_backtrace(); print "\n" . '###/FEHLER###' . "\n"; if (!is_null($debug_logfile)) { file_put_contents($debug_logfile, ob_get_contents(), FILE_APPEND); ob_end_clean(); } } } #### # Cache-Funktionen #### protected static function cache_get_object(array $options = array()) /* * Gibt das IR_Cache Objekt zurück * Parameter: * $options: Parameter für das IRCache Modul * Rückgabewert: * IR_Cache Objekt / null */ { $return = null; $cacheparams = array( 'ttl' => static::$cache_config['ttl'], 'keyonly' => true, ); if (!static::$cache_config['disabled']) { foreach ($options as $_key => $_value) { $cacheparams[$_key] = $_value; } $return = new IR_Cache($cacheparams); if (!is_object($return)) { $return = null; static::error('cache init error'); } } return $return; } public static function cache_get($cachekey, &$target, array $options = array()) /** * liest Daten aus dem Cache * Parameter: * - Cachekey * - Name des Ziel-Keys in $cache_data * - Optionen für Cache-Objekt (ttl) * Rückgabewert: * - Erfolg (true/false) */ { $success = false; $cachedata = false; $cache = static::cache_get_object($options); if (is_object($cache)) { try { $cachedata = unserialize($cache->get($cachekey)); if ($cachedata !== false && is_array($cachedata) && array_key_exists('data', $cachedata)) { $target = $cachedata['data']; $success = true; } } catch (Exception $exception) { static::error($exception); } } return $success; } public static function cache_put($cachekey, $source, array $options = array()) /** * schreibt Daten in den Cache * Parameter: * - Cachekey * - Name des Quell-Keys in $cache * Rückgabewert: * - Erfolg (true/false) */ { $success = false; $cache = static::cache_get_object($options); if (is_object($cache)) { try { $cache->put(serialize(array( 'data' => $source )), $cachekey); $success = true; } catch (Exception $exception) { static::error($exception); } } return $success; } #### # CCDB-Funktionen #### public static function ccdb_init() # Initialisiert das IR_CCDB_Search Objekt für die CCDB-Suche # Rückgabewert: # true (initialisert) / false (Fehler) { $success = false; if (!(self::$ccdbsearch instanceof IR_CCDB_Search)) { try { self::$ccdbsearch = new IR_CCDB_search(); $success = true; } catch (Exception $exception) { static::error($exception); } } return $success; } public static function ccdb_get_count($ccdbsearchconfig, &$target) /** * Liest die Anzahl der Datensätze zu einer CCDB Konfiguration aus. * Parameter: * $ccdbsearchconfig: Konfiguration der CCDB * &$target: Referenzvariable für das Ergebnis der CCDB Suche * Rückgabewert: * true (erfolgreich) / false (Fehler) */ { $success = false; static::ccdb_init(); if (self::$ccdbsearch instanceof IR_CCDB_Search) { try { self::$ccdbsearch->config($ccdbsearchconfig); $target = self::$ccdbsearch->fetch_count(); $success = true; } catch (Exception $exception) { $target = 0; static::error($exception); } } return $success; } public static function ccdb_get_data($ccdbsearchconfig, &$target) /** * Liest die Datensätze zu einer CCDB Konfiguration aus. * Parameter: * $ccdbsearchconfig: Konfiguration der CCDB * &$target: Referenzvariable für das Ergebnis der CCDB Suche * Rückgabewert: * true (erfolgreich) / false (Fehler) */ { $success = false; static::ccdb_init(); if (self::$ccdbsearch instanceof IR_CCDB_Search) { try { self::$ccdbsearch->config($ccdbsearchconfig); $target = self::$ccdbsearch->fetch_data(); for ($_counter = 0; $_counter < count($target); $_counter++) { if (self::$ccdb_config['convert_to_utf8']) { foreach (array_keys($target[$_counter]) as $_key) { $target[$_counter][$_key] = iconv('Windows-1252', 'UTF-8', $target[$_counter][$_key]); } } // # Prüft ob die URL mit einem Slash beginnt und der Bereich existiert // if (array_key_exists('url', $target[$_counter]) && preg_match('/\A\//', $target[$_counter]['url']) && array_key_exists('bereich', $target[$_counter]) && array_key_exists((string) $target[$_counter]['bereich'], static::$bereich_info)) // { // $target[$_counter]['url'] = static::$bereich_info[$target[$_counter]['bereich']]['baseurl'] . $target[$_counter]['url']; // } } $success = true; } catch (Exception $exception) { $target = array(); static::error($exception); } } return $success; } public static function ccdb_get_last_query() /** * Gibt das letzte SQL-Statement der CCDB Suche zurück (für Debugzwecke) * Rückgabewert: * SQL-Statement */ { return self::$ccdbsearch->get_last_query(); } public static function ccdbcache_get_count($ccdbsearchconfig, &$target) /** * Liest die Anzahl der Datensätze zu einer CCDB Konfiguration aus. (mit Caching der Daten) * Parameter: * $ccdbsearchconfig: Konfiguration der CCDB * &$target: Referenzvariable für das Ergebnis der CCDB Suche * Rückgabewert: * true (erfolgreich) / false (Fehler) */ { $success = false; unset($ccdbsearchconfig['order'], $ccdbsearchconfig['maxshow'], $ccdbsearchconfig['offset']); $cachekey = 'count_' . md5(serialize($ccdbsearchconfig)); if (static::cache_get($cachekey, $target)) { $success = true; } else { $success = static::ccdb_get_count($ccdbsearchconfig, $target); if ($success) { static::cache_put($cachekey, $target); } } return $success; } public static function ccdbcache_get_data($ccdbsearchconfig, &$target) /** * Liest die Datensätze zu einer CCDB Konfiguration aus. (mit Caching der Daten) * Parameter: * $ccdbsearchconfig: Konfiguration der CCDB * &$target: Referenzvariable für das Ergebnis der CCDB Suche * Rückgabewert: * true (erfolgreich) / false (Fehler) */ { $success = false; $cachekey = 'data_' . md5(serialize($ccdbsearchconfig)); if (static::cache_get($cachekey, $target)) { $success = true; } else { $success = static::ccdb_get_data($ccdbsearchconfig, $target); if ($success) { static::cache_put($cachekey, $target); } } return $success; } } /** * Funktion die NUR das Layout "2018_GFA_Consulting_Group_News" berücksichtigt. * @param string $direction [previouse|next] * @return array */ function get_browse_link($direction) { $return = array(); if (in_array($direction, array('previous', 'next'))) { $ccdb_data = array(); # Zuerst prüfen, ob es einen Container mit gleichem Datum gibt, jedoch mit größerer oder kleinerer Container ID $search_config = array( // 'distinct' => 1, 'result_columns' => array( 'Content.URL', ), 'layout' => array(2559), 'search_values' => array( 'datum' => array( 'column' => 'Content.Datum', 'type' => 'EQ', 'value' => '2019-04-09', ), 'container' => array( 'column' => 'Content.Container', 'type' => ($direction == 'previous') ? 'LT' : 'GT', 'value' => '3912055', ), ), 'connector' => '##datum## AND ##container##', // 'connector' => '##datum##', 'order' => 'Content.Container ' . (($direction == 'previous') ? 'DESC' : 'ASC'), 'maxshow' => 1, 'offset' => 0, ); IRGlobal::ccdbcache_get_data($search_config, $ccdb_data); # nach größerem oder kleinerem Datum suchen, falls die erste Abfrage kein Ergebnis liefert if (!count($ccdb_data )) { $search_config = array( // 'distinct' => 1, 'result_columns' => array( 'Content.URL', 'Content.Layout', ), 'layout' => array(2559), 'search_values' => array( 'datum' => array( 'column' => 'Content.Datum', 'type' => ($direction == 'previous') ? 'LT' : 'GT', 'value' => '2019-04-09', ), ), 'connector' => '##datum##', 'order' => 'Content.Datum ' . (($direction == 'previous') ? 'DESC' : 'ASC') . ', Content.Container ' . (($direction == 'previous') ? 'DESC' : 'ASC'), 'maxshow' => 1, 'offset' => 0, ); IRGlobal::ccdbcache_get_data($search_config, $ccdb_data); } if (count($ccdb_data)) { $return = $ccdb_data[0]; } } return $return; } ?> GFA - Multi-stakeholder event on sustainable financing for protected areas in Laos

Multi-stakeholder event on sustainable financing for protected areas in Laos

Posted on 9 Apr, 2019 by Dietmar Bräutigam, Chief Technical Advisor, ICBF Laos

On March 13, 2019, the Integrated Conservation of Biodiversity and Forests (ICBF) project hosted a multi-stakeholder exchange event on Sustainable Financing of Protected Areas at the Landmark Hotel in Vientiane, Laos. Chaired by the Deputy Director General of the Department of Forestry, Mr. Sangthong Southammakoth, about 50 participants from different ministries, educational institutions, protected areas, organizations, projects and the private sector came together to present and discuss experiences and latest developments from Laos and the ASEAN region, and elaborate future directions. Practice-oriented case studies from Indonesia, the Rain Forest Trust, Asian Arks, the Wildlife Conservation Society and Green Discovery were showcased. ICBF´s initial efforts and experiences were presented by Dietmar Bräutigam, Chief Technical Adviser of the GFA consultant team.

Sustainable financing of protected areas is a challenge worldwide, and in the ASEAN region and Laos as well. A sustained flow of funds is of crucial importance for protected areas to be properly managed and achieve agreed site-specific conservation goals. Due to commitments of the government of Laos (GoL) in the context of international conventions such as the Convention on Biological Diversity (CBD) as well as national policies and directions like the National Biodiversity Conservation Action Plan, sustainable funding is an obligation. Potential funding sources for protected areas include Payments for Ecosystem Services (PES), eco-tourism, climate funding, biodiversity offsets, as well as different fees/ taxes for roads, resource use etc.  Moreover, new opportunities for the country have emerged recently, e.g. in the context of a long-term conservation concession funded by the Rainforest Trust, which supports protected areas around the globe and has gained interest in Laos.

The exchange event is embedded into ICBF’s efforts to promote and support sustainable financing of protected areas and has been organized in close collaboration with the Rainforest Trust and Asian Arks. The ICBF project strengthens the management and conservation of three protected areas in Laos with comprehensive and integrated support. This includes identifying and connecting to sustainable financing opportunities to ensure that ICBF´s measures and impacts can be maintained after the project has been completed. In this context, a scoping study in selected protected areas has been carried out that identified site-specific budget requirements, funding gaps and long-term funding scenarios.

ICBF is a development project of GoL supported by the Federal Government of Germany through KfW. It is implemented by the Ministry of Agriculture and Forestry, and its Department of Forestry, in close cooperation with relevant agencies and partners. The project is implemented from 2015 to 2022 with an overall budget of 17.5 million euros. Consultancy services are provided by GFA Consulting Group in close collaboration with INDUFOR Oy of Finland and the Worldwide Fund for Nature.

> Project details