8)Разобрался я как сделать функционал публикации в Joomla не без разных форумов, крупиц, и метода тыка. На это ушло у меня массу времени надеюсь вы сэкономите своё время и не будете так мучаться как я первопроходец.
Щас я интересующимся всё подробно объясню.
Итак делаем мы функционал для админки а именно функцию
function publish()Структура моей админки такова.
1.controllers/priceleaf.php
2.models/priceleaf.php
3.models/priceleafs.php
4.tables/priceleaf.php
5.views/priceleaf/view.html
6.views/priceleafs/view.html
7.views/priceleaf/tmpl/form.php
8.views/priceleafs/tmpl/default.php
9.admin.priceleaf.php
10.controller.php
11.install.sql
1.И так начнём мы с того что добавим в базу данных в таблицу поле
published Тип
varchar2.Открываем файл views/priceleafs/tmpl/default.php
Это наш шаблон в него мы должны внести значки публикации. Сначала выведем верхнее значение
<th width="5%" align="center">
<?php echo JHTML::_('grid.sort', 'Published', 'm.published', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
Затем мы должны провести цикл и присвоить id для это после
</thead> пишем
<?php
$k = 0;
for ($i=0, $n=count( $this->items ); $i < $n; $i++) {
$row = &$this->items[$i];
$checked = JHTML::_('grid.id', $i, $row->id );
$published = JHTML::_('grid.published', $row, $i );
$link = JRoute::_( 'index.php?option=com_priceleaf&controller=priceleaf&task=edit&cid[]='. $row->id );
?>
Затем уже в самой таблице шаблона нужно написать ячейку статус нашего раздела
<td align="center"><?php echo $published;?></td>
После всего это нужно перед закрывающимся тегом
</form>поставить
<?php echo JHTML::_( 'form.token' ); ?>
Это нужно для того чтобы защитить данные передаваемые формой через POST-запрос.
Вот полный код шаблона.
<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm">
<div id="editcell">
<table class="adminlist">
<thead>
<tr>
<th width="5">
<?php echo JText::_( 'ID' ); ?>
</th>
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $this->items ); ?>);" />
</th>
<th>
<?php echo JText::_( 'PRICELEAF' ); ?>
</th>
<th width="5%" align="center">
<?php echo JHTML::_('grid.sort', 'Published', 'm.published', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
</tr>
</thead>
<?php
$k = 0;
for ($i=0, $n=count( $this->items ); $i < $n; $i++) {
$row = &$this->items[$i];
$checked = JHTML::_('grid.id', $i, $row->id );
$published = JHTML::_('grid.published', $row, $i );
$link = JRoute::_( 'index.php?option=com_priceleaf&controller=priceleaf&task=edit&cid[]='. $row->id );
?>
<tr class="<?php echo "row$k"; ?>">
<td>
<?php echo $row->id; ?>
</td>
<td>
<?php echo $checked; ?>
</td>
<td>
<a href="<?php echo $link; ?>"><?php echo $row->name; ?></a>
</td>
<td align="center">
<?php echo $published;?>
</td>
</tr>
<?php
$k = 1 - $k;
}
?>
</table>
</div>
<input type="hidden" name="option" value="com_priceleaf" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="controller" value="priceleaf" />
<?php echo JHTML::_( 'form.token' ); ?>
</form>
3.Открываем файл views/priceleafs/view.html
В него добавлем нужные нам кнопки
JToolBarHelper:: publishList ();
JToolBarHelper:: unpublishList ();
Это опубликовать и снять с публикации.
Если сохранить и посмотреть то он выведет вам поле Публикация. и 2 кнопки + статус расздела опубликован он или нет. Но работать они не будут так как мы его не написали действия для них. вот полный код вида.
<?php
//Защита от прямого обращения к скрипту
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view' );
class PriceleafsViewPriceleafs extends JView
{
function display($tpl = null)
{
JToolBarHelper::title( JText::_( 'PRICELEAF' ), 'generic.png' );
JToolBarHelper::deleteList();
JToolBarHelper::editListX();
JToolBarHelper::addNewX();
JToolBarHelper:: publishList ();
JToolBarHelper:: unpublishList ();
$items = & $this->get( 'Data');
$this->assignRef('items', $items);
parent::display($tpl);
}
}
4.Нам нужно записать в контроллер значение. var $published = null;
Вот полный код
<?php
//Защита от прямого обращения к скрипту
class TablePriceleaf extends JTable
{
var $id = null;
var $name = null;
var $published = null;
function TablePriceleaf(& $db) {
parent::__construct('#__priceleaf_razdel', 'id', $db);
}
}
5.Завершающий этап для того что бы кнопки заработали, а так же можно было нажать на стаус публикации конкретного раздела и изменить его значение нужно зайти и открыть следующий файл. controllers/priceleaf.php
В нём описывается задача и метод функции function publish() тоесть публикация.
вот код
function publish()
{
JRequest::checkToken() or jexit( 'Invalid Token' );
$data = JRequest::getVar('cid', 0, '', 'array');
if (empty($data)) {
$message = JText::_('No data');
$this->setRedirect( 'index.php?option=com_priceleaf', $msg );
}
$model = $this->getModel('priceleaf');
$table = $model->getTable();
if ($this->_task == 'publish')
{
if ($table->publish($data))
{
$message = JText::_('Category').' '.JText::_('Published');
}
else
{
$message = JText::_('Category no Published. Failed');
$message .= ' ['.$table->getError().']';
}
}
if ($this->_task == 'unpublish')
{
if ($table->publish($data,0))
{
if ($data>1)
$message = JText::_('Category').' '.JText::_('Unpublished.');
}
else
{
$message = JText::_('Category no Unpublished. Failed');
$message .= ' ['.$table->getError().']';
}
}
$this->setRedirect( 'index.php?option=com_priceleaf', $msg );
}
Так же не забудьте написать тут же функцию конструкции что бы он знал к какой функции обратиться.
function __construct()
{
parent::__construct();
//Функции кнопок добавить редактировать
$this->registerTask( 'add' , 'edit' );
$this->registerTask( 'publish' , 'publish' );
$this->registerTask( 'unpublish' , 'publish' );
}
Помните мы в шаблоне писали <?php echo JHTML::_( 'form.token' ); ?>
Так вот если бы мы этого там не поставили то строчка в контроллере JRequest::checkToken() or jexit( 'Invalid Token' ); выдавала бы нам ошибку страницу Invalid Token. Строка $this->setRedirect( 'index.php?option=com_priceleaf', $msg ); это то куда нас вернёт при нажатии ссылки функция. у меня это ведёт на туже страницу. Вот эта строка очень важна изначально у меня она выглядела так $model = $this->getModel(); Из за чего ничего не работало конечно ведь мы не указали нашу модель, тоесть когда мы нажали опубликовать, функция должна передать значение в модель и выглядеть эта строка должна так $model = $this->getModel('priceleaf'); естественно значение priceleaf должно быть вашим у меня так называется файл модели.
Ну а дальше в файлах идёт проверка, 1 или 0 что пишем в базу. Теперь у Вас должно всё работать.
ЕСТЕСТВЕННО Моя структура может отличаться от вашей, название моделей классов. так что не забывайте всё менять на свои значения.
Будет интересно узнать Ваши отзывы. Следующим я собираюсь узнать как делать постраничную навигацию Joomla методом.