web-dev-qa-db-fra.com

Obtenir les paramètres du module en utilisant la boucle

Je crée un module pour un site Web et pour obtenir les paramètres du module, procédez comme suit:

//-- Get a parameter from the module's configuration
$company1_enable = $params->get('company1_enable');
$company1_name = $params->get('company1_name');
$company1_logo = $params->get('company1_logo');
$company1_image = $params->get('company1_image');
$company1_description = $params->get('company1_description');

Mais ce module doit prendre en charge environ 40 sociétés, ce qui signifie que je devrais répéter ce code 40 fois, en changeant le numéro après "société" ($company2_enable = $params->get('company2_enable');, $company3_enable = $params->get('company3_enable'); etc.).

Est-il possible d'utiliser une boucle sur l'objet $params Afin de le faire plus efficacement?

4
johanpw

Je vais aller un peu plus en profondeur avec la méthode des champs de formulaire répétables.

Premièrement, j'utiliserais un champ de formulaire répétable pour les noms tous, un autre pour les logos tous et ainsi de suite. Voici donc le champ de formulaire pour le nom de la société:

<field 
    name="company_name" 
    type="Repeatable" 
    icon="list" 
    label="Company Name"
    default='{"name":["Company 1", "Company 2", "etc.."]}'>
    <fields name="params">
        <fieldset hidden="true" name="company_name_modal" repeat="true">
            <field name="name"
                label="Image"
                type="text" />
        </fieldset>
    </fields>
</field>

Dans votre helper.php, ajoutez ce qui suit pour parcourir les champs de formulaire encodés en json:

class ModMyModuleHelper
{
    public function group_by_key($array) 
    {
        $result = array();

        foreach ($array as $sub) 
        {
            foreach ($sub as $k => $v) 
            {
                $result[$k][] = $v;
            }
        }
        return $result;
    }    
}

Dans votre fichier mod_mymodule.php, vous devrez appeler l’assistant et la fonction, comme suit:

require_once dirname(__FILE__) . '/helper.php';

$helper = new ModMyModuleHelper;

// Get names
$json_names = $params->get('company_name');
$names      = $helper->group_by_key( json_decode($json_names, true) );

Ensuite, dans votre default.php, vous pouvez ajouter votre boucle foreach:

foreach ($names as $index => $value) 
{                   
    echo '<p>' . $value[0] . '</p>';
}

Je préfère en quelque sorte cette méthode car il vous suffit de dupliquer le code pour le logo, l'image et la description de l'entreprise, plutôt que 40 fois (pour chaque entreprise).

J'espère que cela vous aidera d'une manière ou d'une autre

4
Lodder

si vous utilisez joomla 3.2+, vous pouvez utiliser champ répétable ou si vous utilisez 3.1 ou une version antérieure, il est recommandé de créer votre propre champ contient un tableau de champs.

donc vous vous retrouvez avec $params->get('company'); et cela retournera un ensemble complet pour les entreprises.

3
Lanah

Je voudrais faire précéder cette réponse par l’affirmation que ce n’est pas la solution idéale pour stocker et récupérer une liste dynamique de paramètres. La méthode "appropriée" consiste à utiliser une table personnalisée dans votre base de données Joomla.

Pour répondre à votre question, si vous connaissez le nombre d'entreprises, la façon d'utiliser une boucle pour récupérer vos paramètres serait la suivante:

$companies = array();
$company_count = 40;

for ($i = 1; $i <= $company_count; $i++)
{
    $companies[$i] = (object) array(
        'enable' => $params->get('company' . $i . '_enable', null);
        'name' => $params->get('company' . $i . '_name', null);
        'logo' => $params->get('company' . $i . '_logo', null);
        'image' => $params->get('company' . $i . '_image', null);
        'description' => $params->get('company' . $i . '_description', null);
    );
}

//Access company information by index from 1 to 40  
$companies[1]->enable;
$companies[1]->name;
$companies[1]->logo;
$companies[1]->image;
$companies[1]->description;

Si vous ne connaissez pas le nombre de paramètres, les choses se compliquent un peu. Vous devez utiliser un do ... while en vérifiant si un résultat nul est renvoyé:

$companies = array();
$continue = true;
$count = 0;

do
{
    $count++;
    $company = (object) array(
        'enable' => $params->get('company' . $count . '_enable', null);
        'name' => $params->get('company' . $count . '_name', null);
        'logo' => $params->get('company' . $count . '_logo', null);
        'image' => $params->get('company' . $count . '_image', null);
        'description' => $params->get('company' . $count . '_description', null);
    );

    if (empty($company->enable)
    {
        $continue = false;
    }
    else
    {
        $companies[$count] = $company;
    }

} while ($continue)

Je n'ai pas testé le code, mais les concepts de base sont là. Je suggère fortement de suivre les conseils de Lanah et d'utiliser le champ répétable si vous utilisez la version 3.4.x ou créez et utilisez une table de base de données personnalisée si votre version est inférieure.

Bonne chance!

3
Brian Bolli