Работа со своими функциями в компоненте Office


Добрый день, у меня к Вам вопрос такой, как можно решить проблему расширения класса auth.class.php компонента Office? Изучая стандартный набор чанков, сниппетов и класса, заметил такую особенность, что в форме чанка передается параметр, например, такой:

<input type="hidden" name="action" value="auth/formLogin" />
Потом в классе auth.class.php который лежит в ядре ModX по пути: /core/components/office/controllers/auth.class.php можно увидеть функцию с таким же именем:

public function formLogin($data = array()) {...}
По аналогии я добавил свои две функции (SaveNewPassword и formRepair)в этот класс, а потом вызывал их в формах следующим образом:

<input type="hidden" name="action" value="auth/SaveNewPassword" />
и
<input type="hidden" name="action" value="auth/formRepair" />
соответственно в каждом своем чанке.

Вызываю это все дело в чанке вполне стандартно, таким образом:

[[!officeAuth? &groups=`Users` &tplLogin=`tpl.Office.auth.repair` &HybridAuth=`0`]]


Но все это дело не работает когда я отправляю форму со своего чанка, где в инпуте пишется что-то вроде этого:

<input type="hidden" name="action" value="auth/SaveNewPassword" />
то при отправки субмита это формы выскакивает сообщение «Не могу найти указанное действие». Как решить эту проблему? Подскажите? Может в классе auth.class.php есть какое-то неявное присвоение вызываемой функции по этим параметрам. Кто знает?
Андрей
20 октября 2014, 10:14
modx.pro
1 539
0

Комментарии: 6

Василий Наумкин
20 октября 2014, 15:17
0
Все запросы отправляются через ajax, на вот этот коннектор.

Там загружается Office и вызывается его метод loadAction. Он разделяет запрос на 2 строки: класса и метод.

Если запрошенный метод есть в указанном классе — он будет вызван. Если нет, ты получишь ошибку:
if (isset($this->controllers[$name])) {
	/* @var officeDefaultController $controller */
	$controller = $this->controllers[$name];
	$controller->setDefault($scriptProperties);

	if (empty($action)) {$action = $controller->getDefaultAction();}
	if (method_exists($controller, $action)) {
		return $controller->$action($scriptProperties);
	}
}
else {
	return 'Could not load controller "'.$name.'"';
}

Судя по твоему сообщению, ты этого момента даже не доходишь, потому что получаешь «не могу найти указанное действие» от action.php, а он такое выводит, если получает false от loadAction.

Когда loadAction возвращает false? Когда action пустой. А это значит, что твоя форма даже не передала нужный action — вот и ошибка.

Разбирайся с тем, что же ты отправляешь на коннектор. Ну и читай исходники, конечно.
    Андрей
    21 октября 2014, 06:56
    0
    Где идет формирование допустимых корректных action? Что такая конструкция auth/formLogin пропускает успешно через метод loadAction, а такая нет: auth/formRepair. Потому что когда в чанке меняю value с auth/formRepair на auth/formLogin, то форма отправляется успешно. Остальное все без изменений.
      Василий Наумкин
      21 октября 2014, 07:30
      0
      Я наверное, не по-русски пишу, потому что меня всё реже стали понимать.

      Добавь, пожалуйста, метод formRepair в класс Auth, который что-то вернёт. Желательно, как минимум:
      public function formRepair() {
      	return $this->success('Ура! Работает!');
      }
      Если такого метода нет, или он ничего не возвращает, или возвращает false — будет такая ошибка, как у тебя.

      Нет никаких допустимых корректных action, есть только доступные методы в классе.
        Андрей
        21 октября 2014, 07:44
        0
        Грубо как-то отвечаете, я еще учусь же просто, с modx месяц только, а с компонентом office и того меньше. Вы имеете ввиду, наверное, класс officeAuthController что хранится в файле auth.class, потому что такого класса Auth я не нашел (где он находится)? Если в класс officeAuthController, то я так и сделал добавил публичную функцию которая возвращает значение. Ладно спасибо за информацию, буду разбираться.
          Василий Наумкин
          21 октября 2014, 08:31
          +1
          Ну раз не нравится, как отвечаю — больше не буду.

          Извини, пожалуйста.
            Андрей
            21 октября 2014, 09:17
            0
            Все нормально. Просто дружелюбным надо быть к новичкам в работе, не давить их своим опытом. У меня на другом форуме большой рейтинг по прикладному программированию и классическому php-программированию, новичков я не упрекаю в незнании, а отвечаю если знаю конструктивно и просто.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    6