View file engine/classes/inifile.class.php

File size: 10.79Kb
<?
/**
   * Класс для чтения и записи ini файла
   */ 
  
   class iniFile{
      /**
       * (string) Путь и имя ini файла
       */ 
      public $ini_file;
      /**
       * (string) Весь ini файл в виде строки (file_get_contents())
       */ 
      public $ini_data;
      /**
       *  (array) Содержимое ini файла после работы parse_ini_file(file, true)
       */ 
      public $ini_array = array();
      
      /**
       * Для превью ini массива (перед сохранением)
       */ 
       private $preview;
      
      const WRONG_EXT = 'У файла должно быть расширение *.ini';
      const NOT_FOUND = 'Указанный файл не найден';
      const WRONG_READ = 'Не возможно прочитать указанный файл';
      const ERROR_SAVE = 'Не могу сохранить файл';
      /**
       * @param string Путь/имя_файла
       * @return void
       */ 
      public function __construct($path_to_ini_file){
         $this->ini_file = $path_to_ini_file;        
         
         if(!preg_match("#\.ini$#", $this->ini_file)){
             $this->Exept(self::WRONG_EXT);       
         }
         else{
            if(file_exists($this->ini_file)){
                $this->ini_array = parse_ini_file($this->ini_file,true);
                $this->ini_data = file_get_contents($this->ini_file);
            }
         }    
      }
      
      /**
       * Метод выбрасывает исключения в случае ошибок
       * @param string - текст исключения
       */ 
      private function Exept($text){
          throw new Exception($text);  
      }
      
      /**
       * Метод для создания пустого ini файла
       * @param string Путь/имя_файла
       * @return bool
       */ 
      public function create(){ 
          return file_put_contents($this->ini_file,'');
      }
      /**
       * Метод вернёт содержимое ini файла в виде строки
       * @return string
       */ 
      public function readStringIni(){
          if(!file_exists($this->ini_file))
              $this->Exept(self::NOT_FOUND);
          elseif(!is_readable($this->ini_file))
              $this->Exept(self::WRONG_READ);
          else{
             return $this->ini_data;
          }              
      }
      /**
       * Метод возвращает распарсенный ini файл
       * @return array
       */ 
      public function read(){
          if(!file_exists($this->ini_file))
              $this->Exept(self::NOT_FOUND);
          elseif(!is_readable($this->ini_file))
              $this->Exept(self::WRONG_READ);
          else{
             return $this->ini_array;
          }    
      }   
      
      /**
       *  Метод добавляет секцию в файл
       *  @param string - наименовании секции
       *  @return void
       */    
       public function addSection($namesection){
            file_put_contents($this->ini_file, '['.$namesection.']'.PHP_EOL);
       }
       
      /**
       *  Метод добавляет параметр в секцию
       *  @param string - наименовании секции в которую добавляется параметр
       *  @param string - наименование параметра
       *  @param mixid - значение параметра
       *  @return void
       */    
       public function addParam($namesection, $nameparam, $value){
            $this->ini_array[$namesection][$nameparam]= $value;
       }
       
       
       /**
        * Метод удаляет целую секцию с параметрами 
        * @param string наиманование секции
        * @param bool  
        *  true - удалить 
        *  false - удалить только из массива - возможность предосмотра метод preview()
        * @return void
        */ 
        public function deleteSection($namesection, $drop=true){
            
             if(is_array($this->ini_array)){
                foreach($this->ini_array as $gen=>$param){
                    if($gen != $namesection){
                        foreach($param as $p=>$v){  
                             $change[$gen][$p] = $v;
                        }
                    }    
                }
                
                $this->preview = $change;
             }
             
             if($drop === true){
                 $this->ini_array = $this->preview;
                 $this->save();
             }
        }

       /**
        * Метод удаляет параметр из указанной секции 
        * @param string наиманование секции
        * @param string наименование параметра
        * @param bool  
        *  true - удалить 
        *  false - удалить только из массива - возможность предосмотра метод preview()
        * @return void
        */ 
        public function deleteParam($namesection, $paramname, $drop=true){
             if(is_array($this->ini_array)){
                foreach($this->ini_array as $gen=>$param){

                    if($gen == $namesection){
                        foreach($param as $p=>$v){
                            if($p != $paramname)
                                 $change[$gen][$p] = $v; 
                        }
                    }    
                }
                
                $this->preview = $change;
             }
             
             if($drop === true){
                 $this->ini_array = $this->preview;
                 $this->save();
             }           
        }  
        
        /**
         * Метод для смены имени секции
         * @param string старое имя
         * @param string новое имя
         * @param bool  
         *  true - удалить 
         *  false - удалить только из массива - возможность предосмотра метод preview()
         * 
         *  @return void   
         */
         public function changeSectionName($oldname, $newname,$change=true){
             if(is_array($this->ini_array)){
                foreach($this->ini_array as $gen=>$param){
                    if($gen == $oldname)
                        $gen = $newname;

                    foreach($param as $p=>$v){
                         $change[$gen][$p] = $v;
                    }

                }
                
                $this->preview = $change;
             }
             
             if($change === true){
                 $this->ini_array = $this->preview;
                 $this->save();
             }            
         } 

        /**
         * Метод для смены имени параметра секции
         * @param string имя секции
         * @param string старое имя
         * @param string новое имя
         * @param bool  
         *  true - удалить 
         *  false - удалить только из массива - возможность предосмотра метод preview()
         * 
         *  @return void   
         */
         public function changeParamName($namesection, $oldname, $newname,$change=true){
            
             if(is_array($this->ini_array)){
                foreach($this->ini_array as $gen=>$param){
                    if($gen == $namesection){
                        foreach($param as $p=>$v){
                             if($p == $oldname)
                                 $p = $newname;
                             
                             $change[$gen][$p] = $v;
                        }
                    }
                }

                $this->preview = $change;
             }
             
             if($change === true){
                 $this->ini_array = $this->preview;
                 $this->save();
             }            
         } 
        
        /**
         * Метод для изменения значения параметра конкретной секции
         * @param string имя секции
         * @param string имя параметра
         * @param string новое значение
         * @param bool  
         *  true - удалить 
         *  false - удалить только из массива - возможность предосмотра метод preview()
         *   
         * @return void
         */       
        public function changeParamValue($namesection, $nameparam, $newvalue,$set=true){
             if(is_array($this->ini_array)){
                foreach($this->ini_array as $gen=>$param){
                    if($gen == $namesection){
                        foreach($param as $p=>$v){
                             if($p == $nameparam)
                                 $v = $newvalue;
                             
                             $change[$gen][$p] = $v;
                        }
                    }
                }

                $this->preview = $change;
             }
             
             if($set === true){
                 $this->ini_array = $this->preview;
                 $this->save();
             }              
        }
        
        
        /**
         * Метод для мониторинга изменений массива ini файла во время редактирования с помощью класса
         * @return array
         */ 
        public function preview(){
                return $this->preview;
        }
       
       /**
        * Метод сохраняет добавленные секции и параметры в файл
        * @return bool
        */        
        public function save(){
            
            if(is_array($this->ini_array)){
                $string =  '';
                foreach($this->ini_array as $gen=>$param){
                     $string .= '['.$gen.']'.PHP_EOL;

                     foreach($param as $p=>$v){
                        $string .= $p.'='.$v.PHP_EOL;
                     }
                }
                if(!file_put_contents($this->ini_file,$string)){
                   $this->Exept(self::ERROR_SAVE);
                   return false;
                }   
                          
            }
            
            return true;  
        }
   }
   ?>