Каюсь, что не знаю php и до сих пор его не изучила. Но ПОМОГИТЕ!!! Очень нужно!
Нужно, чтобы блок показывался в типе материала training и не показывался на страницах */edit. Сниппеты, когда показываться-показываться или не показываться-не показываться - я нашла. И они замечательно работают. А вот подобную конструкцию нет. Попробовала включить логику, но нужны знания
<?php
$match = FALSE;
$types = array('training' => 1);
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
if (isset($types[$type])) {
$match = TRUE;
}
}
return $match;
?>
Это показывать в типе материла. Что нужно добавить, чтобы не показывать на страницах */edit?
Заранее спасибо за помощь!
Комментарии
if (arg(0) == 'node' && is_numeric(arg(1))) {
заменить на
if (arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
Спасибо, сейчас попробую
Еще раз огромное спасибо.
Если кому-то будет нужен код (показывать в типе материала training и не показывать на страницах изменения материала (edit), то у меня сработал такой код
<?php
$match = FALSE;
$types = array('training' => 1);
if (arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
if (isset($types[$type])) {
$match = TRUE;
}
}
if (strpos($url, "edit")) {
$match = FALSE;
}
return $match;
?>
<?php
return(($node = menu_get_object()) && $node->type == 'training' && arg(2) != 'edit');
?>
Я думаю этого достаточно
Увы, fatal error... Но, все равно, спасибо за помощь
Если код не проверен, я об этом предупреждаю. У меня никаких ошибок нет, смотри синтаксис.
у вас получился код, который работает до поры до времени. Такие вещи как
if (strpos($url, "edit")) { использовать неправильно, я уж не говорю про то что у вас переменная $url вроде и не определена.
Dan предложил гораздо более корректный и чистый вариант, одна строчка заменяет весь ваш процессинг.
Спасибо большое за совет. Попробую еще раз ночью код, который предложил Dan.
if (strpos($url, "edit")) и все остальное - "свиснула" на drupal.org. Только там не было варианта показывать-не показывать. А введение второго аргумента помогло.
С php "не дружу" и даже не понимаю как это работает. Но буду изучать, как только немного разгружусь во времени. Очень интересно и полезно. Но использую (с оглядкой на свою недружбу) чужие решения и всегда делюсь своими находками с другими. Спасибо людям, которые выкладывают в интернет свои решения различных задач и проблем!
Строка <?php return(($node = menu_get_object()) && $node->type == 'training' && arg(2) != 'edit'); ?>
Работает следующим образом:
1. $node = menu_get_object() -- загружается объект ноды. Почти то же самое что и node_load. Причём в переменную $node попадает именно текущая нода, которую мы просматриваем. Если мы находимся не на странице ноды то будет возвращен NULL
2. Проверятся ($node).
3. $node->type == 'training' -- проверяем тип ноды
4. arg(2) != 'edit' -- проверяем путь
Шаги 2,3 и 4 выполняются друг за другом и только в том случае если предыдущий шаг увенчался успехом, то есть не равен FALSE (или NULL или 0 или пустой строке и т.д.). Если все три проверки успешны - тогда строка возвращает TRUE, иначе - FALSE.
Теперь ты знаешь PHP чуть лучше
Дальше можно не читать.
За код типа
<?php if(($var = function()) && $another_var){} ?>
некоторые ортодоксальные программисты ломятся бить по голове, навязывая запись типа<?php $var = function(); if($var && $another_var){} ?>
и аргументируя тем, что можно ошибиться и опустить скобки и тогда выражение<?php if($var = function() && $another_var){} ?>
будет выполняться всегда вне зависимости от значения переменных. Но я думаю, что в простых случаях (как данный), это вполне допустимо.Это так, к справке
Огромное спасибо. В Drupal столько возможностей! А php нужно учить. На чужих кодах далеко не уедешь. Вчера не удалось проверить еще раз код Danа. Но впереди выходные.