В какой конкретной директиве этот custom.php?
Подойдет ли такой код?:
public function getDeliveryDate() {
if (пятница, суббота, воскресенье) {
return 'вторник и позже';
} else {
return 'завтра и позже';
}
}
И последний связанный вопрос - откуда система поймет, что, например, сегодня "пятница, суббота или воскресенье"?
1. Ясно. Переубедили. Просьба, пока не реализовывал еще, мой переделанный конечный вариант проверите?
public function getDeliveryDate() {
if (friday) {
return 'понедельник и позже';
} else if (saturday, sunday) {
return 'вторник и позже';
} else {
return 'завтра и позже';
}
}
2. И если я правильно понял, код надо ставить после комментария "//TODO: Write your own macroses here".
3. И последнее - искал, не смог найти, как сделать вызов макроса в xslt?!
Ничего не могу понять?! Макрос вставил куда надо, вызов тоже сделал:
.../classes/modules/custom.php
после //TODO: Write your own macroses here
public function getDeliveryDate() {
if (friday) {
return 'понедельник и позже';
} else if (saturday - sunday) {
return 'вторник и позже';
} else {
return 'завтра и позже';
}
}
.../object-view.xsl
<xsl:value-of select="document('udata://custom/getDeliveryDate()/')/udata" />
А вместо нужной информации сообщение:
Method custom::getDeliveryDate() doesn't exists
А XML выводит следующее:
<udata module="custom" method="getDeliveryDate" generation-time="0.007301">понедельник и позже</udata>
Что не так?
Решил идти еще одним путем - сделал так:
public function getDeliveryDate() {
echo "Hello World!";
}
Вызвал это из адресной строки - mydomain/udata://custom/getDeliveryDate - на белом экране получил "Hello World!".
Дальше попробовал вызвать тоже самое из шаблона так - <xsl:value-of select="document('udata://custom/getDeliveryDate()/')/udata" />,
И опять получил это же сообщение - "Method custom::getDeliveryDate() doesn't exists"
Ничего не могу понять?!
Одну свою ошибку я нашел - xsl-вызов был неправильный, вернее "()" были лишними при вызове - для сравнения пишу оба:
<xsl:value-of select="document('udata://custom/getDeliveryDate()/')/udata" /> // неправильный вызов
<xsl:value-of select="document('udata://custom/getDeliveryDate/')/udata" /> // правильный вызов
Теперь надо как-то разобраться с самим макросом, чтобы проверка была правильной - за советы и помощь буду признателен!
Не судите строго за все мои предыдущие сообщения - я не программист! Но, тем не менее, методом "проб и ошибок" я сделал вроде бы рабочий макрос (по текущему дню каждую строку проверял - 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 большое спасибо за советы и помощь!
я бы использовал 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
У этой темы еще есть продолжение: есть вызов наличии товара <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_равен_ожидается поставка_или_поставка на заказ" в коде выше?
мне кажется проверку лучше по 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>
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 то, что обычно, т.е. первые три условия из макроса;
}
}
все-таки настаиваю
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;
}
}
Сократил дату до 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 не делать проверку?
что-то вроде этого должно быть, но нужно передавать параметр 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;
}
}
все страницы в 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, устанавливаем переменную, далее если переменная установлена и ее значение равно нужному назначаем значение для вывода текста
Вызов будет произведен из object-view.xsl после цены, наличии и информации о стоимости доставки. Как в таком случае вызвать макрос?
И еще, обязательно сделать следующую проверку - нельзя убрать это (наличие всегда имеет какой-либо статус)?
if (!$element instanceof umiHierarchyElement) {
throw new publicException(getLabel('error-page-does-not-exist'));
}
И последнее - можно ли код сделать так, как было при xslt - если available=10692 (есть в наличии) то выводить инфо из case 5, case 6, case 0, case 7, default (что-то одно в зависимости от условия), а при остальных статусах (нет, ожидается, под заказ и т.д.) выводить case 8?
тогда скорее всего <xsl:value-of select="document(concat('udata://custom/getDeliveryDate/',page/@id))/udata" />
можно и не делать проверку
if (isset($available) && $available != 10692) {
$weekday = 8;
}
1. Если я правильно понял по коду, если статус не равно "есть в наличии", то выводить "после прихода" - правильно?
if (isset($available) && $available != 10692) {
$weekday = 8;
}
2. И еще, вот конечный код - все ли верно?
public function getDeliveryDate() {
if ($element_id) {
$element = umiHierarchy::getInstance()->getElement($element_id);
$available = $element->getValue('available');
}
$weekday = date('w'); //from 0 to 6, 6 - saturday, 0 - sunday
$day = date('d/m');
$holidays = array('31/12', '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');
if (in_array($day, $holidays)) {
$weekday = 7; //for day equals holidays
}
if (isset($available) && $available != 10692) {
$weekday = 8; //for is not available
}
switch($weekday) {
case 5:
return 'понедельник и позже';
break;
case 6: case 0:
return 'вторник и позже';
break;
case 7:
return 'после праздника';
break;
case 8:
return 'после прихода';
break;
default:
return 'завтра и позже';
break;
}
}