Как создавать "универсальные модули"
Под понятием "универсальности" я подразумеваю совместимость с различными версиями и платформами (в данном случае 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 коментар
Recommended Comments
Створіть аккаунт або увійдіть для коментування
Ви повинні бути користувачем, щоб залишити коментар
Створити обліковий запис
Зареєструйтеся для отримання облікового запису. Це просто!
Зареєструвати аккаунтВхід
Уже зареєстровані? Увійдіть тут.
Вхід зараз