23 дек. 2015 г.

Распространенные ошибки при разработке, недочеты в коде и рекомендации

Распространенные ошибки при разработке, недочеты в коде и
рекомендации.
1. Двойные кавычки. Старайтесь использовать их только когда это необходимо, ибо
http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double
2. вместо​
  ​
if (is_array($var) && isset($var[‘abcde’]) && $var[‘abcde’])
{...}  ​
достаточно написать ​
if (!empty($var[‘abcde’])) {...} ​
  ​
, даже если
переменная ​
$var ​
  не объявлена, или она пришла не в виде массива, или в массиве ​
$var
отстутствует ключ ​
‘abcde’ ​
.
3. вместо ​
array_push($array, $value);  ​
достаточно написать ​
$array[] = $value;
4. вместо ​
if ($a > 0) {...}  ​
можно написать ​
if ($a) {...}  ​
, хотя в случае если $a
меньше нуля это не прокатит. Однако в разработке под друпал мы редко работаем с отрицательными числами.
5. вместо ​
if (count($array)) {...}  ​
достаточно написать ​
if ($array) {...}
6. вместо ​
if ($x) {$a = ‘yes’;} else {$a = ‘no’;} ​
  ​
целесообразнее написать ​
$ ​
a =
$x ? ‘yes’ : ‘no’;
7. вместо ​
$a == ‘yes’ ? $b = 1 : $b = 0; ​
 пишем ​
$b = $a == ‘yes’ ? 1 : 0;
8. вместо ​
$a = $b > 10 ? TRUE : FALSE; ​
  пишем ​
$a = $b > 10;
9. многие пишут​
  ​
if (isset($var)) {unset($var);} ​
. Это неправильно. Unset не
нуждается в такой проверке.
10. бывает и так: ​
unset($var); $var = array(); ​
.
11. C/C++ программисты, опустившиеся до PHP. Отбрасываем привычки навроде приведения
типов (int)$var, (string)$str без нужды при каждом пуке (было такое, было). Изучите ​
“Loose
comparisons with ==” ​
, ​
“Strict comparisons with ===” ​
 и ​
“Comparisons of $x with PHP functions”   ​
(гугл в
помощь).
12. Не используем алиасы функций вместо актуальных (например,  ​
sizeof() = count(),
chop() = rtrim() ​
)
13. Помните, что вызов функции ​
t(‘text’)  ​
влечет за собой сохранение в базе переводов
значения ‘text’, если оно там отсутствует, или перевода на русский этого текста, если он
есть. Поэтому использование динамических строк типа ​
t(‘count is ’ . $value)
недопустимо. Вам придется наблюдать в управлении переводами кучу неперевёденных
строк ​
‘count is 1’, ‘count is 2’, ‘count is 3’, ‘count is 333’ ​
, и т.д. Вместо
этого пишем ​
t(‘count is @value’, array(‘@value’ => $value)); ​
. ​
  ​
Изучите
справку по ​
t()  ​
и ​
 format_plural() ​
.
14. Вместо ​
if (node_load(123) && $a) {...} ​
  ​
и т.п., следует писать ​
if ($a &&
node_load(123)) ​
. Сначала выполняем легкие проверки, а потом тяжелые, не тормозим
без нужды работу сайта, drupal и так тормозной!
15. некоторые после использования переменной могут в конце написать
unset($переменная) ​
, несмотря на то, что далее к ней не будет обращения. Это не очень
нужно.
16. switch/case ​
  ​
стейтмент не пихаем везде и всюду. Используем разумно.
17. @  ​
­ зло.
18. Белый экран иногда (обычно на сабмитах форм), ошибок в коде нет,  логи тоже пусты, “не
знаю что делать”. ­ скорее всего закрывающий тэг ​
?> ​
 с переносом или пробелом после,
либо PHP­файл в UTF8 с BOM. Кто­то нарушил пункт No0 :) Ищите в последних
модифицированных  или добавленных файлах.
19. Какие­то внезапные трудно отлавливаемые ошибки в js или стили едут ­ скорее всего
что­то связанное с UTF8 или кириллицей в скриптах. Либо использование для последнего
елемента js­массива запятой. Болезненно для ИЕ.
20. Проблема ­ сайт внезапно стал тормозить. Причины могуть быть разные, но одна из самых
неявных ­ вы по каким­то причинам решили удалить включенный модуль физически, но не
отключили его в админке. Ядро в таком случае каждый раз, видя в БД включенный модуль
(поле  ​
status=1  ​
в таблице  ​
system ​
) ​
 и не находя его тело, начинает искать по всем папкам. При
этом, независимо от результатов поиска система его сама не отключает.
21. Если переменная ​
$var ​
  ​
существует, но равна ​
NULL ​
, то ​
isset($var) ​
  ​
вернет ​
FALSE ​
.
22. Вместо ​
array_key_exists() ​
  ​
проще использовать ​
isset() ​
. Исключение ­ определение
наличия в массиве ключа даже со значением NULL(см выше), тут ​
isset()  ​
не сработает.
23. foreach (db_query(‘нехитрый SQL­запрос’) as $result) {...}  ​
­ это не
страшно.
24. запросы (даже нехитрые) в теле foreach/for ­ вот что страшно.
25. Вместо ​
strlen() ​
  ​
используем аналог ­​
  ​
drupal_strlen() ​
! То­же самое касается
substr(), strtolower(), strtoupper() ​
. См. справку. Исключение ­ гарантированно не содержащие UTF8 строки.
26. Имена таблиц в SQL­запросах оборачиваем в ​
{плейсхолдеры} ​
.  ​
Так­же ​
не ​
используем т.н.
грависы (`такие` `вот` `кавычки`)
27. Запросы генерим по обстоятельствам, где­то используем объект ​
db_select() ​
, где­то
напрямую вызов​
  ​
db_query() ​
, как проще.
28. При сохранении таймштампа в БД используем константу ​
REQUEST_TIME
29. При выводе этого таймштампа юзеру, используем друпаловскую ​
format_date() ​
.
30. Прежде чем изобретать велосипед для игрищ с датами/временем не поленитесь заглянуть
в справку по PHP. Там для этого инструментов навалом. Плюс велосипеды в поставке
Друпала.
31. То­же самое касается строк и массивов.
32. В функции ​
my_module_install() ​
  ​
в установщике модуля, вместо ​
t(‘text’) ​
  ​
пишем ​
$t =
get_t(); $t(‘text’);
33. В хуке ​
hook_menu() ​
  ​
при указании заголовка пункта меню ​
(‘title’ => ‘Title’) ​
 не
используем ф­ю ​
t() ​
.
34. Создал новый пункт меню программно (​
hook_menu() ​
) ­ не работает. Нужно чистить кэш
Друпала.
35. Так­же ­ после добавлении каких­либо хуковых функций они не “подхватываются” ­ чистим
кэш Друпала.
36. Добавление всех подряд файлов модуля в директивы ​
files[] =  ​
...  .info­файла. Если вы
увидели такой подход в скачанном с друпал.орг модуле, то это не значит что так и надо
делать. Читаем внимательно ​
http://drupal.org/node/542202#files
37. Самое главное ­ никаких модификаций в файлах ядра или сторонних модуле

12 мая 2015 г.

Group by views_pre_execute and "group by"

/** * Implements hook_views_pre_execute(). * @param $view */ function mymodule_views_pre_execute(&$view) { if ($view->name == 'commerce_orders' && $view->current_display == 'admin_page') { // Group order list on /admin/commerce/orders/list page. $view->build_info['query']->groupBy('commerce_order.order_id'); } } Help links https://www.drupal.org/node/1342616 http://linuxdev.dk/blog/altering-views-queries

Create a custom views access plugin


If you want to create a custom views access plugin the reason for this will be to allow you to have an entry point to add custom logic to protect the access to your view.
Let say you need a finer access control to a view than roles and permissions. For example you are storing properties on a user object who determine if certain user can see certain views independent of their roles.
What we need to do, is to configure our views correctly with a views access plugin.
The hacky way:
You could load the user in the template file of your view and check for the property but this is not what we want to do. While this would work you would have to redo it in every template and you will not be able to configure it. It is also difficult to control. Its hacky and hacky solutions tend to cause a lot of maintenance. Making these quick solutions costing more in the long run. This is worth a different blog post entirely.
Here is the drupal way:
Views has this beautiful architecture in place that allows you to extend its base classes. If you start writing a custom views plugin the best thing to do is to examine an other plugin of its kind. For example check out the permissions access plugin. (tip: a good way to write plugins is to look at examples from views or other module implementing the same system)
The file:

/views/plugins/views_plugin_access_perm.inc
<?php
 
/**
 * @file
 * Definition of views_plugin_access_perm.
 */
 
/**
 * Access plugin that provides permission-based access control.
 *
 * @ingroup views_access_plugins
 */
class views_plugin_access_perm extends views_plugin_access {
  function access($account) {
    return views_check_perm($this->options['perm'], $account);
  }
 
  function get_access_callback() {
    return array('views_check_perm', array($this->options['perm']));
  }
 
  function summary_title() {
    $permissions = module_invoke_all('permission');
    if (isset($permissions[$this->options['perm']])) {
      return $permissions[$this->options['perm']]['title'];
    }
 
    return t($this->options['perm']);
  }
 
 
  function option_definition() {
    $options = parent::option_definition();
    $options['perm'] = array('default' => 'access content');
 
    return $options;
  }
 
  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    $perms = array();
    $module_info = system_get_info('module');
 
    // Get list of permissions
    foreach (module_implements('permission') as $module) {
      $permissions = module_invoke($module, 'permission');
      foreach ($permissions as $name => $perm) {
        $perms[$module_info[$module]['name']][$name] = strip_tags($perm['title']);
      }
    }
 
    ksort($perms);
 
    $form['perm'] = array(
      '#type' => 'select',
      '#options' => $perms,
      '#title' => t('Permission'),
      '#default_value' => $this->options['perm'],
      '#description' => t('Only users with the selected permission flag will be able to access this display. Note that users with "access all views" can see any view, regardless of other permissions.'),
    );
  }
}
This is a clear example that we can use to start with. You can see there are some essential functions to create this plugin. Lets check our example to see which ones.
Create a file called custommodule_access_plugin.inc in the root of your custom module.
<?php
 
  /**
   * Access plugin that provides property based access control.
   */
  class custommodules_access_plugin extends views_plugin_access {
 
    function summary_title() {
      return t('Custom acces plugin');
    } // summary_title()
 
  /**
   * Determine if the current user has access or not.
   */
    function access($account) {    
      return custommodules_access($account);
    }
 
    function get_access_callback() {
      return array('custommodules_access', array());
    }
 
  }
For the custom views plugin you need three functions. The summary_title to return the title in the admin interface. This is what you will see when you go to the views interface and you select your plugin. It will appear next to role based and permission based access in the views interface.
Then we have our access method where you the custom callback. Finaly you must declare to views your custom access callback. You can pass arguments if need using the array see in the example above.
We have our file with the class now we need to tell views that we have created a new access plugin.
Two things need to be done. First in the info file you must tell there is a file containing the class.
name = custommodule
description = Custom code
core = 7.x
package = custom
dependencies[] = views
files[] = custommodule_access_plugin.inc
The you need to implement a hook_views_plugins to tell views that there is a new custom access plugin available
  /**
   * Implements hook_views_plugins()
   */
  function custommodule_views_plugins() {
    $plugins = array(
      'access' => array(
        'test' => array(
          'title' => t('Custom Access check'),
          'help' => t('this is a custom access plugin'),
          'handler' => 'custommodule_access_plugin',
          'path' => drupal_get_path('module', 'custommodule'),
        ),
      ),
    );
    return $plugins;
  }
Our access callbacks doing the custom checks.
 function custommodules_access($account = NULL) {
    global $user;
    $access = false; 
    $account = user_load($user->uid);
    $optionfield = field_get_items('user', $account, 'field_option');
 
    //In the future more values are possible so this is extendible
    //For now only +eur exists
    $allowed_values = array('eur');
    $options = explode('+', $optionfield[0]['value']);
    foreach ($allowed_values as $allowed_value) {
      if (in_array($allowed_value, $options)) {
        $access = true;
      }
    }  
    return $access;
  }
Here we are checking on certain values that are stored in a field of a user of certain role. When a user has these properties we want the callback to return true. This will grant access.
Now that you have this plugin you can start using it in all your views by going to the interface access section and select the plugin.


Original source http://dominiquedecooman.com/drupal-7-tip-create-custom-views-access-plugin

4 мар. 2015 г.

Выключить отображение php ошибок на сайте:

# supress php errors
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0

Включить отображение php ошибок на сайте:

php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2047

Вывод ошибок php в произвольный лог файл

# enable PHP error logging
php_flag  log_errors on
php_value error_log  /home/path/public_html/domain/PHP_errors.log

Защищаем папку с логами от доступа

# prevent access to PHP error log
<Files PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>

Выставляем уровень вывода ошибок

integer — флаг, который задает глубину вывода ошибок. 0 — не выводить ничего, 8191- выводить в лог все. Значение 1 — выводит ошибки. Более подробное описение в документации по PHP.
# general directive for setting php error level
php_value error_reporting integer

Выставляем максимальный размер для строки с ошибкой

# general directive for setting max error size
log_errors_max_len integer

Отключить логирование повторяющихся ошибок

# disable repeated error logging
php_flag ignore_repeated_errors on
php_flag ignore_repeated_source on

Настройки для сайта в рабочем режиме

# PHP error handling for production servers
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_reporting -1
php_value log_errors_max_len 0

<Files /home/path/public_html/domain/PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>

Конфигурация для отладки или разработки

# PHP error handling for development servers
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/path/public_html/domain/PHP_errors.log
# [see footnote 3] # php_value error_reporting 999999999
php_value error_reporting -1
php_value log_errors_max_len 0

<Files /home/path/public_html/domain/PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>

Настройка аутентификации в apache

E-mail Печать PDF
Если хочется закрыть какую либо часть сайта от любопытных глаз, самым простым способом будет настроить аутентификацию в Apache 2.2: basic или digest либо по IP адресам. Разница между basic и digest аутентификацией в том что basic отправляет пароли открытым текстом, digest же отправляет хэши паролей. Digest метод предпочтительней, так как безопасней. Пароли будем хранить в файле в зашифрованном виде.
Настройка аутентификации basic
Вписываем в описание виртуального хоста, или директории сайта, либо создаем файл .htaccess в нужной директории сайта:
AuthType basic
AuthName "private area"
AuthUserFile /usr/local/www/etc/.htpasswd
Require valid-user
Создаем директорию в которой разместим файл для аутентификации.
mkdir /usr/local/www/etc
Создадим файл .htpasswd который будет хранить имена пользователей и пароли:
#cd /usr/local/www/etc
#htpasswd -c .htpasswd user
И введем пароль для пользователя user.
Сделаем этот файл принадлежащим веб серверу и запретим чтение для остальных пользователей:
#chown www:www .htpasswd
#chmod 640 .htpasswd
Поменять пароль или добавить нового пользователя можно с помощью команды:
#htpasswd .htpasswd user
Для удаления пользователя можно использовать
#htpasswd -D .htpasswd user
Настройка аутентификации digest
Вписываем в описание виртуального хоста, или директории сайта, либо создаем файл .htaccess в нужной директории сайта:
AuthType Digest
AuthName "private"
AuthDigestDomain /private/ http://example.com/private/
AuthDigestProvider file
AuthUserFile /usr/local/www/etc/.htdigest
Require valid-user
Создаем директорию в которой разместим файл для аутентификации.
#mkdir /usr/local/www/etc
Создадим файл .htdigest который будет хранить имена пользователей и пароли:
#cd /usr/local/www/etc
#htdigest -c .htdigest private user
И введем пароль для пользователя user. Обратите внимание на private в команде, это значение должно совпадать со значением в AuthName «private». Сделаем этот файл принадлежащим веб серверу и запретим чтение для остальных пользователей:
#chown www:www .htdigest
#chmod 640 .htdigest
Поменять пароль или добавить нового пользователя можно с помощью команды:
#htdigest .htdigest private user
Для удаления пользователя можно использовать
#htdigest -D .htdigest private user
Еще один способ ограничения доступа - это указать с каким IP-адресов можно попадать в директорию, например вот так:
Order deny,allow
Deny from all
Allow from 192.168.1.1
Мы запрещаем доступ всем разрешив только с нашего IP-адреса (можно перечислить IP-адреса через пробел, или указывать сети, например так
192.168.1.0/24). Директива Order задает порядок проверки, То есть сначала
блокируем всех а потом разрешаем избранным.

3 июл. 2014 г.

Drupal 7 custom node view modes

Drupal 7 custom node view modes

Monday, December 20, 2010 - 16:06
One of the cool new things in Drupal 7 is the ability to easily add new “View modes” for nodes. View modes are available for other entities like comments also, but I’m gonna only cover the nodes for this time.
Before, Drupal had only two “hard-coded” node view modes, the full node view and the teaser view. These two provided us just enough flexibility for most simple content listings, but quite often we needed to turn to Views in Fields mode to get more flexibility. By flexibility in this case I mean displaying the same content in different ways in different contexts.
In Drupal 7 we can create additional view modes by simply implementing hook_entity_info_alter() in our custom module.

/**
* Implements hook_entity_info_alter().
*/
function MYMODULE_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['another_teaser'] = array(
    'label' => t('Another teaser'),
    'custom settings' => TRUE,
  );
}

After defining the new view mode, we can go to content type’s “Manage Display” page and select which fields to display plus some additional options for fields, like which image style to use for image fields, for example.
display_fields.jpeg
Next we need to get this view mode used somewhere. We’re gonna create a View for that. Set the View to Style = Unformatted, Row style = Node and select the “Another teaser” view mode from the row style options. Optionally you can create a page display with a path for the View for easier testing.
views-select-view-mode.jpeg

Up to this point nothing is that different than creating a view in “fields” mode, and select the desired fields one by one in the view itself. The differences are mostly how we can apply some theming and custom layout for the content.
To get the most out of this we’ll propably want to add a custom node.tpl.php template for this view mode. Custom node template enables easy and flexible theming and we can use standard hook_preprocess_node() function for example to control the variables we have available in the template. To make Drupal use a different .tpl.php file for view mode we need to add a new template suggestion in hook_preprocess_node().
/**
* Implements hook_preprocess_node().
*/
function MYMODULE_preprocess_node(&$vars) {
  if($vars['view_mode'] == 'another_teaser') {
    $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__another_teaser';
  }
} 
Duplicate standard node.tpl.php for the content type you need, like node--article--another-teaser.tpl.php. (NOTE: use underscores in template suggestions, dashes in the filename).
There are many other ways to get the exactly same outcome, like the Display Suite module, but seems to be an overkill for a simple need what we just covered. While Views in fields mode is still most often the way to go, this opens a completely fresh option if you need to reuse the templates in multiple views, or you need to display every content type in a different way in the same listing without doing gigantic template files for views.

Comments

This really rocks!

Impressive! This will change forever how I view content type display and usage.

:). Can't wait to start developing with D7. (but first I must to finish my current projects :(

I searched a lot for that !!!
I also tried Display Suite for this, but currently it doesn´t work correctly with views and of course is an overkill. THANKS AGAIN !!!

I was literally looking for this feature yesterday and found your post on drupal planet. Talk about good timing.
Also thanks for the drupal 7 tips. Looking forward to working on new projects so can start with D7.

Thanks for this cool highlight of the feature.
This is especially powerful in D7 since you can now define field order per view mode (in CCK D6, field display order = form display order, for all view modes)
Note that Display Suite in D7 got notably skimmed down since much of its features are now handled in core, or can plug directly on the main core field UI, instead of having to develop a complete alternate UI in D6.
Display Suite notably offers a UI to create your own custom view modes - although, as you point, creating them through code is quite straightforward.

Thanks, that was helpful. Two remarks about your code:
AFAIK $vars['build_mode'] is not available in preprocess_node functions, but $vars['view_mode'] is.
I took the creation of template suggestions a small step further by doing this:
/**
* Implements hook_preprocess_node().
*/
function MYMODULE_preprocess_node(&$vars) {
$vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__' . $vars['view_mode'];
}
As a result, I can now use this file naming pattern for all possible node type & view mode combinations: node--NODE-TYPE--VIEW-MODE.tpl.php.

You are right, $vars['build_mode'] doesn't seem to exist in hook_preprocess_node. It might be that I used an outdated Drupal 7 or something. I corrected it to $vars['view_mode'] now. Thanks!
Thanks for the hint to use a general vars['view_mode'] in the template suggestions.

Hi!
I am very new to Drupal and can´t figure out why my html codes doesn´t work in content when saved. If i check the preview -- "Preview Trimmed Version" is how i want it to be displayed in content when saved. Now "content" displays in the "Preview full version" which is not how the html codes should turn out. I checked the html codes and they are correct. Please, if any one knows how to solve this it would be great! Thank you.

hello
it's perfect for what i need, but where i put the code :
/**
* Implements hook_entity_info_alter().
*/
function MYMODULE_entity_info_alter(&$entity_info) {
$entity_info['node']['view modes']['another_teaser'] = array(
'label' => t('Another teaser'),
'custom settings' => TRUE,
);
}
?
I must create a new module just for that?
Im a newbie...
sorr for my poor english

Hi! Thanks for your comment. Yes - you need a custom module where these snippets are placed. I didn't cover the steps to create a custom module, because there's a lot resources for that available on the web.
See: http://drupal.org/node/361112

Another useful tip relating to theming custom node views...
Instead of creating separate template files per view mode you can use the $view_mode variable in your default node type template file.
for example in your "node--news_post.tpl.php" file, you can set the output of your "another_teaser" custom view mode with the following...
custom teaser output code here

Thanks for the info. However, I'm a bit stuck with the part on the views, using Views 3 (currently RC1). I've got something working, but I'm not sure I've done it the right way. "Style settings" appears to no longer exist, the closest I can find is "unformatted list".
Could you, or anybody who feels like it, comment on how you should do do this using Views 3?
And is a view really necessary? It seems like overkill to me, what good is a display mode in core if you can't use it without a contrib module...

thx for the nice snipped. Did'nt work for me. If you also have problems with the code, try defining TRUE as a string ('TRUE')....

I had the same problem. Set TRUE as a string helped for me!

you shouldn't use a string if you use then php interprets it always as TRUE , you probabely didn't activate your custom view mode under `Custom display settings` in `MANAGE DISPLAY` tab.

I have been using Views_datasource in D6 for a while, to output JSON files. One of the things I do is output the URL of Images as oppose to the images them selves. I have mobile apps that consume this data.
I want to try doing this in D7 and VIews3, but no luck out of the box. So I ran across your article, and I am wondering if this could be a solution.
So one of the "another teaser" I would create a view of type JSON. and all of the FILES, and IMAGES would be URL's. The output would have a path with a .json extension. What more am I missing, and am I going int he right direction? perhaps there is some sample code out there that I could look at?
thanks

Excellent and to-the-point article on a super helpful topic. Thank you. This is an excellent addition to D7, too bad it's not documented. (Also the post by marcvangend really helps too).
In case it helps anyone else, I discovered the 'hook_entity_info_alter' feature in the node_example module (example_node_list), but they failed to mention where this modification would manifest itself in the Drupal admin area. It didn't even occur to me that it added a new view mode in the Manage Display tab. So simple! That detail would be helpful.
Anyway, thanks for helping me connect the dots!

Great. Works for me. My views looks a little different but works with Format:unformatted list and show:content. Well I have an error message I haven't looked into yet but it's using my template file so that's good enough for me for now.
How do I use this view with a specified node? I don't want to look at all the nodes on the same page. I want to be able to select one node and then perhaps switch between view modes for just that node. I imagine I can possibly pass an argument to the view and filter the view based on that argument but I don't know how or if there is an easier/better way.
Thanks again.

hi
I am not sure what wrong I am doing. I created new module in sites\all\modules\ as energy_landing. Created .info and .module file enable module but still I cant see new view mode.. Please help

I'm at the same place. Did you solve this yet?

Very nice tip. It might not work when used for the first time until you clear the cache twice: once after adding the new hook and then second time. Duno why, but without second cache clearing I had the custom view mode checkbox checked, but the mode didn't appear in the horizontal view modes list. Now it's ok.

Yes, this was my pick after researching, after reading this article. I think this module uses the system described here, but its handy if you do not want to mess with the code and writing own modules... Anyway, article is great. And tjhis module simplifies much for me now :)

Just wanted to thank you for the custom view mode tip. So thanks! :)

This post helped me again ;) Thanks Juha!

Hello, I don't know if i'm at the right place for that. In fact, i'm fed up to search on the web for this.
I want , when i create a content, to choose multiple node/pages to display my content. For exemple when i'm creating my article i want a fields who allow me to select multiple link of my website.
Is there a way to do that with, just creating a new view or content type ? Or should i alter a module or create a new one for my purpose ?
A link with a turtorial or similar case should be fine too ;)
thank you in advance for your response.

Thank you very much!!!

wow, impressive, I'm newbie, so if someone could give me a little example of how to select the title of the node in this node--type--view_mode.tpl.php...
Thanks.

Thanks for the help, one addition:
If you want to adjust the visibility of a field from within the code, so you don't have to mess around with the UI at all, you will likely have to do something like this:
$node->content['my_field_of_interest']['#hidden'] = FALSE;
otherwise the field may be hidden in your new view mode. It may be worth noting this alternative as part of the tutorial, below where you say «we can go to content type’s “Manage Display” page and select which fields to display».

Oh, that's for use in hook_node_view, of course.

Exactly how I like it. Hands down this is the best and most useful Drupal mini-tutorial I've come across so far, earning my keep with Drupal for about 3 years now. Also your preview feature yields a 503, seems like varnish config problems. :P

If you set
'custom settings' => FALSE,
if won't be enabled by default (on all content types) and you can choose which content types to enable it on.
http://www.wunderkraut.com/blog/drupal-7-custom-node-view-modes/2010-12-20

3 окт. 2013 г.

Аллергия на собак. Что делать ?

Хотя все больше и больше людей обнаруживают благоприятное воздействие собаки в целом,но факт остается фактом , что примерно от 15 до 20 процентов от общей численности населения имеют аллергию на животных. Результат? Бесчисленное количество владельцев недовольны, встает вопрос- что же делать?! Аллергены -вещества, которое вызывают аллергическую реакцию. Контактируя и вдыхая аллергены мы получаем аллергическую реакцию. Симптомы - покраснение кожи, зуд, выделения из глаз и носа; чихание; кашель; покалывание или боль в горле; зуд кожи, и наиболее серьезная из всех- это затрудненное дыхание.Наиболее распространенными аллергенами являются животные белки, которые обнаружены в частичках старой отшелушиваемой кожи, , слюне, моче и сальных клетках. Любое животное может вызвать аллергическую реакцию, но кошки чаще всего. Люди также испытывают аллергию на мочу, слюну домашних и экзотических животных, таких, как хорьки, кролики, птицы, хомяки и грызуны. Не Существует вида животных, к которому у людей не может развиться аллергия.Длина шерсти и тип не повлияет или не предотвратит аллергию. Некоторые животные могут быть менее аллергенны, но это строго на индивидуальной основе и не может быть предсказано.
После того, как ставится диагноз аллергии на животное врачи часто рекомендуют устраненить животное от окружающих. Грустно? Да. Это необходимо? Не всегда.
Имейте в виду, что большинство людей имеют аллергию на некоторые вещи ещё и кроме животных, как, например, пылевых клещей, пыльцу и формы пыли, которые можно найти в доме. Аллергические симптомы возникают в результате общей совокупной нагрузки на организм. Это означает, что если ликвидировать некоторые другие аллергены, вам возможно не придется избавляться от вашего питомца. (И наоборот, если вы решите удалить вашего питомца из вашего дома, это не может сразу решить ваши проблемы.) Вы также должны быть готовы инвестировать время и усилия, необходимые для анализа и дезаллергизацию домашней обстановки, ограничить в будущем воздействие аллергенов и найти врача , который будет работать с вами.
Мы предлагаем вам провести программу , состоящую из 3-х частей .
Улучшение условий жизни
1. Найти место свободное от аллергенов. Спальня- наилучший вариант. Предотвратить доступ вашему питомцу в спальню, Также хорошая идея использовать гипоаллергенное постельное белье и подушки из гипоаллергенных материалов.
2. Минимальное количество тканных материалов. Аллергены собираются в коврах, драпировках и обивках, уменьшить их количество по возможности. Если вы решили сохранить некоторые ткани необходима их паровая очистка регулярно. Лучший выбор- это хлопковые ткани. Стирка регулярная штор с оконных проемов.
3. Вакуумные фильтры- использование в пылесосах фильтров HEPA (высокоэффективное поглощение частиц пыли) или одноразовых мешков.
4. Установить очиститель воздуха оснащенный HEPA-фильтром. Поглощение из воздуха мелких частиц были способствует уменьшению аллергенов в помещении.
5. Использование анти-аллергенных спреев . Эти спреи обезвреживают аллергены, что делает их безвредными.
6. Частое мытье оконных стекол. Используйте спреи без отдушек.
7. Регулярная влажная уборка- стирание пыли с предметов интерьера.
8. Частая стирка постельного белья и очищение клетки питомца
Обработка вашего питомца
1. Купание домашних животных, по крайней мере один раз в неделю. При купании смываются аллергены, которые накапливаются в животном мехе.
2. Протирайте вашего любимца с продуктом , который поможет предотвратить отслаивание старых частиц кожного покрова, средство посоветует ветеринар.
3. Запишите все симптомы дерматита , которые появляются у вас на вашего питомца. Часто линька животных усугубляет дерматиты у хозяев.
4. Щеткой или расческой часто расчесывайте вашего питомца . Лучше делать это на открытом воздухе, если это возможно.
Забота о себе
1. Если возможно,чтобы кто-то, кроме вас делал домашнюю уборку и все работы связанные с хим.обработкой,-это тоже хороший выход. Если вы это делаете сами- то не забудьте надеть маску от пыли.
2. Мойте руки после обработки вашего компаньона, прежде чем дотрагиваться до лица. Районы вокруг носа и глаз особенно чувствительна к аллергенам.
3. Выделить себе “домашнюю одежду” из числа наиболее легкомоющейся. Носите ее при уборке и работ с питомцем, стирать часто.
4. Найти врача, желательно специалиста по аллергии , который поможет убедиться, что ваш питомец является причиной вашей аллергии и поможет облегчить ваши симптомы. Лекарственные препараты и иммунотерапия часто помогает сделать вашу жизнь с вашим питомцем более приятной, поможет вам остаться вместе.

http://mirsobak.org.ru/1810-allergiya-na-sobak-chto-delat/