После написания предыдущей статьи поступила просьба написать еще 1 статью про добавление мета тегов к производителям компонента VirtueMart для joomla 1.6+ - приступим!
Пойдем мы тем же путем, что и в прошлой статье для jommla 1.5, для начала сделаем поля для добавления мета тегов. Кстати, хочу отметить, что для новой версии VirtueMart использовало более правдоподобный паттерн проектирования к MVC.
Идем к файлу administrator/components/com_virtuemart/views/manufacturer/tmpl/edit_description.php.
Добавляем к строкам
<?php echo VmHTML::row('input', 'COM_VIRTUEMART_MANUFACTURER_NAME', 'mf_name', $this->manufacturer->mf_name); ?>
<?php echo VmHTML::row('booleanlist', 'COM_VIRTUEMART_PUBLISH', 'published', $this->manufacturer->published); ?>
<?php echo VmHTML::row('input', $this->viewName.' '. JText::_('COM_VIRTUEMART_SLUG'), 'slug', $this->manufacturer->slug); ?>
<?php echo VmHTML::row('select','COM_VIRTUEMART_MANUFACTURER_CATEGORY_NAME',
'virtuemart_manufacturercategories_id', $this->manufacturerCategories, $this->manufacturer->virtuemart_manufacturercategories_id, '',
'virtuemart_manufacturercategories_id', 'mf_category_name',false); ?>
<?php echo VmHTML::row('input', 'COM_VIRTUEMART_MANUFACTURER_URL', 'mf_url',$this->manufacturer->mf_url); ?>
<?php echo VmHTML::row('input', 'COM_VIRTUEMART_MANUFACTURER_EMAIL', 'mf_email',$this->manufacturer->mf_email); ?>
<?php echo VmHTML::row('editor', 'COM_VIRTUEMART_MANUFACTURER_DESCRIPTION', 'mf_desc', $this->manufacturer->mf_desc); ?>
3 поля и получаем такой вид
<?php echo VmHTML::row('input', 'COM_VIRTUEMART_MANUFACTURER_NAME', 'mf_name', $this->manufacturer->mf_name); ?>
<?php echo VmHTML::row('booleanlist', 'COM_VIRTUEMART_PUBLISH', 'published', $this->manufacturer->published); ?>
<?php echo VmHTML::row('input', $this->viewName.' '. JText::_('COM_VIRTUEMART_SLUG'), 'slug', $this->manufacturer->slug); ?>
<?php echo VmHTML::row('select', 'COM_VIRTUEMART_MANUFACTURER_CATEGORY_NAME',
'virtuemart_manufacturercategories_id', $this->manufacturerCategories, $this->manufacturer->virtuemart_manufacturercategories_id, '', 'virtuemart_manufacturercategories_id', 'mf_category_name',false); ?>
<?php echo VmHTML::row('input', 'COM_VIRTUEMART_MANUFACTURER_URL','mf_url', $this->manufacturer->mf_url); ?>
<?php echo VmHTML::row('input', 'COM_VIRTUEMART_MANUFACTURER_EMAIL','mf_email', $this->manufacturer->mf_email); ?>
<?php echo VmHTML::row('editor', 'COM_VIRTUEMART_MANUFACTURER_DESCRIPTION', 'mf_desc', $this->manufacturer->mf_desc); ?>
<?php echo VmHTML::row('input', 'Мета описание', 'mf_m_desc', $this->manufacturer->mf_m_desc); ?>
<?php echo VmHTML::row('input', 'Мета ключевые-слова', 'mf_m_key', $this->manufacturer->mf_m_key); ?>
<?php echo VmHTML::row('input', 'Мета тайтл','mf_m_title', $this->manufacturer->mf_m_title); ?>
сохраняем и перезаписываем.
Далее идем в базу данных и находим таблицу "(ваш префикс к базе данных - посмотреть можно в файле configuration.php)_virtuemart_manufacturers_ru_ru" - насчет букв "ru_ru" не полностю уверен, наверняка это язык под которым вы устанавливали VirtueMart, и добавляем 3 поля соответственно mf_m_desc, mf_m_key, mf_m_title, как и какие добавлять поля описано в прошлой статье.
Следующим шагом делаем вывод и сохранение данных в выше указаные поля.
Идем к файлу модели производителя (еще раз хочу сделать акцент на приблеженности нового VirtueMart-a к MVC) administrator/components/com_virtuemart/models/manufacturer.php.
Находим такой кусочек кода:.
function __construct() {
parent::__construct('virtuemart_manufacturer_id');
$this->setMainTable('manufacturers');
$this->addvalidOrderingFieldName(array('m.virtuemart_manufacturer_id', 'mf_name', 'mf_desc', 'mf_category_name', 'mf_url'));
$this->removevalidOrderingFieldName('virtuemart_manufacturer_id');
$this->_selectedOrdering = 'mf_name';
$this->_selectedOrderingDir = 'ASC';
}
и дополняем его.
function __construct() {
parent::__construct('virtuemart_manufacturer_id');
$this->setMainTable('manufacturers');
$this->addvalidOrderingFieldName(array('m.virtuemart_manufacturer_id',
'mf_name',
'mf_desc',
'mf_category_name',
'mf_url',
'mf_m_desc',
'mf_m_key',
'mf_m_title'));
$this->removevalidOrderingFieldName('virtuemart_manufacturer_id');
$this->_selectedOrdering = 'mf_name';
$this->_selectedOrderingDir = 'ASC';
}
Сохраняем, перезаписываем. Но хочу обратить ваше внимание на то что - это нам даст только вывод наших данных, а о том как они сохраняются подсказала нам строка:
$this->setMainTable('manufacturers');
а если сказать точнее то она нам говорит, что где то лежит модель базовой таблици, рыть долго не нужно, она обычно лежит в папке tables, по пути administrator/components/com_virtuemart/tables/manufacturers.php - тут немного дописываем класс
class TableManufacturers extends VmTable {
/** @var int Primary key */
var $virtuemart_manufacturer_id = 0;
/** @var string manufacturer name */
var $mf_name = '';
var $slug = '';
/** @var string manufacturer email */
var $mf_email = '';
/** @var string manufacturer description */
var $mf_desc = '';
/** @var int Manufacturer category id */
var $virtuemart_manufacturercategories_id = 0;
/** @var string manufacturer URL */
var $mf_url = '';
/** @var int published or unpublished */
var $published = 1;
/**
* @author Max Milbers
* @param $db A database connector object
*/
function __construct(&$db)
{
parent::__construct('#__virtuemart_manufacturers', 'virtuemart_manufacturer_id', $db);
$this->setUniqueName('mf_name');
$this->setLoggable();
$this->setTranslatable(array('mf_name','mf_email','mf_desc','mf_url'));
$this->setSlug('mf_name');
$this->setTableShortCut('m');
}
}
и превращаем его в такой вид
class TableManufacturers extends VmTable {
/** @var int Primary key */
var $virtuemart_manufacturer_id = 0;
/** @var string manufacturer name */
var $mf_name = '';
var $slug = '';
/** @var string manufacturer email */
var $mf_email = '';
/** @var string manufacturer description */
var $mf_desc = '';
/** @var int Manufacturer category id */
var $virtuemart_manufacturercategories_id = 0;
/** @var string manufacturer URL */
var $mf_url = '';
var $mf_m_desc = '';
var $mf_m_key = '';
var $mf_m_title = '';
/** @var int published or unpublished */
var $published = 1;
/**
* @author Max Milbers
* @param $db A database connector object
*/
function __construct(&$db)
{
parent::__construct('#__virtuemart_manufacturers', 'virtuemart_manufacturer_id', $db);
$this->setUniqueName('mf_name');
$this->setLoggable();
$this->setTranslatable(array('mf_name', 'mf_email', 'mf_desc', 'mf_url', 'mf_m_desc', 'mf_m_key', 'mf_m_title'));
$this->setSlug('mf_name');
$this->setTableShortCut('m');
}
}
сохраняем и перезаписываем - теперь по идее, наши данные должны сохраняться.
Теперь соответсвенно приступим к тому, для чего это все и делалось - к выводу мета тегов.
Первое это вывод на странице описания самого производителя, а именно components/com_virtuemart/views/manufacturer/view.html.php и меняем здесь такие строки
if ($virtuemart_manufacturer_id !=0 ) {
$manufacturer = $model->getManufacturer();
$model->addImages($manufacturer,1);
$manufacturerImage = $manufacturer->images[0]->displayMediaThumb('class="manufacturer-image"',false);
$document->setTitle(JText::_('COM_VIRTUEMART_MANUFACTURER_DETAILS').' '.strip_tags($manufacturer->mf_name));
$this->assignRef('manufacturerImage', $manufacturerImage);
// $this->assignRef('manufacturerProductsURL', $manufacturerProductsURL);
$this->assignRef('manufacturer', $manufacturer);
$pathway->addItem(strip_tags($manufacturer->mf_name));
$this->setLayout('details');
// vmdebug('$manufacturer',$manufacturer);
}
на
if ($virtuemart_manufacturer_id !=0 ) {
$manufacturer = $model->getManufacturer();
$model->addImages($manufacturer,1);
$manufacturerImage = $manufacturer->images[0]->displayMediaThumb('class="manufacturer-image"',false);
if(!empty($manufacturer->mf_m_title))
{$titler = $manufacturer->mf_m_title;}
else
{$titler = $manufacturer->mf_name;}
$document->setTitle(JText::_('COM_VIRTUEMART_MANUFACTURER_DETAILS').' '.strip_tags($titler));
$document->setMetaData('description', $manufacturer->mf_m_desc);
$document->setMetaData('keywords', $manufacturer->mf_m_key);
$this->assignRef('manufacturerImage', $manufacturerImage);
// $this->assignRef('manufacturerProductsURL', $manufacturerProductsURL);
$this->assignRef('manufacturer', $manufacturer);
$pathway->addItem(strip_tags($manufacturer->mf_name));
$this->setLayout('details');
// vmdebug('$manufacturer',$manufacturer);
}
сохраняем, перезаписываем.
Но основной целью у нас является страница с товарами от производителя потому идем дальше в такой файл components/com_virtuemart/views/category/view.html.php и находим следующий код:
if (JRequest::getInt('virtuemart_manufacturer_id' ) and !empty($products[0])) $title .=' '.$products[0]->mf_name ;
$document->setTitle( $title );
$pagination = $productModel->getPagination($perRow);
$this->assignRef('vmPagination', $pagination);
$orderByList = $productModel->getOrderByList($categoryId);
$this->assignRef('orderByList', $orderByList);
// $productRelatedManufacturerList = $productModel->getProductRelatedManufacturerList($categoryId);
// $this->assignRef('productRelatedManufacturerList', $productRelatedManufacturerList);
//$sortOrderButton = $productModel->getsortOrderButton();
//$this->assignRef('sortOrder', $sortOrderButton);
if ($category->metadesc) {
$document->setDescription( $category->metadesc );
}
if ($category->metakey) {
$document->setMetaData('keywords', $category->metakey);
}
if ($category->metarobot) {
$document->setMetaData('robots', $category->metarobot);
}
if ($app->getCfg('MetaTitle') == '1') {
$document->setMetaData('title', $title);
}
и меняем его на:
if (JRequest::getInt('virtuemart_manufacturer_id' ) and !empty($products[0])) $title .=' '.$products[0]->mf_name ;
if(!empty($products[0]->mf_m_title))
{$titler = $products[0]->mf_m_title;}
else
{$titler = $title;}
$document->setTitle( $titler );//здесь сами можете выбрать какой тайтл оставлять или менять в случае если не пустой мета-тайтл
$pagination = $productModel->getPagination($perRow);
$this->assignRef('vmPagination', $pagination);
$orderByList = $productModel->getOrderByList($categoryId);
$this->assignRef('orderByList', $orderByList);
// $productRelatedManufacturerList = $productModel->getProductRelatedManufacturerList($categoryId);
// $this->assignRef('productRelatedManufacturerList', $productRelatedManufacturerList);
//$sortOrderButton = $productModel->getsortOrderButton();
//$this->assignRef('sortOrder', $sortOrderButton);
if ($category->metadesc) {
$document->setDescription( $category->metadesc );
}
elseif(JRequest::getInt('virtuemart_manufacturer_id' ))
{
$document->setDescription($products[0]->mf_m_desc);
}
if ($category->metakey) {
$document->setMetaData('keywords', $category->metakey);
}
elseif(JRequest::getInt('virtuemart_manufacturer_id' ))
{
$document->setMetaData('keywords',$products[0]->mf_m_key);
}
if ($category->metarobot) {
$document->setMetaData('robots', $category->metarobot);
}
if ($app->getCfg('MetaTitle') == '1') {
$document->setMetaData('title', $titler);
}
вот в принципе и все, если возникнут вопросы то прошу в комментарии или в раздел "задать вопрос".
Комментарии
Вот страница с нужной вам статьей!
if ($virtuemart_ma nufacturer_id>0 and !empty($this->products[0])) $title .=' '.$this->products[0]->mf_name ;
if(!empty($this ->products[0]->mf_m_title)){
$title = $this->products[0]->mf_m_title;
}
$document->setTitle( $title );
Автору респект просто зверский.