title: OpenCart: cant save custom module settings
body: <p>I have this trouble on admin part of my module. Im used chmod -R 777 for site contains folder, but method validate returns me permission_error</p>
  
  <p>OpenCart version: 2.3.0.2</p>
  
  <p>module code:</p>
  
  <pre><code>    &lt;?php
  class ControllerModulemymodul extends Controller {
      private $error = array();
  
      public function index() {
          $this-&gt;load-&gt;language('module/mymodul'); //подключаем наш языковой файл
  
          $this-&gt;load-&gt;model('setting/setting');   //подключаем модель setting, он позволяет сохранять настройки модуля в БД
  
          if (($this-&gt;request-&gt;server['REQUEST_METHOD'] == 'POST') &amp;&amp; $this-&gt;validate()) { //если мы нажали "Сохранить"  в панели, мы сохраняем текущие настройки
              $this-&gt;model_setting_setting-&gt;editSetting('mymodul', $this-&gt;request-&gt;post);
              $this-&gt;response-&gt;redirect($this-&gt;url-&gt;link('extension/module', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL'));
          }
  
           // ваши переменные
          $data['heading_title'] = $this-&gt;language-&gt;get('heading_title');
          $data['text_edit'] = $this-&gt;language-&gt;get('text_edit');
          $data['text_enabled'] = $this-&gt;language-&gt;get('text_enabled');
          $data['text_disabled'] = $this-&gt;language-&gt;get('text_disabled');     
  
          $data['entry_status'] = $this-&gt;language-&gt;get('entry_status');
  
          // если метод validate вернул warning, передадим его представлению
          if (isset($this-&gt;error['warning'])) {
              $data['error_warning'] = $this-&gt;error['warning'];
          } else {
              $data['error_warning'] = '';
          }
  
          // далее идет формирование массива breadcrumbs (хлебные крошки)
          $data['breadcrumbs'] = array();
          $data['breadcrumbs'][] = array(
              'text' =&gt; $this-&gt;language-&gt;get('text_home'),
              'href' =&gt; $this-&gt;url-&gt;link('common/dashboard', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL')
          );
          $data['breadcrumbs'][] = array(
              'text' =&gt; $this-&gt;language-&gt;get('text_module'),
              'href' =&gt; $this-&gt;url-&gt;link('extension/module', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL')
          );
          $data['breadcrumbs'][] = array(
              'text' =&gt; $this-&gt;language-&gt;get('heading_title'),
              'href' =&gt; $this-&gt;url-&gt;link('module/category', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL')
          );
  
          //ссылки для формы и кнопки "cancel"
          $data['action'] = $this-&gt;url-&gt;link('module/mymodul', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL');
          $data['cancel'] = $this-&gt;url-&gt;link('extension/module', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL');
  
          //переменная с статусом модуля
          if (isset($this-&gt;request-&gt;post['mymodul_status'])) {
              $data['mymodul_status'] = $this-&gt;request-&gt;post['mymodul_status'];
          } else {
              $data['mymodul_status'] = $this-&gt;config-&gt;get('mymodul_status');
          }
  
          //ссылки на контроллеры header,column_left,footer, иначе мы не сможем вывести заголовок, подвал и левое меню в файле представления
          $data['header'] = $this-&gt;load-&gt;controller('common/header');
          $data['column_left'] = $this-&gt;load-&gt;controller('common/column_left');
          $data['footer'] = $this-&gt;load-&gt;controller('common/footer');
  
          //в качестве файла представления модуля для панели администратора использовать файл mymodul.tpl
          $this-&gt;response-&gt;setOutput($this-&gt;load-&gt;view('module/mymodul.tpl', $data));
      }
  
      //обязательный метод в контроллере, он запускается для проверки разрешено ли пользователю изменять настройки данного модуля
      protected function validate() {
          if (!$this-&gt;user-&gt;hasPermission('modify', 'module/category')) {
              $this-&gt;error['warning'] = $this-&gt;language-&gt;get('error_permission');
          }
          return !$this-&gt;error;
      }
  }
  </code></pre>