Collections - Filtrage de plusieurs valeurs d'attribut à sélection multiple

8

Ce n'est pas une faute de frappe.

Je suis conscient que je dois utiliser «finset» pour filtrer mes attributs à sélection multiple; cependant, j'essaie de filtrer plusieurs valeurs à la fois et d'obtenir:

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

Voici un exemple de code:

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

Ce que j'ai sur le frontend est un ensemble de champs, chaque ensemble correspond à un attribut spécifique et contient des cases à cocher pour chaque valeur d'attribut. Sur la base de ces soumissions, la collection devrait filtrer ce qui a été sélectionné.

Tout fonctionne très bien, sauf pour le cas unique où j'essaie de filtrer deux des options de sélection multiple en même temps. Si je n'en choisis qu'un, la recherche fonctionne correctement. Si j'en choisis deux ou plus, j'obtiens l'erreur MySQL mentionnée ci-dessus.

Des idées? Ou suis-je obligé d'utiliser des instructions SQL personnalisées pour créer ce filtre?

pspahn
la source
Si vous essayez de filtrer plusieurs types d'entrée, sélectionnez le filtrage à l'aide du catalog_product_index_eav_idxtableau.
Subesh Pokhrel

Réponses:

18

D'après ce que je comprends, vous voulez envoyer 2 valeurs ou plus et les filtrer en utilisant OR.
Quelque chose comme ça:

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

$v1 & $v2 sont les valeurs de vos cases à cocher

Pour cela, vous devez passer au addAttributeToFilteret au tableau de tableaux.

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

Voici une implémentation possible.

$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);
}
Marius
la source
J'obtiens mon identifiant de catégorie comme ceci ($ exist_prdcat_id = 4,5 donc j'utilise -> addAttributeToFilter ('category_id', array (array ('finset' => array ($ exist_prdcat_id)))), mais je ne reçois pas produit pourquoi ?? pouvez-vous me dire ceci
ND17
Je veux filtrer la date de début et la date de fin, comment allez-vous?
MrTo-Kane
où dois-je placer ce code ??
zekia
@ktsixit Où vous en avez besoin.
Marius
Comment puis-je exécuter 'et'. Je veux dire filtrer la collection de produits en fonction de plusieurs valeurs d'attributs à sélection multiple. @Marius pouvez-vous aider?
jack
-1

Ce code combinera deux finsetconditions avec OR:

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