Your IP : 216.73.216.224


Current Path : /var/www/html/plugins/osmembership/fields/src/Extension/
Upload File :
Current File : /var/www/html/plugins/osmembership/fields/src/Extension/Fields.php

<?php
/**
 * @package        Joomla
 * @subpackage     Membership Pro
 * @author         Tuan Pham Ngoc
 * @copyright      Copyright (C) 2012 - 2026 Ossolution Team
 * @license        GNU/GPL, see LICENSE.php
 */

namespace JoomDonation\MembershipPro\Plugin\MembershipPro\Fields\Extension;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Event\DispatcherInterface;
use Joomla\Event\Event;
use Joomla\Event\SubscriberInterface;
use MPFEventResult;

defined('_JEXEC') or die;

class Fields extends CMSPlugin implements SubscriberInterface
{
	use DatabaseAwareTrait;
	use MPFEventResult;

	public static function getSubscribedEvents(): array
	{
		return [
			'onEditSubscriptionPlan'      => 'onEditSubscriptionPlan',
			'onAfterSaveSubscriptionPlan' => 'onAfterSaveSubscriptionPlan',
		];
	}

	/**
	 * Constructor.
	 *
	 * @param   DispatcherInterface  $dispatcher  The dispatcher
	 * @param   array                $config      An optional associative array of configuration settings
	 */
	public function __construct(DispatcherInterface $dispatcher, array $config)
	{
		parent::__construct($dispatcher, $config);
	}

	/**
	 * Render setting form
	 *
	 * @param   Event  $event
	 *
	 * @return void
	 */
	public function onEditSubscriptionPlan(Event $event): void
	{
		/* @var \OSMembershipTablePlan $row */
		[$row] = array_values($event->getArguments());

		if (!$this->isExecutable())
		{
			return;
		}

		ob_start();

		$this->loadLanguage();

		$this->drawSettingForm($row);

		$result = [
			'title' => Text::_('OSM_FIELDS_ASSIGNMENT'),
			'form'  => ob_get_clean(),
		];

		$this->addResult($event, $result);
	}

	/**
	 * Store setting into database, in this case, use params field of plans table
	 *
	 * @param   Event  $event
	 *
	 * @return void
	 */
	public function onAfterSaveSubscriptionPlan(Event $event): void
	{
		/**
		 * @var string                   $context
		 * @var \OSMembershipTablePlan   $row
		 * @var array                    $data
		 * @var                          $isNew
		 */
		[$context, $row, $data, $isNew] = array_values($event->getArguments());

		if (!$this->isExecutable())
		{
			return;
		}

		$db         = $this->getDatabase();
		$query      = $db->getQuery(true);
		$formFields = $data['subscription_form_fields'] ?? [];
		$formFields = array_filter($formFields);

		if (!$isNew)
		{
			$query->delete('#__osmembership_field_plan')
				->where('plan_id = ' . $row->id);
			$db->setQuery($query)
				->execute();
		}

		if (!count($formFields))
		{
			return;
		}

		$query->clear()
			->insert('#__osmembership_field_plan')
			->columns($db->quoteName(['field_id', 'plan_id']));

		foreach ($formFields as $field)
		{
			$query->values(implode(',', $db->quote([$field, $row->id])));
		}

		$db->setQuery($query)
			->execute();
	}

	/**
	 * Method to check if the plugin is executable
	 *
	 * @return bool
	 */
	private function isExecutable()
	{
		if ($this->getApplication()->isClient('site') && !$this->params->get('show_on_frontend'))
		{
			return false;
		}

		return true;
	}

	/**
	 * Display form allows users to change settings on subscription plan add/edit screen
	 *
	 * @param   \OSMembershipTablePlan  $row
	 */
	private function drawSettingForm($row)
	{
		$db    = $this->getDatabase();
		$query = $db->getQuery(true)
			->select('id, plan_id, name, title')
			->from('#__osmembership_fields')
			->where('published = 1')
			->order('plan_id, ordering');
		$db->setQuery($query);
		$rowFields = $db->loadObjectList();

		$selectedFieldIds = [];

		// Load assigned fields for this event
		if ($row->id)
		{
			$query->clear()
				->select('field_id')
				->from('#__osmembership_field_plan')
				->where('plan_id = ' . $row->id);
			$db->setQuery($query);
			$selectedFieldIds = $db->loadColumn();
		}

		$bootstrapHelper = \OSMembershipHelperBootstrap::getInstance();
		$rowFluid        = $bootstrapHelper->getClassMapping('row-fluid');
		$spanClass       = $bootstrapHelper->getClassMapping('span3');
		?>
		<div class="<?php
		echo $rowFluid; ?>">
			<?php
			foreach ($rowFields as $rowField)
			{
				$attributes = [];

				if ($rowField->plan_id == 0 || $rowField->name == 'email')
				{
					$attributes[] = 'disabled';
					$attributes[] = 'checked';
				}
				elseif (in_array($rowField->id, $selectedFieldIds))
				{
					$attributes[] = 'checked';
				}
				?>
				<div class="<?php
				echo $spanClass; ?>">
					<label class="checkbox">
						<input type="checkbox" value="<?php
						echo $rowField->id ?>"
						       name="subscription_form_fields[]"<?php
						if (count($attributes))
						{
							echo ' ' . implode(' ', $attributes);
						} ?>><?php
						echo '[' . $rowField->id . '] - ' . $rowField->title; ?>
					</label>
				</div>
				<?php
			}
			?>
		</div>
		<?php
	}
}