Здравствуйте всем. Пытаюсь сделать корзину товаров, примерно как в этой статье: http://forum.php.su/topic.php?forum=33&topic=792. Очень тяжело поддается моему пониманию. Только я начал думать, что начал немного разбираться в html и php, как наткнулся на эту статью и захотелось плакать. Помогите пожалуйста разобраться. В частности пока вопросы по этому фрагменту кода: PHP: <?php foreach ($productsInBasket as $product) { ?> <li> <b><?=$product['name']?></b> <?=$product['cnt']?> шт. (<?=($product['price'] * $product['cnt'])?> руб.) [<a href="/basket.php?add=<?=$product['product_id']?>">+1</a>] / [<a href="/basket.php?minus=<?=$product['product_id']?>">-1</a>] / [<a href="/basket.php?del=<?=$product['product_id']?>">удалить</a>] </li> <?php } ?> "<?=" - для чего здесь знак равно? "{ ?> " - фигурные скобки открываются перед закрывающимися скобками тэга php. Как этооо и почему? я не понимаааюю... "[]" - для чего нужны квадратные скобки и знак"/"?
<?=$var?> равно <?php echo $var; ?> Фигурные скобки обрамляют пхп-шный форыч, но поскольку автор кода достаточно грамотен, чтоб не писать длинные эхи - он просто выходит из режима пхп и пишет хтмл, иногда подставляя в него значения из пхп. но тело цикла-то ему надо как-то контролировать. вот он и возвращается в режим пхп, закрывает цикл и опять уходит из пхп. В данном случае квадратные скобки и слэш проваливаются в хтмл исходник. То есть у него на странице просто ссылки оформлены так. Сами слова в квадратных скобках а между ними - слэши.
Я у себя корзину держу в сессии И только у зарегистрированных пользователей в базе хранится содержание их корзины.
Собственно вот корзина из шапки PHP: <?php namespace App\Models\Pages; /* * Создана модель * */ use System\Gabriel\CFESession; use System\Http\Model\Model; class Basket extends Model { // Модуль с корзиной, реализован через сессии public function getCountPrice($arr) { // Здесь получаем общее количество if(!empty($arr['items'])) { $arr['count'] = 0; foreach($arr['items'] as $key => $value) { foreach($value as $k => $val) { if ($k == 'count_p') { $arr['count'] += $val; } } } } // Здесь получаем общую цену $arr['price'] = 0.00; foreach($arr['items'] As $key => $value) { foreach ($value as $k => $val) { if($k == 'price') { $arr['price'] +=$val; } } } return $arr; } public function getArraySession($session_name, $key, $array_new) { // Здесь добавляем новые элементы в массив, хранящий данные о продукте. foreach($array_new as $k => $value){ CFESession::add_array_last_session($session_name, $key, $k, $value); } return CFESession::GET_CFE($session_name); } public function index () { // Не посредственно сам модуль корзины $result = []; // Массив который будет содержать всю корзину $result2 = []; // Массив который служит для проверки имеющегося массива if(isset($_POST['flag']) && $_POST['flag'] == 2){ // Делаем запрос к таблице товаров, чтобы получить необходимые данные о товаре $res = $this->table('nomenclature')->where(['id' => $_POST['PID']])->fetchOne(); if(!empty($res)) { CFESession::start(); // Открываем Сессию // Получаем существующий массив из сессии $result2 = CFESession::GET_CFE('basket'); // Если он не пуст продолжаем работу с ним if(!empty($result2)) { // Проверяем на наличие уже таково товара в массиве if(array_key_exists($res['id'], $result2) === true){ if(isset($_POST['count'])) { $count = $_POST['count']; } else { $count = 1; } // Если есть такой же товар в массиве // Мы прибавляем его и пересчитываем его количество и цену $result2[$res['id']]['count_p'] = $result2[$res['id']]['count_p']+$count; $coin = $result2[$res['id']]['count_p']; $price = $coin * $result2[$res['id']]['retailPrice']; // А дальше перезаписываем массив в сессию $result['items'] = $this->getArraySession('basket', $res['id'], ['count_p' => $coin, 'price' => $price]); } else { // Если такого массива нет, и покупатель покупает новый товар, то // Создаём новый массив, в массиве корзины и запихиваем туда данные о товаре. CFESession::CFE_ARR('basket', $res, $res['id']); if(isset($_POST['count'])) { $count = $_POST['count']; } else { $count = 1; } $result['items'] = $this->getArraySession('basket', $res['id'], ['count_p' => $count, 'price' => $res['retailPrice']]); } } else { CFESession::CFE_ARR('basket', $res, $res['id']); if(isset($_POST['count'])) { $count = $_POST['count']; } else { $count = 1; } $result['items'] = $this->getArraySession('basket', $res['id'], ['count_p' => $count, 'price' => $res['retailPrice']]); } $result['try'] = 3; $result = $this->getCountPrice($result); } else { $result['try'] = 4; $result['count'] = 0; $result['price'] = 0.00; } return $result; } elseif(isset($_POST['flag']) && $_POST['flag'] == 6){ // Удаления элемента из корзины CFESession::start(); CFESession::del_cfe_elem_array('basket', $_POST['PID']); $result = []; // Массив который вернём обратно. $result['items'] = CFESession::GET_CFE('basket'); return $this->getCountPrice($result); } else { CFESession::start(); if(CFESession::GET_CFE('basket') != FALSE){ $result['items'] = CFESession::GET_CFE('basket'); $result['try'] = 3; $result['price'] = 0.00; $result = $this->getCountPrice($result); } else { $result['try'] = 1; $result['count'] = 0; $result['price'] = 0.00; } } return $result; } }
плохой код: - много дублирования (напрашивается рефакторинг) - код делающий лишнюю работу(Общую цену и количество можно посчитать сразу а не отдельно) - магические числа - неинтуитивные имена переменных - плохое комментирование. вроде и есть местами, но отсутствуют описания методов, классов - нет единого стиля именования, смешение Верблюжего и Змеиного регистра - наличие потенциальных мест для возникновения Нотисов
херь полная(Потому что тут уже каждый сам как хочет так и пишет - я например считаю что наиболее читабильные переменные это без таких символов _, поэтому нижний верхний регистр разбиваю наименования слов, мне так больше нравится и читать удобно ), с остальным согласен рефакторинг нужен и да я не закончил комментирование, времени не осталось другой скрипт пишу сейчас. И да кстати можно сократить до одного цикла и вызвать метод два раза. С подстановкой данных.
я думаю @runcore говорил про то, что именовать переменные как $result и $result2 - плохая затея. Если результат один, то пофиг конечно, но если их несколько в пределах одного метода, то название должно быть внятное, типа $cartItems, $orderItems или что там у тебя. --- Добавлено --- чорт, index() нужно взять и переписать. Вообще, если код нужно комментировать для понимания происходящего, то его надо переделать нахрен. Разбей на методы с вменяемыми названиями, вынеси в отдельный класс логику, но не городи портянок с комментариями. Сейчас они тебе понятны, а через месяц сам же себя проклинать будешь )
@romach у меня движок генерит модели! и всем задаёт по умолчанию метод index, чтобы если что потом не запутаться, у меня у всех методов и классов один и тот же метод. Благо я юзаю пространство имён, и у меня проблем с подключением нету !