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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Доброго времени суток уважаемые форумчане. Есть вопрос - нужен совет. Есть самописный компонент для Joomla. Компонент создает записи по типу заказов. Запись имеет статус по типу в работе, оплачен, и тд а так же параметры типа время и дата заказа. Время пишется в формате 03:14 а дата в формате 31-12-2015. Теперь вопрос - даже два :

1 нужно сделать сортировку по дате И времени. То есть есть сортировка по дате и есть сортировка по времени - нужно сделать что бы сортировка была и по времени и по дате одновременно по примеру

01-12-2015 03:45
01-12-2015 11:45
02-01-2016 09:25
и так далее

и второй вопрос - есть необходимость сделать смену статуса заказа по кнопке - с аналогией того как меняется статус статьи в списке материалов. То есть будет несколько кнопок по типу в работе оплачен и тд - при выборе нескольких заказов в списке и нажатии кнопки в работе - пакетно всем заказам присваивается статус в работе. Joomla 3.0 - подскажите с чего начать, куда глядеть и как сделать - первый раз столкнулся с таким заданием (
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Как делал я: смотрел, как сделан com_content и делал по аналогии (это по второму вопросу).

По сортировке: а у вас что, дата и время в базе раздельно хранятся?
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Да. мне необходимо было отдельно записать в ячейку дату и в отдельную ячейку время (не спрашивайте почему, там много раз менялась задача самого компонента :( ). По этому я не могу сортировать по дате которая была бы в формате 01-12-2015 03:45 как по отдельной ячейке Бд (по аналогии к примеру с ид)
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Да. мне необходимо было отдельно записать в ячейку дату и в отдельную ячейку время (не спрашивайте почему, там много раз менялась задача самого компонента :( ). По этому я не могу сортировать по дате которая была бы в формате 01-12-2015 03:45 как по отдельной ячейке Бд (по аналогии к примеру с ид)
Зачем вам было писать в таком формате 01-12-2015 03:45 если надо было выбрать тип поля DATETIME и писать в него и дату и время! С ним можно любые манипуляции делать средствами SQL!
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Дело в том что  компонент имеет форму  добавления заказа как с фронта так и с бека. С фронта по условию пользователь должен видеть 2 формы - дата и время. Соответственно 2 ячейки в бд.
Собственно гипотетически можно ведь выбрать сортировку в запросе по типу ORDER BY `date` , `time` ASC к примеру ?
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
С фронта по условию пользователь должен видеть 2 формы - дата и время. Соответственно 2 ячейки в бд.
Собственно гипотетически можно ведь выбрать сортировку в запросе по типу ORDER BY `date` , `time` ASC к примеру ?
Необязательно 2 поля в бд, можно было объединить значение перед записью в базу.
Гипотетически - да, должно сработать:
Код: sql
order by `date` asc, `time` asc
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Необязательно 2 поля в бд, можно было объединить значение перед записью в базу.
Гипотетически - да, должно сработать:
Код: sql
order by `date` asc, `time` asc
честно говоря я думал об этом, но там есть еще функционал формирования отчета в пдф - админ выбирает компанию заказчика, диапозон дат от и до и формирует пдф - возможно тут даже помешало бы объеденение (имхо не проверял но всякое)

смотрите - вот что попробовал и вот что получилось :

в файле administrator/components/com_mycomponent/models/mycomponents.php (где на сколько я понимаю формируется запрос к БД для вывода результатов в список и фильрации дальнейших ) обозначил новую ячейку в массиве

 
Код: php
 public function __construct($config = array())
  {
    if (empty($config['filter_fields'])) {
      $config['filter_fields'] = array(
        'id', 'a.id',
        'order_id', 'a.order_id',
        'date', 'a.date',
        'time', 'a.time',
        'state', 'a.state',
        'company_name', 'a.company_name',       
        'date', 'a.date', 
        'time', 'a.time',     
        'company_adress', 'a.company_adress',
        'adress', 'a.adress'
      );
    }
 
    parent::__construct($config);
  }
далее в формировании переменной для сортировке прописал сл:
Код: php
    $orderCol  = $this->state->get('list.ordering');
    $orderDirn  = $this->state->get('list.direction');
    if ($orderCol == 'a.ordering' || $orderCol == 'category_title') {

          $orderCol = 'a.name '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
    }

    $query->order($db->escape($orderCol.' '.$orderDirn));
 echo $query;
    return $query;

  }

на сколько я понимаю строка
Код: php
 $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
по идее и должна быть тем самым условием 
Код: sql
ORDER BY `date` ASC, `time` ASC

но  echo $query; пишет SELECT * FROM `zdj5e_zakaz` AS a ORDER BY a.date asc
и при этом результат, который отфильтровывается, есесн сортируется только по дате.

натолкните - что не так делаю  -ведь по идее должно сработать
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
omg, вы PHP то вообще знаете? Что вы вобще написали такое, вы хоть понимаете?

ведь по идее должно сработать

нет, не должно сработать.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
omg, вы PHP то вообще знаете? Что вы вобще написали такое, вы хоть понимаете?

не так хорошо как хотелось бы по этому и сижу здесь и на других форумах. Знаете - подскажите, не знаете или не хотите - не засоряйте тему . Спс за понимание
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А что тут подсказывать то. Совершенно непонятно что вы вообще делаете. Вот это выражение:
Код: php
     $orderCol = 'a.name '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
то же самое что:
Код: php
 $orderCol = true;

я уже не говорю о том что вы в это условие( if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { ... )  не попадаете даже судя по вашему выводу. Почему оно у вас вообще такое?

вот это строка:
Код: php
$orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'

Это вообще что? К примеру $orderDirn у вас будет иметь значение ASC. вы получите строку.
Код: php
$orderCol = 'a.date ASC, a.orderingaa.time ASC, a.ordering'

Ну и вообще непонятно зачем вы добавили (аж два раза) два разных фильтра, если сортировка у вас по нескольким полям сразу.

P.S. Прочитайте хотя бы про операторы PHP прежде чем компоненты разрабатывать.
« Последнее редактирование: 10.04.2015, 00:25:24 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Дело в том что компонент я создавал по туториалу - и, стыдно признаться но соглашусь с вами, половину кода я до сих пор не могу сам разобрать по причине того что относительно не давно начала разбирать джумлвские фишки.

на счет
Код: php
 $orderCol = 'a.name '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
данное выражение  имела ранее немного другой вид и формировало, на сколько я понял, условие сортировки

первоначальный и рабочий вариант:

Код: php
 $orderCol = 'a.name '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.date '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';


на счет условия ( if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { ... ) - сам не могу понять логику но этот bullshit работает, черт возьми :)

дело в том что строка

Код: php
$orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
сформирует запрос по типу

Код: php
$orderCol = a.date  BY  ASC  a.time  BY ASC'
что в принципе и должно работать, но будь я не ладен не пашет  :-X
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Цитировать
сформирует запрос по типу

Код

$orderCol = a.date  BY  ASC  a.time  BY ASC'

что в принципе и должно работать, но будь я не ладен не пашет  Lips Sealed

в мускуле вы явно не "шар".
Цитировать

половину кода я до сих пор не могу сам разобрать по причине того что относительно не давно начала разбирать джумлвские фишки.

Вы женщина или мужчина?
« Последнее редактирование: 10.04.2015, 01:04:03 от capricorn »
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
каюсь - пробелы в знаниях работы с мускулом есть и весьма велики .
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Покажите всю функцию формирования запроса
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Код: php
<?php
/*Модель через неё идут запросы в базу, соответственно модель работает на запись и вытаскивание данных,
*/
 
// Запрет к прямому доступу. Если кто то попытается обратиться к файлу напрямую, Joomla выдаст пустую страницу.
defined('_JEXEC') or die;
 
/**
 * Класс модели
 */
class MycomponentsModelMycomponents extends JModelList
{
//Конструктор
//Дополнительный ассоциативный массив параметров конфигурации.
  public function __construct($config = array())
  {
    if (empty($config['filter_fields'])) {
      $config['filter_fields'] = array(
        'id', 'a.id',
        'order_id', 'a.order_id',
        'date', 'a.date',
        'time', 'a.time',
        'state', 'a.state',
        'company_name', 'a.company_name',       
        'date', 'a.date', 
        'time', 'a.time',     
        'company_adress', 'a.company_adress',
        'adress', 'a.adress'
      );
    }
 
    parent::__construct($config);
  }
 
//Метод для автоматического заполнения model state
//Примечание. Вызов GetState в этом методе приведет к рекурсии.
 
 
  protected function populateState($ordering = null, $direction = null)
  {
    $app = JFactory::getApplication('administrator');
 
 
    // Загрузите состояние фильтра.
    $search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
    $this->setState('filter.search', $search);
 
    $published = $this->getUserStateFromRequest($this->context.'.filter.state', 'filter_state', '', 'string');
    $this->setState('filter.state', $published);
 
    // Загрузка параметров
    $params = JComponentHelper::getParams('com_mycomponents');
    $this->setState('params', $params);
 
    // Список информации о состоянии
    parent::populateState('a.id', 'asc');
  }
 
 
//Родные фильтры Joomla с помощью них создаётся поиск и фильтрация опубликованных и неопубликованных данных
    protected function getStoreId($id = '')
  {
    $id .= ':' . $this->getState('filter.search');
    $id .= ':' . $this->getState('filter.state');
    return parent::getStoreId($id);
  } 
 
 
  /**
   * Метод для создания запросов SQL для загрузки данных списка.
   *
   * Возвращение строк запроса из бд.
   */
 
  protected function getListQuery()
  {
    // Создайте новый объект запроса.
    $db    = $this->getDbo();
    $query  = $db->getQuery(true);
    $user  = JFactory::getUser();
 
    // Выбираем нужные поля из таблицы
    $query->select(
    $this->getState('list.select','*'));
 
    $query->from($db->quoteName('zdj5e_zakaz').' AS a');
 
//Фильтры поиска       
    $search = $this->getState('filter.search');
    if (!empty($search)) {
      if (stripos($search, 'id:') === 0) {
        $query->where('a.id = '.(int) substr($search, 3));
      } else {
        $search = $db->Quote('%'.$db->escape($search, true).'%');
        $query->where('(a.company_name LIKE '.$search.')
          OR (a.name LIKE '.$search.')OR (a.order_id LIKE '.$search.')');
      }
    }   
 
 
// Фильтр по состоянию публикации
    $published = $this->getState('filter.status');
    if (is_numeric($published)) {
      $query->where('a.status = '.(int) $published);
    } elseif ($published === '') {
      $query->where('(a.status IN (0, 1))');
    }
 
 
    // сортировка
    $orderCol  = $this->state->get('list.ordering');
    $orderDirn  = $this->state->get('list.direction');
    if ($orderCol == 'a.ordering' || $orderCol == 'category_title') {

          $orderCol = 'a.name '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
      ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
    }

    $query->order($db->escape($orderCol.' '.$orderDirn));
    echo $query;
    return $query;

  }
 
 
 
 
 
}
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
вместо echo $query; укажите print_r($query->__toString()); и покажите результат вывода
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
вот такое написало

Код: sql
SELECT * FROM `zdj5e_zakaz` AS a ORDER BY a.date asc
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
вот хоть убейте но не могу понять - но ведь благодаря вот этой строке

Код: php
$orderCol = 'a.date '.$orderDirn.', a.ordering' 

мы имеем в запросе к БД вот это

a.date asc

логично что если мы пропишем

Код: php
'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'

то должно быть и время в запросе - но его нет /
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Все правильно, потому что $query->order($db->escape($orderCol.' '.$orderDirn)); - через list.ordering передается только одно поле, и только его одного вы передаете в $query->order.
Вам необходимо проверять:
Код: php
if ($orderCol == 'a.date') {
 $query->order($db->escape('a.date '.$orderDirn.', a.time '.$orderDirn));
} else {
  $query->order($db->escape($orderCol.' '.$orderDirn));
}
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Посмотрите, что у вас на выходе в print_r($db->escape($orderCol.' '.$orderDirn)); и сами все поймете
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Посмотрите, что у вас на выходе в print_r($db->escape($orderCol.' '.$orderDirn)); и сами все поймете
Спасибо - кажется понял - буду разбираться далее :)
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
И да: на уровне новичка (да и не только новичка) использование print_r() или var_dump() - лучшее средство отладки, сразу наглядно покажет, что где может быть не так.
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
я человек темный. но думаю можно использовать var_dump (), чтобы посмотреть содержимое переменных работы с БД. С этим содержимым можно идти в мускул, который и скажет, что не так. Можно, наверное, сразу получить ответ из php, но я по-темному обычно так делаю.

« Последнее редактирование: 10.04.2015, 01:26:29 от capricorn »
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
я ранее var_dump(); использовал - просто echo осталось с момента последней правки (не помню почему я это сделал, нет моему поступку прощения :) ) и так вот и лежит :)
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
echo в модели не работает, вместо этого используется print_r() для простого вывода данных. var_dump() показывает не только данные, но и их размер и некоторые полезные доп.атрибуты, а также в более красивом виде показывает массивы.
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
честно говоря никогда не задумывался об полезной или хоть какой-то разницы между var_dump(); и print_r(); :) но спс - буду знать )
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Цитировать
Метод тыка и мата помогает в кодинге
Метод мата часто аннулирует понимание того, что пришло методом тыка ;)
Удачи =)
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
возможно - но прозрение приходит порой как раз после хорешенького такого матерного тыка в код :)
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
выполните ваш SQL запрос, с заведомо нормальными данными, напрямую в мускуле.
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
сейчас как раз это в процессе работы и делаю )
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Создание компонента для табеля рабочего времени

Автор sashahz

Ответов: 7
Просмотров: 475
Последний ответ 12.04.2021, 11:12:11
от sashahz
Автоматическая отправка в архив по дате

Автор Санчо

Ответов: 16
Просмотров: 1936
Последний ответ 19.09.2020, 23:09:00
от Санчо
Групповая сортировка и сохранение tags

Автор platonische

Ответов: 1
Просмотров: 714
Последний ответ 26.04.2018, 11:13:02
от platonische
Блокировка пользователя по времени

Автор MuNKy

Ответов: 8
Просмотров: 1761
Последний ответ 14.04.2017, 19:42:01
от pH43
Структура компонента (1 запись + JSON ИЛИ Много записей)

Автор platonische

Ответов: 4
Просмотров: 898
Последний ответ 02.03.2017, 15:18:26
от passer