Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 548 Ответов
  • 22927 Просмотров
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #450 : 11.11.2015, 18:25:45 »
b2z, вы пишите:
Цитировать
Сначала сделайте выборку материалов из #__chmos_compilations_articles

Код
// Выбираем ID		
$db=JFactory::getDbo();
$query=$db->getQuery(true);
$query->select->quoteName('content_id');
$query->from($db->quoteName('#__chmos_compilations_articles'));
$query->where($db->quoteName('compilation_id').'='.$id);
$db->setQuery($query);
$contentIds=$db->loadColumn();

Мы так понимаем, что это и есть выборка из таблицы #__chmos_compilations_articles.
------------------------------------------
Цитировать
а потом удаляйте сборник.

Код
// Удаляем сборник
$table->delete($id);
 
// Подключаем модель
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_content/models','ContentModel');
$model=JModelLegacy::getInstance('Article','ContentModel',array('ignore_request'=>true));
 
// Удаляем материалы
$model->delete($contentIds);

...Мы не совсем понимаем, где именно у нас ошибка, потому что вроде как все действия, которые Вы написали, мы выполнили: выборка из таблицы есть, удаление сборника тоже.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #451 : 11.11.2015, 18:27:57 »
Может быть, кто-то из форумчан, которые просматривают сейчас тему - знают, в чём мы допустили ошибку?
Автор Voland, например? =)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #452 : 11.11.2015, 19:00:42 »
robert, сделали, в сообщении выводится: "Item deleted successfullyIDs to remove: Model exists".
Значит, проблема в выборке: я на улице, посмотрю, когда приеду.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

voland

  • Легенда
  • 11030
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
Re: Создание папок из фронтенда
« Ответ #453 : 11.11.2015, 19:05:08 »
Может быть, кто-то из форумчан, которые просматривают сейчас тему - знают, в чём мы допустили ошибку?
Автор Voland, например? =)
я не слежу за кодом, а работаю в IDE обычно - надо прочитать страниц 5 назад, вникнуть о чем речь, еще и самого кода, как я понял нет ни на гитхабе, нигде..
Проще было б написать один раз за полдня, чем тратить недели.
Извините, мой логический склад ума не позволяет мне плодить энтропию.
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #454 : 11.11.2015, 22:14:53 »
voland, если вдруг Вы в свой выходной захотите по каким-то причинам выбрать время и помочь нам, - мы будем только рады.
Код отдельно мы никуда не выкладывали, потому что он постоянно видоизменяется.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #455 : 11.11.2015, 22:25:14 »
Проверьте еще раз, точно у вас есть таблица chmos_compilations_articles? Если да, то какие столбцы там есть? И сейчас там есть какие-нибудь записи?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Создание папок из фронтенда
« Ответ #456 : 11.11.2015, 22:34:03 »
Проверьте еще раз, точно у вас есть таблица chmos_compilations_articles? Если да, то какие столбцы там есть? И сейчас там есть какие-нибудь записи?

Код: sql
CREATE TABLE IF NOT EXISTS `#__chmos_compilations_articles` (
  `compilation_id` int(11) UNSIGNED NOT NULL,
  `content_id` INT(10) UNSIGNED,
  PRIMARY KEY (`compilation_id`, `content_id`),
  CONSTRAINT `#__chmos_compilations_articles_fk_compilation_id`
  FOREIGN KEY (`compilation_id`)
  REFERENCES `#__chmos_compilations` (`id`)
    ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

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

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #458 : 11.11.2015, 22:41:06 »
robert, таблица  chmos_compilations_articles точно есть.
Автор b2z написал её структуру.
Прикрепляем скрин с записями в этой таблице:
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #459 : 11.11.2015, 22:46:26 »
Нифига себе, вы новичку сразу подсунули FOREIGN KEY? Но выборка вроде осуществляется перед удалением, если я правильно помню.

P.S. Еще и CONSTRAINT.
« Последнее редактирование: 11.11.2015, 22:55:31 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #460 : 11.11.2015, 22:46:41 »
b2z, текущий код метода delete в файле compilationform.php такой:
Спойлер
[свернуть]
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #461 : 11.11.2015, 22:50:08 »
Да, выборка идет после удаления. Временный код для проверки удалите.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #462 : 11.11.2015, 22:58:27 »
robert, временный код удалили
Вот строки этого временного кода (вроде бы ничего не забыли):
$return[]=$id;
$return[]='IDs to remove: '.implode(',',$contentIds);
if($model){
$return[]='Model exists.';
}
return $return;
--------------
Вот метод delete файла compilationform.php, который имеем сейчас:
Спойлер
[свернуть]
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Создание папок из фронтенда
« Ответ #463 : 11.11.2015, 23:03:01 »
Нифига себе, вы новичку сразу подсунули FOREIGN KEY? Но выборка вроде осуществляется перед удалением, если я правильно помню.

P.S. Еще и CONSTRAINT.
Я предсказывал эти проблемы. b2z, напишите ей нормально полностью функцию удаления, а то топик грозит побить мой рекорд (помните разработку импорта XML? на 505 постов...)
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #464 : 11.11.2015, 23:03:25 »
Цитировать
Да, выборка идет после удаления

Значит, нам нужно select на первое место поставить?
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #465 : 11.11.2015, 23:24:27 »
Может быть, как-то так?
Цитировать
Код
public function delete($data)
{
// Выбираем ID
$db=JFactory::getDbo();
$query='SELECT content_id
FROM #__chmos_compilations_articles
WHERE compilation_id='.(int)$id;
$db->setQuery($query);
$contentIds=$db->loadColumn();


$id = (!empty($data['id']))? $data['id'] : (int) $this->getState('compilation.id');
if (JFactory::getUser()->authorise('core.delete', 'com_chmos.compilation.'.$id)!== true)
{
throw new Exception(403, JText::_('JERROR_ALERTNOAUTHOR'));
}
$table = $this->getTable();
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models', 'ContentModel');
       $model = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request' => true));


if ($table->delete($data['id']) === true)
{
$return=array();
$model->delete($contentIds);
}
else
{
return false;
}
}
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #466 : 11.11.2015, 23:42:58 »
mila_serdnaya, верните функции delete() старый код, потом добавьте выборку IDs с учетом подсказок. Сейчас у вас не совсем правильно:
- функция при успешном исполнении ничего не возвращает
- переменная $id в запросе нигде не объявлена
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #467 : 11.11.2015, 23:50:02 »
robert, возвращаем функции delete() старый код:
Спойлер
[свернуть]

*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #468 : 11.11.2015, 23:52:31 »
Цитировать
добавьте выборку IDs с учетом подсказок

Подсказка - это то, что наше обращение к таблице chmos_compilations_articles должно произойти перед тем, как мы удалим сборник?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #469 : 12.11.2015, 00:04:35 »
Да.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #470 : 12.11.2015, 00:36:38 »
robert, пробуем разобраться с кодом.

public function delete($data)
{
$id = (!empty($data['id']))? $data['id'] : (int) $this->getState('compilation.id'); - здесь мы в переменную получаем id удаляемого сборника
if (JFactory::getUser()->authorise('core.delete', 'com_chmos.compilation.'.$id)!== true) -здесь мы говорим, что если пользователь неавторизован...
{
throw new Exception(403, JText::_('JERROR_ALERTNOAUTHOR')); - ...то мы выводим ошибку
}

Затем получаем ID материалов, которые связаны с удаляемым сборником:

$db=JFactory::getDbo();
$query='SELECT content_id
FROM #__chmos_compilations_articles
WHERE compilation_id='.(int)$id;
$db->setQuery($query);
$contentIds=$db->loadColumn();         

...пока правильно?



« Последнее редактирование: 12.11.2015, 00:42:22 от mila_serdnaya »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #471 : 12.11.2015, 00:44:16 »
Да, правильно.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #472 : 12.11.2015, 00:56:50 »
Уже что-то. =)
---------------
После того, как мы получили ID материалов, которые связаны с удаляемым сборником, можно удалять сборник.
Продолжаем код:

$table = $this->getTable(); - в переменную получаем данные из таблицы
if ($table->delete($data['id']) === true) - если таблицу удаляем, то...
{
$return=array(); - ...получаем результат
}

else - если не удаляем
{
return false; - то ничего не возвращаем.
}
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #473 : 12.11.2015, 00:58:57 »
Нам нужно куда-то вставить подключение к модели и само удаление материалов.


*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #474 : 12.11.2015, 01:02:20 »
Мы думаем так:
Сначала подключаем модель
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_content/models','ContentModel');
$model=JModelLegacy::getInstance('Article','ContentModel',array('ignore_request'=>true));

Потом обращаемся к таблице
$table = $this->getTable();

if ($table->delete($data['id']) === true) - если таблицу удаляем, то...
{
$model->delete($contentIds); - удаляем материалы тоже
$return=array(); - ...получаем результат
}
else - если не удаляем
{
return false; - то ничего не возвращаем.
}

....Правильно мы закончили код? Или опять напартачили со строкой удаления материалов?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #475 : 12.11.2015, 01:07:20 »
Вы вернули не первоначальный код модели. $return=array(); там не должно быть.
в переменную получаем данные из экземпляр объекта таблицы
если таблицу нужный сборник успешно удален удаляем, то...
удаляем и материалы
...получаем результат на самом деле не получали, хотя должны были получить $id
если не удаляем удалось удалить
то ничего не возвращаем ложь.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #476 : 12.11.2015, 01:18:29 »
Прочитали мы то, что Вы нам позачёркивали - улыбнулись.)
Правим код с учётом Ваших замечаний.
----------------
в переменную получаем экземпляр объекта таблицы
$table = $this->getTable();

если  нужный сборник успешно удален, то...
if ($table->delete($data['id']) === true)

{
$model->delete($contentIds);  удаляем и материалы
здесь мы должны получить $id
}
else если не удалось удалить
{
return false; - возвращаем ложь
}
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #477 : 12.11.2015, 01:23:34 »
Не совсем мы понимаем, что эта за переменная $id. Это id удаляемого сборника? Мы же вроде как в самом начале функции её получали:
$id = (!empty($data['id']))? $data['id'] : (int) $this->getState('compilation.id');
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Создание папок из фронтенда
« Ответ #478 : 12.11.2015, 01:25:32 »
Не совсем мы понимаем, что эта за переменная $id.
Ладно,
Код: php-brief
return $id;
В принципе все нормально. Модель ContentModelArticle лучше подключить прямо перед удалением материалов, чтобы не выполнять лишний код в случае неудачи.
Все, я иду спать.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

mila_serdnaya

  • Захожу иногда
  • 432
  • 3 / 0
Re: Создание папок из фронтенда
« Ответ #479 : 12.11.2015, 01:31:07 »
robert, спасибо Вам огромное. За терпение особенно.  
Спокойной Вам ночи и самых-самых хороших снов!
------
А мы сейчас всё подправим и пойдём тестировать. Надеемся, всё получится.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Создание релиза компонента средствами GitHub

Автор SkyAn

Ответов: 4
Просмотров: 725
Последний ответ 01.11.2019, 17:42:04
от Septdir
[Решено] Создание контент плагина

Автор IvanTopor

Ответов: 4
Просмотров: 1255
Последний ответ 26.02.2016, 13:10:37
от IvanTopor
Создание динамических полей в своем компоненте

Автор NeuroZ

Ответов: 14
Просмотров: 1464
Последний ответ 18.08.2015, 11:17:59
от b2z
Создание таблиц средствами компонента

Автор spirit1086

Ответов: 3
Просмотров: 1042
Последний ответ 18.08.2015, 10:17:09
от spirit1086
Создание изображений PHP и GD

Автор vita1971

Ответов: 6
Просмотров: 927
Последний ответ 10.05.2015, 13:10:38
от vita1971