Beste Methode, um ein Element vom benutzerdefinierten Modell herauszufiltern
-
16-10-2019 - |
Frage
Ich habe ein benutzerdefiniertes Modul, mit dem wir Bannerbilder in admin hinzufügen können. Ich habe dieses Modul im Administrator erfolgreich implementiert. Jetzt möchte ich Banner im vorderen Ende anzeigen.
Meine benutzerdefinierte Tabelle ist unten angegeben
table name : banner
fields: banner_name | store_ids | images | img_path | status
Speicher -IDs und Bilder werden als gespeichert als comma-seperated-values
. Jetzt möchte ich ein Bannerelement auswählen, das der aktuellen Store -Ansicht entspricht. Hier ist mein Code, den ich versucht habe, das Bannermodul in der Frontend anzuzeigen.
<?php
//get all active banner items as array
$bannerItems = Mage::getModel('banner/banner') -> getCollection()
-> addFieldToFilter('status',1) -> getItems(); //select only enabled items
$curStoreId = Mage::app() -> getStore() -> getId(); //get current store id
$banner = "";
foreach($bannerItems as $item)
{
$data = $item -> getData();
/*
Store ids are saved as `comma separated values`. Hence making
all store_ids as an array
*/
$storearray = explode(",",$data['store_id']);
foreach($storearray as $store)
{
if($store == $curStoreId) //check for matches, if yes load the item
{
$banner = $item;
break;
}
}
if($banner != "") // ensure to store the first matched item to load
{
break;
}
}
//output
if( empty($banner) )
{
die("no banner exist for this store.Please add a banner !!!");
}
else
{
die( print_r( $banner->getId() ) );
}
?>
Dies bietet mir das Bannermodell entspricht der aktuellen Store -Ansicht. Ich bin jedoch der Meinung, dass dieser Code langwierig ist. Ich muss also wissen, wie ich dies von seiner besten Seite erreichen kann. Bitte geben Sie Ihre Vorschläge an. Danke im Voraus
Lösung
Ich habe dies nicht "getestet", aber das sollte hilfreich sein.
$currentStore = 5;
$bannerItems = Mage::getModel('banner/banner') -> getCollection()
-> addFieldToFilter('status',1);
$bannerItems->getSelect()->where("FIND_IN_SET($currentStore, store_ids) > 0");
$bannerItems->getSelect()->orWhere("store_ids = 0");
$bannerItems->getSelect()->order("(FIND_IN_SET($currentStore, store_ids) > 0 ) * 10 DESC");
Finden Sie zuerst die aktuelle Store_id (zum Beispiel verwendet) mithilfe der aktuellen Store_id heraus FIND_IN_SET
Suchen Sie auch nach store_ids = 0, aber sortieren Sie das frühere Ergebnis, wenn Sie in absteigender Reihenfolge existieren, damit Sie das erforderliche Ergebnis in der ersten Reihe erhalten können.
Danach benutze einfach $bannerItems->getFirstItem()
, In der Frage wurde bereits alles getan.