Как сделать редирект в PHP после выполнения кода в загруженной странице?

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

Аватар пользователя natalikarn natalikarn 1 ноября 2020 в 17:22

Всем хорошего настроения!i

Появился вопрос, думаю многим будет интересно.

Как сделать, чтобы при загрузке страницы, выполнялся код (у меня там запись в базу добавляется об успешном входе), а в конце происходила автоматическая пере-адресация на другую страницу, чтобы избежать лишних щелканий кнопок пользователем.

нужно дописать код переадресации в конце имеющейся функции?
Это возможно?

Такой вариант не работает..
header("Location: http://example.com/myOtherPage.php");

Комментарии

Аватар пользователя natalikarn natalikarn 1 ноября 2020 в 17:40

на страницу выведен блок из моего модуля, в нем функция, где перехватывается параметр в строке запроса и в базу записывается статус входа по нажатию кнопки, вот эту кнопку я бы убрала, да и вообще страницу тоже, но она нужна как промежуточный параметр, вот и появилась такая идея добавить в конец функции, после записи в базу данных код с переадресацией

Аватар пользователя vlucas vlucas 1 ноября 2020 в 18:26

Что-то вы явно не то делаете...
Вам что нужно конкретно?
При входе посетителя на сайт писать что-то в базу читая параметры? Если примерно так, то вам не нужна ни страница, ни блок. Смотрите в сторону хуков или событий. Выберите подходящий и там реализуйте ваш функционал.

Аватар пользователя natalikarn natalikarn 2 ноября 2020 в 14:57

Вот так сокращенно выглядит мой код

public function buildForm(array $form, FormStateInterface $form_state) {

 . . .

 $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) {
  }

}

переадресация не происходит, я уже совсем запуталась, что я делаю не так?

Аватар пользователя gun_dose gun_dose 2 ноября 2020 в 15:22

У вас тут вообще каша полная. Зачем вам генерировать какую-то форму, если вы сразу собираетесь редиректить со страницы?

Аватар пользователя marassa marassa 2 ноября 2020 в 15:36

natalikarn wrote: что я делаю не так?

Вы, похоже, не понимаете как вообще устроен веб...

natalikarn wrote: чтобы при загрузке страницы, выполнялся код

Загрузка страницы происходит на клиенте, в браузере. Единственный код, который может там выполняться, это JavaScript.

natalikarn wrote: у меня там запись в базу добавляется об успешном входе

JavaScript в браузере никак не может добавить запись в базу данных на сервере.

Аватар пользователя marassa marassa 2 ноября 2020 в 16:09

А что ajax - он разве может добавить запись в базу без выполнения php-кода на сервере? И зачем здесь ajax, если (насколько я понял из сумбурного объяснения) никакого действия пользователя вообще не предполагается, а предполагается (зачем-то) загрузить другую страницу немедленно после загрузки (зачем-то) страницы с формой (зачем она тогда?).

Аватар пользователя gun_dose gun_dose 2 ноября 2020 в 17:20

А вот тут похоже ты не понимаешь. Допустим, делаем контроллер для валидации одноразовых ссылок. Контроллер принимает GET-параметры и в зависимости от них возвращает тебе страницу, либо редирект.

Ну во всяком случае, конкретно эту задачу я понял так)))

Аватар пользователя marassa marassa 2 ноября 2020 в 17:36

gun_dose wrote: Допустим, делаем контроллер для валидации одноразовых ссылок. Контроллер принимает GET-параметры и в зависимости от них возвращает тебе страницу, либо редирект.

Тогда при чем тут "загрузка страницы" и "щелкание кнопок пользователем"?

gun_dose wrote: конкретно эту задачу я понял так)))

А у меня телепатические способности хуже развиты)

Аватар пользователя natalikarn natalikarn 2 ноября 2020 в 21:34

Добрый вечер)
Пишу все на php в своем модуле, в базу данные тоже оттуда летят, в аджакс только результат вывожу на страницу в html .
Я долго искала как сделать автоматическую отправку формы, чтобы пользователю при переходе на промежуточную страницу обрабатывался код и происходила переадресация после этого, без жатия кнопки, но что-то лыжи у меня буксуют.. опыта еще маловато для этого.
Вышла из положения тем, что кнопка выгружает все данные на эту-же страницу но вот другая беда - эта кнопка она прям вечная, я ее никакими кодами убрать не могу после нажатия, она так и висит над текстом и ничего ее не берет.

Аватар пользователя natalikarn natalikarn 3 ноября 2020 в 0:20

Очевидно мне надо сделать промежуточную страницу, только для того, чтобы производилась запись о смене статуса, с передачей параметра и происходила после этого переадресация и получение параметра на результативную страницу.
Осталось понять как это сделать, я пока только с формами в своем модуле начала шаманить на php в друпал))), так понимаю это уже класс автозагрузки надо смотреть?

Аватар пользователя natalikarn natalikarn 3 ноября 2020 в 11:23

Благодарю, вот иногда действительно не хватает малюсенького пинка в нужном направлении, а все просто оказывается, сейчас запись данных происходит успешно в контроллере при загрузки страницы, осталось с переадресацие разобраться..

gun_dose wrote: а вместо рендер-массива отдавайте RedirectResponse

- не совсем поняла, что имеется ввиду)))

Аватар пользователя gun_dose gun_dose 3 ноября 2020 в 13:28

В примере в контроллере собирается какой-то массив и потом отдаётся через return $output. А вам надо типа так:

<?php
use Symfony\Component\HttpFoundation\RedirectResponse;
.....
// Some code
return new RedirectResponse('/my-awesome-page');
?>
Аватар пользователя natalikarn natalikarn 4 ноября 2020 в 20:01

Мне нужно сделать редирект по событию в форме в моем модуле, пробовала вот это

function num_form_test_form_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
    $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 формы, который я указала как -

  public function getFormId() {
    return 'test_form';
  }

Но это не работает

Аватар пользователя natalikarn natalikarn 4 ноября 2020 в 20:50

Почему каша? Как раз то, что ей было я уже исправила))) Просто задач оказалось несколько, редирект это уже дополнительно возникла необходимость по ходу дела..

Есть форма (выведена в моем модуле в блок) , в нее пользователь добавляет данные для аналитики, по нажатию сабмит происходит автоматическая регистрация события в базу.. это уже готово, а далее должна произойти переадресация на другую страницу, где выводятся результат анализа данных.

Все работает, не работает только переадресация в событии после обработки формы.. уже весь инет перерыла, все варианты, что нашла не едут

Аватар пользователя natalikarn natalikarn 5 ноября 2020 в 13:24

Проверила в тестовом варианте, пере-адресация сабмита работает, в форме нет - проблема оказалась в том, что мне нужно сделать пере-адресацию в ajax-запросе, так-как кнопка в форме обрабатывает вывод некоторых данных и выводит их в качестве сообщения, если происходит ошибка в ее заполнении.

    $form['actions']['submit'] = [
      '#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;

Аватар пользователя vlucas vlucas 5 ноября 2020 в 13:26

// Очевидно, что-то вроде этого, это конечно не правильно, написала так-как представляю должно было бы быть.. -
// 'url' => Url::fromRoute('num.numerology'),
// 'type' => 'GET',
// 'url' => '/stat?key='$key, или так..
// 'window.location.href' => '/stat?key='$key'

Dash 1

Аватар пользователя natalikarn natalikarn 5 ноября 2020 в 13:56

я написала, что это не правильно, это то как я представила как могло бы это быть в моем понимании.. вопрос можно закрыть, я его решила.

Аватар пользователя natalikarn natalikarn 5 ноября 2020 в 14:15

Я не уверенна, что это здесь будет уместно мое решение.. Я переписала сайт на vb.net - это оказалось для меня быстрее и проще на данный момент.
Вариант на друпал я продолжу для себя в качестве обучения php.
Благодарю за помощь, мне это действительно помогло, за месяц обучения я написала почти 20 модулей, не смотря на ранее, мои глупые вопросы)))

Аватар пользователя natalikarn natalikarn 5 ноября 2020 в 14:55

Убрала лишний сабмит и вывела ссылку в html, написала условие для не авторизованных пользователей, и вывела варианты вызова кнопки в массиве.

$butzakaz_ar = array(
        "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;

Аватар пользователя natalikarn natalikarn 5 ноября 2020 в 15:00

я с друпал работаю уже не первый год, но все как-то в роли пользователя, что ли - написала несколько интернет-магазинов и сайтов разных используя те инструменты, что есть в друпал. Встал вопрос развития, появились запросы на не стандартные решения, так-как не все можно взять в готовом варианте и использовать. После того, как меня кинул программист, что писал мне кастомные модули для друпал сайтов я решила сама изучить сей вопрос поближе и думаю это было верное решение

Аватар пользователя vlucas vlucas 5 ноября 2020 в 15:03

написала

я так понял, правильнее: "Накликали"

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

Просто у меня сложилось стойкое впечатление, что вы учите PHP совсем где-то вдали от друпал.

Уже советовал, ещё раз: учите Drupal API, именно его, если хотите развиваться как кодер Drupal и писать правильно, а не то что у вас в примерах.