Beispiel #1
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $name = $this->getConfiguration('name');
     $schema->addNew($permName, 'multi-id')->setLabel($name)->setReadOnly(true)->setRenderTransform(function ($value) {
         return implode(';', $value);
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     $schema->addNew($permName, 'multi-name')->setLabel($name)->setReadOnly(true)->setRenderTransform(function ($value, $extra) {
         if (is_string($value) && empty($value)) {
             // ItemsLists have no stored value, so when called from \Tracker\Tabular\Source\TrackerSourceEntry...
             // we have to: get a copy of this field
             $field = $this->getTrackerDefinition()->getFieldFromPermName($this->getConfiguration('permName'));
             // get a new handler for it
             $factory = $this->getTrackerDefinition()->getFieldFactory();
             $handler = $factory->getHandler($field, ['itemId' => $extra['itemId']]);
             // for which we can then get the itemIds array of the "linked" items
             $value = $handler->getItemIds();
             // and then get the labels from the id's we've now found as if they were the field's data
         }
         $labels = $this->getItemLabels($value, ['list_mode' => 'csv']);
         return implode(';', $labels);
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     return $schema;
 }
Beispiel #2
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $output->writeln('Importing tracker...');
     $lib = \TikiLib::lib('tabular');
     $info = $lib->getInfo($input->getArgument('tabularId'));
     $perms = \Perms::get('tabular', $info['tabularId']);
     if (!$info || !$perms->tabular_import) {
         throw new \Exception('Tracker Import: Tabular Format not found');
     }
     $fileName = $input->getArgument('filename');
     if (!file_exists($fileName)) {
         throw new \Exception('Tracker Import: File not found');
     }
     // from \Services_Tracker_TabularController::getSchema TODO refactor?
     $tracker = \Tracker_Definition::get($info['trackerId']);
     if (!$tracker) {
         throw new \Exception('Tracker Import: Tracker not found');
     }
     $schema = new \Tracker\Tabular\Schema($tracker);
     $schema->loadFormatDescriptor($info['format_descriptor']);
     $schema->loadFilterDescriptor($info['filter_descriptor']);
     $schema->validate();
     if (!$schema->getPrimaryKey()) {
         throw new \Exception(tr('Primary Key required'));
     }
     // this will throw exceptions and not return if there's a problem
     $source = new \Tracker\Tabular\Source\CsvSource($schema, $fileName);
     $writer = new \Tracker\Tabular\Writer\TrackerWriter();
     $writer->write($source);
     $output->writeln('Import done');
     return 0;
 }
Beispiel #3
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $schema->addNew($permName, 'default')->setLabel($this->getConfiguration('name'))->setRenderTransform(function ($value) {
         return $value;
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     return $schema;
 }
Beispiel #4
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $prepend = $this->getOption('prepend');
     $append = $this->getOption('append');
     $schema->addNew($permName, 'default')->setLabel($this->getConfiguration('name'))->setRenderTransform(function ($value) {
         return $value;
     });
     $schema->addNew($permName, 'formatted')->setLabel($this->getConfiguration('name'))->addIncompatibility($permName, 'default')->setRenderTransform(function ($value) use($prepend, $append) {
         return $prepend . $value . $append;
     });
     return $schema;
 }
Beispiel #5
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $smarty = TikiLib::lib('smarty');
     $smarty->loadPlugin('smarty_modifier_escape');
     $schema->addNew($permName, 'default')->setLabel($this->getConfiguration('name'))->setRenderTransform(function ($value) {
         return $value;
     });
     $schema->addNew($permName, 'mailto')->setLabel($this->getConfiguration('name'))->setPlainReplacement('default')->setRenderTransform(function ($value) {
         $escape = smarty_modifier_escape($value);
         return "<a href=\"mailto:{$escape}\">{$escape}</a>";
     });
     return $schema;
 }
Beispiel #6
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $schema->addNew($permName, 'default')->setLabel($this->getConfiguration('name'))->setRenderTransform(function ($value) {
         return $value;
     });
     return $schema;
 }
Beispiel #7
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $schema->addNew($permName, 'default')->setLabel($this->getConfiguration('name'))->setRenderTransform(function ($value) {
         return $value;
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     $prepend = $this->getOption('prepend');
     $append = $this->getOption('append');
     $schema->addNew($permName, 'formatted')->setLabel($this->getConfiguration('name'))->addIncompatibility($permName, 'default')->setRenderTransform(function ($value) use($prepend, $append) {
         return $prepend . $value . $append;
     })->setParseIntoTransform(function (&$info, $value) use($permName, $prepend, $append) {
         $value = substr($value, strlen($prepend), -strlen($append));
         $info['fields'][$permName] = $value;
     });
     return $schema;
 }
Beispiel #8
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $name = $this->getConfiguration('name');
     $smarty = TikiLib::lib('smarty');
     $smarty->loadPlugin('smarty_function_icon');
     $schema->addNew($permName, 'y/n')->setLabel($name)->setRenderTransform(function ($value) {
         return $value;
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     $schema->addNew($permName, 'X')->setLabel($name)->addIncompatibility($permName, 'y/n')->setRenderTransform(function ($value) {
         return 'y' === $value ? 'X' : '';
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $value = trim($value);
         $info['fields'][$permName] = empty($value) ? 'n' : 'y';
     });
     $schema->addNew($permName, 'icon')->setLabel($name)->setPlainReplacement('X')->setRenderTransform(function ($value) use($smarty) {
         return 'y' === $value ? smarty_function_icon(['name' => 'success'], $smarty) : '';
     });
     return $schema;
 }
Beispiel #9
0
 function getTabularSchema()
 {
     global $prefs;
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $baseKey = $this->getBaseKey();
     $name = $this->getConfiguration('name');
     $plain = function ($lang) {
         return function ($value, $extra) use($lang) {
             if (isset($extra['text'])) {
                 $value = $extra['text'];
             } elseif ($lang && isset($value[$lang])) {
                 $value = $lang;
             }
             return $value;
         };
     };
     $render = function ($lang) use($plain) {
         $f = $plain($lang);
         return function ($value, $extra) use($f) {
             $value = $f($value, $extra);
             return $this->attemptParse($value);
         };
     };
     if ('y' !== $this->getConfiguration('isMultilingual', 'n')) {
         $schema->addNew($permName, "default")->setLabel($name)->setReadOnly(true)->setPlainReplacement('default-raw')->addQuerySource('text', "{$baseKey}_raw")->setRenderTransform($render(null));
         $schema->addNew($permName, 'default-raw')->setLabel($name)->addQuerySource('text', "{$baseKey}_raw")->setRenderTransform($plain(null))->setParseIntoTransform(function (&$info, $value) use($permName) {
             $info['fields'][$permName] = $value;
         });
     } else {
         $lang = $prefs['language'];
         $schema->addNew($permName, "current")->setLabel($name)->setReadOnly(true)->setPlainReplacement('current-raw')->addQuerySource('text', "{$baseKey}_{$lang}_raw")->setRenderTransform($render($lang));
         $schema->addNew($permName, 'current-raw')->setLabel(tr('%0 (%1)', $name, $lang))->setReadOnly(true)->addIncompatibility($permName, 'current')->addQuerySource('text', "{$baseKey}_{$lang}_raw")->setRenderTransform($plain($lang));
         foreach ($prefs['available_languages'] as $lang) {
             $schema->addNew($permName, $lang)->setLabel($name)->setPlainReplacement("{$lang}-raw")->addQuerySource('text', "{$baseKey}_{$lang}_raw")->addIncompatibility($permName, 'current')->addIncompatibility($permName, 'current-raw')->setRenderTransform($render($lang));
             $schema->addNew($permName, "{$lang}-raw")->setLabel(tr('%0 (%1)', $name, $lang))->addQuerySource('text', "{$baseKey}_{$lang}_raw")->addIncompatibility($permName, 'current')->addIncompatibility($permName, 'current-raw')->addIncompatibility($permName, $lang)->setRenderTransform($plain($lang))->setParseIntoTransform(function (&$info, $value) use($permName, $lang) {
                 $info['fields'][$permName][$lang] = $value;
             });
         }
     }
     return $schema;
 }
Beispiel #10
0
 function getTabularSchema()
 {
     global $prefs;
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $baseKey = $this->getBaseKey();
     $name = $this->getConfiguration('name');
     $renderLink = function ($lang) {
         return function ($value, $extra) use($lang) {
             $smarty = TikiLib::lib('smarty');
             $smarty->loadPlugin('smarty_function_object_link');
             if (isset($extra['text'])) {
                 $value = $extra['text'];
             } elseif ($lang && isset($value[$lang])) {
                 $value = $lang;
             }
             if ($value) {
                 return smarty_function_object_link(['type' => 'trackeritem', 'id' => $extra['itemId'], 'title' => $value], $smarty);
             } else {
                 return '';
             }
         };
     };
     if ('y' !== $this->getConfiguration('isMultilingual', 'n')) {
         $schema->addNew($permName, 'default')->setLabel($name)->setRenderTransform(function ($value) {
             return $value;
         })->setParseIntoTransform(function (&$info, $value) use($permName) {
             $info['fields'][$permName] = $value;
         });
         $schema->addNew($permName, 'link')->setLabel($name)->setPlainReplacement('default')->addQuerySource('itemId', 'object_id')->addIncompatibility($permName, 'default')->setRenderTransform($renderLink(null));
     } else {
         $lang = $prefs['language'];
         $schema->addNew($permName, 'current')->setLabel(tr('%0 (%1)', $name, $lang))->setReadOnly(true)->addQuerySource('text', "{$baseKey}_{$lang}")->setRenderTransform(function ($value, $extra) use($lang) {
             if (isset($extra['text'])) {
                 return $extra['text'];
             } elseif ($lang && isset($value[$lang])) {
                 return $value[$lang];
             }
         });
         $schema->addNew($permName, "link-current")->setLabel($name)->setReadOnly(true)->setPlainReplacement($lang)->addQuerySource('itemId', 'object_id')->addQuerySource('text', "{$baseKey}_{$lang}")->setRenderTransform($renderLink($lang));
         foreach ($prefs['available_languages'] as $lang) {
             $schema->addNew($permName, $lang)->setLabel(tr('%0 (%1)', $name, $lang))->addQuerySource('text', "{$baseKey}_{$lang}")->setRenderTransform(function ($value, $extra) use($lang) {
                 if (isset($extra['text'])) {
                     return $extra['text'];
                 } elseif ($lang && isset($value[$lang])) {
                     return $value[$lang];
                 }
             })->setParseIntoTransform(function (&$info, $value) use($permName, $lang) {
                 $info['fields'][$permName][$lang] = $value;
             });
             $schema->addNew($permName, "link-{$lang}")->setLabel($name)->setPlainReplacement($lang)->addQuerySource('itemId', 'object_id')->addQuerySource('text', "{$baseKey}_{$lang}")->addIncompatibility($permName, 'default')->addIncompatibility($permName, $lang)->setRenderTransform($renderLink($lang));
         }
     }
     return $schema;
 }
Beispiel #11
0
 function getTabularSchema()
 {
     $permName = $this->getConfiguration('permName');
     $baseKey = $this->getBaseKey();
     $name = $this->getConfiguration('name');
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $schema->addNew($permName, 'userlink')->setLabel($name)->setPlainReplacement('username')->setRenderTransform(function ($value) {
         $smarty = TikiLib::lib('smarty');
         $smarty->loadPlugin('smarty_modifier_userlink');
         if ($value) {
             return smarty_modifier_userlink($value);
         }
     });
     $schema->addNew($permName, 'realname')->setLabel($name)->setReadOnly(true)->setRenderTransform(function ($value) {
         $smarty = TikiLib::lib('smarty');
         $smarty->loadPlugin('smarty_modifier_username');
         if ($value) {
             return smarty_modifier_username($value, true, false, false);
         }
     });
     $schema->addNew($permName, 'username-itemlink')->setLabel($name)->setPlainReplacement('username')->addQuerySource('itemId', 'object_id')->setRenderTransform(function ($value, $extra) {
         $smarty = TikiLib::lib('smarty');
         $smarty->loadPlugin('smarty_function_object_link');
         if ($value) {
             return smarty_function_object_link(['type' => 'trackeritem', 'id' => $extra['itemId'], 'title' => $value], $smarty);
         }
     });
     $schema->addNew($permName, 'realname-itemlink')->setLabel($name)->setPlainReplacement('realname')->addQuerySource('itemId', 'object_id')->setRenderTransform(function ($value, $extra) {
         $smarty = TikiLib::lib('smarty');
         $smarty->loadPlugin('smarty_function_object_link');
         $smarty->loadPlugin('smarty_modifier_username');
         if ($value) {
             return smarty_function_object_link(['type' => 'trackeritem', 'id' => $extra['itemId'], 'title' => smarty_modifier_username($value, true, false, false)], $smarty);
         }
     });
     $schema->addNew($permName, 'username')->setLabel($name)->setRenderTransform(function ($value) {
         return $value;
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     return $schema;
 }
Beispiel #12
0
 function getTabularSchema()
 {
     global $prefs;
     $permName = $this->getConfiguration('permName');
     $type = $this->getOption('datetime');
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $label = $this->getConfiguration('name');
     $helper = new Tracker\Tabular\Schema\DateHelper($label);
     $helper->setupUnix($schema->addNew($permName, 'unix'));
     $tikidate = TikiLib::lib('tikidate');
     if ($type == 'd') {
         $helper->setupFormat('Y-m-d', $schema->addNew($permName, 'yyyy-mm-dd'));
         $helper->setupFormat(str_replace($tikidate->search, $tikidate->replace, $prefs['short_date_format']), $schema->addNew($permName, 'short date format'));
         $helper->setupFormat(str_replace($tikidate->search, $tikidate->replace, $prefs['long_date_format']), $schema->addNew($permName, 'long date format'));
     } else {
         $helper->setupFormat('Y-m-d H:i:s', $schema->addNew($permName, 'yyyy-mm-dd hh:mm:ss'));
         $helper->setupFormat(str_replace($tikidate->search, $tikidate->replace, $prefs['short_date_format'] . ' ' . $prefs['short_time_format']), $schema->addNew($permName, 'short datetime format'));
         $helper->setupFormat(str_replace($tikidate->search, $tikidate->replace, $prefs['long_date_format'] . ' ' . $prefs['long_time_format']), $schema->addNew($permName, 'long datetime format'));
     }
     return $schema;
 }
Beispiel #13
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $name = $this->getConfiguration('name');
     if (!$this->getOption('selectMultipleValues')) {
         // Cannot handle multiple values when exporting
         $schema->addNew($permName, 'id')->setLabel($name)->setRenderTransform(function ($value) {
             return $value;
         })->setParseIntoTransform(function (&$info, $value) use($permName) {
             $info['fields'][$permName] = $value;
         });
         $fullLookup = new Tracker\Tabular\Schema\CachedLookupHelper();
         $fullLookup->setLookup(function ($value) {
             return $this->getItemLabel($value);
         });
         $schema->addNew($permName, 'lookup')->setLabel($name)->setReadOnly(true)->addQuerySource('text', "tracker_field_{$permName}_text")->setRenderTransform(function ($value, $extra) use($fullLookup) {
             if (isset($extra['text'])) {
                 return $extra['text'];
             } else {
                 return $fullLookup->get($value);
             }
         });
         if ($fieldId = $this->getOption('fieldId')) {
             $simpleField = Tracker\Tabular\Schema\CachedLookupHelper::fieldLookup($fieldId);
             $invertField = Tracker\Tabular\Schema\CachedLookupHelper::fieldInvert($fieldId);
             $schema->addNew($permName, 'lookup-simple')->setLabel($name)->addIncompatibility($permName, 'id')->addQuerySource('text', "tracker_field_{$permName}_text")->setRenderTransform(function ($value, $extra) use($simpleField) {
                 if (isset($extra['text'])) {
                     return $extra['text'];
                 } else {
                     return $simpleField->get($value);
                 }
             })->setParseIntoTransform(function (&$info, $value) use($permName, $invertField) {
                 if ($id = $invertField->get($value)) {
                     $info['fields'][$permName] = $id;
                 }
             });
         }
         $schema->addNew($permName, 'name')->setLabel($name)->setReadOnly(true)->setRenderTransform(function ($value) {
             return $this->getItemLabel($value, ['list_mode' => 'csv']);
         });
     }
     return $schema;
 }
Beispiel #14
0
 private function getSchema(array $info)
 {
     $tracker = \Tracker_Definition::get($info['trackerId']);
     if (!$tracker) {
         throw new Services_Exception_NotFound();
     }
     $schema = new \Tracker\Tabular\Schema($tracker);
     $schema->loadFormatDescriptor($info['format_descriptor']);
     $schema->loadFilterDescriptor($info['filter_descriptor']);
     return $schema;
 }
Beispiel #15
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $name = $this->getConfiguration('name');
     $possibilities = $this->getPossibilities();
     $invert = array_flip($possibilities);
     $schema->addNew($permName, 'code')->setLabel($name)->setRenderTransform(function ($value) {
         return $value;
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     $schema->addNew($permName, 'text')->setLabel($name)->addIncompatibility($permName, 'code')->addQuerySource('text', "tracker_field_{$permName}_text")->setRenderTransform(function ($value, $extra) use($possibilities) {
         if (isset($possibilities[$value])) {
             return $possibilities[$value];
         }
     })->setParseIntoTransform(function (&$info, $value) use($permName, $invert) {
         if (isset($invert[$value])) {
             $info['fields'][$permName] = $invert[$value];
         }
     });
     return $schema;
 }
Beispiel #16
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $name = $this->getConfiguration('name');
     $type = $this->getOption('inputtype');
     $sourceCategories = $this->getApplicableCategories();
     $applicable = $this->getIds($sourceCategories);
     $invert = array_flip(array_map(function ($item) {
         return $item['name'];
     }, $sourceCategories));
     $matching = function ($extra) use($applicable) {
         static $lastId, $categories;
         if ($lastId == $extra['itemId']) {
             return $categories;
         }
         if (isset($extra['categories'])) {
             // Directly from search results
             $categories = array_intersect($extra['categories'], $applicable);
         } elseif (isset($extra['itemId'])) {
             // Not loaded, fetch list
             $categories = $this->getCategories($extra['itemId']);
             $categories = array_intersect($categories, $applicable);
         } else {
             $categories = [];
         }
         $lastId = $extra['itemId'];
         return $categories;
     };
     if ($type == 'd' || $type == 'radio') {
         // Works for single selection only
         $schema->addNew($permName, 'id')->setLabel($name)->addQuerySource('itemId', 'object_id')->addQuerySource('categories', 'categories')->setRenderTransform(function ($value, $extra) use($matching) {
             $categories = $matching($extra);
             if (count($categories) > 1) {
                 return '#invalid';
             } else {
                 return reset($categories);
             }
         })->setParseIntoTransform(function (&$info, $value) use($permName) {
             if ($value != '#invalid') {
                 $info['fields'][$permName] = $value;
             }
         });
         $schema->addNew($permName, 'name')->setLabel($name)->addIncompatibility($permName, 'id')->addQuerySource('itemId', 'object_id')->addQuerySource('categories', 'categories')->setRenderTransform(function ($value, $extra) use($matching, $sourceCategories) {
             $categories = $matching($extra);
             if (count($categories) > 1) {
                 return '#invalid';
             } else {
                 $first = reset($categories);
                 if (isset($sourceCategories[$first])) {
                     return $sourceCategories[$first]['name'];
                 }
             }
         })->setParseIntoTransform(function (&$info, $value) use($permName, $invert) {
             if (isset($invert[$value])) {
                 $info['fields'][$permName] = $invert[$value];
             }
         });
     } else {
         // Handle multi-selection fields
         $schema->addNew($permName, 'multi-id')->setLabel($name)->addQuerySource('itemId', 'object_id')->addQuerySource('categories', 'categories')->setRenderTransform(function ($value, $extra) use($matching) {
             $categories = $matching($extra);
             return implode(';', $categories);
         })->setParseIntoTransform(function (&$info, $value) use($permName) {
             $values = explode(';', $value);
             $values = array_map('trim', $values);
             $info['fields'][$permName] = implode(',', array_filter($values));
         });
         $schema->addNew($permName, 'multi-name')->setLabel($name)->addIncompatibility($permName, 'multi-id')->addQuerySource('itemId', 'object_id')->addQuerySource('categories', 'categories')->setRenderTransform(function ($value, $extra) use($matching, $sourceCategories) {
             $categories = $matching($extra);
             $categories = array_map(function ($cat) use($sourceCategories) {
                 if (isset($sourceCategories[$cat])) {
                     return $sourceCategories[$cat]['name'];
                 }
             }, $categories);
             return implode('; ', array_filter($categories));
         })->setParseIntoTransform(function (&$info, $value) use($permName, $invert) {
             $values = explode(';', $value);
             $values = array_map('trim', $values);
             $values = array_map(function ($name) use($invert) {
                 if (isset($invert[$name])) {
                     return $invert[$name];
                 }
             }, $values);
             $info['fields'][$permName] = implode(',', array_filter($values));
         });
     }
     foreach ($sourceCategories as $cat) {
         $this->addCheckboxColumn($schema, $matching, $permName, $cat['categId'], $cat['name']);
     }
     return $schema;
 }
Beispiel #17
0
 function getTabularSchema()
 {
     $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
     $permName = $this->getConfiguration('permName');
     $name = $this->getConfiguration('name');
     $possibilities = $this->getPossibilities();
     $invert = array_flip($possibilities);
     $schema->addNew($permName, 'code')->setLabel($name)->setRenderTransform(function ($value) {
         return $value;
     })->setParseIntoTransform(function (&$info, $value) use($permName) {
         $info['fields'][$permName] = $value;
     });
     $schema->addNew($permName, 'text')->setLabel($name)->addIncompatibility($permName, 'code')->setRenderTransform(function ($value) use($possibilities) {
         if (isset($possibilities[$value])) {
             return $possibilities[$value];
         }
     })->setParseIntoTransform(function (&$info, $value) use($permName, $invert) {
         if (isset($invert[$value])) {
             $info['fields'][$permName] = $invert[$value];
         }
     });
     $schema->addNew($permName, 'flag')->setLabel($name)->setPlainReplacement('text')->setRenderTransform(function ($value) use($possibilities) {
         if (isset($possibilities[$value])) {
             return $this->renderImage($value, $possibilities[$value]);
         }
     });
     $schema->addNew($permName, 'flag-and-text')->setLabel($name)->setPlainReplacement('text')->setRenderTransform(function ($value) use($possibilities) {
         if (isset($possibilities[$value])) {
             $label = $possibilities[$value];
             return $this->renderImage($value, $label) . ' ' . smarty_modifier_escape($label);
         }
     });
     return $schema;
 }