We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 45324
    • 3 Posts
    Добрый день. При вызове определенной страницы из ExtJs пользуюсь методом:
    var createPage = MODx.action ? MODx.action['resource/create'] : 'resource/create';
    MODx.loadPage(createPage, 'class_key=dbCard');
    

    Если я передаю class_key, то по логике должен загружаться контроллер вида: dbCardManagerController, но подгружается страница создания нового ресурса. Это вполне логично, так как action = 'resource/create', а это стандартное действие.
    Контроллеры подгружаются в файле core/components/[componentName]/index.class
    public static function getInstance(modX &$modx, $className, array $config = array()) {
    		$action = call_user_func(array($className,'getDefaultController'));    //Здесь подгружается функция getDefaultController переданного атрибута class_key
    		if (isset($_REQUEST['action'])) {
    			$action = str_replace(array('../','./','.','-','@'),'',$_REQUEST['action']);   // а здесь action уже берется из переданного запроса, а это resource/create
    		}
    		
    		$className = self::getControllerClassName($action,$config['namespace']);  // здесь action resource/create, который передаётся из ExtJS-файла. Поэтому как получить нужный мне dash/create не могу понять.
    		$classPath = $config['namespace_path'].'controllers/'.$action.'.class.php';
    		require_once $classPath;
    		//* @var modManagerController $controller 
    		$controller = new $className($modx,$config);
    		return $controller;
    	}


    Подскажите пожалуйста можно ли использовать некоторое другое действие либо действие можно оставить тем же, но что-то исправить в выше приведенной функции? Как я понимаю, зацепка - это атрибут class_key, но как его использовать?

    This question has been answered by wdizant. See the first response.

      • 45324
      • 3 Posts
      Залез во внутреннюю структуру модкса. Нижний код как раз обрабатывает action resource/... Здесь же и проверяется class_key.
      public static function getInstance(modX &$modx,$className,array $config = array()) {
              $resourceClass = 'modDocument';
              $isDerivative = false;
              if (!empty($_REQUEST['class_key'])) {
                  $isDerivative = true;
                  $resourceClass = in_array($_REQUEST['class_key'],array('modDocument','modResource')) ? 'modDocument' : $_REQUEST['class_key'];
                  if ($resourceClass == 'modResource') $resourceClass = 'modDocument';
              } else if (!empty($_REQUEST['id']) && $_REQUEST['id'] != 'undefined') {
                  /** @var modResource $resource */
                  $resource = $modx->getObject('modResource',$_REQUEST['id']);
                  if ($resource && !in_array($resource->get('class_key'),array('modDocument','modResource'))) {
                      $isDerivative = true;
                      $resourceClass = $resource->get('class_key');
                  } else if ($resource && $resource->get('class_key') == 'modResource') { /* fix improper class key */
                      $resource->set('class_key','modDocument');
                      $resource->save();
                  }
              }
      	 if ($isDerivative) {
                  $resourceClass = str_replace(array('../','..','/','\\'),'',$resourceClass);
                  if (!class_exists($resourceClass) && !$modx->loadClass($resourceClass)) {
                                // Здесь не подключается необходимый мне класс
      				$resourceClass = 'modDocument'; 
                  }
      
                  $delegateView = $modx->call($resourceClass,'getControllerPath',array(&$modx));
                  $action = strtolower(str_replace(array('Resource','ManagerController'),'',$className));
                  $className = str_replace('mod','',$resourceClass).ucfirst($action).'ManagerController';
                  $controllerFile = $delegateView.$action.'.class.php';
                  if (!file_exists($controllerFile)) {
                      $modx->setOption('manager_theme','default');
                      $delegateView = $modx->call($resourceClass,'getControllerPath',array(&$modx));
                      $controllerFile = $delegateView.$action.'.class.php';
                  }
                  require_once $controllerFile;
              }
      		
              $controller = new $className($modx,$config);
              $controller->resourceClass = $resourceClass;
              return $controller;
          }

      Значит можно сделать промежуточный вывод. Код в первом сообщении обрабатывает лишь только конкретный контроллер. Вышеприведенный код обрабатывает действие (action), связанное с созданием ресурса. При обработке запроса class_key данная функция получает, но далее по коду не находит необходимый мне класс. Соответственно и не найдёт нужный контроллер. Поэтому используется стандартный класс и стандартный контроллер.
      Теперь необходимо найти ответ на вопрос "Почему не подключается нужный мне класс?"
      • discuss.answer
        • 45324
        • 3 Posts
        Решил проблему при помощи плагина на событие «OnHandleRequest». В нём прописал:
        if($modx->event->name == 'OnHandleRequest'){
                 $modx->addPackage('[myComponentName]', $modx->getOption('core_path').'components/[myComponentName]/model/','modx_[myComponentName]_'); 
        }