Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Проверка корректности заполнения поля в форме

Автор johnРаздел Custom макросы

Ответов: 7
Просмотров: 4309
Последний ответ 30 Августа 2014, 22:11:55
от john
проверка наличия дочерних элементов списка

Автор idu.kuruРаздел Шаблоны XSLT

Ответов: 4
Просмотров: 3115
Последний ответ 07 Октября 2014, 09:19:38
от idu.kuru
Яндекс.Касса где происходить проверка платежей

Автор SumrakrndРаздел Настройка системы и модулей

Ответов: 8
Просмотров: 2515
Последний ответ 11 Августа 2016, 00:12:28
от aghigay
Проверка существования под-уровня меню

Автор johnРаздел Custom макросы

Ответов: 7
Просмотров: 4083
Последний ответ 29 Сентября 2012, 00:43:49
от john
Проверка на наличие товара в корзине

Автор samРаздел Шаблоны XSLT

Ответов: 2
Просмотров: 1213
Последний ответ 08 Февраля 2016, 17:40:14
от sam

0 Пользователей и 2 Гостей просматривают эту тему.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #15 : 22 Декабря 2015, 17:36:28 »
Одну свою ошибку я нашел - xsl-вызов был неправильный, вернее "()" были лишними при вызове - для сравнения пишу оба:
<xsl:value-of select="document('udata://custom/getDeliveryDate()/')/udata" /> // неправильный вызов
<xsl:value-of select="document('udata://custom/getDeliveryDate/')/udata" /> // правильный вызов

Теперь надо как-то разобраться с самим макросом, чтобы проверка была правильной - за советы и помощь буду признателен!
« Последнее редактирование: 22 Декабря 2015, 18:47:24 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #16 : 22 Декабря 2015, 18:46:47 »
Не судите строго за все мои предыдущие сообщения - я не программист! Но, тем не менее, методом "проб и ошибок" я сделал вроде бы рабочий макрос (по текущему дню каждую строку проверял - if/elseif/else):
		public function getDeliveryDate() {
$weekday = date('l');
if ($weekday == 'Friday') {
return 'понедельник и позже';
} elseif (($weekday == 'Saturday') || ($weekday == 'Sunday')) {
return 'вторник и позже';
} else {
return 'завтра и позже';
}
}
<xsl:value-of select="document('udata://custom/getDeliveryDate/')/udata" />
Буду признателен за комментарии, и буду рад, если кому-то это будет полезно!

P.S. e.ioffe большое спасибо за советы и помощь!
« Последнее редактирование: 22 Декабря 2015, 18:49:17 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

crazygeorgio

  • ***
  • 140
  • +7/-0
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #17 : 22 Декабря 2015, 20:22:08 »
я бы использовал switch case, читается лучше

public function getDeliveryDate() {
  $weekday = date('w');
  switch($weekday) {
      case 5:
        return 'понедельник и позже';
      break;
      case 6: case 0:
        return 'вторник и позже';
      break;
      default:
        return 'завтра и позже';
      break; 
  }
}

еще Евгений как-то рекомендовал выносить кастомные методы в модули, а не прямо в custom.php
         


*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #18 : 22 Декабря 2015, 21:19:38 »
У этой темы еще есть продолжение: есть вызов наличии товара <xsl:value-of select="//property[@name = 'available']/value/item/@name" />

Подобно тому, как ниже, надо сделать проверку по "ожидается поставка"/"поставка на заказ"
						<xsl:choose>
<xsl:when test="условие если_available_value_равен_ожидается поставка_или_поставка на заказ">
<xsl:text>после прихода</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="document('udata://custom/getDeliveryDate/')/udata" />
</xsl:otherwise>
</xsl:choose>
Подскажете, что написать вместо "условие если_available_value_равен_ожидается поставка_или_поставка на заказ" в коде выше?
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

crazygeorgio

  • ***
  • 140
  • +7/-0
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #19 : 22 Декабря 2015, 22:15:36 »
мне кажется проверку лучше по id делать, название могут и поменять, а id останется
<xsl:choose>
  <xsl:when test=".//property[@name = 'available']/value/item/@id = XXX or .//property[@name = 'available']/value/item/@id = YYY">
    <xsl:text>после прихода</xsl:text>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="document('udata://custom/getDeliveryDate/')/udata" />
  </xsl:otherwise>
</xsl:choose>

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #20 : 22 Декабря 2015, 22:21:28 »
Я так и поступил, т.е. нашел, что по id лучше сделать проверку, только никак не мог написать проверку одновременно для двух id, Вы подсказали. Спасибо!
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

e.ioffe

  • ****
  • 369
  • +81/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
Re: Проверка по дням недели
« Ответ #21 : 23 Декабря 2015, 10:45:02 »
Метод вызывается так, без скобок udata://custom/getDeliveryDate/
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #22 : 23 Декабря 2015, 13:45:17 »
e.ioffe спасибо! Я нашел, что метод вызывается, как Вы написали. И с макросом разобрался. И еще проверку на "available" в xslt сделал (по id статуса), только потом переделал - когда товар в наличии, то выводится инфо. из макроса, а во всех остальных случаях инфо. xsl:text "после прихода".

Если подскажете, я бы в макрос добавил еще - $holidays = 00/00/0000, 00/00/0000 и т.д., чтобы в праздники выводить иную информацию о сроках доставки (первый if не должен противоречить второму). Как это правильно сделать?
		public function getDeliveryDate() {
$weekday = date('l');

$holidays = 00/00/0000, 00/00/0000...; // Здесь должны быть даты праздников - как правильно их написать? Ниже проверка

if ($weekday == 'Friday') {
return 'понедельник и позже';
} else if (($weekday == 'Saturday') || ($weekday == 'Sunday')) {
return 'вторник и позже';
} else {
return 'завтра и позже';
}

if ($holidays == '?!') { // Например, если завтра дата праздника, то уже сегодня инфо. из return ниже
return 'после праздника';
} else ($holidays == '?!') { // И если сегодня день праздника, то инфо. см. return ниже
return то, что обычно, т.е. первые три условия из макроса;
}

}
« Последнее редактирование: 23 Декабря 2015, 13:47:35 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

crazygeorgio

  • ***
  • 140
  • +7/-0
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #23 : 23 Декабря 2015, 13:55:29 »
все-таки настаиваю

public function getDeliveryDate() {
  $weekday = date('w');//от 0 до 6, 6-суббота, 0-воскресенье
  $day = date('d/m/Y');
  $holidays = array('31/12/2015', '01/01/2016', '07/01/2016');
  if (in_array($day, $holidays)) {
    $weekday = 7;//для праздников
  }
  switch($weekday) {
      case 5:
        return 'понедельник и позже';
      break;
      case 6: case 0:
        return 'вторник и позже';
      break;
      case 7:
        return 'после праздника';
      break;
      default:
        return 'завтра и позже';
      break; 
  }
}

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #24 : 23 Декабря 2015, 14:47:20 »
Спасибо! Если это рабочий вариант (не испытывал еще), то почему-бы и нет. Просто вариант от e.ioffe уже испытан на практике.
if (in_array($day, $holidays)) - это я правильно понимаю, что, "если содержимое формат_даты/дата равна дате праздника, указанной в праздники, то день недели равен 7 (т.е. присвоили сами), а дальше проверка - включающая в себя этот условно седьмой день "?
И, crazygeorgio испытан ли подобный вариант на практике? И как интервал по дате праздников сделать, например, с 31.12.2015 по 11.01.2016?
« Последнее редактирование: 23 Декабря 2015, 14:49:21 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

crazygeorgio

  • ***
  • 140
  • +7/-0
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #25 : 23 Декабря 2015, 15:10:16 »
мне то что испытывать) у меня такой задачи нет) понимаете все правильно

для интервала наверное нужно делать отдельно проверку по временной метке timestamp, либо в массив вбивать все 12 дней, в любом случае праздников не так много, ну будет там массив из десятков двух-трех значений, не так много на мой взгляд, единственное что каждый год список нужно обновлять, ну его можно в принципе задать в каком-нибудь справочнике в системе и из-него подтягивать значения

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #26 : 23 Декабря 2015, 15:34:25 »
Сократил дату до 4-х значений, вместо 8-и - год убрал, чтобы массив не перегрузить:
public function getDeliveryDate() {
$weekday = date('w'); //from 0 to 6, 6-Saturday, 0-Sunday
$day = date('d/m');
$holidays = array('01/01', '02/01', '03/01', '04/01', '05/01', '06/01', '07/01', '08/01', '09/01', '10/01' '22/02', '07/03', '30/05', '08/05', '11/06', '03/11', '31/12'); // с 31.12 по 10.01 полностью праздники
if (in_array($day, $holidays)) {
$weekday = 7; //For holidays
}
switch($weekday) {
case 5:
return 'понедельник и позже';
break;
case 6: case 0:
return 'вторник и позже';
break;
case 7:
return 'после праздника';
break;
default:
return 'завтра и позже';
break; 
}
}
А можно в этот-же макрос включить вчерашнюю проверку "//property[@name = 'available']/value/item/@id = '10694' or //property[@name = 'available']/value/item/@id = '10695'" return "после прихода", чтобы в xslt не делать проверку?
« Последнее редактирование: 23 Декабря 2015, 15:43:20 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

crazygeorgio

  • ***
  • 140
  • +7/-0
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #27 : 23 Декабря 2015, 16:00:52 »
что-то вроде этого должно быть, но нужно передавать параметр id элемента в метод

public function getDeliveryDate($element_id = false) {
        if($element_id)  {
          $element = umiHierarchy::getInstance()->getElement($element_id);

          if (!$element instanceof umiHierarchyElement) {
             // выбрасываем исключение
             throw new publicException(getLabel('error-page-does-not-exist'));
          }
          $available = $element->getValue('available');
        }
$weekday = date('w'); //from 0 to 6, 6-Saturday, 0-Sunday
$day = date('d/m');
$holidays = array('01/01', '02/01', '03/01', '04/01', '05/01', '06/01', '07/01', '08/01', '09/01', '10/01' '22/02', '07/03', '30/05', '08/05', '11/06', '03/11', '31/12'); // с 31.12 по 10.01 полностью праздники
if (in_array($day, $holidays)) {
   $weekday = 7; //For holidays
}
        if (isset($available) && $available == 10694) {
           $weekday = 8;
        }

switch($weekday) {
case 5:
return 'понедельник и позже';
break;
case 6: case 0:
return 'вторник и позже';
break;
case 7:
return 'после праздника';
break;
case 8:
return 'после прихода';
break;
default:
return 'завтра и позже';
break; 
}
}

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #28 : 23 Декабря 2015, 16:19:28 »
Цитировать
что-то вроде этого должно быть, но нужно передавать параметр id элемента в метод

Ничего не понял - разве, что могу попробовать расшифровать Ваши действия: прежде, чем задать переменную $available, нашли $element_id, дальше проверку тоже не совсем понял, затем задали уже переменную наличии товара, после чего добавили еще одно условие, если наличие равняется "10694", задали цифровое значение, далее вывели текст.

P.S. Просто, извиняюсь, как выше писал - я не программист, потому Вам приходится меня за руку водить!
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

crazygeorgio

  • ***
  • 140
  • +7/-0
    • Просмотр профиля
Re: Проверка по дням недели
« Ответ #29 : 23 Декабря 2015, 16:50:14 »
все страницы в umi это элементы, у всех них есть уникальный идетификатор id, они выводятся во всех стандартных макросах xslt

<udata module="catalog" method="getObjectsList" generation-time="0.009930">
  <lines>
    <item id="45" alt_name="homyachok_pushistyj" link="/market/hamsters/homyachok_pushistyj/"
     xlink:href="upage://45">Хомячок пушистый</item>
    <item id="47" alt_name="homyachok_obychnyj" link="/market/hamsters/homyachok_obychnyj/"
     xlink:href="upage://47">Хомячок обычный</item>
    <item id="48" alt_name="homyachok_na_kolesah" link="/market/hamsters/homyachok_na_kolesah/"
     xlink:href="upage://48">Хомячок на колесах</item>
    <item id="50" alt_name="homyachok_smile" link="/market/hamsters/homyachok_smile/"
     xlink:href="upage://50">Хомячок с улыбкой</item>
    <item id="54" alt_name="testovyj_homyak" link="/market/hamsters/testovyj_homyak/"
     xlink:href="upage://54">Тестовый хомяк</item>
  </lines>
  <total>9</total>
  <per_page>10</per_page>
  <category_id>44</category_id>
  <type_id>772</type_id>
</udata>

так вот id нужно передать в макросе <xsl:value-of select="document(concat('udata://custom/getDeliveryDate/',id))/udata" />

только вот конструкцию для id нужно смотреть как записать, все зависит от того в каком месте вызывается макрос

далее в методе производится проверка передан ли параметр или нет, если передан, то получаем страницу, если получили страницу получаем значение поля available, устанавливаем переменную, далее если переменная установлена и ее значение равно нужному назначаем значение для вывода текста
« Последнее редактирование: 23 Декабря 2015, 16:51:47 от crazygeorgio »