it-swarm-tr.com

JFormFieldList filtre sorgusunda bir parantez önce benzersiz değerleri nasıl alınır?

Bir JHtml genişletilmiş sınıf tarafından doldurulmuş bir JFormField özel filtre var. Aşağıdaki kod ile görünümde eklenir:

JHtmlSidebar::addFilter(
    '- Select Height -',
    'filter_height',
    JHtml::_('select.options', $heightOptions, "value", "text", $this->state->get('filter.height'), true)
);

Amaçlandığı gibi çalışır, ancak bir nedenden dolayı filtre varsayılan metni göstermez (- Yükseklik Seç -), ancak bunun yerine "bir seçenek belirleyin" dizesini gösterir (aynı şekilde kodlanmış başka bir filtre ekledim - nasıl görünmesi gerektiğini göster).

enter image description here

Bazı karışıklık sonra ben JFormField sınıf veritabanı sorgu değiştirerek düzeltebilirim anladım. Orijinal JFormField sınıfım aşağıdaki gibidir:

JFormHelper::loadFieldClass('list');

class JFormFieldHeight extends JFormFieldList
{
    protected $type = 'Height';

    public function getOptions()
    {
        $options = array();

        $db     = JFactory::getDbo();
        $query  = $db->getQuery(true);

        $query->select("DISTINCT LEFT(a.description2, LOCATE('(', a.description2) - 1) AS height");
        $query->from('#__cadcam_disc AS a');
        $query->order("LEFT(a.description2, LOCATE('(', a.description2) - 1)");

        $db->setQuery($query);
        $options = $db->loadObjectList();

        if ($db->getErrorNum()) {
            JError::raiseWarning(500, $db->getErrorMsg());
        }

        return $options;
    }
}

Bu kod soruna neden olur ama LOCATE işlevini sorgudan kaldırırsanız iyi çalışıyor. Açıkçası bu bir seçenek değil bu yüzden orijinal sorgu tutmak gerekiyor.

Bilgi için, seçim kutusuna varsayılan değer de dahil olmak üzere her iki durumda da değerler yüklenir, ancak varsayılan değerin seçilmesi bile "bir seçenek belirleyin" dizesine geri döner:

enter image description here

Burada neler olduğu hakkında bir fikrin var mı?

3
doovers

Sanırım problemi buldum. Aynı sorun ortaya çıktığında kendi uzantılarımdan biri üzerinde çalışıyordum. HTML çıktısını kontrol edin ve 0 değerine sahip iki seçenek olup olmadığına bakın.

Bu soruna neden olan işlevdir

public function getAdminList()
{
    $db = JFactory::getDbo();
    $query  = $db->getQuery(true);

    $query->select('DISTINCT notify.admin_to_notify AS id');
    $query->from('#__babelu_exams_notification_profiles AS notify');

    $query->select('admin.name');
    $query->join('LEFT', '#__users AS admin ON admin.id = notify.admin_to_notify');

    $query->order('admin.name');

    $db->setQuery($query);
    return $db->loadObjectList();
}

Gördüğünüz gibi ikimiz de sorunun kökü olan DISTINCT seçicisini kullanıyoruz. HTML çıktısını kontrol ederken, seçim bu şekilde görünüyordu

<select name="filter[admin]" id="filter_admin" class="span12 small chzn-done" onchange="this.form.submit()" style="display: none;">
   <option value="">
       Filter by Administrator
   </option>
   <option value="0" selected="selected">
       Not Assigned
   </option>
   <option value="0" selected="selected"></option>
</select>

Bu yüzden, görünümüme göndermeden önce varsayılana bir başlık eklemek için getAdminList () işlevinin son bölümünü biraz değiştirdim.

result = $db->loadObjectList();
    if ($result[0]->id == 0)
    {
        $result[0]->name = JText::_('COM_BABELU_EXAMS_RESULTS_NONE_ASSIGNED');
    }
    else
    {
        $notAssigned = new stdClass();
        $notAssigned->name = JText::_('COM_BABELU_EXAMS_RESULTS_NONE_ASSIGNED');
        $notAssigned->id = 0;
        array_unshift($result, $notAssigned);
    }

    return $result;

Ve sorun çözüldü.

Umarım bu yardımcı olur. Mutlu Joomla! Ng

2
Mathew Lenning

Sorunun neden ne sorgu biraz sonuç ile aşağı olduğunu düşündüm ben biraz onunla oynadı ve böyle döndürülen herhangi bir sayısal olmayan dizeleri çıkardı:

$query->select("DISTINCT LEFT(a.description2, LOCATE('(', a.description2) - 1) AS height");
$query->from('#__cadcam_disc AS a');
$query->where("LEFT(a.description2, LOCATE('(', a.description2) - 1) > 0");
$query->order("LEFT(a.description2, LOCATE('(', a.description2) - 1) + 0");

Ve bu durumu düzeltti.

Sorunun nedenini hala anlamıyorum ama en azından şimdi düzeltildi.

1
doovers

Üzerinde çalıştığınız Joomla sürümünden bahsetmiyorsunuz ama:

1) İsterseniz "- Yükseklik Seç -" Neden bir JText::_() önce arayın. JText::_() bir dil dosyasındaki bir anahtarı çevirmek için kullanılır, ör. eğer bunu /components/com_mycomponent/language/en-GB/en-GB.com_mycomponent.ini 'da bir İngilizce dil dosyasında bulduysanız, içinde bu satır vardı (diğerleri ile birlikte)

 COM_MYCOMPONENT_PLACEHOLDER_SELECT_HEIGHT="- Select Height -"

= Öğesinin solundaki tuşun içinde boşluk olmadığını ve bileşen tarafından anahtarlandığını unutmayın. Varsayılan olarak, anahtar bulunamazsa, işleve iletilen metni geri almalısınız, ancak JText::_() çağrısını kaldırarak sorunu ortadan kaldırabilirsiniz.

2) İlk öğenin normal olarak ayarlanacağı yer olan JFormField için kod eklemeniz gerekir. sorunun ne olduğunu.

Bir print_r($heightOptions) ayrıca neler olup bittiğine de ışık tutabilir.

Daha önce uzatılmış bir JFormFieldList içinde, ilk öğeyi veritabanından oluşturulan $options

$noneSelected = new stdClass;
$noneSelected->value = '';
$noneSelected->text = '- ' . JText::_('COM_MYCOMPONENT_PLACEHOLDER_SELECT_HEIGHT') . ' -';
array_splice($options, 0, 0, array($noneSelected));
0
Craig

Bazı iyileştirmeler/en iyi uygulamaları göstermek için, @ doovers'ın yayınladığı çözümü ele alacağım.

$query = $db->getQuery(true)
    ->select("DISTINCT SUBSTRING_INDEX(description2, '(', 1) AS height");
    ->from("#__cadcam_disc");
    ->where("LOCATE('(', description2) > 0")
    ->order("height");
  • SUBSTRING_INDEX()LEFT(LOCATE()) ile eşdeğer tek işlev çağrısıdır
  • Bir tablo diğer adı (a) gerekli değildir çünkü sorgulanacak tek bir tablo vardır (çözülecek belirsizlik yoktur).
  • WHERE yan tümcesinde ( Olmayan değerleri filtrelerken, pozitif bir LOCATE() değeri olup olmadığını kontrol edebilirsiniz (ilk karakter 0 Konumunda olur, ancak görevinizin mantığı, > -1, ergo > 0 öğesinin yapılıp yapılmayacağını kontrol etmemiz gerekmediği anlamına gelir.
  • height sütun takma adı verilen SELECT yan tümcesindeki dize işleme, ORDER BY yan tümcesinde belirtilebilir. Bu gözlerde çok daha kolay.

İşte bu işlevleri daha iyi tanımak isteyen herkes için bir oyun alanı.

https://www.db-fiddle.com/f/ci6ZfAQAPkbMKtak4T5kbm/

0
mickmackusa