Хорошо, давайте разберем проблему.
У вас есть массив. Каждый элемент в массиве является хешем. Одно (или более) из значений в этом хэше имеет для кодирования с использованием этой ужасной мерзости библиотеки. Но библиотека не может обрабатывать массивы.
Нам придется обрабатывать массив самостоятельно.
<rant>
Прежде чем мы начнем, я хотел бы еще раз выразить, насколько ужасно разработан этот код "Protector". Он написан для PHP4 и представляет собой код спагетти, заключенный в класс. Он неправильно использует свойства, как будто пользователь неправильно запомнил, как работают переменные экземпляра Java , и почему-то думал, что было бы целесообразно или разумно использовать PHP таким же образом. Если автор кода не оглядывается назад на этот отвратительный кусок байтов сейчас с полным пренебрежением, то с ним что-то серьезно не так.
</rant>
Я собираюсь основывать свои знания об этом классе на этой копии , поскольку предоставленная вами отформатирована даже хуже, чем оригинал.
Сначала давайте создадим список ключей внутреннего массива, которые нам нужно кодировать.
$keys_to_encode = array( 'user' );
В вашем примере кодирования в качестве кодируемого указывается только ключ user
Если вам нужно кодировать другие, просто добавьте больше элементов в этот массив.
Теперь давайте подготовим нашего "Защитника". Кажется, вам нужно либо указать шаблон, либо использовать метод MakePattern
, чтобы создать его. Мы собираемся указать его вручную, потому что MakePattern
может создавать практически бесполезные комбинации.
$stupid = new Protector();
$stupid->Pattern = 'E:I:E:R:D:I:E';
Это будет base64-кодировать, перевернуть регистр, base64 снова, перевернуть его, un-base64, перевернуть регистр, а затем повторно base64. Имейте в виду, что PHP-декодер base64 «правильно» игнорирует плохие отступы и неожиданные символы, что является единственной причиной, по которой работает base64-reverse-unbase64. Результирующая строка будет выглядеть как бред для людей, которые не знают, как выглядит base64, и не-base64 для бреда для людей, которые знают, как выглядит base64.
Если вам нужно кодировать значения определенным образом, вы бы просто изменили шаблон. Важно, чтобы вы либо жестко запрограммировали шаблон, либо сохранили его где-нибудь вместе с данными, потому что без него вам будет сложно выполнить декодирование. (Я имею в виду, это можно сделать вручную , но вы не хотите этого делать.) Я ожидаю, что ваш начальник даст вам конкретные инструкции по схеме, учитывая, что вы не не может использовать этот полный провал в классе.
Теперь пришло время обработать наши данные. Давайте представим, что $in
содержит ваш исходный массив.
$out = array();
foreach($in as $k => $target) {
foreach($keys_to_encode as $target_key) {
$stupid->ToEncode = $target[ $target_key ];
$target[ $target_key ] = $stupid->Encode();
}
$out[$k] = $target;
}
Это перебирает массив хэшей, затем внутри каждого хэша кодируются только те ключи, которые мы хотим закодировать. Закодированный хеш помещается в новый массив $out
. Это то, что вы передадите своему виджету дерева.
Декодирование так же просто. Вы заявили, что ваша цель - позволить пользователям редактировать определенные данные в виджете дерева, и вы, похоже, хотите защитить основные ключи. Это говорит мне, что вам , вероятно, нужно иметь дело только с одним из хэшей за раз. Поэтому я собираюсь написать этот пример декодирования, используя только одно значение, $whatever
.
$stupidest = new Protector();
$stupidest->Pattern = 'E:I:E:R:D:I:E'; // SAME PATTERN!
$stupidest->ToDecode = $whatever;
$decoded = $stupidest->Decode();
Опять же, критически , что вы используете тот же шаблон декодирования здесь.
Что касается фактического взаимодействия с древовидным виджетом, то вы сами там. Я знаю только о ExtJS достаточно, чтобы знать, что он существует и с создателями графического интерфейса действительно интересно играть.