All streams
Search
Write a publication
Pull to refresh
-19
0
Fortop @Fortop

Пользователь

Send message
Естественно.
Потому что всего вашего образования — два класса и коридор.

Если я начну 5-тилетним задвигать теорию суперструн для них это тоже будет выглядеть бредом, как и для вас.

А какие громкие слова об архитектуре… :D
Сыну больше чем мне? :D
Да вы у нас скорострел… Как я погляжу…

И ламер наблюдается пока один — это конкретно вы.

Основная ваша проблема в том, что знаний у вас близко к нулю.
Рассуждать о безопасности с таким кодом…

// это вызов в контроллере
$category_info = $this->model_catalog_category->getCategory($path_id);

// а это сам метод...
public function getCategory($category_id) {
	$query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$category_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'");

	return $query->row;
}

Ну, наверное, конечно можно… местами…
Но я бы не стал

Реализация opencart имеет право на жизнь как коробочное нерасширяемое приложение для конечного пользователя.
Когда вся кастомизация заключается в смене «шкурки».

Вопрос «безопасности» очень сильно открыт…
Вопрос расширяемости… увольте.

И так, как говорят братья беларусы — панеслася
Разбираем этот кусок кода частично

$this->document->addScript('catalog/view/javascript/jquery/magnific/jquery.magnific-popup.min.js');
$this->document->addStyle('catalog/view/javascript/jquery/magnific/magnific-popup.css');
$this->document->addScript('catalog/view/javascript/jquery/datetimepicker/moment.js');
$this->document->addScript('catalog/view/javascript/jquery/datetimepicker/bootstrap-datetimepicker.min.js');
$this->document->addStyle('catalog/view/javascript/jquery/datetimepicker/bootstrap-datetimepicker.min.css');


А если я хочу подменить шаблон и использовать другой? Мне копипастить весь action контроллера?

Скрипты, связанные с шаблоном, обязаны быть связаны только с ним, а не с action контроллера

А если я захочу выводить не html, а отдавать json? Опять копипаст?

Маппинг данных для шаблона
$data['heading_title'] = $product_info['name'];
$data['text_select'] = $this->language->get('text_select');
$data['text_manufacturer'] = $this->language->get('text_manufacturer');
$data['text_model'] = $this->language->get('text_model');
$data['text_reward'] = $this->language->get('text_reward');
$data['text_points'] = $this->language->get('text_points');
$data['text_stock'] = $this->language->get('text_stock');
$data['text_discount'] = $this->language->get('text_discount');
$data['text_tax'] = $this->language->get('text_tax');
$data['text_option'] = $this->language->get('text_option');
$data['text_minimum'] = sprintf($this->language->get('text_minimum'), $product_info['minimum']);
$data['text_write'] = $this->language->get('text_write');
$data['text_login'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true));
$data['text_note'] = $this->language->get('text_note');
$data['text_tags'] = $this->language->get('text_tags');
$data['text_related'] = $this->language->get('text_related');
$data['text_payment_recurring'] = $this->language->get('text_payment_recurring');
$data['text_loading'] = $this->language->get('text_loading');
$data['entry_qty'] = $this->language->get('entry_qty');
$data['entry_name'] = $this->language->get('entry_name');
$data['entry_review'] = $this->language->get('entry_review');
$data['entry_rating'] = $this->language->get('entry_rating');
$data['entry_good'] = $this->language->get('entry_good');
$data['entry_bad'] = $this->language->get('entry_bad');
$data['button_cart'] = $this->language->get('button_cart');
$data['button_wishlist'] = $this->language->get('button_wishlist');
$data['button_compare'] = $this->language->get('button_compare');
$data['button_upload'] = $this->language->get('button_upload');
$data['button_continue'] = $this->language->get('button_continue');
$this->load->model('catalog/review');
$data['tab_description'] = $this->language->get('tab_description');
$data['tab_attribute'] = $this->language->get('tab_attribute');
$data['tab_review'] = sprintf($this->language->get('tab_review'), $product_info['reviews']);
$data['product_id'] = (int)$this->request->get['product_id'];
$data['manufacturer'] = $product_info['manufacturer'];
$data['manufacturers'] = $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $product_info['manufacturer_id']);
$data['model'] = $product_info['model'];
$data['reward'] = $product_info['reward'];
$data['points'] = $product_info['points'];
$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');



Не, явное лучше неявного… Но не до такой же степени…

Кто мешал сделать так?
$translator = new Translator($this->request->get('lang'));
// спорный момент, ну ок, пусть у нас маппер попутно дергает еще и переводчик
// хотя лично я бы вопрос перевода оставил бы на намного более поздний этап 
// при выводе в шаблоне
$mapper = new ProductTemplateMapper($translator);
$queryMapper = new ProductQueryMapper($translator);
$validator = new ProductQueryValidator($translator);

$data = [];
$data = $mapper->map($data, $product_info);

$queryData =$queryMapper->map([], $this->request->getQueryParams());
if (!$validator->isValid($queryData)) {
    throw new Exception($validator->getMessage());
}
$data = $mapper->map($data, $queryData)


Йо, диджей…
  • Мы имеем переиспользуемый код.
  • Мы не имеем лапши в контроллере и логика стала намного чище и прозрачнее. Буде нам захочется деталей мы преспокойно погрузимся в мапперы и валидатор.
  • Мы можем валидировать данные в другом месте тем же самым кодом.
  • Мы можем маппить одни структуры и входные параметры в другие где нам угодно, если захотим.

Безопасность?
Мы добавили валидацию данных, которую я не видел в исходном коде…
Осталось написать корректно валидатор.

Чересчур дубовый.
Я бы даже сказал — высеченный в граните при помощи зубила
Ещё раз для двоечников…

Что вы слышали о маппинге?
Как этот конкретный код улучшает безопасность?
Подождите мальчик…

Вопрос был об архитектуре, котлетах и мухах.
То, что я вижу в коде, это помойка в одном месте.

О DataMapper нет, не слышали?

И как приведенный код улучшает «безопасность»?
Тут вот выше посоветовали…
Глянул…

https://github.com/opencart/opencart/blob/master/upload/catalog/controller/product/product.php#L229
пример кода из опенкарт
			$data['text_select'] = $this->language->get('text_select');
			$data['text_manufacturer'] = $this->language->get('text_manufacturer');
			$data['text_model'] = $this->language->get('text_model');
			$data['text_reward'] = $this->language->get('text_reward');
			$data['text_points'] = $this->language->get('text_points');
			$data['text_stock'] = $this->language->get('text_stock');
			$data['text_discount'] = $this->language->get('text_discount');
			$data['text_tax'] = $this->language->get('text_tax');
			$data['text_option'] = $this->language->get('text_option');
			$data['text_minimum'] = sprintf($this->language->get('text_minimum'), $product_info['minimum']);
			$data['text_write'] = $this->language->get('text_write');
			$data['text_login'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true));
			$data['text_note'] = $this->language->get('text_note');
			$data['text_tags'] = $this->language->get('text_tags');
			$data['text_related'] = $this->language->get('text_related');
			$data['text_payment_recurring'] = $this->language->get('text_payment_recurring');
			$data['text_loading'] = $this->language->get('text_loading');
			$data['entry_qty'] = $this->language->get('entry_qty');
			$data['entry_name'] = $this->language->get('entry_name');
			$data['entry_review'] = $this->language->get('entry_review');
			$data['entry_rating'] = $this->language->get('entry_rating');
			$data['entry_good'] = $this->language->get('entry_good');
			$data['entry_bad'] = $this->language->get('entry_bad');
			$data['button_cart'] = $this->language->get('button_cart');
			$data['button_wishlist'] = $this->language->get('button_wishlist');
			$data['button_compare'] = $this->language->get('button_compare');
			$data['button_upload'] = $this->language->get('button_upload');
			$data['button_continue'] = $this->language->get('button_continue');
			$this->load->model('catalog/review');
			$data['tab_description'] = $this->language->get('tab_description');
			$data['tab_attribute'] = $this->language->get('tab_attribute');
			$data['tab_review'] = sprintf($this->language->get('tab_review'), $product_info['reviews']);
			$data['product_id'] = (int)$this->request->get['product_id'];
			$data['manufacturer'] = $product_info['manufacturer'];
			$data['manufacturers'] = $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $product_info['manufacturer_id']);
			$data['model'] = $product_info['model'];
			$data['reward'] = $product_info['reward'];
			$data['points'] = $product_info['points'];
			$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');




Вам вопрос, как специалисту по архитектуре, такое в каждом контролере?
Вот через месяц я его и открою снова.

А держать 5 активных в которые не заглядывал в течении дня…
Это сравни тому как оставлять кучку мусора посреди комнаты — потом когда-то домету…
Вообще-то это сложно назвать работой.
10+ проектов одновременно…
Не-не-не :)

Мне ближе фреймворки, а не cms

Но код из любопытства гляну
Действительно указано, причём практически в самом начале.
Значит я очень невнимательно прочёл
Composer-то поддерживается или нет?
Только не говорите, что эта случайная картинка плод ваших трудов… :-D
Оттуда откуда и такие же «программисты» вроде вас юноша…

Сначала пишут такие программы
image

Потом героически преодолевают трудности…
Естественно.
Ведь вы один из тех миллионов.
И вы, конечно же, не ошибаетесь
К счастью здоровым вроде меня она и не нужна.

А вам я крайне рекомендую перечитать и вникнуть в текст.
Ну и определиться с тем, что же вы считаете велосипедами…
Вопрос очень странный.

модульность дружит с модульностью.
Большинство современных шаблонизаторов отлично с этим живет.
Мне жаль вас огорчать, но вам к окулисту и в первый класс школы.
Для изучения чтения
Это ваши личные комплексы.

Миллионы леммингов не могут ошибаться…
У меня не в одной БД.

Подразумевалось «все связанные данные и ресурсы в одной БД»

Если у вас пользователи не имеют связей между собой, то естественно БД может быть больше одной

Information

Rating
Does not participate
Location
Донецкая обл., Украина
Date of birth
Registered
Activity