function write($lang, $file, $key, $message) { $paths = explode('/', $file); array_unshift($paths, $lang); $path = OUTPUT; $file = $paths[sizeof($paths) - 1]; // create directories for ($i = 0; $i < sizeof($paths) - 1; $i++) { $dir = $paths[$i]; $path .= "/{$dir}"; if (!is_dir($path)) { mkdir($path); } } // create lang file $append_php = preg_match('/\\.php$/', $file) !== 1; $path .= "/{$file}" . ($append_php ? ".php" : ""); if (!is_file($path)) { touch($path); } $messages = (include $path); if (!is_array($messages)) { $messages = [$key => $message]; } else { $messages[$key] = $message; } $encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder(); $code = sprintf("<?php\n\nreturn %s;\n", $encoder->encode($messages, ['array.indent' => 4, 'array.align' => true])); file_put_contents($path, $code); }
<?php $usage = <<<DOCOPT Usage: gen <file> DOCOPT; $options = (new \Docopt\Handler())->handle($usage); $file = $options['<file>']; if ($file == '-') { $file = 'php://stdin'; } $data = json_decode(file_get_contents($file), !!'assoc'); $encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder(); echo $encoder->encode($data, ['array.inline' => true]); echo "\n";
Options: --php Handle PHP brackets, i.e. `name="foo[bar]"` --fmt=<fmt> Output format. json or php. [default: json] --no-initials Ignore initial values DOCOPT; $options = (new \Docopt\Handler())->handle($usage); $fmt = $options['--fmt']; $registry = new \Fulfil\Registry(); $reader = new \Fulfil\Ext\FormReader($registry); if ($options['--php']) { $reader->handlePHPBrackets = true; $reader->ignoreInitials = $options['--no-initials']; } if ($options['<file>'] == '-') { $options['<file>'] = 'php://stdin'; } $forms = $reader->readHTML(file_get_contents($options['<file>'])); foreach ($forms as $form) { $schema = $form->schema->export(); // move it to the bottom unset($form->schema); $form->schema = $schema; } if ($fmt == 'json') { echo json_encode($forms, JSON_PRETTY_PRINT) . "\n"; } elseif ($fmt == 'php') { $encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder(); echo $encoder->encode($forms, ['array.inline' => true]); echo "\n"; }
<?php require __DIR__ . '/../src/autoload.php'; // Configuration script asks user for database details $config = ['database' => 'mydb', 'hostname' => 'localhost', 'username' => 'dbuser', 'password' => 'dbpass']; // Store the configuration into a file $encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder(); file_put_contents('dbconf.php', '<?php return ' . $encoder->encode($config) . ';'); echo "Contents of the config file:" . PHP_EOL; readfile('dbconf.php'); echo PHP_EOL . PHP_EOL; // Load the config from the file $dbconf = (require 'dbconf.php'); echo "Array read from the config file:" . PHP_EOL; var_dump($dbconf); unlink('dbconf.php');
<?php /* This simple example demonstrates how to encode a simple array using default settings and while using minimal whitespace */ require __DIR__ . '/../src/autoload.php'; $encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder(); echo $encoder->encode(['foo' => 'bar', [1, true, false, null, 1.0]]); echo PHP_EOL; echo $encoder->encode(['foo' => 'bar', [1, true, false, null, 1.0]], ['whitespace' => false]);
/** * <h1>Описание</h1> * <pre> * Изменить значение любого параметра в любом конфиге laravel из каталога config. * Возвращает: 1 (в случае успеха) / 0 (в случае неудачи). * Может работать со значениями любых типов (в т.ч. массивами). * Новое значение должно быть того же типа, что и старое, иначе ошибка. * </pre> * <h1>Пример использования</h1> * <pre> * Изменим значение параметра locale конфига app на "en" * r1_config_set("app.locale", "en"); // 1 * </pre> * * @param string $option * @param string $value2set * * @return string */ function r1_config_set($option, $value2set) { try { // 1. Создать новую FS относительно каталога config $fs = r1_fs('config'); // 2. Разобрать $option на составляющие // // $option_arr[0] | имя конфига // $option_arr[1] | имя опции в конфиге // $option_arr[2..] | для опций-массивов, имена ключей массивов // $option_arr = explode('.', $option); if (!array_key_exists(0, $option_arr) || !array_key_exists(1, $option_arr)) { throw new \Exception('Значение параметра option не соответствует формату. Пример правильного значения: "M5.common_ison"'); } // 3. Получить значение опции $value = config($option_arr[0] . '.' . $option_arr[1]); // 4. Узнать тип значения опции $type = call_user_func(function () use($value) { switch (gettype($value)) { case 'boolean': return 'boolean'; case 'integer': return 'integer'; case 'double': return 'double'; case 'string': return 'string'; case 'array': return 'array'; case 'object': return 'object'; case 'resource': return 'resource'; case 'NULL': return 'NULL'; case 'unknown type': return 'unknown type'; default: return 'unknown type'; } }); if (in_array($type, ['object', 'resource', 'NULL', 'unknown type'])) { throw new \Exception("Хелпер r1_config_set не работает со значениями следующих типов: 'object', 'resource', 'NULL', 'unknown type'"); } // 5. Узнать тип значения $value2set $type2set = call_user_func(function () use($value2set) { switch (gettype($value2set)) { case 'boolean': return 'boolean'; case 'integer': return 'integer'; case 'double': return 'double'; case 'string': return 'string'; case 'array': return 'array'; case 'object': return 'object'; case 'resource': return 'resource'; case 'NULL': return 'NULL'; case 'unknown type': return 'unknown type'; default: return 'unknown type'; } }); if (in_array($type2set, ['object', 'resource', 'NULL', 'unknown type'])) { throw new \Exception("Хелпер r1_config_set не работает со значениями следующих типов: 'object', 'resource', 'NULL', 'unknown type'"); } if ($type != 'array' && $type !== $type2set) { throw new \Exception('Тип назначаемого значения должен соответствовать типу опции: ' . $type); } // 6. Если $type относится к тем, что умещаются на 1-й строке if (in_array($type, ['boolean', 'integer', 'double', 'string'])) { // 6.1. Преобразовать $value2set к его строковому эквиваленту switch (gettype($value2set)) { case 'boolean': $value2set = $value2set ? 'true' : 'false'; break; case 'integer': $value2set = '' . $value2set; break; case 'double': $value2set = '' . $value2set; break; case 'string': break; } // 6.2. Извлечь содержимое конфига $option_arr[0] $config = r1_fs('config')->get($option_arr[0] . '.php'); // 6.3. Найти и заменить в конфиге значение опции $option_arr[1] if (in_array($type, ['boolean', 'integer', 'double'])) { $config = preg_replace("/'" . $option_arr[1] . "' *=> *.*/ui", "'" . $option_arr[1] . "' => " . $value2set . ",", $config); } else { $config = preg_replace("/'" . $option_arr[1] . "' *=> *.*/ui", "'" . $option_arr[1] . "' => '" . $value2set . "',", $config); } // 6.4. Перезаписать $config r1_fs('config')->put($option_arr[0] . '.php', $config); } // 7. Если $type - массив if (in_array($type, ['array'])) { // 7.1. Извлечь значение, которое надо изменить, и его тип $value2change = call_user_func(function () use($value, $type, $option_arr, $type2set) { // 1] Если в $option_arr лишь 2 элемента, вернуть $value и $type if (count($option_arr) == 2) { return ["value" => $value, "type" => $type]; } // 2] Проверить существование искомого значения $arrpath = ""; for ($i = 2; $i < count($option_arr); $i++) { // 2.1] Дополнить $arrpath $arrpath = $arrpath . '.' . $option_arr[$i]; // 2.2] Проверить существование такого св-ва массива if (is_null(config($option_arr[0] . '.' . $option_arr[1] . $arrpath))) { throw new \Exception('Попытка изменить значение несуществующего в опции-массиве свойства: ' . $arrpath); } } // 3] Получить искомое значение $res_value = config($option_arr[0] . '.' . $option_arr[1] . $arrpath); // 4] Получить тип искомого значения $res_type = call_user_func(function () use($res_value) { switch (gettype($res_value)) { case 'boolean': return 'boolean'; case 'integer': return 'integer'; case 'double': return 'double'; case 'string': return 'string'; case 'array': return 'array'; case 'object': return 'object'; case 'resource': return 'resource'; case 'NULL': return 'NULL'; case 'unknown type': return 'unknown type'; default: return 'unknown type'; } }); if (in_array($res_type, ['object', 'resource', 'NULL', 'unknown type'])) { throw new \Exception("Хелпер r1_config_set не работает со значениями следующих типов: 'object', 'resource', 'NULL', 'unknown type'"); } if ($type2set !== $res_type) { throw new \Exception('Тип назначаемого значения должен соответствовать типу опции: ' . $res_type); } // 5] Вернуть результат return ["value" => $res_value, "type" => $res_type]; }); // 7.2. Узнать кол-во измерений массива config($option_arr[0].'.'.$option_arr[1].$arrpath $dimensions = r1_countdim(config($option_arr[0] . '.' . $option_arr[1])); // 7.3. Если $value2change['type'] относится к следующим if (in_array($value2change['type'], ['boolean', 'integer', 'double', 'string', 'array'])) { // 1] Преобразовать $value2set к его строковому эквиваленту switch (gettype($value2set)) { case 'boolean': $value2set = $value2set ? 'true' : 'false'; break; case 'integer': $value2set = '' . $value2set; break; case 'double': $value2set = '' . $value2set; break; case 'string': break; } // 2] Извлечь содержимое конфига $option_arr[0] $config = r1_fs('config')->get($option_arr[0] . '.php'); // 3] Напис.функц.для получения ссылки на св-во многомерного массива $get_multidem_prop = function &(&$array, $keys) { $result =& $array; foreach ($keys as &$key) { $result =& $result[$key]; } return $result; }; // 4] Изменить значение $value $keys = []; for ($i = 2; $i < count($option_arr); $i++) { array_push($keys, $option_arr[$i]); } $newvalue =& $get_multidem_prop($value, $keys); $newvalue = $value2set; // 5] Сформировать строку для замены $value // 5.1] Создать новый экземпляр энкодера $encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder(); // 5.2] Закодировать $value $value = $encoder->encode($value, ['array.indent' => 2, 'array.base' => 4]); // 6] Найти и заменить $value в $config // 6.1] Сформировать регулярное выражение $regex = "/'" . $option_arr[1] . "' *=> *\\[.*\\]"; // 6.2] Учесть кол-во измерений в массиве if (+$dimensions >= 2) { for ($i = 0; $i < count($dimensions) + 1; $i++) { $regex = $regex . '.*\\]'; } } // 6.3] Завершить регулярное выражение $regex = $regex . "/smuiU"; // 6.4] Заменить $config = preg_replace($regex, "'" . $option_arr[1] . "' => " . $value, $config); // 7] Перезаписать $config r1_fs('config')->put($option_arr[0] . '.php', $config); } } // n] Вернуть ответ return 1; } catch (\Exception $e) { write2log('При попытке назначить новое значение опции M5.common_ison возникла ошибка: ' . $e->getMessage(), ['r1_config_set']); return 0; } }