it-swarm-tr.com

JFormField içinde 3.x'ten Joomla 2.5 farkları

Çeşitli eklentileri ile birlikte bir xml dosyası yüklemek için JForm kullanarak bunu yapmak için modüller için ekstra parametreler eklemek için bir eklenti kullanıyorum.

Ben kullanıyorum bu ve 3.0 ve yukarı çalışır, bir fieldset döngü alınır ve her "alan" JFormField bir örneğidir.

$field->name = 'plg_form_settings['.$field->name.']';
$content .= '<div class="control-group">';
    $content .= '<div class="control-label">';
        $content .= $field->label;
    $content .= '</div>';
    $content .= '<div class="controls">';
        $content .= $field->input;
    $content .= '</div>';
$content .= '</div>';

Gördüğünüz gibi, $field->name 'Un halka açık olduğunu varsayarak işe yaradı, ancak 2.5'te korunuyor (3'te beni şaşırtıyor, 3'ün hiçbir sürümünde hiç çalışmadı).

2.5 ve 3'te JFormField arasındaki farkları kontrol ettim ve büyük farklılıklar var, ancak şu ya da bu şekilde $field->name Özelliğine erişmem gerekiyor (yapabileceğimi görüyorum $field->__get('name') salt okunur erişim için), JFormField işlevselliğini göz ardı edebilirim, ancak geriye uyumluluk eklemek için biraz sayaç üretken görünüyor.

Joomla 3'te __set($name,$value) adında bir işlev var, ancak Joomla 2.5'te değil

Joomla 2.5'te alan adını (veya başka bir özelliği) geçersiz kılmanın "basit" bir yolu var mı?

5
Jordan Ramstad

Ben bu konuda sıkı çalışıyorum ve bir çözüm, diğer modüller yapmak ama nesnelerin birden çok katman (bu yüzden biraz anlamak zor) gizli gizli yapmak için "uygun" yolu ile geldim.

İlk önce sorunun JFormField içinde olduğunu düşündüm ama gerçekten değildi. Bu özelliklere erişmeye gerek yoktur, çünkü alanlar herhangi bir doğrudan kontrol vermek için yapılmamıştır.

İşte sahip olduğum diğer kod biraz.

if($form->loadFile($path.'/fields.xml')){
        $fieldset = $form->getFieldset();
        //SQL STUFF HERE TO GET $result
        $result = $db->loadObject();
        if(isset($result->params)){
            $moduleParams = json_decode($result->params);
        }else{
            $moduleParams = new stdClass;
        }
        foreach($fieldset as $index=>$field){
            $field->name = 'plg_form_settings['.$field->name.']';
            $content .= '<div class="control-group">';
                $content .= '<div class="control-label">';
                    $content .= $field->label;
                $content .= '</div>';
                $content .= '<div class="controls">';
                    $content .= $field->input;
                $content .= '</div>';
            $content .= '</div>';
        }
    }

Bu, alan kümesindeki her alanı döngüler ve JFormField daha fazla veya daha az salt okunur bir sınıf örneği döndürür. Yapılması gereken düzenlemeler JForm aracılığıyla yapılır.

if($form->loadFile($path.'/fields.xml')){
    $fieldset = $form->getFieldset();
    //SQL STUFF HERE TO GET $result
    $result = $db->loadObject();
    if(isset($result->params)){
        $moduleParams = json_decode($result->params);
    }else{
        $moduleParams = new stdClass;
    }
    $dataArray = array();
    //split the loop into 2, this way the data can be bound
    foreach($fieldset as $index=>$field){
        if($id!=0&&isset($moduleParams->{$index})){
            $dataArray[$index] = $moduleParams->{$index};
        }
    }
    //bind and reset to ensure it worked
    $form->bind($dataArray);
    $fieldset = $form->getFieldset();
    foreach($fieldset as $index=>$field){
        $output = '<div class="control-group">';
            $output .= '<div class="control-label">';
                $output .= $field->label;
            $output .= '</div>';
            $output .= '<div class="controls">';
                $output .= $field->input;
            $output .= '</div>';
        $output .= '</div>';
        $content .= $output;
    }
}

Gördüğünüz gibi 2 döngü kullandığım, biri sadece bir parametreyi bir alanla eşleştirmek (muhtemelen gerçek $ moduleParams nesnesini döngüye sokarak geliştirebilirim). Diğeri daha öncekiyle aynı olsa da. Arasında veri oluşturmak ve alan kümesi değişkeni "sıfırlamak" için veri bağlamak (gerekli olup olmadığını emin değilim ama hata ayıklama sürecinde zarar vermez. Ancak bu sadece $field->value bir form değerini bağladığınız için, diğer değişkenler hala korunur.

Bu yüzden, bu sorunun esas olarak ilgili olduğu bir isim çözümü buldum. JForm, diğer nesnelerle etkileşimi için bir temel olarak kullandığı için isme oldukça sıkıdır, bu nedenle JForm formu ayrıştırırken, ancak sonra dokunmamak en iyisidir.

Gösterdiğim işlev bir "yardımcı" nın bir parçasıdır, bu yüzden bunu bunun dışında ve eklentinin kendisine taşıdım. Bir html dizesi oluşturduğumdan bulmak/değiştirmek için regex kullanabilirsiniz.

$regex  = '/(?:name=")([^"]*)(?:")/';
//CALL HELPER TO GET $content
$content = '<input type="text" name="cc_field"/>'; //example of part of output from helper
$content = preg_replace($regex,"name=\"cc_settings[$1]\"",$content);

Bu, JForm nesnesi alanları ayrıştırırken düzenlenmesi nedeniyle oluşabilecek sorunların dışında adı da değiştirmenize izin vermelidir.

1
Jordan Ramstad