Как заменить цифры количества товара на звездочки

qwaszer

Новичок
Такой вот вопрос! Есть такой код, в нем происходит подсчет количества товара и выводится количество в цифрах, надо сделать, чтобы количество было в звездочках.
Код:
function product_count($category_id) {
        global $perm;
        $ps_vendor_id = $_SESSION["ps_vendor_id"];

        $db = new ps_DB;
        if( !isset($GLOBALS['category_info'][$category_id]['product_count'] )) {

            $count  = "SELECT count(#__{vm}_product.product_id) as num_rows from #__{vm}_product,#__{vm}_product_category_xref, #__{vm}_category WHERE ";
           
           
           

            $q = "";
            if (defined('_VM_IS_BACKEND' )) {
                if (!$perm->check( "admin,storeadmin")) {
                    $q .= "#__{vm}_product.vendor_id = '$ps_vendor_id' AND ";
                }
            }
            $q .= "#__{vm}_product_category_xref.category_id='$category_id' ";
            $q .= "AND #__{vm}_category.category_id=#__{vm}_product_category_xref.category_id ";
            $q .= "AND #__{vm}_product.product_id=#__{vm}_product_category_xref.product_id ";
            //$q .= "AND #__{vm}_product.product_parent_id='' ";
            if( !$perm->check("admin,storeadmin") ) {
           
           
           
                $q .= " AND product_publish='Y'";
                if( CHECK_STOCK && PSHOP_SHOW_OUT_OF_STOCK_PRODUCTS != "1") {
                    $q .= " AND product_in_stock > 0 ";
                }
            }
            $count .= $q;
            $db->query($count);
            $db->next_record();
            $GLOBALS['category_info'][$category_id]['product_count'] = $db->f("num_rows");
        }
        return $GLOBALS['category_info'][$category_id]['product_count'];
    }
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
В каких звездочках?
 

AnrDaemon

Продвинутый новичок
Ответь на вопрос, откуда твой код узнает, сколько звёздочек рисовать для того или иного товара?
Ведь для одного наименования 10 штук на складе может быть "за год не раскупят", а для другого и тысяча - "сегодня кончится".
 

qwaszer

Новичок
Ну то есть цифры заменить на символ *. Звездочки: 1 товар - 1 звезда, 2-5 товара - 2 звезды, 5-10 товаров - 3 звезды, 10-20 - 4 звезды, и более 20 товаров - 5 звезд.
Вот примерный код, что я хочу. Я не понимаю куда его вставлять, ибо пробовал - сайт виснет сразу.
if ($count==1) {
$string = '*';
} elseif (($count>=2)&&($count<5)) {
$string = '**';
} elseif (($count>=5)&&($count<10)) {
$string = '***';
} elseif (($count>=10)&&($count<20)) {
$string = '****';
} elseif ($count>=20) {
$string = '*****';
}
 

vasinsky

Новичок
PHP:
$count = 3;

function product_count($category_id) {
        global $perm;
        $ps_vendor_id = $_SESSION["ps_vendor_id"];

        $db = new ps_DB;
        if( !isset($GLOBALS['category_info'][$category_id]['product_count'] )) {

            $count  = "SELECT count(#__{vm}_product.product_id) as num_rows from #__{vm}_product,#__{vm}_product_category_xref, #__{vm}_category WHERE ";
      
      
      

            $q = "";
            if (defined('_VM_IS_BACKEND' )) {
                if (!$perm->check( "admin,storeadmin")) {
                    $q .= "#__{vm}_product.vendor_id = '$ps_vendor_id' AND ";
                }
            }
            $q .= "#__{vm}_product_category_xref.category_id='$category_id' ";
            $q .= "AND #__{vm}_category.category_id=#__{vm}_product_category_xref.category_id ";
            $q .= "AND #__{vm}_product.product_id=#__{vm}_product_category_xref.product_id ";
            //$q .= "AND #__{vm}_product.product_parent_id='' ";
            if( !$perm->check("admin,storeadmin") ) {
      
      
      
                $q .= " AND product_publish='Y'";
                if( CHECK_STOCK && PSHOP_SHOW_OUT_OF_STOCK_PRODUCTS != "1") {
                    $q .= " AND product_in_stock > 0 ";
                }
            }
            $count .= $q;
            $db->query($count);
            $db->next_record();
      
            $count =  $db->f("num_rows");
      }
    
        if($count >= 1 && $count <3)
            $count_stars = 1;
        elseif($count >=3 && $count <5)
            $count_stars = 2;
        elseif($count >=5 && $count <10)
            $count_stars = 3;
        elseif($count >= 10 && $count<= 20)
            $count_stars = 4;
        else
            $count_stars = 5;

            return array(
                        $GLOBALS['category_info'][$category_id]['product_count']=> $db->f("num_rows"),
                        $GLOBALS['category_info'][$category_id]['product_stars'] => str_repeat('*', $count_stars)
            }
теперь функция возвращает массив
1й элемент - кол-во товаров
2й элемент - звёзды (в зависимости от кол-ва товаров)


ну или можешь использовать свою старую функцию - для получения кол-ва товаров в конкретной категории, а эту

PHP:
function product_stars($counts) {
        if($count >= 1 && $count <3)
            $count_stars = 1;
        elseif($count >=3 && $count <5)
            $count_stars = 2;
        elseif($count >=5 && $count <10)
            $count_stars = 3;
        elseif($count >= 10 && $count<= 20)
            $count_stars = 4;
        else
            $count_stars = 5;

           return  str_repeat('*', $count_stars);
}
для вывода строки с звёздами. т.е.

$counts = product_count($category_id) - сколько товаров в категории
product_count($counts) - строка с звёздами по кол-ву товара
 

hell0w0rd

Продвинутый новичок
Меня всегда радовал такой код
PHP:
if($count >= 1 && $count <3)
    ...
elseif($count >=3 && $count <5)
    ...
elseif($count >=5 && $count <10)
    ...
 

vasinsky

Новичок
А ты бы как сделал?

PHP:
if(in_array($count, range(1,3)))
  $count_stars = 1;
if(in_array($count, range(4,5)))
  $count_stars = 2;
elseif(in_array($count, range(6,10)))
  $count_stars = 3;
elseif(in_array($count, range(11,20)))
  $count_stars = 4;
 

vasinsky

Новичок
а.. ты вон про что.
ну эт для ТС было - чтоб он видел что да как.
 

Вурдалак

Продвинутый новичок
Тьфу, нубасы!
PHP:
interface StarGenerator {
    /**
     * @param int $quantity
     * @throws InvalidArgumentException if quantity is not valid
     * @return string
     */
    public function generate($quantity);
}
PHP:
class StaticStarGenerator implements StarGenerator {
    /**
     * @var array
     */
    private $quantityLimits;

    /**
     * @param array $quantityLimitMap
     */
    public function __construct(array $quantityLimitMap) {
        $this->quantityLimits = array_values($quantityLimitMap);
    }

    public function generate($quantity) {
        if ($quantity < 0) {
            throw new InvalidArgumentException();
        }

        foreach ($this->quantityLimits as $i => $limit) {
            if ($quantity <= $limit) {
                return str_repeat('*', $i + 1);
            }
        }

        return '*****';
    }
}
PHP:
class StaticStarGeneratorTest extends PHPUnit_Framework_TestCase {
    /**
     * @test
     */
    public function showsValidStars() {
        $generator = new StaticStarGenerator([2, 4, 9, 20]);

        $this->assertEquals('*', $generator->generate(2));
        $this->assertEquals('**', $generator->generate(3));
        $this->assertEquals('***', $generator->generate(5));
        $this->assertEquals('****', $generator->generate(19));
        $this->assertEquals('*****', $generator->generate(100500));
    }

    /**
     * @test
     * @expectedException InvalidArgumentException
     */
    public function failsWithNegativeQuantity() {
        $generator = new StaticStarGenerator([1, 2, 3, 4]);
        $generator->generate(-1);
    }
}
Код:
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="foo.static.star_generator.limits" type="collection">
            <parameter>2</parameter>
            <parameter>4</parameter>
            <parameter>9</parameter>
            <parameter>20</parameter>
        </parameter>
    </parameters>

    <services>
        <service id="foo.star_generator" alias="%foo.star_generator.id%"/>

        <service id="foo.static.star_generator" class="Foo\StaticStarGenerator">
            <argument>%foo.static.star_generator.limits%</argument>
        </service>

    </services>
</container>
 

AnrDaemon

Продвинутый новичок
Зачем нагружать процессор, если у тебя всего пять звёздочек?
 

AnrDaemon

Продвинутый новичок
При хотя бы 1к RPM это уже будет значительной частью нагрузки. Другое дело, что при таком RPM есть смысл делать кеширование...
В любом случае, я стараюсь сразу делать работу, которую можно сделать заранее, чтобы потом не искать ошибки на ровном месте.
str_repeat есть смысл использовать, когда количество повторов заранее неизвестно.
 

vasinsky

Новичок
str_repeat есть смысл использовать, когда количество повторов заранее неизвестно.
AnrDaemon, ну так нужно смотреть в сторону расширяемости.
можешь считать что эта функция была продемонстрирована - для наглядности.
 

fixxxer

К.О.
Партнер клуба
Вурдалак, фу, а если я захочу звездочки картинками рисовать? Или диапазон станет 1 - 10? Где, блин, rendering strategy?
 

qwaszer

Новичок
vasinsky, я добавил твой код(измененный) и вместо цифр он выводит Array, подскажи пожалуйста, что можно исправить?
 
Сверху