* @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Associations\Administrator\View\Association; use Joomla\CMS\Application\AdministratorApplication; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\View\GenericDataException; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Pagination\Pagination; use Joomla\CMS\Router\Route; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Toolbar\ToolbarHelper; use Joomla\Component\Associations\Administrator\Helper\AssociationsHelper; use Joomla\Component\Associations\Administrator\Model\AssociationModel; use Joomla\Input\Input; use Joomla\Registry\Registry; use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * View class for a list of articles. * * @since 3.7.0 */ class HtmlView extends BaseHtmlView { /** * An array of items * * @var array * * @since 3.7.0 */ protected $items = []; /** * The pagination object * * @var Pagination * * @since 3.7.0 */ protected $pagination; /** * The model state * * @var CMSObject * * @since 3.7.0 */ protected $state; /** * Selected item type properties. * * @var Registry * * @since 3.7.0 */ protected $itemType; /** * The application * * @var AdministratorApplication * @since 3.7.0 */ protected $app; /** * The ID of the reference language * * @var integer * @since 3.7.0 */ protected $referenceId = 0; /** * The type name * * @var string * @since 3.7.0 */ protected $typeName = ''; /** * The reference language * * @var string * @since 3.7.0 */ protected $referenceLanguage = ''; /** * The title of the reference language * * @var string * @since 3.7.0 */ protected $referenceTitle = ''; /** * The value of the reference title * * @var string * @since 3.7.0 */ protected $referenceTitleValue = ''; /** * The URL to the edit screen * * @var string * @since 3.7.0 */ protected $editUri = ''; /** * The ID of the target field * * @var string * @since 3.7.0 */ protected $targetId = ''; /** * The target language * * @var string * @since 3.7.0 */ protected $targetLanguage = ''; /** * The source of the target field * * @var string * @since 3.7.0 */ protected $defaultTargetSrc = ''; /** * The action to perform for the target field * * @var string * @since 3.7.0 */ protected $targetAction = ''; /** * The title of the target field * * @var string * @since 3.7.0 */ protected $targetTitle = ''; /** * The edit form * * @var Form * @since 3.7.0 */ protected $form; /** * Set if the option is set to save as copy * * @var boolean * @since 3.7.0 */ private $save2copy = false; /** * The type of language * * @var Registry * @since 3.7.0 */ private $type; /** * The supported types * * @var array * @since 3.7.0 */ private $typeSupports = []; /** * The extension name * * @var string * @since 3.7.0 */ private $extensionName = ''; /** * Display the view * * @param string $tpl The name of the template file to parse; automatically searches through the template paths. * * @return void * * @since 3.7.0 * * @throws \Exception */ public function display($tpl = null): void { /** @var AssociationModel $model */ $model = $this->getModel(); // Check for errors. if (\count($errors = $model->getErrors())) { throw new GenericDataException(implode("\n", $errors), 500); } $this->app = Factory::getApplication(); $this->form = $model->getForm(); /** @var Input $input */ $input = $this->app->input; $this->referenceId = $input->get('id', 0, 'int'); [$extensionName, $typeName] = explode('.', $input->get('itemtype', '', 'string'), 2); /** @var Registry $extension */ $extension = AssociationsHelper::getSupportedExtension($extensionName); $types = $extension->get('types'); if (\array_key_exists($typeName, $types)) { $this->type = $types[$typeName]; $this->typeSupports = []; $details = $this->type->get('details'); $this->save2copy = false; if (\array_key_exists('support', $details)) { $support = $details['support']; $this->typeSupports = $support; } if (!empty($this->typeSupports['save2copy'])) { $this->save2copy = true; } } $this->extensionName = $extensionName; $this->typeName = $typeName; $this->itemType = $extensionName . '.' . $typeName; $languageField = AssociationsHelper::getTypeFieldName($extensionName, $typeName, 'language'); $referenceId = $input->get('id', 0, 'int'); $reference = ArrayHelper::fromObject(AssociationsHelper::getItem($extensionName, $typeName, $referenceId)); $this->referenceLanguage = $reference[$languageField]; $this->referenceTitle = AssociationsHelper::getTypeFieldName($extensionName, $typeName, 'title'); $this->referenceTitleValue = $reference[$this->referenceTitle]; // Check for special case category $typeNameExploded = explode('.', $typeName); if (array_pop($typeNameExploded) === 'category') { $this->typeName = 'category'; if ($typeNameExploded) { $extensionName .= '.' . implode('.', $typeNameExploded); } $options = [ 'option' => 'com_categories', 'view' => 'category', 'extension' => $extensionName, 'tmpl' => 'component', ]; } else { $options = [ 'option' => $extensionName, 'view' => $typeName, 'extension' => $extensionName, 'tmpl' => 'component', ]; } // Reference and target edit links. $this->editUri = 'index.php?' . http_build_query($options); // Get target language. $this->targetId = '0'; $this->targetLanguage = ''; $this->defaultTargetSrc = ''; $this->targetAction = ''; $this->targetTitle = ''; if ($target = $input->get('target', '', 'string')) { $matches = preg_split("#[\:]+#", $target); $this->targetAction = $matches[2]; $this->targetId = $matches[1]; $this->targetLanguage = $matches[0]; $this->targetTitle = AssociationsHelper::getTypeFieldName($extensionName, $typeName, 'title'); $task = $typeName . '.' . $this->targetAction; /** * Let's put the target src into a variable to use in the javascript code * to avoid race conditions when the reference iframe loads. */ $this->document->addScriptOptions('targetSrc', Route::_($this->editUri . '&task=' . $task . '&id=' . (int) $this->targetId)); $this->form->setValue('itemlanguage', '', $this->targetLanguage . ':' . $this->targetId . ':' . $this->targetAction); } $this->addToolbar(); parent::display($tpl); } /** * Add the page title and toolbar. * * @return void * * @since 3.7.0 * * @throws \Exception */ protected function addToolbar(): void { // Hide main menu. $this->app->input->set('hidemainmenu', 1); $helper = AssociationsHelper::getExtensionHelper($this->extensionName); $title = $helper->getTypeTitle($this->typeName); $languageKey = strtoupper($this->extensionName . '_' . $title . 'S'); if ($this->typeName === 'category') { $languageKey = strtoupper($this->extensionName) . '_CATEGORIES'; } ToolbarHelper::title( Text::sprintf( 'COM_ASSOCIATIONS_TITLE_EDIT', Text::_($this->extensionName), Text::_($languageKey) ), 'language assoc' ); $bar = Toolbar::getInstance(); $bar->appendButton( 'Custom', '', 'reference' ); $bar->appendButton( 'Custom', '', 'target' ); if ($this->typeName === 'category' || $this->extensionName === 'com_menus' || $this->save2copy === true) { ToolbarHelper::custom('copy', 'copy.png', '', 'COM_ASSOCIATIONS_COPY_REFERENCE', false); } ToolbarHelper::cancel('association.cancel', 'JTOOLBAR_CLOSE'); ToolbarHelper::help('Multilingual_Associations:_Edit'); } }