it-swarm.com.de

Holen Sie sich Modulparameter mit Schleife

Ich erstelle ein Modul für eine Website und um die Modulparameter zu erhalten, gehe ich folgendermaßen vor:

//-- 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');

Aber dieses Modul muss ~ 40 Firmen unterstützen, was bedeutet, dass ich diesen Code 40 Mal wiederholen müsste und nur die Nummer nach "Firma" ändern müsste ($company2_enable = $params->get('company2_enable');, $company3_enable = $params->get('company3_enable'); usw.)

Gibt es eine Möglichkeit, eine Schleife für das Objekt $params Zu verwenden, um dies effektiver zu machen?

4
johanpw

Ich werde die Methode der wiederholbaren Formularfelder etwas vertiefen.

Erstens würde ich 1 wiederholbares Formularfeld für alle Namen verwenden, ein anderes für alle Logos und so weiter. Hier wäre also das Formularfeld für den Firmennamen:

<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>

Fügen Sie in Ihrer helper.php Folgendes hinzu, um die json-codierten Formularfelder zu durchsuchen:

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

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

In Ihrer mod_mymodule.php Datei müssen Sie den Helfer und die Funktion folgendermaßen aufrufen:

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) );

Dann können Sie in Ihrer default.php Ihre foreach -Schleife hinzufügen:

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

Ich bevorzuge diese Methode, da Sie nur den Code für das Firmenlogo, das Bild und die Beschreibung kopieren müssen und nicht 40 Mal (für jede einzelne Firma).

Hoffe, das hilft in irgendeiner Weise, Form oder Gestalt

4
Lodder

wenn Sie Joomla 3.2+ verwenden, können Sie wiederholbares Feld verwenden. Wenn Sie 3.1 oder älter verwenden, wird empfohlen eigenes Feld erstellen enthält ein Array von Feldern.

sie erhalten also $params->get('company'); und dies gibt die gesamte Menge für Unternehmen zurück.

3
Lanah

Ich möchte dieser Antwort die Aussage voranstellen, dass dies nicht die ideale Lösung zum Speichern und Abrufen einer dynamischen Liste von Parametern ist. Der "richtige" Weg wäre, eine benutzerdefinierte Tabelle in Ihrer Joomla-Datenbank zu verwenden.

Um Ihre Frage zu beantworten: Wenn Sie die Anzahl der Unternehmen kennen, können Sie eine Schleife zum Abrufen Ihrer Parameter folgendermaßen verwenden:

$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;

Wenn Sie die Anzahl der Parameter nicht kennen, wird es etwas komplizierter. Sie müssten eine do ... while-Schleife verwenden, um zu überprüfen, ob ein Null-Ergebnis zurückgegeben wird:

$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)

Ich habe keinen Code getestet, aber die Kernkonzepte sind da. Ich würde dringend empfehlen, Lanahs Rat zu befolgen und das wiederholbare Feld zu verwenden, wenn Sie Version 3.4.x verwenden, oder eine benutzerdefinierte Datenbanktabelle zu erstellen und zu verwenden, wenn Ihre Version niedriger ist.

Viel Glück!

3
Brian Bolli