Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
hipo_job_edit_tags.inc
1 <?php
17 require_once SQ_SYSTEM_ROOT.'/core/hipo/hipo_job.inc';
18 
28 {
29 
30 
36  function HIPO_Job_Edit_Tags($code_name='')
37  {
38  $this->HIPO_Job($code_name);
39 
40  }//end constructor
41 
42 
52  public static function paintConfig(&$o, $class, $write_access)
53  {
54  // metadata regeneration threshhold HIPO config entry
55  $o->openField(translate('edit_tag_threshold'));
56 
57  if ($write_access) {
58  text_box($class.'[SQ_HIPO_TAG_THRESHOLD]', SQ_HIPO_TAG_THRESHOLD, 5);
59  echo ' '.translate('assets');
60  $o->note(translate('hipo_value_divided_by_tag'));
61  } else {
62  echo SQ_HIPO_TAG_THRESHOLD;
63  echo ' '.translate('assets');
64  }
65 
66  $o->closeField();
67 
68  }//end paintConfig()
69 
70 
77  public static function getConfigVars()
78  {
79  return Array(
80  'SQ_HIPO_TAG_THRESHOLD' => Array('editable' => 1, 'default' => '15'),
81  );
82 
83  }//end getConfigVars()
84 
85 
97  function getCodeName()
98  {
99  return parent::getCodeName().'-'.md5(implode('-',array_keys($this->_running_vars['assets'])));
100 
101  }//end getCodeName()
102 
103 
110  function getHipoName()
111  {
112  return translate('hipo_name_edit_tags');
113 
114  }//end getHipoName()
115 
116 
125  {
126  return Array(
127  Array(
128  'name' => translate('hipo_updating_tags'),
129  'function_call' => Array(
130  'process_function' => 'processTags',
131  ),
132  'running_mode' => 'server',
133  'auto_step' => TRUE,
134  'allow_cancel' => TRUE,
135  'percent_done' => 0,
136  'complete' => FALSE,
137  'message' => '',
138  ),
139  );
140 
141  }//end getInitialStepData()
142 
143 
154  {
155 
156  if (SQ_HIPO_TAG_THRESHOLD == 0) return 0;
157  if (!isset($this->_running_vars['todo_assetids'])) {
158  return 0;
159  }
160  return ((count($this->_running_vars['todo_assetids']) / (SQ_HIPO_TAG_THRESHOLD / count($this->_running_vars['tag_changes']))) * 100);
161 
162 
163  }//end getThresholdPercentageRequired()
164 
165 
172  function freestyle()
173  {
174  while (!empty($this->_running_vars['todo_assetids'])) {
175  if (!$this->processTags($this->_steps[0], get_class($this))) {
176  return FALSE;
177  }
178  }
179  return TRUE;
180 
181  }//end freestyle()
182 
183 
190  function prepare()
191  {
192  // to start editing tags, we need to have an asset id to start editing tags at
193  if (empty($this->_running_vars['assets'])) {
194  trigger_localised_error('HIPO0017', E_USER_WARNING);
195  return FALSE;
196  }
197 
198  $this->_running_vars['done_assetids'] = Array();
199 
200  if (empty($this->_running_vars['tag_changes'])) {
201  // no tag changes, so do nothing
202  $this->_running_vars['todo_assetids'] = Array();
203  } else {
204  $assets = $this->_running_vars['assets'];
205  $child_assets = Array();
206  for (reset($assets); NULL !== ($assetid = key($assets)); next($assets)) {
207  $asset = $GLOBALS['SQ_SYSTEM']->am->getAsset($assetid);
208  if (is_null($asset)) {
209  trigger_localised_error('HIPO0016', E_USER_WARNING, $assetid);
210  return '';
211  }
212  $child_assets += $GLOBALS['SQ_SYSTEM']->am->getChildren($assetid, Array(), NULL, FALSE, NULL, NULL, TRUE, NULL, NULL, TRUE, NULL, Array(SQ_SC_LINK_BACKEND_NAV));
213 
214  $child_assets[$assetid] = Array (
215  0 => Array (
216  'type_code' => $asset->type(),
217  ),
218  );
219 
220  // getChildren is not supposed to return any assets that are
221  // linked by notice links but at time of writing it did, resulting in
222  // tags getting tagged. Check for assets returned that have no type
223  $child_assets = array_filter($child_assets); //TODO: Running array_filter wouldnt have any effect, since it's multi-dimensional array now.
224  unset($asset);
225  }
226  $this->_running_vars['todo_assetids'] = $child_assets;
227  }
228 
229  return parent::prepare();
230 
231  }//end prepare()
232 
233 
243  function processTags(&$step_data, $prefix)
244  {
245  if (!empty($this->_running_vars['todo_assetids'])) {
246  $tag_manager = $GLOBALS['SQ_SYSTEM']->getTagManager();
247  reset($this->_running_vars['todo_assetids']);
248  $assetid = key($this->_running_vars['todo_assetids']);
249  $asset_type = $this->_running_vars['todo_assetids'][$assetid][0]['type_code'];
250  unset($this->_running_vars['todo_assetids'][$assetid]);
251 
252  $asset = $GLOBALS['SQ_SYSTEM']->am->getAsset($assetid, $asset_type);
253 
254  if (!is_null($asset)) {
255  if ($GLOBALS['SQ_SYSTEM']->am->acquireLock($assetid, 'links')) {
256  foreach ($this->_running_vars['tag_changes'] as $tag_data) {
257  if (!is_array($tag_data['tag_id'])) {
258  $tag_data['tag_id'] = Array($tag_data['tag_id']);
259  }
260  switch ($tag_data['action']) {
261  case 'add':
262  foreach ($tag_data['tag_id'] as $tag_data_id) {
263  // if this asset is already tagged with this tag, update the weight
264  $link = $GLOBALS['SQ_SYSTEM']->am->getLinkByAsset($asset->id, $tag_data_id, SQ_LINK_NOTICE);
265  if (empty($link)) {
266  $tag_manager->setTag($asset->id, $tag_data_id, $tag_data['weight']);
267  } else {
268  $tag_manager->setTagWeight($link['linkid'], $tag_data['weight']);
269  }
270  }
271  break;
272 
273  case 'delete':
274  $tag_manager->deleteTag($asset->id, $tag_data['tag_id']);
275  break;
276  }
277  }
278  $step_data['message'] = translate('hipo_editing_tags', htmlentities($asset->name, ENT_COMPAT, SQ_CONF_DEFAULT_CHARACTER_SET));
279  $GLOBALS['SQ_SYSTEM']->am->releaseLock($assetid, 'links');
280  $GLOBALS['SQ_SYSTEM']->am->forgetAsset($asset);
281  unset($asset);
282  } else {
283  // we do not acquire lock
284  trigger_localised_error('SYS0100', E_USER_WARNING, $asset->name);
285  }
286  } else {
287  $step_data['message'] = translate('hipo_skipping_asset', $assetid);
288  $this->_addError(translate('hipo_cannot_edit_tags', $assetid));
289  }
290 
291  // add this assetid to the done array so we don't do it again
292  $this->_running_vars['done_assetids'][] = $assetid;
293  }//end if there are assets to process
294 
295  if (empty($this->_running_vars['todo_assetids'])) {
296  $step_data['percent_done'] = 100;
297  $step_data['complete'] = TRUE;
298  unset($this->_running_vars['done_assetids']);
299  } else {
300  $total = count($this->_running_vars['todo_assetids']) + count($this->_running_vars['done_assetids']);
301  $step_data['percent_done'] =(count($this->_running_vars['done_assetids']) / $total) * 100;
302  $step_data['complete'] = FALSE;
303  }
304 
305  return TRUE;
306 
307  }//end processTags()
308 
309 
320  function getLockAssetDetails(&$job_type, &$running_vars, &$options)
321  {
322  $job_type = 'hipo_job_acquire_locks';
323 
324  $options['auto_complete'] = TRUE;
325 
326 
327  $running_vars = Array(
328  'assetids' => array_keys($this->_running_vars['assets']),
329  'lock_type' => Array('links'),
330  'forceably_acquire' => FALSE,
331  'dependants_only' => FALSE,
332  );
333 
334  }//end getLockAssetDetails()
335 
336 
346  function releaseLocks(&$step_data, $prefix)
347  {
348  if (!isset($this->_running_vars['re_lock_assets'])) {
349  $this->_running_vars['re_lock_assets'] = $this->_running_vars['assets'];
350  }
351 
352  $assetid = key($this->_running_vars['re_lock_assets']);
353  unset($this->_running_vars['re_lock_assets'][$assetid]);
354 
355  $children = $GLOBALS['SQ_SYSTEM']->am->getDependantChildren($assetid);
356 
357  foreach ($children as $dep_child_id => $dep_child_data) {
358  $GLOBALS['SQ_SYSTEM']->am->releaseLock($dep_child_id, 'links');
359  }
360 
361  $asset_info = $GLOBALS['SQ_SYSTEM']->am->getAssetInfo(Array($assetid));
362 
363  $step_data['message'] = translate('hipo_release_locks', $asset_info[$assetid]['name']).translate('hipo_release_locks_dependents');
364 
365  $GLOBALS['SQ_SYSTEM']->am->releaseLock($assetid, 'all');
366 
367  $this->_running_vars['done_assetids'][] = $assetid;
368 
369  if (empty($this->_running_vars['re_lock_assets'])) {
370  unset($this->_running_vars['done_assetids']);
371  $step_data['percent_done'] = 100;
372  $step_data['complete'] = TRUE;
373  } else {
374  $step_data['percent_done'] = (count($this->_running_vars['done_assetids']) / count($this->_running_vars['assets'])) * 100;
375  $step_data['complete'] = FALSE;
376  }
377 
378  return TRUE;
379 
380  }//end releaseLocks()
381 
382 
383 }//end class
384 
385 ?>