День добрый, сообщество!
Вопрос к специалистам PHP. Есть конструкция (вроде правильная?):
<?php if (логическое выражение_1): ?>
<?php “оператор_ 1” ?>
<?php elseif (логическое выражение_2): ?>
<?php “оператор_2” ?>
<?php else: ?>
<?php “оператор_3” ?>
<?php endif; ?>
Может что намудрил, короче: если выражение_1 TRUE (в массиве есть хотябы одно значение), исполнить оператор_1.
Если FALSE, то: если выражение_2 TRUE, исполнить оператор_2. Если выражение_2
FALSE, то выполнить оператор_3. Весь код будет в шаблоне …tpl.php.
Логическое выражение_1 это:
<?php
foreach ((array)$node->field_salary_agreement_vac as $item) {
print $item['view']
}
?>
Логическое выражение_2 это:
<?php
$node->field_age_vac[0]['view']
?>
.
Здесь понятно, будет так: <?php elseif ($node->field_age_vac[0]['view']): ?>
А вот логическое выражение_1 как составить? Спасибо
Комментарии
Уточнение. Существует поле CCK, где пользователь может ввести определенные значения. Результат выводится при помощи функции перебора массива:
<?php
foreach ((array)$node->field_salary_agreement_vac as $item) {
print $item['view']
}
?>
Однако, если пользователь ничего не вводил, массив будет пустой. Вот и нужно составить условие: если значения в массиве есть, оператор_1 выполнится. Если значений нет, произойдет переход к elseif (логическое выражение_2).
in_array
Можно в деталях? Как все это записать кодом?
Брат, я такой же программер как и ты
Где то так
<?php if (in_array("что_ищем", $arr)) { // $arr - массив, в котором нада найти
print "FOUND!!!"; //Если нашлось, возвращается единица, этот текст покажется
} ?>
Понял :о)
<?php foreach ((array)$node->field_salary_agreement_vac as $item) {
if ($item['view']) {
//выполняется условие
}else{
// дефолтное значение
} ?>
Не зависимо от того, есть в массиве значение или нет, дефолтное значение выводится всегда.
Так пробовал, тоже безрезультатно...
<?php
foreach ((array)$node->field_salary_agreement_vac as $item) {
$result = count($item['view']);
if ($result > 0) {
print $item['view'];//выполняется условие
}
else {
print 'none value';// дефолтное значение
}
}
?>
Не совсем ясно, что нужно получить.
<?php
$output = '';
foreach($node->field_salary_agreement_vac as $item) {
$output .= $item['view'];
}
print $output ? $output : 'none value';
?>
Отлично! Заработало. Возможно я не правильно изъяснил задачу. Вот код из шаблона …tpl.php:
Код_1:
<?php
<h2 class="vacancy-title-two">
(<?php print t('from'); ?>
<?php print $node->field_salary_vac[0]['view'] ?>
<?php if ($node->field_salary_max_vac[0]['view']): ?>
<?php print t('to'); ?>
<?php print $node->field_salary_max_vac[0]['view'] ?>
<?php endif; ?>
<?php print $node->field_currency_vac[0]['view'] ?>)
</h2>
?>
Тут три поля CCK (последовательно): 1. Выводит (зарплату «от») число, 2. Выводит (зарплату «до») число, 2.Выводит валюту (руб, usd …) текст. Все примерно так «наименование вакансии (от 25 000 до 35 000 РУБ)»
Есть еще одно поле (выведено через content template) :
Код_2:
<?php
<div class="field field-type-number-integer field-field-salary-agreement-vac">
<h3 class="field-label">или</h3>
<div class="field-items">
<?php foreach ((array)$node->field_salary_agreement_vac as $item) { ?>
<div class="field-item"><?php print $item['view'] ?></div>
<?php } ?>
</div>
</div>
?>
Через него пользователь в форме указывает значение (зарплата): «по договоренности». Получаем, если пользователь указал это значение, то код_1 не выполняется (ибо получится «зарплата: от 25 000 до 35 000 РУБ. по договоренности»), а выводится значения массива (т.е. код_2 – зарплата: по договоренности). Однако, если пользователь вообще ничего не указывал, то должен выполниться код_3:
Код_3:
<?php
<div>
<span><?php print “зарплата: не указано” ?></span>
</div>
?>
С Вашим кодом первые два кода работают. Но вот как сделать третье условие?
<?php if(!$output_1 && !$output_2): ?>
<div>
<span><?php print “зарплата: не указано” ?></span>
</div>
<?php endif ?>
Что-то не соображу уже. Как их соединить?
<?php
$output = '';
foreach($node->field_salary_agreement_vac as $item) {
$output .= $item['view'];
}
print $output ? $output : 'none value';
?>
и
<?php if(!$output_1 && !$output_2): ?>
<div>
<span><?php print “зарплата: не указано” ?></span>
</div>
<?php endif ?>
Вместо $output для первого кода пишите $output_1 , а для второго $output_2
Я плохо владею (если не сказать, что вообще не владею) PHP. Так не правильно?
<?php
$output_1 = '';
foreach($node->field_salary_agreement_vac as $item) {
$output_2 .= $item['view'];
}
print $output_2 ? $output_1 : 'none value';
if(!
$output_1 && !$output_2):print "зарплата не указана";
endif;
?>
print $output_2 ? $output_2 : 'none value';
Хотя я не совсем пойму, что Вы хотите получить
Немного модернизировал. Вместо ‘none value’ вставил: $node->field_salary_vac[0]['view'] Это поле выводит зарплату (число).
<?php
$output_1 = '';
foreach($node->field_salary_agreement_vac as $item) {
$output_2 .= $item['view'];
}
print $output_2 ? $output_2 : $node->field_salary_vac[0]['view'];
if(!
$output_1 && !$output_2):print "none salary";
endif;
?>
Получаем, если в $item['view'] есть значение, то оно выводится на экран и ничего более (так и должно). Если там значений нет, выводится значение из $node->field_salary_vac[0]['view'], и если оно там есть, то оно выводится на экран вместе с «зарплата не указана» (так не должно). Если ни в $item['view'] и ни в $node->field_salary_vac[0]['view'] ничего нет, то выводится «зарплата не указана» (как и должно). Что необходимо поправить?
А также. Вместо $node->field_salary_vac[0]['view']; в итоге предполагается целая «вереница» кода:
<?php
<h2 class="vacancy-title-two">
(<?php print t('from'); ?>
<?php print $node->field_salary_vac[0]['view'] ?>
<?php if ($node->field_salary_max_vac[0]['view']): ?>
<?php print t('to'); ?>
<?php print $node->field_salary_max_vac[0]['view'] ?>
<?php endif; ?>
<?php print $node->field_currency_vac[0]['view'] ?>)
</h2>
?>
Как это реализовать? …print $output_2 ? $output_2 : здесь этот код…
Покажите весь шаблон, из этих кусков кода ничего не понятно.
Все крутится во-круг кода:
<?php
1)<h2 class="vacancy-title-two">
2) <?php if ($node->field_salary_vac[0]['view']): ?>
3) (<?php print t('от'); ?>
4) <?php print $node->field_salary_vac[0]['view'] ?>
5) <?php endif; ?>
6) <?php if ($node->field_salary_max_vac[0]['view']): ?>
7) <?php print t('до'); ?>
8) <?php print $node->field_salary_max_vac[0]['view'] ?>
9) <?php endif; ?>
10) <?php print $node->field_currency_vac[0]['view'] ?>
11) <?php foreach ((array)$node->field_salary_agreement_vac as $item) { ?>
12) <?php print $item['view'] ?>
13) <?php } ?>
14) <?php print t('не указано'); ?>
15) )
16)</h2>
?>
Он располагается в шаблоне (сам шаблон большой). Это все поля CCK. Его задача, вывести значения зарплаты. С 2) – 5)строки, если условие TRUE, выводится: «(от XX XXX » где XX XXX это число сохраненное в $node->field_salary_vac[0]['view'].
С 6) – 9) строки, если условие TRUE, выводится: «до ХХ ХХХ », где ХХ ХХХ это число сохраненное в <?php print $node->field_salary_max_vac[0]['view'] ?> Далее в строке 10) выводится валюта. И вот этот самый код в строке 11) – 13), где пользователь вводит значение «по договоренности», которое записывается в массив. Если будут введены все значения, то получится (от ХХ ХХХ до ХХ ХХХ РУБ по договоренности не указано). Это не правильно. Нужно, если массив (строки 11 - 13) TRUE, выведится: (по договоренности). Если массив пустой, то выводятся строки: 3-4, 7-8 и 10. Если они также пусты, нужно вывести строку 14, т.е. (не указано). Понимаю, что условия построены не совсем грамотно, но думаю суть понятна. Вот собственно и задача. Все выходные голову ломаю.
Вот еще упростил
<?php
<h2>
<?php //первый код
if ($node->field_salary_vac[0]['view']) {
print '<span>('. t('from') .' </span>';
print $node->field_salary_vac[0]['view'];
if ($node->field_salary_max_vac[0]['view']) {
print '<span> '. t('to') .' </span>';
print $node->field_salary_max_vac[0]['view'] ;
}
if ($node->field_currency_vac[0]['view']) {
print '<span> '. $node->field_currency_vac[0]['view'] .'</span>';
}
print '<span>)</span>';
}
?>
<?php //второй код
foreach ((array)$node->field_salary_agreement_vac as $item) {
print '('. $item['view'] .')';
}
?>
<?php //третий код
print '('. t('Salary not specified') .')';
?>
</h2>
?>
если в массиве во втором коде есть значения (true), тогда оно выводится (print), а первый и третий коды при этом не выполняются.
Если в массиве во втором коде нет значений (false), то выполняется только первый код. Если условие
if ($node->field_salary_vac[0]['view']) в первом коде false (соответственно все остальные операторы
первого кода не выполняются), то выполняется только третий код.
Наконец то на ум пришло решение. По крайней мере все работает. Блин, двое суток без отдыха. Проверьте, код написан грамотно или есть замечания?:
<?php
<h2 class="vacancy-title-two">
<?php
if ($node->field_salary_vac[0]['view']) {
print '<span>('. t('from') .' </span>';
print $node->field_salary_vac[0]['view'];
if ($node->field_salary_max_vac[0]['view']) {
print '<span> '. t('to') .' </span>';
print $node->field_salary_max_vac[0]['view'] ;
}
if ($node->field_currency_vac[0]['view']) {
print '<span> '. $node->field_currency_vac[0]['view'] .'</span>';
}
print '<span>)</span>';
}
else {
$output = '';
foreach($node->field_salary_agreement_vac as $item) {
$output .= $item['view'];
}
print $output ? $output : '('. t('Salary not specified') .')';
}
?></h2>
?>
Большое спасибо Ch за подсказку и volocuga за отзыв.