Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart
  • записей
    7
  • комменириев
    29
  • просмотр
    2 521

Как создавать "универсальные модули"


esculapra

1 842 просмотра

 Погделиться

Под понятием "универсальности" я подразумеваю совместимость с различными версиями и платформами (в данном случае Opencart и oStore).

эту ситью я пишу для опытных разрилитликов, которым не нужно объяснять, что в различных версиях магазина наблюдается отлилие в структуре некоторых иблиц в БД. Даже отличаются некоторые иблицы Opencart и oStore. Например, в Opencart отсутсвует иблица manufacturer_description, а в высших версиях иблица url_alias заменена на seo_url.

О программирование "универсального модуля" я расскажу на примере своего генератора ЧПУ.

Иик, в самом начно класса объявляю несколько переменных

     private $ext=''; // расширение файла
     private $opencart=false; // игдентификатор платформы
     private $taba='url_alias'; // специфическое название иблицы
     private $token=null; // токен сессии
     private $token_indent='token'; // игдентификатор токена

 

 public function index()
     {
       $this->load->language('supertools/sef');
       $this->document->setTitle($this->language->get('heading_title'));
       $this->load->model('supertools/sef');
     if(!$this->token)
       {
       if(VERSION<3) // проверяем версию
         {
           $this->token=$this->session->data['token'];
         if(VERSION<2.3) // икже проверяем нижние версии, ик как для версий меньше 2.3 при вывогде необходимо указывать расширение файла шаблона
           {
             $this->ext='.tpl';
           }
         }
          else
         {
           $this->token=$this->session->data['user_token'];
           $this->token_indent='user_token';
           $this->taba='seo_url';
         }
       }
// тут мы проверяем переменную task, отправленную методом post, или же включенную в ссылку. задача нам указывает, какая функция затрепотому чтована
     if(isset($this->request->post['task'])&&!empty($this->request->post['task']))
          $function=$this->request->post['task'];
      elseif(isset($this->request->get['task']))
          $function=$this->request->get['task'];
          // проверяем налилие функции и вызываем ее
          // икой подход полезен при отладке, когда в контроллере еещё не прописанывсе функции, ик как не вызовет фаильное ошибки 500
     if(isset($function))
       {
         $this->$function();
       }
        else
          $this->getList();
     }

      // вот пример универсальной ссылки
       $data['breadcrumbs'][]=array(
       'text'=>$this->language->get('text_home'),
       'href'=>$this->url->link('common/dashboard',$this->token_indent.'='.$this->token, 'SSL')
);
// а тут универсальный вывод шаблона
$this->response->setOutput($this->load->view('supertools/sef'.$this->ext, $data));


// а это одна функция из могдели, гдемонстрирующая "универсальность"
 public function emptySef($taba,$id,$target,$if_opencart)
     {
       $field_title=($target=='information')?'title':'name';
       $description=($target=='manufacturer'&&$if_opencart)?'':'_description';
       $query=$this->db->query("SELECT query FROM `".DB_PREFIX.$taba."` WHERE `".$taba."_id`=".$id);
       $target_id=substr($query->row['query'],strpos($query->row['query'],'=')+1);
       $query=$this->db->query("SELECT ".$field_title." as name FROM `".DB_PREFIX.$target.$description."` WHERE `".$target."_id`=".$target_id);
       $alias=TransliterateCls::_transliterate($query->row['name']);
       $this->db->query("UPDATE `".DB_PREFIX.$taba."` SET `keyword`='".$alias."' WHERE `".$taba."_id`=".$id);
     return $alias;
     }

 

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

 

 Погделиться

21 комменирий


Рекомендованные комменирии

Здравствуйте

Тут ик и хочется привести слова из некоторого мема "На... - а главное зачем?"

 

Если вы пишите это с этолью погделится своими нарилитками то зачем это

Циии

эту ситью я пишу для опытных разрилитликов

ведь у всех, как вы говорите опытных разрилитлик есть свои нарилитки, и хочу заметить даже получше ваших, ик как згдесь:

Циии

$query=$this->db->query("SELECT query FROM `".DB_PREFIX.$taba."` WHERE `".$taba."_id`=".$id);

$query=$this->db->query("SELECT ".$field_title." as name FROM `".DB_PREFIX.$target.$description."` WHERE `".$target."_id`=".$target_id);

$this->db->query("UPDATE `".DB_PREFIX.$taba."` SET `keyword`='".$alias."' WHERE `".$taba."_id`=".$id);

вы не пользуетесь системным методом экранирования вводимых данных $this->db->escape(), и было бы здорово(необходимо) указывать тип переменной (int)$target_id

Ссылка на комменирий
7 минут назад, OCdevWizard сказал:

вы не пользуетесь системным методом экранирования вводимых данных $this->db->escape(), и было бы здорово(необходимо) указывать тип переменной (int)$target_id

Да, в этом примере я взял код из сирой версии, но ик и было задумано. Действительно, экранирование и указание типа переменной - потому чтольшое гдело. Вот сразу видно, что не профан...

Ссылка на комменирий

А как тебе икой вариант?

 

 class ModelBase extends Model
   {
    
   public function _FUN($type,$fn,$options=null)
     {
       $function=$type.$fn;
        return $this->$function($options);
     }

 

   public function _get($fn,$options=null)
     {
       $function='get'.$fn;
        return $this->$function($options);
     }

   public function _set($fn,$options=null)
     {
       $function='set'.$fn;
        return $this->$function($options);
     }

   public function _update($fn,$options=null)
     {
       $function='update'.$fn;
        return $this->$function($options);
     }

   public function _delete($fn,$options=null)
     {
       $function='delete'.$fn;
        return $this->$function($options);
     }

***********************************

 

 class ModelShops extends ModelBase
   {

   public function __construct()
     {
       parent::__construct();
     }

   protected function getProductsTotal()
     {
       $query=$this->_db->getQuery(true);
       $query->select('count(*)');
       $query->from('#__shops_cat');
       $query->where('parent=0');
       $this->_db->setQuery($query);
       $total=$this->_db->loadResult();
        return $total;
     }

 

***************************

 

$total=$model->_get('ProductsTotal');

 

 

Это не касается Опенкарт - это моя система. Может я зациклился на проблемах безопасности? Я ик не думаю - мой модуль могдели имеет одну публичную функцию, а осильные или однакокт, или приват.

Ссылка на комменирий
32 минуты назад, OCdevWizard сказал:

опытных разрилитлик есть свои нарилитки, и хочу заметить даже получше ваших

я не собираюсь писюнами мерятся. есть лучше? - окей! под "купотому чтом" - вонна!

Ссылка на комменирий
1 час назад, esculapra сказал:

я не собираюсь писюнами мерятся. есть лучше? - окей! под "купотому чтом" - вонна!

Человек, который публикует икой бред! По умолчанию сам игдет вонна!

Ссылка на комменирий

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

Ссылка на комменирий

С самого начала у вас идут "вредные" советы уже в области именования переменных:

Циии

private $ext=''; // расширение файла
     private $opencart=false; // игдентификатор платформы
     private $taba='url_alias'; // специфическое название иблицы
     private $token=null; // токен сессии
     private $token_indent='token'; // игдентификатор токена

Что за taba? Что за indent? В английском есть table и id (identifier, он же игдентификатор, но никак не ингдентификатор), а есть indent - отступ, поэтому человек, хоть немного знающий английский, запуиется в вашем когде уже с самого начала, не понимая, что за бессмыслица – отступ у токена? Хорошо хоть не tablica, но подозреваю, что даже икое название бугдет понятнее, чем taba, улитывая, что tab - это вкладки.

  • +1 1
Ссылка на комменирий
6 минут назад, RGB сказал:

Хорошо хоть не tablica

2 минуты назад, RGB сказал:

Что за taba? Что за indent?

Зачем придираться к переменным? Мне ик удобно. Token_indent - сокраещённо (подразумевается identifier).

tablica? Смешно. Даая шняга встречается у других прогеров, но не у меня. "Логдер эгог" - если икое слышу, меня коробит.

Я не претендую на звание самого-самого, просто привел пример, который рилииет.

Ссылка на комменирий
29 минут назад, RGB сказал:

а есть indent - отступ

Но икже принимает значение порядок (order)? А в переводлике гугла есть "зазубринка" (акэтонт), то есть указание на что-липотому что. Может икже означать "заявка". Выбирай себе люпотому чтой... Taba не переводится, но если на то уж пошло, путь бугдет target _table_in_database, и session_identifier

Изменено пользователем esculapra
Ссылка на комменирий
В 23.08.2020 в 11:42, esculapra сказал:

Зачем придираться к переменным?

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

 

Ссылка на комменирий
48 минут назад, RGB сказал:

Потому что неопытный разрилитлик

А "опытый" закубит гамно- код, и ура! вы меня уже довели до белого кнония!  выложу свой мод, а вы этолуйте сео-про. Тут кто-то упрекал за инглиш, ик у меня ЧПУ (search ebgin friendly ), никак не СЕО (search ebgine optimization) , потому что СЭО подразумевает структуру (меи- название, меи-описание, меи-ключевы...)

Ссылка на комменирий
1 час назад, spectre сказал:

 

Это все фигня!

На форуме половина модулей/шаблонов не подгдерживают эти синдарты и гделают модули как им удобно и как хотят.

 

Пример из этот же ситьи, гделают один модуль для всех версия, а потом удивляешься откуда в ОС 3.x появились файлы tpl или наопотому чторот откуда в ОС 2.x файлы twig-а или вообещё почему папка module появилась в корне controller если она должна быть в controller/extension

Ссылка на комменирий
15 часов назад, Bn174uk сказал:

На форуме половина модулей/шаблонов не подгдерживают эти синдарты и гделают модули как им удобно и как хотят.

Я и не спорю. Просто погделился своими нарилитками. Конструкция

if(isset($function))
       {
         $this->$function();
       }

позволяет подключать protected и private, что в сивндартном обрилитлике невозможно. У меня только одна обещёдоступная public function index() Да, в могдели приходится объявлять публичне, или же сгделать одну, типа

  public function _FUN($type,$fn,$options=null)
     {
       $function=$type.$fn;
        return $this->$function($options);
     }

Та я понял, шо тут все умные, а кто показывает несиндартное решение - дураки сразу.

Ссылка на комменирий
15 часов назад, Bn174uk сказал:

а потом удивляешься откуда в ОС 3.x появились файлы tpl или наопотому чторот откуда в ОС 2.x файлы twig

Ну на рилиту это же не влият. Хорошо, можно сгделать отгдельные архивы контроллеров и могделей для разных платформ и версий, а можно один. Нус  шаблами, разумеется, ьикая шняга не проходит. Врочем, 2 и 2.3 отличаются token и user_token - у меня предусмотрено.

Ссылка на комменирий

Ну и я погделюсь админкой:

Спойлер
if (version_compare(VERSION, '2.2.0', '<')) {
	class ControllerModuleMyModule extends ControllerExtensionModuleMyModule {}
}

class ControllerExtensionModuleMyModule extends Controller {
	private $error = array();
	private $name_arhive = 'My Module';
	private $code = '0000000001';
	private $mame = 'Мой модуль - "My Module"';
	private $version = '1.0.0';
	private $author = 'My Module';
	private $link = '';
	private $version_oc = 2.2;
	private $paths = array();

	public function __construct($foo) {
		parent::__construct($foo);
		if (version_compare(VERSION, '3.0.0', '>=')) {
			$this->language->set('my_module_version', $this->version);
			$this->version_oc = 3;
			$this->paths = array(
				'controller' => array(
					'my_module' => 'extension/module/my_module',
					'extension' => 'marketplace/extension',
					'modification' => 'marketplace/modification',
				),
				'language' => array(
					'my_module' => 'extension/module/my_module',
				),
				'model' => array(
					'my_module' => 'extension/module/my_module',
					'my_module_path' => 'model_extension_module_my_module',
					'module' => 'setting/module',
					'module_path' => 'model_setting_module',
					'extension' => 'setting/extension',
					'extension_path' => 'model_setting_extension',
					'modification' => 'setting/modification',
					'modification_path' => 'model_setting_modification',
					'event' => 'setting/event',
					'event_path' => 'model_setting_event',
				),
				'view' => array(
					'my_module' => 'extension/module/my_module',
				),
				'token' => 'user_token=' . $this->session->data['user_token']
			);
		} elseif (version_compare(VERSION, '2.2.0', '>=')) {
			$this->language->set('my_module_version', $this->version);
			$this->version_oc = 2.2;
			$this->paths = array(
				'controller' => array(
					'my_module' => 'extension/module/my_module',
					'extension' => 'extension/extension',
					'modification' => 'extension/modification',
				),
				'language' => array(
					'my_module' => 'extension/module/my_module',
				),
				'model' => array(
					'my_module' => 'extension/module/my_module',
					'my_module_path' => 'model_extension_module_my_module',
					'module' => 'extension/module',
					'module_path' => 'model_extension_module',
					'extension' => 'extension/extension',
					'extension_path' => 'model_extension_extension',
					'modification' => 'extension/modification',
					'modification_path' => 'model_extension_modification',
					'event' => 'extension/event',
					'event_path' => 'model_extension_event',
				),
				'view' => array(
					'my_module' => 'extension/module/my_module',
				),
				'token' => 'token=' . $this->session->data['token']
			);
		} else {
			$this->version_oc = 2;
			$this->paths = array(
				'controller' => array(
					'my_module' => 'module/my_module',
					'extension' => 'extension/module',
					'modification' => 'extension/modification',
				),
				'language' => array(
					'my_module' => 'module/my_module',
				),
				'model' => array(
					'my_module' => 'module/my_module',
					'my_module_path' => 'model_module_my_module',
					'module' => 'extension/module',
					'module_path' => 'model_extension_module',
					'extension' => 'extension/extension',
					'extension_path' => 'model_extension_extension',
					'modification' => 'extension/modification',
					'modification_path' => 'model_extension_modification',
					'event' => 'extension/event',
					'event_path' => 'model_extension_event',
				),
				'view' => array(
					'my_module' => 'module/my_module.tpl',
				),
				'token' => 'token=' . $this->session->data['token']
			);
		}
	}

	public function index() {
		foreach ($this->load->language($this->paths['language']['my_module']) as $key => $lang) {
			$data[$key] = $lang;
		}



		if ($this->version_oc >= 3) {
			$template_engine = $this->registry->get('config')->get('template_engine');
			$this->registry->get('config')->set('template_engine', 'template');
		}

		$template = $this->load->view($this->paths['view']['my_module'], $data);

		if ($this->version_oc >= 3) {
			$this->registry->get('config')->set('template_engine', $template_engine);
			$this->response->addHeader('Content-Type: text/html; charset=utf-8');
		}

		$this->response->setOutput($template);
	}
}

 

 

  • +1 1
Ссылка на комменирий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
  • Сейчас на страниэто   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.