#forms #typo3 #typoscript
#формы #typo3 #typoscript
Вопрос:
На веб-сайте Typo3 форма интегрирована. Действие должно быть перенаправлено в пользовательскую функцию typoscript.
Это то, что я пробовал до сих пор:
Код изменяемой формы (отрывок):
<form action="{f:cObject(typoscriptObjectPath: 'lib.mynlreg')}" method="post">
<input type="text" name="email" placeholder="Ihre E-Mail-Adresse">
<input type="submit" name="send" value="Jetzt registrieren" class="submit" />
</form>
Библиотека typoscript:
lib.mynlreg = USER_INT
lib.mynlreg {
userFunc = VendorExtensionmyClass->myFunction
}
И класс:
class myClass {
public function myFunction($content, $conf) {
$arguments = $this->request->getArguments();
$formEmail = $arguments['email'];
return '<div>' . $formEmail . '</div>';
}
}
Я ожидаю получить содержимое поля формы «электронная почта», но после отправки страница выдает ошибку. Вопрос в том, как мне передать переменные post в пользовательскую функцию? Спасибо за любую помощь!
Комментарии:
1. Вы пробовали это $variables = TYPO3 CMS Core Utility GeneralUtility::_GP(’email’);??
Ответ №1:
$this->request
недоступно в пользовательской функции. Как говорит гаутамсин Мори, вам следует использовать TYPO3CMSCoreUtilityGeneralUtility::_GP('email');
, однако я не уверен, что вы понимаете, что делает f:cObject
ViewHelper.
С этим кодом ваш HTML перед отправкой формы будет:
<form action="<div></div>" method="post">
<input type="text" name="email" placeholder="Ihre E-Mail-Adresse">
<input type="submit" name="send" value="Jetzt registrieren" class="submit" />
</form>
Ваш HTML-код после отправки будет:
<form action="<div>filledInEmail</div>" method="post">
<input type="text" name="email" placeholder="Ihre E-Mail-Adresse">
<input type="submit" name="send" value="Jetzt registrieren" class="submit" />
</form>
Я бы рекомендовал создать расширение для этого, но если вы действительно хотите / нуждаетесь в том, чтобы сделать это вот так, я думаю, что вы ищете что-то вроде:
<f:cObject typoscriptObjectPath="lib.mynlreg" />
<form action="{uri.page(addQueryString: 1)}" method="post">
<input type="text" name="email" placeholder="Ihre E-Mail-Adresse">
<input type="submit" name="send" value="Jetzt registrieren" class="submit" />
</form>
Это создаст форму с действием на текущей странице (включая любую строку запроса). Затем вам нужно изменить пользовательскую функцию, чтобы возвращать пустую строку, если форма не была отправлена. Что-то вроде:
class myClass {
public function myFunction($content, $conf) {
$formEmail = TYPO3CMSCoreUtilityGeneralUtility::_GP('email');
if (empty($formEmail)) {
return '';
}
return '<div>' . $formEmail . '</div>';
}
}
Комментарии:
1. Привет, Руди, большое спасибо за твою помощь! Моя главная проблема в том, что я должен использовать определенный PHP-скрипт в качестве действия для формы. Поскольку вы не должны указывать PHP-файл непосредственно как действие, я подумал, что было бы лучше определить пользовательскую функцию. Но я еще не так много знаю об этом, и это были мои первые тесты. Это в принципе правильный способ или есть способ получше?
2. Если вы используете TYPO3 9, вы могли бы посмотреть, можете ли вы использовать
form
расширение с пользовательским завершителем. У меня нет никакого опыта работы с этим, но я знаю, что это возможно и выглядит довольно просто: docs.typo3.org/typo3cms/extensions/form/Concepts / … . Если вы используете более старую версию TYPO3, вы, вероятно, могли бы использоватьpowermail
. Это также поддерживает пользовательские средства обработки: docs.typo3.org/typo3cms/extensions/powermail/ForDevelopers / …3. Я пробовал это с помощью завершителя Powermail — проблема в том, что электронное письмо всегда отправляется первым, потому что (как я прочитал в описании) завершитель всегда выполняется ПОСЛЕ его отправки. В качестве альтернативы Powermail предлагает возможность использовать DataProcessor, данные будут обработаны ПЕРЕД отправкой, но электронное письмо все равно будет отправлено после. Знаете ли вы, как запретить отправку электронных писем, чтобы фактически выполнялась только моя функция? Еще раз спасибо за вашу помощь!!!!
4. Я не очень хорошо знаком с powermail, но, если я правильно понимаю руководство, вы должны быть в состоянии отключить отправку электронной почты, установив
plugin.tx_powermail.settings.receiver.enable = 0
иplugin.tx_powermail.settings.sender.enable = 0
в TypoScript.5. Теперь я попробовал еще раз, как вы предложили это в начале вашего поста, и расширил функцию PHP в соответствии с моим заданным PHP-кодом — и это работает! Спасибо за вашу помощь!