root/trunk/midcom/midcom.helper.replicator/helpers.php

Revision 16789, 6.7 kB (checked in by rambo, 2 months ago)

forward port r16788

Line 
1 <?php
2 /**
3  * @package midcom.helper.replicator
4  * @author The Midgard Project, http://www.midgard-project.org
5  * @version $Id: viewer.php 3975 2006-09-06 17:36:03Z bergie $
6  * @copyright The Midgard Project, http://www.midgard-project.org
7  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
8  */
9
10 /**
11  * Workaround for Zend bug regarding object handling inside methods
12  *
13  * Manifests as "Wrong parameter count for serialize()" when you call
14  * it (otherwise properly) inside MidCOM application
15  *
16  * For now also works around bug #259 if applicaple and checks the serialization against bug #244
17  *
18  * @package midcom.helper.replicator
19  * @param midgard_object $object reference to an object
20  * @return string object serialized (or false in case of failure)
21  */
22 function midcom_helper_replicator_serialize(&$object)
23 {
24     //return midgard_replicator::serialize($object);
25     /**
26      * Workaround for bug #259
27      */
28     if (   !isset($object->lang)
29         || $object->lang === 0)
30     {
31         // Non-ML or not in langx does not trigger the bug
32         $stat = midgard_replicator::serialize($object);
33         return midcom_helper_replicator_serialize_check_bug244($stat, $object);
34     }
35     $current_language = (int)$_MIDGARD['lang'];
36     $current_default_language = mgd_get_default_lang();
37     mgd_set_lang(0);
38     mgd_set_default_lang(0);
39     $object_class = get_class($object);
40     $object_lang0 = new $object_class($object->guid);
41     if (   !$object_lang0
42         || !isset($object_lang0->guid)
43         || empty($object_lang0->guid))
44     {
45         // Sanity check failed
46         $errno = mgd_errno();
47         mgd_set_default_lang($current_default_language);
48         mgd_set_lang($current_language);
49         mgd_set_errno($errno);
50         unset($object_class, $object_lang0, $current_language, $current_default_language, $errno);
51         return false;
52     }
53     else
54     {
55         $stat = midgard_replicator::serialize($object_lang0);
56     }
57     $errno = mgd_errno();
58     mgd_set_default_lang($current_default_language);
59     mgd_set_lang($current_language);
60     mgd_set_errno($errno);
61     unset($object_class, $object_lang0, $current_language, $current_default_language, $errno);
62     return midcom_helper_replicator_serialize_check_bug244($stat, $object);
63 }
64
65 /**
66  * Checks if serialization would trigger bug #244, if so returns failure
67  * and raises UI message.
68  *
69  * @param string $serialized reference to serialized object
70  * @return string $serialized or false if triggers bug #244
71  */
72 function midcom_helper_replicator_serialize_check_bug244(&$serialized, &$object)
73 {
74     //debug_push_class('function', __FUNCTION__);
75     if (!preg_match_all('%<[^>]+?lang="[^"]+"[^>]+?>%', $serialized, $matches))
76     {
77         // not ML or no extra languages present.
78         /*
79         debug_add('no lang matches');
80         debug_pop();
81         */
82         return $serialized;
83     }
84     //debug_print_r('$matches: ', $matches);
85     $langs = count($matches[0]);
86     unset($matches);
87     if ($langs <= 1)
88     {
89         // master + 1 does not trigger bug #244
90         /*
91         debug_add("\$langs <= 1, does not trigger bug #244");
92         debug_pop();
93         */
94         unset($langs);
95         return $serialized;
96     }
97     if ($langs % 2 == 0)
98     {
99         //debug_add("\$langs={$langs}, triggers bug #244");
100         $total_langs = $langs+1;
101         $class = get_class($object);
102         $object_url = $_MIDCOM->get_host_prefix() . "__mfa/asgard/object/view/{$object->guid}/";
103         $msg = "Object <a target='_blank' href='{$object_url}'>{$class} #{$object->id}</a> has {$total_langs} languages, this triggers <a target='_blank' href='http://trac.midgard-project.org/ticket/244'>bug #244</a>.";
104         $msg .= " Object will not be replicated, please go add one more language to the object in <a target='_blank' href='{$object_url}'>Asgard</a>.";
105         $_MIDCOM->uimessages->add('midcom.helper.replicator', $msg, 'error');
106         $GLOBALS['midcom_helper_replicator_logger']->log_object($object, "has {$total_langs} languages, this triggers bug #244, preventing export.", MIDCOM_LOG_ERROR);
107         unset($class, $object_url, $msg, $total_langs, $langs);
108         //debug_pop();
109         return false;
110     }
111     /*
112     debug_add("\$langs % 2 != 0, does not trigger bug #244");
113     debug_pop();
114     */
115     unset($langs);
116     return $serialized;
117 }
118
119 /**
120  * Wrapper for accessing blob serialization routines
121  *
122  * Serves two purposes
123  *  1. API has changed between 1.8.2 and 1.8.3
124  *  2. see midcom_helper_replicator_serialize
125  *
126  * @param midgard_attachment $object reference to attachment object
127  * @return string blob serialized (or false in case of failure)
128  * @see midcom_helper_replicator_serialize
129  */
130 function midcom_helper_replicator_serialize_blob(&$object)
131 {
132     if (is_callable(array('midgard_replicator', 'serialize_blob')))
133     {
134         // Use this method if it's available
135         return midgard_replicator::serialize_blob($object);
136     }
137     // Old (semantically incorrect) method
138     return midgard_replicator::export_blob($object);
139 }
140
141 /**
142  * Workaround for Zend bug regarding object handling inside methods
143  *
144  * Manifests as "PHP object does not have __res property" when you call
145  * it (otherwise properly) inside MidCOM application
146  *
147  * @param string &$xml reference to importable XML
148  * @param boolean $use_force whether to use force
149  * @return array of objects unserialized from XML (or false for failure)
150  * @see midcom_helper_replicator_serialize
151  */
152 function midcom_helper_replicator_unserialize(&$xml, $use_force = false)
153 {
154     if ($use_force)
155     {
156         return midgard_replicator::unserialize($xml, $use_force);
157     }
158     return midgard_replicator::unserialize($xml);
159 }
160
161 /**
162  * Workaround for Zend bug regarding object handling inside methods
163  *
164  * Manifests as "Wrong parameter count for import_object()" when you call
165  * it (otherwise properly) inside MidCOM application
166  *
167  * @param midgard_object &$object reference to an object
168  * @param boolean $use_force whether to use force
169  * @return boolean indicating success/failure
170  */
171 function midcom_helper_replicator_import_object(&$object, $use_force = false)
172 {
173     if ($use_force)
174     {
175         return midgard_replicator::import_object($object, $use_force);
176     }
177     return midgard_replicator::import_object($object);
178 }
179
180 /**
181  * Workaround for Zend bug regarding object handling inside methods
182  *
183  * @param string &$xml reference to importable XML
184  * @param boolean $use_force whether to use force
185  * @return boolean indicating success/failure
186  * @see midcom_helper_replicator_import_object
187  */
188 function midcom_helper_replicator_import_from_xml(&$xml, $use_force = false)
189 {
190     if ($use_force)
191     {
192         return midgard_replicator::import_from_xml($xml, $use_force);
193     }
194     return midgard_replicator::import_from_xml($xml);
195 }
196 ?>
Note: See TracBrowser for help on using the browser.