Если требуется создать модальное пользовательское поле, например всплывающий выбор из списка.

Добавляем модальное поле в xml файл /components/com_library/views/book/default.xml

<fields name="request" addfieldpath="administrator/components/com_library/models/fields">
        <fieldset name="request">
                <field 
                        name="id" 
                        type="modal_book" 
                        label="COM_LIBRARY_BOOK_FIELD_ID_LABEL" 
                        description="COM_LIBRARY_BOOK_FIELD_ID_DESC"
                        required="true"
                />
        </fieldset>
</fields>

Обратите внимание, в обеих определениях "fields" и "fieldset" мы добавляем name="request" это преписывает пункту меню добавить имя поля и его значение в url. Пользовательский тип определяется как modal_book и место определения класса задается в addfieldpath.

Создаем клас вользовательского поля в administrator/components/com_library/models/fields/modal/book.php и переопределяем метод getInput()

 // No direct access
 defined('_JEXEC') or die('Restricted access');
 
 jimport('joomla.form.formfield');
 
 /**
  * Book form field class
  */
 class JFormFieldModal_Book extends JFormField
 {
        /**
         * field type
         * @var string
         */
        protected $type = 'Modal_Book';
		
		/**
		* Method to get the field input markup
		*/
		  protected function getInput()
		  {
				  // Load modal behavior
				  JHtml::_('behavior.modal', 'a.modal');
		 
				  // Build the script
				  $script = array();
				  $script[] = '    function jSelectBook_'.$this->id.'(id, title, object) {';
				  $script[] = '        document.id("'.$this->id.'_id").value = id;';
				  $script[] = '        document.id("'.$this->id.'_name").value = title;';
				  $script[] = '        SqueezeBox.close();';
				  $script[] = '    }';
		 
				  // Add to document head
				  JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
		 
				  // Setup variables for display
				  $html = array();
				  $link = 'index.php?option=com_library&view=books&layout=modal'.
						  '&tmpl=component&function=jSelectBook_'.$this->id;
		 
				  $db = JFactory::getDbo();
				  $query = $db->getQuery(true);
				  $query->select('title');
				  $query->from('#__books');
				  $query->where('id='.(int)$this->value);
				  $db->setQuery($query);
				  if (!$title = $db->loadResult()) {
						  JError::raiseWarning(500, $db->getErrorMsg());
				  }
				  if (empty($title)) {
						  $title = JText::_('COM_LIBRARY_FIELD_SELECT_BOOK');
				  }
				  $title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
		 
				  // The current book input field
				  $html[] = '<div class="fltlft">';
				  $html[] = '  <input type="text" id="'.$this->id.'_name" value="'.$title.'" disabled="disabled" size="35" />';
				  $html[] = '</div>';
		 
				  // The book select button
				  $html[] = '<div class="button2-left">';
				  $html[] = '  <div class="blank">';
				  $html[] = '    <a class="modal" title="'.JText::_('COM_LIBRARY_SELECT_BOOK_TITLE').'" href="'.$link.
								 '" rel="{handler: \'iframe\', size: {x:800, y:450}}">'.
								 JText::_('COM_LIBRARY_BUTTON_SELECT_BOOK').'</a>';
				  $html[] = '  </div>';
				  $html[] = '</div>';
		 
				  // The active book id field
				  if (0 == (int)$this->value) {
						  $value = '';
				  } else {
						  $value = (int)$this->value;
				  }
		 
				  // class='required' for client side validation
				  $class = '';
				  if ($this->required) {
						  $class = ' class="required modal-value"';
				  }
		 
				  $html[] = '<input type="hidden" id="'.$this->id.'_id"'.$class.' name="'.$this->name.'" value="'.$value.'" />';
		 
				  return implode("\n", $html);
		  }
 
 }

Давайте внимательнее посмотрим на метод.

    Загружается модальное поведение .
    Определяется JavaScript функция SelectBook_jform_request_id и будет вставлена в <head> документа с addScriptDeclaration (). Обратите внимание - $this->id = jform_request_id. 'Jform' это имя формы задана в способе loadForm в нашей модели. 'request'  отражает, что это поле запроса, и «ID» это имя нашей области.
    Есть несколько важных моментов, в ссылке, которая создается, чтобы открыть модальное окно. Мы включаем layout=modal, так как это будет альтернативный макет представления списка для 'books'.  function=jSelectBook_.$this->id будут использоваться в модальном макет определении функции, которая будет вызываться при выборе книги.
    Далее, мы получаем звание выбранного в данный момент книги из базы данных или вернуть исходное "Select Book" фразу, которая будет показана в поле ввода.
    Создается выход HTML . Обратите внимание, что это включает в себя скрытое поле, которое будет иметь идентификатор "jform_request_id_id 'и будет принимать значение документа книги, выбранного в модальном окне.

Дорабатываем вид. /administrator/components/com_library/views/books/view.html.php

Поскольку нам не понадобится панель инструментов

  public function display($tpl = null)
  {
          // Get data from the model
          $items = $this->get('Items');
          $pagination = $this->get('Pagination');
          $state = $this->get('State');
 
          // Check for errors
          if (count($errors = $this->get('Errors'))) {
                  JError::raiseError(500, implode('<br />', $errors));
                  return false;
          }
 
          // Assign data to the view
          $this->items = $items;
          $this->pagination = $pagination;
          $this->state = $state;
 
          // Only set the toolbar if not modal
          if ($this->getLayout() !== 'modal') {
                  $this->addToolBar();
          }
 
          // Display the template
          parent::display($tpl);
 
          // Set the document
          $this->setDocument();
  }

Создаем всплывающий шаблон.  /administrator/components/com_library/views/books/tmpl/modal.php.

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

// No direct access
 defined('_JEXEC') or die('Restricted access');
 
 // Load tooltip behavior
 JHtml::_('behavior.tooltip');
 $listOrder     = $this->escape($this->state->get('list.ordering'));
 $listDirn      = $this->escape($this->state->get('list.direction'));
 
 $function = JFactory::getApplication->input->getCmd('function', 'jSelectBook');
?>
<form action="<?php echo $this->action; ?>" method="post" name="adminForm" id="adminForm">
<table class="adminlist">
    <thead>
        <tr>
            <th>
                <?php echo JHtml::_('grid.sort', 'COM_LIBRARY_BOOKS_HEADING_TITLE', 'title', $listDirn, $listOrder); ?>
            </th>
            <th>
                <?php echo JHtml::_('grid.sort', 'COM_LIBRARY_BOOKS_HEADING_STATE', 'state', $listDirn, $listOrder); ?>
            </th>
            <th>
                <?php echo JHtml::_('grid.sort', 'COM_LIBRARY_BOOKS_HEADING_HITS', 'hits', $listDirn, $listOrder); ?>
            </th>
            <th>
                <?php echo JHtml::_('grid.sort', 'COM_LIBRARY_BOOKS_HEADING_CREATED', 'created', $listDirn, $listOrder); ?>
            </th>
            <th>
                <?php echo JHtml::_('grid.sort', 'COM_LIBRARY_BOOKS_HEADING_MODIFIED', 'modified', $listDirn, $listOrder); ?>
            </th>
            <th width="5">
                <?php echo JHtml::_('grid.sort', 'COM_LIBRARY_BOOKS_HEADING_ID', 'id', $listDirn, $listOrder); ?>
            </th>
        </tr>
    </thead>
    <tfoot>
        <tr>
            <td colspan="6"><?php echo $this->pagination->getListFooter(); ?></td>
        </tr>
    </tfoot>
    <tbody>
<?php foreach ($this->items as $i => $item) : ?>
        <tr class="row<?php echo $i % 2; ?>">
            <td>
                <a class="pointer" onclick="if (window.parent) window.parent.<?php echo $this->escape($function);?>('<?php echo $item->id; ?>', 
					'<?php echo $this->escape(addslashes($item->title)); ?>');">
					<?php echo $this->escape($item->title); ?></a>
            </td>
            <td align="center"><?php echo JHtml::_('jgrid.published', $item->state, $i, 'books.'); ?></td>
            <td align="right"><?php echo $item->hits; ?></td>
            <td align="center"><?php echo $item->created; ?></td>
            <td align="center"><?php echo $item->modified; ?></td>
            <td><?php echo $item->id; ?></td>
        </tr>
<?php endforeach; ?>
    </tbody>
</table>
<div>
    <input type="hidden" name="task" value="" />
    <input type="hidden" name="boxchecked" value="0" />
    <input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
    <input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
    <?php echo JHtml::_('form.token'); ?>
</div>
</form>

Этот макет имеет два важных отличия по сравнению с макета по умолчанию.

    Получаем имя яваскрипта функции, используя JFactory::getApplication->input->getCmd('function', 'jSelectBook').
    Значение $ функции затем используется в случае OnClick на название ссылки.