Под понятием "универсальности" я подразумеваю совместимость с различными версиями и платформами (в данном случае 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;
}
Разумеется, что для каждой конкретной задачи необходим свой подход, но все в ваших руках. Я показал то, что реально работает.