Как вызвать метод (#element_validate/#after_build/...) из класса?

Главные вкладки

Аватар пользователя pawaptz pawaptz 3 октября 2013 в 11:35

Здравствуйте! Подскажите пож-ста!

Есть, к примеру, свой модуль. Конструирую форму. Например, на форме есть элемент тип date:

<?php  $fb->form['dateOfBirth'] = array(
    
'#type' => 'date',
    
'#title' => t('Дата рождения'),
    
'#disabled' => FALSE,
    
'#after_build' => array('bla_bla_bla'),
  );
?>

соответственно, если я объявляю bla_bla_bla прямо в модуле, то всё ок.
Но, я хочу часть логики вынести в отдельные классы, соотвествено хочется вызывать bla_bla_bla как static, но Logic::bla_bla_bla не проканает.
Учитывая, что и не очень хочется вообще его делать статичным, тогда через экземпляр бы... а вот как чото не пойму?

На сколько я понял в form.inc он вызывает саму ф-ю after_build типа по симв. сылке:

<?php
 
if (isset($element['#after_build']) && !isset($element['#after_build_done'])) {
    foreach (
$element['#after_build'] as $function) {
      
$element $function($element$form_state);
    }
    
$element['#after_build_done'] = TRUE;
  }
?>

В связи с этим вопрос - а как проканывает вызов ф-ии bla_bla_bla($element) с лишь 1 входным параметром??
И 2 вопрос - как мне сделать эту тему.
Прошу прощения. я джавист - могу некоторых вещей не догонять в силу незнаний.

Спасибо

Комментарии

Аватар пользователя deb deb 3 октября 2013 в 12:03

> часть логики вынести в отдельные классы

Зачем?

> $function($element, $form_state);

Если бы вызывалось через call_user_func то можно было бы указать в #after_build => array(array($instance, 'method')) а так нет. Ну можно конечно передать анонимную ф-ю, которая передаст управление куда надо, но это бред.

Аватар пользователя sg85 sg85 3 октября 2013 в 12:14

Про явиста сразу заметно.

Трогать ядро не стоит.

"pawaptz" wrote:
На сколько я понял в form.inc он вызывает саму ф-ю after_build типа по симв. сылке:

Это не символическая ссылка, это практически прямой вызов(в Пыхе так можно):

  $var = 'myfunc';
  $var($arg);
  //примерно равно
  myfunc($arg);

"pawaptz" wrote:
В связи с этим вопрос - а как проканывает вызов ф-ии bla_bla_bla($element) с лишь 1 входным параметром??

bla_bla_bla($element,$form_state);
при этом $form_state обычно является указателем, и функция каждый раз изменяет сам элемент на её результат, срабатывает единожды.

Реализация ООП в ПХП в большей степени идет на уровне костылей, кроме того сам друпал до 8й версии практически не приспособлен к ООП, потому проще всего будет на время вообще забыть что это такое(понадобится только для работы с контриб модулями) и вспоминать функциональное программирование.