Нужна помощь с пользовательскими базовыми настройками модуля joomla 1.6?

Я пишу модуль интеграции для нашего продукта, чтобы он мог войти на любую страницу Joomla 1.6. Мне нужна помощь с получением пользовательских данных (из API) в части основных настроек, но я не могу найти способ их получить.

Если вы посмотрите документацию по созданию модуля, то настройки для вашего модуля вы задали в формате XML. Это оставляет вам возможность жестко кодировать любые значения или выборки без каких-либо динамических опций. По сути, я хочу настроить очень простой модуль, который принимает три основных свойства: URL-адрес (используется для определения пути к API) Ключ API (ключ API) Выбор списка (подключается к API и получает имена списков из вашей учетной записи. .)

Выбор списка будет естественным образом меняться для ключа API каждого пользователя, но, поскольку вы настраиваете модуль с файлом XML, я не вижу способа обойти жесткое кодирование параметров выбора списка.

Скажите, пожалуйста, можете ли вы создать динамический <select> с параметрами в модуле Joomla 1.6.

ПРИМЕЧАНИЕ. Я говорю 1.6, потому что существует большая разница между разработкой 1.5 и 1.6 в Joomla.


person Etienne Marais    schedule 20.04.2011    source источник


Ответы (2)


Что ж, после адской борьбы и никакой помощи здесь я наконец могу сказать, что я сделал это. Вот процесс для всех гуглеров в будущем:

Чтобы создать динамическое выпадающее меню, вам нужно сделать кучу вещей, чтобы Joomla, наконец, собрала его воедино.

Также не забудьте внимательно прочитать документацию. Методы этого ответа в ней не содержатся, но, возможно, кто-то проснется и когда-нибудь поместит ее туда.

Итак, после изучения того, как архитектура 1.6 объединяет переменные модуля с помощью XML-файла сборки, мы приступаем.

XML будет выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<extension type="module" version="1.6.0" client="site">
    <name>...</name>
    <author>...</author>
    <creationDate>April 2011</creationDate>
    <copyright>Copyright (C) 2011 ... All rights reserved.</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
    <authorEmail>...</authorEmail>
    <authorUrl>...</authorUrl>
    <version>1.6.0</version>
    <description>
        ...
    </description>
    <files>
        <filename module="mod_your_mod">mod_your_mod.php</filename>
        <filename>helper.php</filename>
        <filename>index.html</filename>
        <folder>tmpl</folder>
        <folder>elements</folder>
        <folder>lib</folder>
    </files>
    <languages />
    <help />
    <config>
        <fields name="params">
            <fieldset name="basic">
                <!-- Custom field, list selection from API -->
                <!-- Path to module external parameters -->
                <field addfieldpath="/modules/mod_your_mod/elements" 
                    name="mod_your_mod_id_selection" <!-- Name of variable -->
                    type="lists" <!-- New variable type -->
                    default="" 
                    label="Select lists" 
                    description="This is the list selection, where you select the list a contact can subscribe to." />
            </fieldset>
            <fieldset
                name="advanced">
                <field
                    name="layout"
                    type="modulelayout"
                    label="JFIELD_ALT_LAYOUT_LABEL"
                    description="JFIELD_ALT_MODULE_LAYOUT_DESC" />
                <field
                    name="moduleclass_sfx"
                    type="text"
                    label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
                    description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC" />
                <field
                    name="cache"
                    type="list"
                    default="1"
                    label="COM_MODULES_FIELD_CACHING_LABEL"
                    description="COM_MODULES_FIELD_CACHING_DESC">
                    <option
                        value="1">JGLOBAL_USE_GLOBAL</option>
                    <option
                        value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
                </field>
                <field
                    name="cache_time"
                    type="text"
                    default="900"
                    label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
                    description="COM_MODULES_FIELD_CACHE_TIME_DESC" />
                <field
                    name="cachemode"
                    type="hidden"
                    default="itemid">
                    <option value="itemid"></option>
                </field>
            </fieldset>
        </fields>
    </config>
</extension>

Итак, следуя пути реализации модуля Joomla здесь и здесь я добавил новый тип переменной параметра в папку elements как lists.php, см. имя того же типа, что и тип, который вы объявили в файле XML.

Класс внутри этого файла выглядит так:

<?php
// No direct access
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
jimport('joomla.html.html');
//import the necessary class definition for formfield
jimport('joomla.form.formfield');

// Include API utility file
require_once(dirname(__FILE__) . '/../lib/your_api.php');

class JFormFieldLists extends JFormField
{
    /**
     * The form field type.
     *
     * @var  string
     * @since 1.6
     */
    protected $type = 'lists'; //the form field type see the name is the same

    /**
     * Method to retrieve the lists that resides in your application using the API.
     *
     * @return array The field option objects.
     * @since 1.6
     */
    protected function getInput()
    {
        $options = array();
        $attr = '';

        $attr .= ' multiple="multiple"';
        $attr .= ' style="width:220px;height:220px;"';

        // Get the database instance
        $db = JFactory::getDbo();
        // Build the select query
        $query = 'SELECT params FROM jos_modules'
            . ' WHERE module="mod_your_mod"';
        $db->setQuery($query);
        $params = $db->loadObjectList();

        // Decode the options to get thje api key and url
        $options = json_decode($params[0]->params, true);

        // Gracefully catch empty fields
        if ( empty($options['api_key']) === true )
        {
            $tmp = JHtml::_(
                'select.option',
                0,
                'No lists available, please add an API key'
            );

            $lists[] = $tmp;

            // The dropdown output, return empty list if no API key specified
            return JHTML::_(
                'select.genericlist',
                $lists,
                $this->name,
                trim($attr),
                'value',
                'text',
                $this->value,
                $this->id
            );
        }
        if ( empty($options['url']) === true )
        {
            $tmp = JHtml::_(
                'select.option',
                0,
                'No lists available, please add the enterprise URL'
            );

            $lists[] = $tmp;

            // The dropdown output, return empty list if no API key specified
            return JHTML::_(
                'select.genericlist',
                $lists,
                $this->name,
                trim($attr),
                'value',
                'text',
                $this->value,
                $this->id
            );

        }

        // Create a new API utility class
        $api = new APIClass(
            $options['url'],
            $options['api_key']
        );

        try
        {
            // Get the lists needed for subscription
            $response = $api->getLists();
        }
        catch ( Exception $e )
        {
            $tmp = JHtml::_(
                'select.option',
                0,
                'Could not connect to the API'
            );

            $lists[] = $tmp;

            // The dropdown output, return empty list if no API key specified
            return JHTML::_(
                'select.genericlist',
                $lists,
                $this->name,
                trim($attr),
                'value',
                'text',
                $this->value,
                $this->id
            );
        }

        $lists = array();

        // Builds the options for the dropdown
        foreach ( $response['data'] as $list )
        {
            // Build options object here
            $tmp = JHtml::_(
                'select.option',
                $list['list_id'],
                $list['list_name']
            );

            $lists[] = $tmp;
        }

        // The dropdown output

        /* The name of the select box MUST be the same as in the XML file otherwise 
         * saving your selection using Joomla will NOT work. Also if you want to make it 
         * multiple selects don't forget the [].
         */
        return JHTML::_(
            'select.genericlist',
            $lists,
            'jform[params][mod_your_mod_id_selection][]',
            trim($attr),
            'value',
            'text',
            $this->value,
            $this->id
        );

    }

}

?>

Таким образом, вы будете знать, когда все работает, потому что ваш выбор из раскрывающегося списка, созданного API (следовательно, полностью динамического), будет сохранен в записи базы данных модуля с именем поля выбора, которое вы можете легко получить, вызвав:

$api_key = $params->get('api_key', '');

в вашем файле модуля. В данном случае это называется mod_your_mod.php.

Я очень надеюсь, что это поможет вам при определении настраиваемых параметров в бэкенде ваших модулей Joomla 1.6. Это позволяет выполнять экстремальные настройки и тесно интегрируется с любым приложением, которое вы хотите использовать с API.

Единственным недостатком является то, что он может быть медленным, но при использовании множества проверок он корректно терпит неудачу, когда API не работает или не извлекает данные правильно. В целом очень неприятная CMS для работы, но это только мое мнение.

person Etienne Marais    schedule 06.06.2011

Существует также гораздо более простое решение, если ваши потребности являются базовыми: http://docs.joomla.org/SQL_form_field_type

Существует тип поля формы "sql":

<field name="title" type="sql" default="10" label="Select an article" query="SELECT id AS value, title FROM #__content" />

(Я сочувствую вашему разочарованию - документация ужасна, разбросана и ее трудно найти)

person Still don't know everything    schedule 30.09.2011
comment
Спасибо, но дело в том, что это будет работать только в том случае, если у вас есть данные локально. Это использует API для получения значений для заполнения раскрывающегося списка. - person Etienne Marais; 03.10.2011
comment
Ой, я невнимательно прочитал ваш пост. Я наткнулся на него, пытаясь посмотреть, сможете ли вы сделать то, что я опубликовал. - person Still don't know everything; 05.10.2011