ti-enxame.com

Obter parâmetros do módulo usando loop

Estou criando um módulo para um site e, para obter os parâmetros do módulo, faço algo assim:

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

Mas este módulo deve suportar ~ 40 empresas, o que significa que eu precisaria repetir esse código 40 vezes, alterando apenas o número após "empresa" ($company2_enable = $params->get('company2_enable');, $company3_enable = $params->get('company3_enable'); etc.)

Existe alguma maneira de usar um loop no objeto $params Para fazer isso de forma mais eficaz?

4
johanpw

Vou aprofundar-me um pouco mais com o método de campos de formulário repetível.

Primeiramente, eu usaria 1 campo de formulário repetível para todos nomes, outro para todos logotipos e assim por diante. Então, aqui estaria o campo do formulário para o nome da empresa:

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

No seu helper.php, adicione o seguinte para percorrer os campos do formulário codificado pelo 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;
    }    
}

No seu arquivo mod_mymodule.php, você precisará chamar o auxiliar e a função, assim:

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

Em seu default.php, você pode adicionar seu loop foreach:

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

Eu meio que prefiro esse método, pois você só precisa duplicar o código do logotipo, imagem e descrição da empresa, em vez de 40 vezes (para cada empresa).

Espero que isso ajude de alguma forma, forma ou forma

4
Lodder

se você estiver usando o joomla 3.2+, poderá usar campo repetitivo ou se estiver usando o 3.1 e mais antigo, é recomendável criar o seu próprio campo contém uma matriz de campos.

então você acaba com $params->get('company'); e isso retornará todo o conjunto para as empresas.

3
Lanah

Gostaria de prefaciar esta resposta com a afirmação de que essa não é a solução ideal para armazenar e recuperar uma lista dinâmica de parâmetros. A maneira "adequada" seria usar uma tabela personalizada no seu banco de dados Joomla.

Para responder sua pergunta, se você souber o número de empresas, o caminho para utilizar um loop para recuperar seus parâmetros seria o seguinte:

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

Se você não sabe o número de parâmetros, as coisas ficam um pouco mais complicadas. Você precisaria usar um loop ... enquanto verifica se um resultado nulo está sendo retornado:

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

Eu não testei nenhum código, mas os conceitos principais estão lá. Eu ALTAMENTE sugeriria seguir o conselho de Lanah e usar o campo repetível se você estiver usando a versão 3.4.x ou criar e usar uma tabela de banco de dados personalizada se sua versão for menor.

Boa sorte!

3
Brian Bolli