Есть некий модуль, в котором реализован класс, использующий стандартный EntityDefaultUIController. В нём есть публичная функция overviewForm, которая выводит специфическую форму.
Как в моем модуле оформить код так, чтобы переопределить вывод этой формы, что где нужно указать?
Было бы сделано обычными формами бы - через alter залез бы и поменял, одна функция. А тут что писать надо и где? Как-то с контроллерами не приходилось ещё работать...
Фактически просто нужно переопределить одну функцию в классе. Как это сделать? Попытка решить проблему в лоб заканчивается так
Fatal error: Call to undefined method MyUIController::load() in X:\home\mysite\www\includes\common.inc on line 7991
Комментарии
Так и нужно.
А так не выходит - Друпал не может найти эти формы. Они спрятаны в классе и по _alter их не переопределить.
В каком смысле "Друпал не может найти эти функции"?
Покажите как альтерите.
Нет разницы как строится форма - рендеринг стандартный. И альтрация перед рендером вызывается, а не в процессе построения.
echo "--$form_id--";
}
return;
}
Ничего не находит, кроме головной формы( головная форма состоит из 4 форм, типа как на admin/people, нужна только одна форма - которая список выводит) -
в которой вообще ничего нет, кроме как указания, что строиться она должна из класса .Да, тут есть уже готовый вывод. Но мне нужно сформировать одну из подформ - переписать функцию(метод) её формирования, и вот к этому методу я никак не могу получить доступ.
Ещё раз поясняю - форма, нужная мне, определена в КЛАССЕ.
Там она видимо и строится
<?php public function overviewForm($form, &$form_state) {
form_load_include($form_state, 'inc', 'group', 'admin/group');
if (
$form_state['rebuild']) {$args = array_merge(array($form, &$form_state), $form_state['rebuild_info']['args']);
return call_user_func_array($form_state['rebuild_info']['callback'], $args);
}
$form['#submit'] = array('group_filters_form_submit');
$form['filters'] = group_filters_form();
$form['options'] = group_options_form();
$form['groups'] = group_groups_form($this->overviewPagerLimit); // Вот ЭТУ строчку надо поменять - чтобы тут вывод сделать другим....
$form['pager'] = array('#markup' => theme('pager'));
return
$form;}?>
Ок. И я еще раз поясню - нет разницы где и как строится форма. Рендеринг происходит отдельно.
Вам нужно определить ID формы, и далее в модуле произвести альтер:
Step 1:
<?php
function MY_MODULE_form_alter(&$form, &$form_state, $form_id) {
var_dump($form_id);
// Или, если стоит devel, можно так:
// dpm($form_id);
}
?>
Step 2:
<?php
function MY_MODULE_form_FORM_ID_alter(&$form, &$form_state) {
// Производите необходимые манипуляции
}
?>
Step 3:
Полезные ссылки:
Короче данный частный случай решили, ок.
А как в принципе метод класса в Друпале переопределять? Есть класс, в нем метод. Как, не патча модуль, в нем поменять поведение метода?
Методы не переопределяют.
Можно отнаследоваться от родительского (необходимого) класса и переопределить в нем метод.
С новым (своим, дочерним) классом производить нужные действия.
В 7м друпале - большую часть (все что сделано "друпал-вейно") можно альтерить и изменять на разных этапах.
Хорошо, как же тут drupal-way "переопределить" метод? Я и пытаюсь наследовать.
<?php
function mymodule_entity_info_alter(&$entity_info) {
$entity_info['group']['controller class'] = 'MyUIController';
}
?><?php class MyUIController extends EntityDefaultUIController {
public function overviewForm($form, &$form_state) {
Здесь типа переопределяем
return $form;
}
}
?>Контроллер находится, но сразу выскакивает фатальная ошибка, указанная выше.
Что я делаю не так?
PS Блин, простейшая ошибка. Надо было $entity_info['group']['admin ui']['controller class'] = 'MyUIController';
Ошибка говорит об отсутствии метода load().
Что не так - не готов сказать. Нужно видеть и понимать картину целиком.
Да ошибся, не заметил, что не тот класс переопределяю...
ЗЫ - используйте Devel для удобного просмотра массивов, после установки:
<?php
function MY_MODULE_form_FORM_ID_alter(&$form, &$form_state) {
dpm($form);
}
?>
покажет Вам все, из чего состоит форма.