Всем хорошего настроения!i
Появился вопрос, думаю многим будет интересно.
Как сделать, чтобы при загрузке страницы, выполнялся код (у меня там запись в базу добавляется об успешном входе), а в конце происходила автоматическая пере-адресация на другую страницу, чтобы избежать лишних щелканий кнопок пользователем.
нужно дописать код переадресации в конце имеющейся функции?
Это возможно?
Такой вариант не работает..
header("Location: http://example.com/myOtherPage.php");
Комментарии
вам страница или редирект?
ну и всегда можно яваскриптом перебросить через window.location
Что из себя страница представляет?
на страницу выведен блок из моего модуля, в нем функция, где перехватывается параметр в строке запроса и в базу записывается статус входа по нажатию кнопки, вот эту кнопку я бы убрала, да и вообще страницу тоже, но она нужна как промежуточный параметр, вот и появилась такая идея добавить в конец функции, после записи в базу данных код с переадресацией
Что-то вы явно не то делаете...
Вам что нужно конкретно?
При входе посетителя на сайт писать что-то в базу читая параметры? Если примерно так, то вам не нужна ни страница, ни блок. Смотрите в сторону хуков или событий. Выберите подходящий и там реализуйте ваш функционал.
return new RedirectResponse($url);
Естественно, класс RedirectResponse нужно проимпортировать.
Вот так сокращенно выглядит мой код
. . .
$form['submit'] = [
'#id' => 'submit',
'#type' => 'submit',
'#value' => $this->t('Загрузить'),
'#ajax' => [
'callback' => '::getID',
],
];
$form['message'] = [
'#type' => 'markup',
'#markup' => '<div class="result"></div>',
];
return $form;
}
// Некий код..
. . .
// Переадресация на другую страницу
function setRedirectDestination(RedirectDestinationInterface $redirect_destination, $this)
{
$redirect_destination = "http://xxxxxxx.com/ru/node/1";
$this->redirectDestination = $redirect_destination;
return new RedirectResponse($this);
}
return $response;
}
/**
* Submitting the form.
*/
public function submitForm(array & $form, FormStateInterface $form_state) {
}
}
переадресация не происходит, я уже совсем запуталась, что я делаю не так?
У вас тут вообще каша полная. Зачем вам генерировать какую-то форму, если вы сразу собираетесь редиректить со страницы?
Вы, похоже, не понимаете как вообще устроен веб...
Загрузка страницы происходит на клиенте, в браузере. Единственный код, который может там выполняться, это JavaScript.
JavaScript в браузере никак не может добавить запись в базу данных на сервере.
А как же ajax?)
А что ajax - он разве может добавить запись в базу без выполнения php-кода на сервере? И зачем здесь ajax, если (насколько я понял из сумбурного объяснения) никакого действия пользователя вообще не предполагается, а предполагается (зачем-то) загрузить другую страницу немедленно после загрузки (зачем-то) страницы с формой (зачем она тогда?).
А вот тут похоже ты не понимаешь. Допустим, делаем контроллер для валидации одноразовых ссылок. Контроллер принимает GET-параметры и в зависимости от них возвращает тебе страницу, либо редирект.
Ну во всяком случае, конкретно эту задачу я понял так)))
Тогда при чем тут "загрузка страницы" и "щелкание кнопок пользователем"?
А у меня телепатические способности хуже развиты)
Ну я поэтому и предлагаю выкинуть всё из контроллера))))
Добрый вечер)
Пишу все на php в своем модуле, в базу данные тоже оттуда летят, в аджакс только результат вывожу на страницу в html .
Я долго искала как сделать автоматическую отправку формы, чтобы пользователю при переходе на промежуточную страницу обрабатывался код и происходила переадресация после этого, без жатия кнопки, но что-то лыжи у меня буксуют.. опыта еще маловато для этого.
Вышла из положения тем, что кнопка выгружает все данные на эту-же страницу но вот другая беда - эта кнопка она прям вечная, я ее никакими кодами убрать не могу после нажатия, она так и висит над текстом и ничего ее не берет.
js автоматически отправляйте форму.
мне бы пример какой, если имеется
первая ссылка из гугла https://learn.javascript.ru/forms-submit
Если взаимодействие юзера не требуется, то зачем вообще форма?
Очевидно мне надо сделать промежуточную страницу, только для того, чтобы производилась запись о смене статуса, с передачей параметра и происходила после этого переадресация и получение параметра на результативную страницу.
Осталось понять как это сделать, я пока только с формами в своем модуле начала шаманить на php в друпал))), так понимаю это уже класс автозагрузки надо смотреть?
Делайте контроллер, как описано тут. Там выполняйте свой код, а вместо рендер-массива отдавайте RedirectResponse
Благодарю, вот иногда действительно не хватает малюсенького пинка в нужном направлении, а все просто оказывается, сейчас запись данных происходит успешно в контроллере при загрузки страницы, осталось с переадресацие разобраться..
- не совсем поняла, что имеется ввиду)))
В примере в контроллере собирается какой-то массив и потом отдаётся через return $output. А вам надо типа так:
<?php
use Symfony\Component\HttpFoundation\RedirectResponse;
.....
// Some code
return new RedirectResponse('/my-awesome-page');
?>
Мне нужно сделать редирект по событию в форме в моем модуле, пробовала вот это
$form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}
function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
// Force redirect to "/sent"
$dest_url = "http://ххх.com/ru/servis_2";
$url = Url::fromUri('http://ххх.com/ru/servis_1');
$form_state->setRedirectUrl( $url );
}
где - num - это название модуля, а test_form - это id формы, который я указала как -
return 'test_form';
}
Но это не работает
Что за событие то?
согласен...
У вас тут процедурный подход или всё таки ООП???
Почему каша? Как раз то, что ей было я уже исправила))) Просто задач оказалось несколько, редирект это уже дополнительно возникла необходимость по ходу дела..
Есть форма (выведена в моем модуле в блок) , в нее пользователь добавляет данные для аналитики, по нажатию сабмит происходит автоматическая регистрация события в базу.. это уже готово, а далее должна произойти переадресация на другую страницу, где выводятся результат анализа данных.
Все работает, не работает только переадресация в событии после обработки формы.. уже весь инет перерыла, все варианты, что нашла не едут
Прямо в сабмите формы и реализуйте переадресацию. Вот пример
https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/modules/produ...
т.е. установите необходимый роут для переадресации в $form_state
Проверила в тестовом варианте, пере-адресация сабмита работает, в форме нет - проблема оказалась в том, что мне нужно сделать пере-адресацию в ajax-запросе, так-как кнопка в форме обрабатывает вывод некоторых данных и выводит их в качестве сообщения, если происходит ошибка в ее заполнении.
'#id' => 'submit',
'#type' => 'submit',
'#value' => $this->t('Тест'),
'#ajax' => [
'callback' => '::setCalcMess',
// Очевидно, что-то вроде этого, это конечно не правильно, написала так-как представляю должно было бы быть.. -
// 'url' => Url::fromRoute('num.numerology'),
// 'type' => 'GET',
// 'url' => '/stat?key='$key, или так..
// 'window.location.href' => '/stat?key='$key'
...
],
];
return $form;
я написала, что это не правильно, это то как я представила как могло бы это быть в моем понимании.. вопрос можно закрыть, я его решила.
Хорошим тоном считается приводить решение, для будущих поколений
Я не уверенна, что это здесь будет уместно мое решение.. Я переписала сайт на vb.net - это оказалось для меня быстрее и проще на данный момент.
Вариант на друпал я продолжу для себя в качестве обучения php.
Благодарю за помощь, мне это действительно помогло, за месяц обучения я написала почти 20 модулей, не смотря на ранее, мои глупые вопросы)))
Убрала лишний сабмит и вывела ссылку в html, написала условие для не авторизованных пользователей, и вывела варианты вызова кнопки в массиве.
"1" => "<a href=\"http://xxx.com/rezult?key=$key\"> Тест " . "</a>", // юзер авторизован...
"2" => "<a href=\"http://xxx.com/user/login\"> Авторизация на сайте " . "</a>", // ...
);
if ($GLOBALS["uid"] >= 1) {
$butrezult = $butzakaz_ar[1];
}
elseif ($GLOBALS["uid"] <= 0) {
$butrezult = $butzakaz_ar[2];
}
$response = new AjaxResponse();
$response->addCommand(
new HtmlCommand(
'.result_mes',
'<div class="link_div">' . $butrezult . '</div>'.
),);
return $response;
И всё же, вы PHP учите, или всё-таки Drupal API?
я с друпал работаю уже не первый год, но все как-то в роли пользователя, что ли - написала несколько интернет-магазинов и сайтов разных используя те инструменты, что есть в друпал. Встал вопрос развития, появились запросы на не стандартные решения, так-как не все можно взять в готовом варианте и использовать. После того, как меня кинул программист, что писал мне кастомные модули для друпал сайтов я решила сама изучить сей вопрос поближе и думаю это было верное решение
я так понял, правильнее: "Накликали"
Просто у меня сложилось стойкое впечатление, что вы учите PHP совсем где-то вдали от друпал.
Уже советовал, ещё раз: учите Drupal API, именно его, если хотите развиваться как кодер Drupal и писать правильно, а не то что у вас в примерах.
ага, точно накликала несколько сайтов))
А по-моему, вы только беду накликали.
вы же не знаете о моих проектах ничего.. почему беду то )))))) по себе судите что ли?