Пишу первый свой класс рейтинга звезд

Тема в разделе "PHP", создана пользователем immortal727, 13 авг 2020.

  1. immortal727

    immortal727

    Регистрация:
    17 май 2018
    Сообщения:
    17
    Симпатии:
    0
    В статье (товаре), где будет использоваться виджет по задумке туда буду передавать id статьи (товара).
    Где будут выставляться сами звездочки создаю объект класса

    PHP:
    <? new \app\widgets\star_reiting\StarReiting($product->id); ?>
    Сам вопрос. Если мне нужно получить id, то в методах класса по моей задумке (код ниже) везде получается надо писать параметр этот $id или все же можно без него обойтись, объявив скажем в конструкторе private $private-tovar=$id её использовать? Может есть другой вариант, получше. Я только начинаю в этом разбираться и нужна подсказка (помощь)
    PHP:
    class StarReiting
    {
        protected 
    $tpl;
        protected 
    $reiting// текущий рейтинг статьи
        
    public function __construct($id){
            
    $this->tpl=__DIR__.'/star_reitng_tpl/reiting.php';
            
    $this->run($id);
        }

        protected function 
    run($id){
            
    self::getReiting($id);
            echo 
    $this->getHtml();
        }

        public static function 
    getReiting($id){

        }

        
    // Метод формирования html разметки
        
    public function getHtml(){
            
    // Чтоб не выводилось, а вернулось в переменную
            // используем буферизацию ob_start
            
    ob_start();
            require_once 
    $this->tpl;
            return 
    ob_get_clean();
        }
    }
     
    Lasted edited by : 13 авг 2020
  2. immortal727

    immortal727

    Регистрация:
    17 май 2018
    Сообщения:
    17
    Симпатии:
    0
    Искал много различных плагинов, но больше по душе оказался скрипт (плагин) - https://habr.com/ru/post/132807/ (третий вариант)
    Но вот незадача, я никак не могу передать данные $_POST в контроллер.
    Обычно я бы вызывал
    $('#rating_3').on('click', function() {
    $.ajax({
    url: 'reiting/star',
    type: 'POST',
    success: function () {

    },
    error: function () {
    alert('Ошибка! Попробуйте позже');
    }
    });
    });

    Где reiting является контроллером ReitingController (так разработана MVC структура), а
    star соответственно его методом starAction()
    Если я так напишу, то ошибки не будет. Но при попытке просто вывести $_POST или же какое-либо окно alert-ом, то ничего не вижу. И в консоли нет ошибок и так ничего не выводится.
    Как же быть? Может кто сможет помочь?
     
  3. true.app

    true.app

    Регистрация:
    22 янв 2021
    Сообщения:
    0
    Симпатии:
    0
    здесь вы просто инициализируете объект и все, никакого рейтинга вы не получите. если я правильно понял нужно примерно следующее:

    Код:
    <?
    $rating = new StarReiting($product->id);
    echo $rating->getHtml();
    ?>
    
    Код:
    <?php
    
    class StarReiting
    {
        protected $id;
    
        public function __construct($id)
        {
            $this->id = $id;
        }
    
        protected function getReiting($id)
        {
            // реализация получение рейтинга
        }
     
        public function getHtml()
        {
            $rating = $this->getReiting($this->id);
            // возвращаем вьюшку передав туда рейтинг  $rating
            return // ...;
        }
    }
    
     
    Последнее редактирование: 15 фев 2021
  4. SinTaksiS-11

    SinTaksiS-11

    Регистрация:
    10 апр 2023
    Сообщения:
    12
    Симпатии:
    1
    Привет. Пробуй использовать свойство класса для сохранения идентификатора товара и потом обращаться к нему внутри методов, не передавая его в параметрах. Для этого нужно объявить свойство класса и установить его значение в конструкторе:
    PHP:
    class StarReiting
    {
       protected 
    $tpl;
       protected 
    $reiting// текущий рейтинг статьи
       
    protected $id// идентификатор товара
     
       
    public function __construct($id){
           
    $this->tpl=__DIR__.'/star_reitng_tpl/reiting.php';
           
    $this->id $id;
           
    $this->run();
       }

       protected function 
    run(){
           
    self::getReiting();
           echo 
    $this->getHtml();
       }

       public static function 
    getReiting($id){
           
    // использование $this->id вместо параметра $id
       
    }

       
    // Метод формирования html разметки
       
    public function getHtml(){
           
    // Чтоб не выводилось, а вернулось в переменную
           // используем буферизацию ob_start
           
    ob_start();
           require_once 
    $this->tpl;
           return 
    ob_get_clean();
       }
    }
    Обрати внимание, что в методе getReiting() нужно обращаться к свойству $this->id, а не использовать параметр $id.

    Также, в конструкторе вы можете объявить свойство как private, чтобы оно не было доступно извне:

    private $id;