Raccolte: filtro di più valori di attributo a selezione multipla


8

Non è un refuso.

Sono consapevole che devo usare 'finset' per filtrare i miei attributi multi-selezione; tuttavia, sto cercando di filtrare più valori contemporaneamente e ottengo:

Incorrect parameter count in the call to native function 'FIND_IN_SET.

Ecco un po 'di codice di esempio:

foreach ($options as $option) {
    // $option[0] contains an attribute ID as a string
    $attribute = Mage::getModel('catalog/resource_eav_attribute')->load($option[0]);

    if ($attribute->getFrontendInput() == 'multiselect') {
        $collection->addAttributeToFilter($attribute->getAttributeCode(), array('finset' => $option[1]));
    } else {
        $collection->addAttributeToFilter($attribute->getAttributeCode(), array('in' => $option[1]));
    }
}

Quello che ho sul frontend è un insieme di campi, ogni set corrisponde a un attributo specifico e contiene caselle di controllo per ciascun valore di attributo. Sulla base di questi invii, la raccolta dovrebbe filtrare ciò che è stato selezionato.

Tutto funziona alla grande tranne il caso singolo in cui provo a filtrare due delle opzioni a selezione multipla contemporaneamente. Se scelgo solo uno di essi, la ricerca funziona correttamente. Se scelgo due o più, ottengo l'errore MySQL sopra menzionato.

Qualche idea? O sono costretto a utilizzare istruzioni SQL personalizzate per creare questo filtro?


Se si sta tentando di filtrare più tipi di input con selezione, provare a filtrare utilizzando la catalog_product_index_eav_idxtabella.
Subesh Pokhrel

Risposte:


18

Da quello che ho capito, vuoi inviare 2 o più valori e filtrarli usando OR.
Qualcosa come questo:

...
WHERE
    FIND_IN_SET($v1, `some_field`) OR
    FIND_IN_SET($v2, `some_field`) OR
...

$v1 & $v2 sono i valori delle tue caselle di controllo

Per questo è necessario passare addAttributeToFilterall'array di array.

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);

Ecco una possibile implementazione.

$data = THE ARRAY OF THE CHECKBOX VALUES;

$filter = array();
foreach ($data as $value) {
    $filter[] = array(
        'attribute' => $attribute->getAttributeCode(),
        'finset'    => $value
    );
}

if (count($filter) > 0) {
    $collection->addAttributeToFilter($filter);
}

Ricevo il mio ID categoria in questo modo ($ exist_prdcat_id = 4,5, quindi uso -> addAttributeToFilter ('category_id', array (array ('finset' => array ($ exist_prdcat_id)),)); ma non ottengo prodotto perché ?? mi puoi dire questo
ND17

Voglio filtrare start_date e end_date, come si fa?
MrTo-Kane,

dove devo inserire questo codice ??
zekia,

@ktsixit Dove ne hai bisogno.
Marius

Come posso eseguire "e". Intendo voler filtrare la raccolta di prodotti in base a più valori di attributo a selezione multipla. @Marius puoi aiutarmi?
jack

-1

Questo codice combinerà due finsetcondizioni con OR:

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.