Reputation: 522
I must create recursive directories and create a file for every folder. I want like this:
modules/ modules/default modules/default/test_module modules/default/test_module/a modules/default/test_module/a/test_module.php modules/default/test_module/m modules/default/test_module/m/test_module.php modules/default/test_module/c modules/default/test_module/c/test_module.php modules/root modules/root/test_module modules/root/test_module/a modules/root/test_module/a/test_module.php modules/root/test_module/m modules/root/test_module/m/test_module.php modules/root/test_module/c modules/root/test_module/c/test_module.php templates templates/default templates/default/test_module templates/default/test_module/test_module.tpl templates/root templates/root/test_module templates/root/test_module/test_module.tpl
But this code generate like this:
|-- modules | |-- default | | |-- root | | | `-- test_module | | | |-- a | | | | `-- test_module.php | | | |-- c | | | | `-- test_module.php | | | `-- m | | | `-- test_module.php | | `-- test_module | | |-- a | | | `-- test_module.php | | |-- c | | | `-- test_module.php | | `-- m | | `-- test_module.php | |-- root | | |-- index | | | `-- c | | | `-- index.php | | |-- modules | | | |-- a | | | | `-- modules.php | | | |-- c | | | | `-- modules.php | | | `-- m | | | `-- modules.php | | `-- user | | |-- a | | | `-- user.php | | |-- c | | | `-- user.php | | `-- m | | `-- user.php | `-- templates | `-- root | |-- default | | `-- test_module | | `-- test_module.tpl | `-- test_module | `-- test_module.tpl
Code is:
protected function createFiles($files, $parent_directory = null)
{
echo $parent_directory."\n</br>\n";
if (!$parent_directory) {
$parent_directory = www;
}
foreach ((array)$files as $key => $value) {
if (is_array($value)) {
if (!is_dir($parent_directory . $key)) {
mkdir($parent_directory . $key,0777);
chmod($parent_directory.$key,0777);
}
$parent_directory .= $key . '/';
$this->createFiles($value, $parent_directory);
} else {
$parent_directory_=$parent_directory.$key . '/';
if(!is_dir($parent_directory_)){
mkdir($parent_directory_,0777);
chmod($parent_directory_,0777);
}
$alias = explode('.',$value);
$alias = $alias[0];
$defaultAjaxContent = <<<AJAX
<?php
class {$alias} extends ajax{
/**
* Autocreated
**/
public function initAjax(){
}
}
?>
AJAX;
$file = fopen($parent_directory_.$value, 'w+');
$write = fwrite($file, $defaultAjaxContent);
if (!$write) {
throw new AjaxCatcher("{$parent_directory_}{$value} oluşturulurken beklenmedik bir hata oluştu. Lütfen tekrar deneyiniz. ");
}
}
}
//$file = fopen($files['default_ajax']);
return 1;
}
Reason why not use recursive mkdir :
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';
$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';
$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';
$this->createFiles($dirs);
thanks.
Upvotes: 3
Views: 331
Reputation: 522
My resolve :
protected function createModuleFiles($alias){
//Default kısmına php controller dosyası oluşturulacak.
$dirs = array();
$dirs['modules/default/'.$alias.'/a'] = $alias . ".php";
$dirs['modules/default/'.$alias.'/m'] = $alias . '.php';
$dirs['modules/default/'.$alias.'/c'] = $alias . '.php';
$dirs['modules/root/'.$alias.'/a'] = $alias . '.php';
$dirs['modules/root/'.$alias.'/m'] = $alias . '.php';
$dirs['modules/root/'.$alias.'/c'] = $alias . '.php';
$dirs['templates/root/'.$alias] = $alias . '.tpl';
$dirs['templates/default/'.$alias] = $alias . '.tpl';
$this->createFiles($dirs);
}
protected function createFiles($files){
foreach($files as $key=>$value){
if(!is_dir($key)){
mkdir(www.$key,0777,true);
}
chmod(www.$key,0777);
$alias = explode('.',$value);
$alias = $alias[0];
$type = end(explode('/',$key));
switch($type){
case 'a';
case 'c';
case 'm';
$content = $this->default_contents($alias,$type);
break;
default:
$content = $this->default_contents($alias,'tpl');
break;
}
$file = fopen(www.$key.'/'.$value, 'w+');
$write = fwrite($file, $content);
if (!$write) {
throw new AjaxCatcher("".www.$key.'/'.$value." an error. ");
}
}
return 1;
}
Upvotes: 0
Reputation: 95121
You can try
class Maker {
function createFiles($config, $path = null) {
foreach ( $config as $k => $v ) {
if (is_array($v)) {
mkdir($path . DIRECTORY_SEPARATOR . $k, 0777);
chmod($path . DIRECTORY_SEPARATOR . $k, 0777);
$this->createFiles($v,$path . DIRECTORY_SEPARATOR . $k);
}
else
{
touch($path . DIRECTORY_SEPARATOR . $v); //create the file
}
}
}
}
$alias = "test_module";
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';
$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';
$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';
$maker = new Maker();
$maker->createFiles($dirs, __DIR__ . "/test");
Upvotes: 0
Reputation: 10781
Take a look at the command touch
.
If you have a set list of files that you must create (with no contents), you can just iterate over your array calling it.
You will need to change your code to supply a single dimensional array of file names.
$dirs = array();
$dirs[] = "modules\default\$alias\a\$alias.php";
...
$dirs[] = "templates\default\$alias\$alias.tpl";
foreach($dirs as $file) {
touch($file);
}
Note that there are permission related restrictions, so read up on touch if you find the files are not being created.
Also of note, you are missing fclose()
in your example. You should look into file_put_contents()
as it handles the fopen/fwrite/fclose
for you.
Upvotes: 1
Reputation: 5764
I think the mkdir with recursive is still the best idea, all you need to do is to concat the nested array keys:
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';
$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';
$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';
// concat the keys (flatten the array)...
function prefixKey($prefix, $array) {
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, prefixKey($prefix . $key . '/', $value));
} else {
$result[$prefix . $key] = $value;
}
}
return $result;
}
// this is your function, use the prefixKey function to get the required
// pathstructure directly from your array...
function createFiles($dirs) {
$pathStructure = prefixKey('', $dirs);
// here you have the flatten keys (the path), the value is the file
foreach($pathStructure as $path => $file) {
// use mkdir with
if(!is_dir($path)) {
mkdir($path, 0777, true);
}
// and so on
}
}
Upvotes: 1