Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

$form и \IPS\Patterns\ActiveRecord

Опубликовано:

Здравствуйте. Делаю новую форму для контроллеров, которые есть в админке и фронте. Класс реализован с помощью \IPS\Patterns\ActiveRecord, node здесь не нужен. Так как в node есть стандартно parent::form, а в ActiveRecord нету, в связи с этим у меня вопрос: если я просто реализую форму функцией public function formWizard() я смогу обращаться к ней из админки и фронта?

 

2. Спрошу тоже тут, так как вопрос касается этой формы. Сделал 3 шага, первый - указание данных, второй - их подтверждение, 3 - результат будет. При переходе на страницу app=wc3&module=players&controller=players&do=form шаги начинаются со 2, почему?

 

public function formWizard()
{
	return new \IPS\Helpers\Wizard(
		array(
			'wc3_gameplayers_connect_first_step' => function( $data )
			{
				$form = new \IPS\Helpers\Form( 'wc3_gameplayers_connect_first_step', 'wc3_gameplayers_connect_first_step_continue' );
				$form->add(new \IPS\Helpers\Form\Text('wc3_gameplayers_connected_name', NULL, true, array('maxLength' => 15)));
				$form->add(new \IPS\Helpers\Form\Select('wc3_gameplayers_connected_realm', NULL, true, array(
					'options' => array(
						NULL => '',
						'server.wc3.info' => 'WC3.Info',
						'iccup.wc3.info' => 'Iccup',
						'rubattle.net' => 'RuBattle',
						'eurobattle.net' => 'EuroBattle'
					),
				)));
				$form->add( new \IPS\Helpers\Form\Select( 'wc3_gameplayers_connected_role', NULL, TRUE, array( 'options' => \IPS\wc3\Player\Role::roles(), 'parse' => 'normal' ) ) );

				if ( $values = $form->values() )
				{
					$count = \IPS\Db::i()->select( 'COUNT(*)', static::$databaseTable, array( 'name=? AND server=?', mb_strtolower($values['wc3_gameplayers_connected_name']), $values['wc3_gameplayers_connected_realm'] ) )->first();

					if ( $count > 0 )
					{
						$form->error = \IPS\Member::loggedIn()->language()->addToStack( 'wc3_gameplayers_connected_error_count' );
						return $form;
					}

					return $values;
				}

				return $form;
			},
			'wc3_gameplayers_connect_second_step' => function ( $data )
			{
				$players = array();

				foreach ( \IPS\Db::i()->select( 'name, spoofedrealm', 'wc3_gameplayers', array( 'name=?', mb_strtolower($data['wc3_gameplayers_connected_name']) ) ) as $player )
				{
					$players[ $player['name'] ] = $player['spoofedrealm'];
				}

				$form = new \IPS\Helpers\Form( 'wc3_gameplayers_connect_second_step', 'wc3_gameplayers_connected_add' );
				$form->addHeader('wc3_gameplayers_connect_second_step_desc');
				$form->addMessage( 'Мы нашли ' . \count($players) . ' игроков.', 'ipsMessage ipsMessage_warning', TRUE );

				if ( $values = $form->values() )
				{
					$count = \IPS\Db::i()->select( 'COUNT(*)', static::$databaseTable, array( 'name=? AND server=?', mb_strtolower($values['wc3_gameplayers_connected_name']), $values['wc3_gameplayers_connected_realm'] ) )->first();

					if ( $count > 0 )
					{
						$form->error = \IPS\Member::loggedIn()->language()->addToStack( 'wc3_gameplayers_connected_error_count' );
						return $form;
					}

					return $values;
				}

				return $form;
			},
			'wc3_gameplayers_connect_finish_step' => function ( $data )
			{
				$form = new \IPS\Helpers\Form( 'wc3_gameplayers_connect_finish_step', 'continue' );
				$form->addMessage( 'import_date_explain' );

				return $form;
			}
		),
		\IPS\Http\Url::internal( 'app=wc3&module=players&controller=players&do=form' ), TRUE, NULL, TRUE, NULL
	);
}

 

3. Мне в форме в шагах 2 и 3 нужно будет использовать кастомный шаблон, для вывода тех или иных сообщений. Реализовывать его с помощью функций формы или же других?

 

4. На втором шаге мне нужно реализовать две кнопки, вернутся на предыдущий шаг и продолжить, как добавить вторую?

Изменено пользователем TemKa_SD

Рекомендованные сообщения

Опубликовано:

Есть у меня тут небольшой конфликт, можно как-то условие отобразить, если это админ панель, отображать один код, иначе другой?

Вариантов уйма

От добавления параметра до простой проверки

if (\IPS\Dispatcher::hasInstance() and \IPS\Dispatcher::i()->controllerLocation === 'admin')

Опубликовано:
  • Автор

Спасибо, сделал так:

 

$url = ( \IPS\Dispatcher::hasInstance() and \IPS\Dispatcher::i()->controllerLocation === 'front' ) ? static::url() : static::acpUrl();

 

public function url()
{
	return \IPS\Http\Url::internal( "app=wc3&module=gameplayers&controller=connected", 'front', 'gameplayersConnected' );
}

public function acpUrl()
{
	return \IPS\Http\Url::internal( "app=wc3&module=gameplayers&controller=connected", 'admin' );
}

 

У меня просто вот если взять этот пример, второй параметр должен быть furl если это фронт, а тут у меня язык просто, ну соответственно в админке нормально работает, а во фронте это читает как furl.

 

\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=wc3&module=gameplayers&controller=connected' ), 'wc3_gameplayers_connect_finish_success' );

Опубликовано:

Какой язык в furl?

Опубликовано:
  • Автор
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=wc3&module=gameplayers&controller=connected' ), 'wc3_gameplayers_connect_finish_success' );

- в этом коде wc3_gameplayers_connect_finish_success - ключ furl, а на самом деле это языковая фраза.

Опубликовано:

- в этом коде wc3_gameplayers_connect_finish_success - ключ furl, а на самом деле это языковая фраза.

С чего бы?

wc3_gameplayers_connect_finish_success - 2-ой параметр

	/**
 * Redirect
 *
 * @param	\IPS\Http\Url	$url			URL to redirect to
 * @param	string			$message		Optional message to display
 * @param	int				$httpStatusCode	HTTP Status Code
 * @param	bool			$forceScreen	If TRUE, an intermediate screen will be shown
 * @return	void
 */
public function redirect( $url, $message='', $httpStatusCode=301, $forceScreen=FALSE )

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.