it-swarm-id.com

Bagaimana cara mengambil nilai unik sebelum tanda kurung di kueri JFormFieldList Filter?

Saya memiliki JHtml filter khusus yang diisi oleh JFormField kelas tambahan. Itu ditambahkan dalam tampilan dengan kode berikut:

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

Ini berfungsi seperti yang dimaksudkan tetapi untuk beberapa alasan filter tidak akan menampilkan teks default (- Pilih Ketinggian -) tetapi sebaliknya menunjukkan string "pilih opsi" (Saya sudah memasukkan filter lain - dikodekan dengan cara yang sama - dalam cuplikan layar untuk tunjukkan seperti apa seharusnya).

enter image description here

Setelah beberapa bermain-main saya tahu bahwa saya bisa memperbaikinya dengan mengubah kueri basis data saya di kelas JFormField. Kelas _ JFormField asli saya adalah sebagai berikut:

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

Kode ini menyebabkan masalah tetapi jika saya menghapus fungsi LOCATE dari kueri itu berfungsi dengan baik. Jelas saya harus menyimpan permintaan asli jadi ini bukan pilihan.

Untuk info, kotak pilih dimuat dengan nilai-nilai dalam kedua kasus termasuk nilai default tetapi bahkan memilih nilai default akan kembali ke string "pilih opsi":

enter image description here

Ada ide apa yang terjadi di sini?

3
doovers

Saya pikir saya menemukan masalahnya. Saya sedang mengerjakan salah satu ekstensi saya sendiri ketika masalah yang sama muncul. Periksa output HTML dan lihat apakah ada dua opsi dengan nilai 0.

Ini adalah fungsi yang menyebabkan masalah

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

Seperti yang Anda lihat, kami berdua menggunakan pemilih DISTINCT yang mungkin merupakan akar masalah. Memeriksa output HTML, seperti inilah tampilan yang dipilih

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

Jadi saya mengubah bagian terakhir dari fungsi getAdminList () sedikit untuk menambahkan judul ke default sebelum mengirimnya ke tampilan saya.

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;

Dan masalah itu terpecahkan.

Saya harap ini membantu. Selamat Joomla! Ng

2
Mathew Lenning

Saya menemukan bahwa penyebab masalah adalah karena hasil dari kueri jadi saya bermain-main dengannya sedikit dan menghapus semua string non numerik yang dikembalikan seperti:

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

Dan itu memperbaiki situasi.

Saya masih tidak mengerti penyebab masalah tetapi setidaknya sudah diperbaiki sekarang.

1
doovers

Anda tidak menyebutkan versi Joomla yang bekerja dengan Anda tetapi:

1) Jika Anda menginginkan "- Pilih Tinggi -" Saya tidak yakin mengapa Anda membungkusnya dalam JText::_() panggil dulu. JText::_() digunakan untuk menerjemahkan kunci dari file bahasa, mis. jika Anda memiliki ini dalam file bahasa Inggris di /components/com_mycomponent/language/en-GB/en-GB.com_mycomponent.ini yang memiliki baris ini di dalamnya (bersama dengan banyak lainnya)

 COM_MYCOMPONENT_PLACEHOLDER_SELECT_HEIGHT="- Select Height -"

Perhatikan kunci di sebelah kiri = Tidak memiliki spasi di dalamnya, dan dikunci oleh komponen. Secara default, jika kunci tidak ditemukan, Anda harus mendapatkan kembali teks yang dilewatkan ke dalam fungsi, tetapi, dengan menghapus panggilan JText::_() Anda dapat menghilangkannya sebagai masalah.

2) Anda harus menambahkan kode untuk JFormField yang merupakan tempat item pertama biasanya diatur, sehingga kita dapat melihat apa masalahnya?.

A print_r($heightOptions) juga bisa menjelaskan apa yang terjadi.

Sebelumnya di JFormFieldList yang diperluas, kami menambahkan item pertama ke $options Yang dibuat dari basis data, mis:

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

Untuk menunjukkan beberapa penyempurnaan/praktik terbaik, saya akan membahas solusi yang diposting @ doovers.

$query = $db->getQuery(true)
    ->select("DISTINCT SUBSTRING_INDEX(description2, '(', 1) AS height");
    ->from("#__cadcam_disc");
    ->where("LOCATE('(', description2) > 0")
    ->order("height");
  • SUBSTRING_INDEX() adalah panggilan fungsi tunggal yang setara dengan LEFT(LOCATE())
  • Alias ​​tabel (a) tidak diperlukan karena hanya ada satu tabel yang ditanyakan (tidak ada ambiguitas untuk diselesaikan).
  • Ketika memfilter nilai yang tidak memiliki ( Di klausa WHERE Anda, Anda bisa memeriksa nilai positif LOCATE() (karakter pertama berada pada posisi 0, tetapi logika tugas Anda berarti kami tidak perlu memeriksa apakah > -1, ergo > 0 akan melakukannya.
  • Manipulasi string dalam klausa SELECT yang diberi alias kolom height dapat dirujuk dalam klausa ORDER BY. Ini jauh lebih mudah di mata.

Inilah taman bermain untuk siapa saja yang ingin mengenal fungsi-fungsi ini dengan lebih baik.

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

0
mickmackusa