Michael
26.12.2013 - 15:21
Цитата (paul85) |
Я не думаю, что типовые движки прямо могут со всеми банками взаимодействовать. |
с тем из друпал магазинных сборок, с которым я работал, там вот эта твоя скидка на каждого пользователя уже выйдет в заметное удорожание, т.к. такое по логике не предусмотрено.
А с какого отправного момента он (заказчик) стал апеллировать к другим движкам? По цене за доделки не сошлись?
_____________
There never was a struggle in the soul of a good man that was not hard
paul85
26.12.2013 - 18:53
Цитата |
Мне лично понравилось, что фамилия - необязательное поле, а отчество - обязательное rolleyes.gif |
Ну это же заказ без регистрации. То есть обратиться к человеку по имени и отчеству, когда менеджер будет звонить. А фамилия ИМХО в данном случае вроде как и лишняя. Поэтому такие обязательные поля.
Цитата |
Это страница товара. Почему титл = "Каталог"? Где h1? Метатеги? Почему во всем каталоге всегда титл = "Каталог"? и т.д. |
Спасибо, учту! Я с сео почти не знаком, увы...
Цитата |
Есть глюки и непонятки в логике. Например, удаление позиций в корзине. |
А чего там за глюк с корзиной?
Цитата |
Правильный путь ценообразования: ТЗ - бюджет заказчика - поиск решения - реализация |
Дело в том, что заказчик не всегда готов озвучивать свой бюджет. Как быть в этом случае?
Цитата |
А с какого отправного момента он (заказчик) стал апеллировать к другим движкам? |
Когда речь пошла об интеграции платежной системы банка. Не то, чтобы претензии, скажем так, намек. Мол, "я конечно понимаю всё... Но вот тут я видел то-то и то-то..." И вроде как справедливо, но обидно другое. Вот он сейчас смотрит на все эти громкие фразы, и может быть чуть-чуть не понимает, что за базовую стоимость он получит магазин довольно далекий от его мечты.
Тут случай забавный был, как раскрутили ребят из 1cteam.ru на 70 кусков. Вот за это! Тоже обещали все на свете, чуть ли не научные исследования провести. =)
paul85
26.12.2013 - 19:01
Цитата |
Недавно Вы писали про тесты для нанимателя. Если это делали Вы, то свои тесты Вы бы не прошли. |
S.Chushkin, ну как, я про верстку вроде ничего и не говорил. Однако вполне вероятно, что свой же тест и не прошел бы.
Признаюсь, сверстан сайт без ухищрений. Но я так глянул более или менее вроде работает под разными браузерами. Вроде даже одинаково отображает.
S.Chushkin
26.12.2013 - 20:08
Цитата (paul85 @ 26.12.2013 - 19:01) |
ну как, я про верстку вроде ничего и не говорил. |
Вёрстка это тоже показатель качества и влияет на цену.
Цитата |
Признаюсь, сверстан сайт без ухищрений. Но я так глянул более или менее вроде работает под разными браузерами. Вроде даже одинаково отображает. |
Вёрстка это не только отображение, но и HTML-код. Ваш HTML-код недостаточно качественен для спеца на 100 Кр, соответственно можно предположить, что PHP-код также недостаточно качественен для спеца указанного уровня. Т.е. или нужно уменьшать цену спеца и увеличивать сроки, чтобы уложиться в озвученную цену проекта (см.выше) или нанимать другого. Кроме того, плохое качество кода порождает сомнения в других параметрах проекта, например безопасности. Поэтому я и сказал, что нужно ещё пару недель, чтобы вылизать код, и HTML и PHP.
В общем, качество кода это один из показателей насколько тщательно разраб выполняет работу, что может/должно влиять на цену проекта.
Цитата |
А чего там за глюк с корзиной? |
Скорее непонятка, не доделано. Когда удаляешь товар из корзины она должна пересчитываться и перерисовываться сразу, а не ждать нажатие кнопки "обновить".
Ещё не хорошо, когда добавляется товар с длинным описанием - кнопки "уезжают" за границы. Вообще, нафига нужно это промежуточное действие, непонятно - нормально сразу добавлять товар в корзину, принцип минимально необходимого числа действий юзера ещё никто не отменял.
Как-то так...
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
26.12.2013 - 20:22
Цитата (MiksIr @ 26.12.2013 - 20:14) |
Тогда достаточно одного поля: "Как вас зовут" или "Как к вам обращаться" - и все. |
Причём поле не должно быть обязательным. Покупатель не обязан называть продавцу своё имя.
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
paul85
26.12.2013 - 20:50
Цитата |
Ещё не хорошо, когда добавляется товар с длинным описанием - кнопки "уезжают" за границы. |
Исправлю. Не заметил, благодарю!
Цитата |
Вообще, нафига нужно это промежуточное действие, непонятно - нормально сразу добавлять товар в корзину |
Изначально так и было сделано. Но позже заказчик настоятельно пожелал "менять количество товара сразу же" + сообщение о добавлении (подразумевается какая-то реакция на кнопку "купить").
Цитата |
Когда удаляешь товар из корзины она должна пересчитываться и перерисовываться сразу, а не ждать нажатие кнопки |
Хм, а что за браузер? Там улетает через AJAX id товара и по success: window.location.reload() То есть перезагрузка не срабатывает, я правильно понимаю?
Цитата |
Тогда достаточно одного поля: "Как вас зовут" или "Как к вам обращаться" - и все. |
Предложу такой вариант, а решает пусть заказчик.
S.Chushkin
26.12.2013 - 20:53
Цитата (paul85 @ 26.12.2013 - 20:50) |
Изначально так и было сделано. Но позже заказчик настоятельно пожелал "менять количество товара сразу же" + сообщение о добавлении (подразумевается какая-то реакция на кнопку "купить"). |
Тут ничего не поделаешь - "хозяин барин...".
Цитата |
Хм, а что за браузер? |
paul85
26.12.2013 - 23:42
Цитата |
PHP-код также недостаточно качественен для спеца указанного уровня. |
Даже любопытно стало! Выложу на оценку пару кусочков.
<?php
class Core extends Config
{
protected $template;
protected $discount=0;
public function __construct()
{
$this->smarty = new Smarty();
$this->smarty->template_dir = $_SERVER['DOCUMENT_ROOT'] . '/tmpl/templates';
$this->smarty->compile_dir = $_SERVER['DOCUMENT_ROOT'] . '/tmpl/templates_c';
$this->db = new goDB($this->config);
$this->db->query("SET NAMES utf8");
if(isset($_COOKIE['SESSID']))
{
session_start();
if(isset($_SESSION['LOGIN']))
{
$this->smarty->assign('user_login', $_SESSION['LOGIN']);
$this->discount = $_SESSION['DISCOUNT'];
}
}
}
protected function cartinfo()
{
$pattern = 'SELECT
temp1.temporderdetail_quantity * CEIL(temp2.product_price -(temp2.product_price/100*'.$this->discount.')) as subtotal,
temp1.temporderdetail_quantity as quantity
FROM
temporderdetail as temp1
LEFT JOIN
product as temp2
ON
temp2.product_id = temp1.product_id
WHERE
temp1.temporderdetail_sesid=?';
$data = array(session_id());
$table = $this->db->query($pattern, $data, 'assoc');
if(!empty($table))
{
$sumprod=0;
$quant=0;
$this->smarty->assign('session', true);
$_SESSION['cart'] = true;
foreach($table as $row)
{
$sumprod += $row['subtotal'];
$quant += $row['quantity'];
}
$sumprod = number_format($sumprod, 0, '', ', ');
$this->smarty->assign('numberofproducts', $quant);
$this->smarty->assign('sumoforder', $sumprod);
}
else
{
$_SESSION['cart'] = false;
}
}
private function _shownews()
{
$news = $this->db->query('SELECT
news_id,
DATE_FORMAT(news_date, "%d-%m-%Y") as news_date,
news_header
FROM
news
ORDER BY
news_date DESC LIMIT 10 ', array(), 'assoc');
$this->smarty->assign('news', $news);
}
protected function _paginator($sql, $sqldata, $pagetodisplay, $rowonpage)
{
$countofrows = $this->db->query($sql, $sqldata, 'num');
$totalpages = ceil($countofrows/$rowonpage);
if($countofrows <= $rowonpage)
$pageline = NULL;
elseif($totalpages < $pagetodisplay)
$pageline = FALSE;
else
{
$start = ($pagetodisplay-1)*$rowonpage;
$sql .= " LIMIT $start, $rowonpage";
if($totalpages <= 9)
{
for($i=1; $i<=$totalpages; $i++)
{
if($pagetodisplay == $i)
$pageline[]=$i*(-1);
else
$pageline[]=$i;
}
}
elseif($pagetodisplay > 5 && $pagetodisplay <= $totalpages-5)
{
$pageline=array(1,0);
for($i=$pagetodisplay-3; $i<=$pagetodisplay+3; $i++)
{
if($pagetodisplay == $i)
$pageline[]=$i*(-1);
else
$pageline[]=$i;
}
$pageline[]=0;
$pageline[]=$totalpages;
}
elseif($pagetodisplay <= 5 && $totalpages > 9)
{
for($i=1; $i<=7; $i++)
{
if($pagetodisplay == $i)
$pageline[]=$i*(-1);
else
$pageline[]=$i;
}
$pageline[]=0;
$pageline[]=$totalpages;
}
elseif($pagetodisplay > 5 && $pagetodisplay > $totalpages-5)
{
$pageline=array(1,0);
for($i=$totalpages-6; $i<=$totalpages; $i++)
{
if($pagetodisplay == $i)
$pageline[]=$i*(-1);
else
$pageline[]=$i;
}
}
}
return(array('sql' => $sql, 'pageline' => $pageline));
}
public function __destruct()
{
if(!empty($_SESSION['cart']) && !isset($_SESSION['admin']))
$this->cartinfo();
$this->_shownews();
if($this->template)
$this->smarty->display($this->template);
else
$this->smarty->display('error/error_pagenotfound.tpl');
}
}
?>
<?php
class search extends Core
{
public function show()
{
$pattern='SELECT
temp1.product_id,
temp1.product_partnumber,
temp1.product_description,
CEIL(temp1.product_price - (temp1.product_price/100*' . $this->discount . ')) AS product_price,
temp2.photo_id
FROM
product AS temp1
LEFT JOIN
photo AS temp2
ON
temp1.product_id = temp2.product_id
WHERE
product_description LIKE CONCAT("%", ?, "%") OR
product_partnumber LIKE CONCAT("%", ?, "%")';
if(!isset($_GET['partnumber']))
{
$_GET['partnumber']='';
}
$patterndata = array($_GET['partnumber'], $_GET['partnumber']);
if(isset($_GET['page']) && (int)$_GET['page'] > 0)
{
$page=(int)$_GET['page'];
$new_pattern = $this->_paginator($pattern, $patterndata, $page, 10);
if($new_pattern['pageline'] === FALSE || $new_pattern['pageline'] === NULL)
{
header("HTTP/1.0 404 Not Found");
$this->template='error/error_pagenotfound.tpl';
exit();
}
}
elseif(isset($_GET['page']) && (int)$_GET['page']<=0)
{
header("HTTP/1.0 404 Not Found");
$this->template='error/error_pagenotfound.tpl';
exit();
}
else
{
$new_pattern = $this->_paginator($pattern, $patterndata, 1, 10);
}
$data = $this->db->query($new_pattern['sql'], $patterndata, 'assoc');
$this->smarty->assign('request', $_GET['partnumber']);
$this->smarty->assign('pagebar', $new_pattern['pageline']);
$this->smarty->assign('data', $data);
$this->template='blocks/blocks_search.tpl';
}
}
?>
Знаю, запросам в контроллере не место. Но движок старый, еще не переделал. Следующий проект уже идет на полноценном MVC. И сорри за алиасы temp1, temp2... Дурацкая привычка. Никак не отвыкну, уж слишком быстро пишется слово temp. :D
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.