За последние 24 часа нас посетил 34571 программист и 1752 робота. Сейчас ищут 909 программистов ...

непонятный код

Тема в разделе "PHP для новичков", создана пользователем Izmaylov, 29 авг 2016.

  1. Izmaylov

    Izmaylov Новичок

    С нами с:
    3 май 2016
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте всем. Пытаюсь сделать корзину товаров, примерно как в этой статье: http://forum.php.su/topic.php?forum=33&topic=792. Очень тяжело поддается моему пониманию. Только я начал думать, что начал немного разбираться в html и php, как наткнулся на эту статью и захотелось плакать. Помогите пожалуйста разобраться. В частности пока вопросы по этому фрагменту кода:
    PHP:
    1. <?php foreach ($productsInBasket as $product) { ?>
    2.       <li>
    3.         <b><?=$product['name']?></b>
    4.         <?=$product['cnt']?> шт.
    5.         (<?=($product['price'] * $product['cnt'])?> руб.)
    6.         [<a href="/basket.php?add=<?=$product['product_id']?>">+1</a>] /
    7.         [<a href="/basket.php?minus=<?=$product['product_id']?>">-1</a>] /
    8.         [<a href="/basket.php?del=<?=$product['product_id']?>">удалить</a>]
    9.       </li>
    10.     <?php } ?>
    "<?=" - для чего здесь знак равно?
    "{ ?> " - фигурные скобки открываются перед закрывающимися скобками тэга php. Как этооо и почему? я не понимаааюю...
    "[]" - для чего нужны квадратные скобки и знак"/"?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    <?=$var?> равно <?php echo $var; ?>
    Фигурные скобки обрамляют пхп-шный форыч, но поскольку автор кода достаточно грамотен, чтоб не писать длинные эхи - он просто выходит из режима пхп и пишет хтмл, иногда подставляя в него значения из пхп. но тело цикла-то ему надо как-то контролировать. вот он и возвращается в режим пхп, закрывает цикл и опять уходит из пхп.
    В данном случае квадратные скобки и слэш проваливаются в хтмл исходник. То есть у него на странице просто ссылки оформлены так. Сами слова в квадратных скобках а между ними - слэши.
     
    Izmaylov нравится это.
  3. Izmaylov

    Izmaylov Новичок

    С нами с:
    3 май 2016
    Сообщения:
    9
    Симпатии:
    0
    Спасибо большое, понял.
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я у себя корзину держу в сессии :) И только у зарегистрированных пользователей в базе хранится содержание их корзины.
     
  5. Izmaylov

    Izmaylov Новичок

    С нами с:
    3 май 2016
    Сообщения:
    9
    Симпатии:
    0
    научи)
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Izmaylov ну, я могу тебе кинуть код моей корзины
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Тебе за экономию строк в таблице доплачивают? )
     
    askanim нравится это.
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Собственно вот корзина из шапки
    PHP:
    1. <?php
    2.  
    3.     namespace App\Models\Pages;
    4.     /*
    5.     *   Создана модель
    6.     *
    7.     */
    8.  
    9.     use System\Gabriel\CFESession;
    10.     use System\Http\Model\Model;
    11.  
    12.     class Basket extends Model
    13.     {
    14.         // Модуль с корзиной, реализован через сессии
    15.         public function getCountPrice($arr) {
    16.             // Здесь получаем общее количество
    17.             if(!empty($arr['items'])) {
    18.                 $arr['count'] = 0;
    19.                 foreach($arr['items'] as $key => $value) {
    20.                     foreach($value as $k => $val) {
    21.                         if ($k == 'count_p') {
    22.                             $arr['count'] += $val;
    23.                         }
    24.                     }
    25.                 }
    26.             }
    27.             // Здесь получаем общую цену
    28.             $arr['price'] = 0.00;
    29.             foreach($arr['items'] As $key => $value)
    30.             {
    31.                 foreach ($value as $k => $val) {
    32.                     if($k == 'price') {
    33.                         $arr['price'] +=$val;
    34.                     }
    35.                 }
    36.  
    37.             }
    38.             return $arr;
    39.         }
    40.         public function getArraySession($session_name, $key, $array_new) {
    41.             // Здесь добавляем новые элементы в массив, хранящий данные о продукте.
    42.             foreach($array_new as $k => $value){
    43.                 CFESession::add_array_last_session($session_name, $key, $k, $value);
    44.             }
    45.             return CFESession::GET_CFE($session_name);
    46.         }
    47.         public function index () {
    48.             // Не посредственно сам модуль корзины
    49.             $result = []; // Массив который будет содержать всю корзину
    50.             $result2 = []; // Массив который служит для проверки имеющегося массива
    51.             if(isset($_POST['flag']) && $_POST['flag'] == 2){
    52.  
    53.                 // Делаем запрос к таблице товаров, чтобы получить необходимые данные о товаре
    54.                 $res = $this->table('nomenclature')->where(['id' => $_POST['PID']])->fetchOne();
    55.                 if(!empty($res)) {
    56.                     CFESession::start(); // Открываем Сессию
    57.                     // Получаем существующий массив из сессии
    58.                     $result2 = CFESession::GET_CFE('basket');
    59.                     // Если он не пуст продолжаем работу с ним
    60.                     if(!empty($result2)) {
    61.                         // Проверяем на наличие уже таково товара в массиве
    62.                         if(array_key_exists($res['id'], $result2) === true){
    63.                             if(isset($_POST['count'])) {
    64.                                 $count = $_POST['count'];
    65.                             }
    66.                             else {
    67.                                 $count = 1;
    68.                             }
    69.                             // Если есть такой же товар в массиве
    70.                             // Мы прибавляем его и пересчитываем его количество и цену
    71.                             $result2[$res['id']]['count_p'] = $result2[$res['id']]['count_p']+$count;
    72.                             $coin = $result2[$res['id']]['count_p'];
    73.                             $price = $coin * $result2[$res['id']]['retailPrice'];
    74.                             // А дальше перезаписываем массив в сессию
    75.                             $result['items'] = $this->getArraySession('basket', $res['id'], ['count_p' => $coin, 'price' => $price]);
    76.                         }
    77.                         else {
    78.                             // Если такого массива нет, и покупатель покупает новый товар, то
    79.                             // Создаём новый массив, в массиве корзины и запихиваем туда данные о товаре.
    80.                             CFESession::CFE_ARR('basket', $res, $res['id']);
    81.                             if(isset($_POST['count'])) {
    82.                                 $count = $_POST['count'];
    83.                             }
    84.                             else {
    85.                                 $count = 1;
    86.                             }
    87.                             $result['items'] = $this->getArraySession('basket', $res['id'], ['count_p' => $count, 'price' => $res['retailPrice']]);
    88.                         }
    89.                     }
    90.                     else {
    91.                         CFESession::CFE_ARR('basket', $res, $res['id']);
    92.                         if(isset($_POST['count'])) {
    93.                             $count = $_POST['count'];
    94.                         }
    95.                         else {
    96.                             $count = 1;
    97.                         }
    98.                         $result['items'] = $this->getArraySession('basket', $res['id'], ['count_p' => $count, 'price' => $res['retailPrice']]);
    99.                     }
    100.  
    101.                     $result['try'] = 3;
    102.                     $result = $this->getCountPrice($result);
    103.                 }
    104.                 else {
    105.                     $result['try'] = 4;
    106.                     $result['count'] = 0;
    107.                     $result['price'] = 0.00;
    108.                 }
    109.                 return $result;
    110.             }
    111.             elseif(isset($_POST['flag']) && $_POST['flag'] == 6){
    112.                 // Удаления элемента из корзины
    113.                 CFESession::start();
    114.                 CFESession::del_cfe_elem_array('basket', $_POST['PID']);
    115.                 $result = []; // Массив который вернём обратно.
    116.                 $result['items'] = CFESession::GET_CFE('basket');
    117.                 return $this->getCountPrice($result);
    118.             }
    119.             else {
    120.                 CFESession::start();
    121.                 if(CFESession::GET_CFE('basket') != FALSE){
    122.                     $result['items'] = CFESession::GET_CFE('basket');
    123.                     $result['try'] = 3;
    124.                     $result['price'] = 0.00;
    125.                     $result = $this->getCountPrice($result);
    126.                 }
    127.                 else {
    128.                     $result['try'] = 1;
    129.                     $result['count'] = 0;
    130.                     $result['price'] = 0.00;
    131.                 }
    132.             }
    133.  
    134.  
    135.             return $result;
    136.         }
    137.     }
    138.  
    139.        
     
  11. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    плохой код:
    - много дублирования (напрашивается рефакторинг)
    - код делающий лишнюю работу(Общую цену и количество можно посчитать сразу а не отдельно)
    - магические числа
    - неинтуитивные имена переменных
    - плохое комментирование. вроде и есть местами, но отсутствуют описания методов, классов
    - нет единого стиля именования, смешение Верблюжего и Змеиного регистра
    - наличие потенциальных мест для возникновения Нотисов
     
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    херь полная(Потому что тут уже каждый сам как хочет так и пишет - я например считаю что наиболее читабильные переменные это без таких символов _, поэтому нижний верхний регистр разбиваю наименования слов, мне так больше нравится и читать удобно ), с остальным согласен рефакторинг нужен и да я не закончил комментирование, времени не осталось другой скрипт пишу сейчас. И да кстати можно сократить до одного цикла и вызвать метод два раза. С подстановкой данных.
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    я думаю @runcore говорил про то, что именовать переменные как $result и $result2 - плохая затея. Если результат один, то пофиг конечно, но если их несколько в пределах одного метода, то название должно быть внятное, типа $cartItems, $orderItems или что там у тебя.
    --- Добавлено ---
    чорт, index() нужно взять и переписать. Вообще, если код нужно комментировать для понимания происходящего, то его надо переделать нахрен. Разбей на методы с вменяемыми названиями, вынеси в отдельный класс логику, но не городи портянок с комментариями. Сейчас они тебе понятны, а через месяц сам же себя проклинать будешь )
     
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @romach у меня движок генерит модели! и всем задаёт по умолчанию метод index, чтобы если что потом не запутаться, у меня у всех методов и классов один и тот же метод.

    Благо я юзаю пространство имён, и у меня проблем с подключением нету !