it-swarm-vi.com

Nhận tham số mô-đun bằng vòng lặp

Tôi đang tạo một mô-đun cho một trang web và để có được các tham số mô-đun, tôi làm một cái gì đó như thế này:

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

Nhưng mô-đun này phải hỗ trợ ~ 40 công ty, nghĩa là tôi sẽ phải lặp lại mã này 40 lần, chỉ thay đổi số sau "công ty" ($company2_enable = $params->get('company2_enable');, $company3_enable = $params->get('company3_enable'); vv)

Có cách nào để sử dụng vòng lặp trên đối tượng $params Để thực hiện việc này hiệu quả hơn không?

4
johanpw

Tôi sẽ đi sâu hơn một chút với phương pháp trường mẫu lặp lại.

Đầu tiên, tôi sẽ sử dụng 1 trường mẫu lặp lại cho tất cả tên, một tên khác cho tất cả logo, v.v. Vì vậy, đây sẽ là trường mẫu cho tên công ty:

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

Trong helper.php của bạn, hãy thêm các mục sau để đi qua các trường mẫu được mã hóa 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;
    }    
}

Trong tệp mod_mymodule.php của bạn, bạn sẽ cần gọi trình trợ giúp và hàm, như vậy:

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

Sau đó, trong default.php, bạn có thể thêm vòng lặp foreach:

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

Tôi thích phương pháp này vì bạn chỉ cần sao chép mã cho logo, hình ảnh và mô tả của công ty, thay vì 40 lần (cho mỗi công ty riêng lẻ).

Hy vọng điều này sẽ giúp một cách nào đó, hình dạng hoặc hình thức

4
Lodder

nếu bạn sử dụng j Joomla 3.2+, bạn có thể sử dụng trường lặp lại hoặc nếu bạn đang sử dụng 3.1 trở lên thì nên sử dụng tạo trường của riêng bạn chứa mảng trường.

vì vậy, bạn kết thúc với $params->get('company'); và điều này sẽ trả lại toàn bộ cho các công ty.

3
Lanah

Tôi muốn mở đầu câu trả lời này với tuyên bố đây không phải là giải pháp lý tưởng để lưu trữ và truy xuất danh sách động các tham số. Cách "thích hợp" sẽ là sử dụng bảng tùy chỉnh trong cơ sở dữ liệu Joomla của bạn.

Để trả lời câu hỏi của bạn, nếu bạn biết số lượng công ty, cách sử dụng vòng lặp để truy xuất thông số của bạn sẽ như vậy:

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

Nếu bạn không biết số lượng thông số, mọi thứ sẽ phức tạp hơn một chút. Bạn sẽ cần phải sử dụng một ... trong khi kiểm tra vòng lặp cho kết quả null được trả về:

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

Tôi chưa thử nghiệm bất kỳ mã nào, nhưng các khái niệm cốt lõi nằm ở đó. Tôi rất muốn đề xuất lời khuyên của Lanah và sử dụng trường lặp lại nếu bạn sử dụng phiên bản 3.4.x hoặc tạo và sử dụng bảng cơ sở dữ liệu tùy chỉnh nếu phiên bản của bạn thấp hơn.

Chúc may mắn!

3
Brian Bolli