CMS Drupal: руководство по разработке системы управления сайтом.Джон Вандюк.

Главные вкладки

Аватар пользователя asde@drupal.org asde@drupal.org 24 марта 2009 в 13:39


Некоторые замечания.


  1. name = Annotate
    description = Allows users to annotate nodes.
    core = 6.x
    package = Pro Drupal Development

  2. <?php
    function annotate_menu(){
        
    $items['admin/settings/annotate'] = array(
        
    'title'=>t('Annotation settings'),
        
    'description'=>t('Change how annotation behave.'),
        
    'page callback'=>'drupal_get_form',
        
    'page arguments'=> array('annotate_admin_settings'),
        
    'access arguments' => array('administer annotations'),
        
    'type'=> MENU_NORMAL_ITEM,
        
    'file'=>'annotate.admin.inc',
        );
        return 
    $items;
    }
    ?>

  3. <?php
    function annotate_admin_settings()
    {
        
    //Получить массив типов узлов с внутренними именами в качестве ключей
        // и "дружественными именами" в качестве значений. Например,
        // array ('page'=>'Page','story'=>'Story');
        
    $options node_get_types('names');
        
    $form['annotate_node_types'] = array(
        
    '#type'=>'checkboxes',
        
    '#title'=>t('Users may annotate these content types'),
        
    '#options'=>$options,
        
    '#default_value'=>variable_get('annotate_nodetypes',
        array(
    'page')),
        
    '#description'=>t('A text field will be available on these
        content types to make user-specific notes.'
    ),
        );
        return 
    system_settings_form($form);
    }
    ?>

  4. <?php
    function annotate_nodeapi(&$node$op$teaser$page)
    {
        global 
    $user;
        global 
    $nid;
        global 
    $node_annotation;
        switch (
    $op){
            
    //Операция view означает что узел сейчас отображен.
            
    case 'view':
                
    //Прервать если пользователь анонимный или не page.
                
    if (!$page || $user->uid == 0){
                    break;
                }
                
    //Найти типы узлов которые надо аннотировать
                
    $types_to_annotate variable_get('annotate_node_',array('page'));
                
    //Прервать если данный узел не подл. аннотации.
                
    if(!in_array($node->type$types_to_annotate)){
                    break;
                }
                
    //Получить аннотацию из бд. и сохр. ее в node
                
    $result db_query('SELECT note FROM {annotations} WHERE nid = %d AND uid = %d'$node->nid,$user->uid);
                
    $node_annotation db_result($result);
                
    $nid $node->nid;
                
    $node->content['annotation_form'] = array(
                    
    '#value'=> drupal_get_form('annotate_entry_form'),
                    
    '#weight'=>10
                
    );
                break;
            case 
    'delete':
                
    db_query('DELETE FROM {annotation} WHERE nid = %d',$node->nid);
                break;
        }
    ?>

  5. <?php
    function annotate_entry_form($node )
    {
        global 
    $nid;
        global 
    $node_annotation;
        
    //Определить fieldset.
        
    $form['annotate'] = array(
            
    '#type'=> 'fieldset',
            
    '#title'=>t('Annotations')
        );
        
    //Определить textarea внутри fieldset.
        
    $form['annotate']['note'] = array(
            
    '#type'=>'textarea',
            
    '#title'=>t('Notes'),
            
    '#default_value'=> $node_annotation,
            
    '#description'=>t('Make your personal annotation about this content here. Only
            you (and the site administrator) will be able to see them.'
    )
        );
        
    $form['annotate']['nid'] = array(
            
    '#type'=>'hidden',
            
    '#value'=> $nid
        
    );
        
    //Определить фу-цию submit.
        
    $form['annotate']['submit'] = array(
            
    '#type'=>'submit',
            
    '#value'=>t('Update')
        );
        return 
    $form;
    }
    ?>

  6. <?php
    function annotate_entry_form_submit($form,$form_state)
    {
        global 
    $user;
        
    $note $form_state['values']['note'];
        
    $nid $form_state['values']['nid'];
        
    db_query("DELETE FROM {annotations} WHERE nid = %d and uid =%d",$nid$user->uid);
        
    db_query("INSERT INTO {annotations} (nid, uid, note, created) VALUES (%d,%d,'%s',%d)",$nid$user->uid$notetime());
        
    drupal_set_message(t('Your annotation was saved.'));
    }
    ?>

  7. <?php
    function annotate_menu(){
        
    $items['admin/settings/annotate'] = array(
        
    'title'=>t('Annotation settings'),
        
    'description'=>t('Change how annotation behave.'),
        
    'page callback'=>'drupal_get_form',
        
    'page arguments'=> array('annotate_admin_settings'),
        
    'access arguments' => array('administer annotations'),
        
    'type'=> MENU_NORMAL_ITEM,
        
    'file'=>'annotate.admin.inc',
        );
        return 
    $items;
    }
    ?>

  8. <?php

    function annotate_entry_form_submit($form,$form_state)
    {
        global 
    $user;
        
    $note $form_state['values']['note'];
        
    $nid $form_state['values']['nid'];
        
    db_query("DELETE FROM {annotations} WHERE nid = %d and uid =%d",$nid$user->uid);
        
    db_query("INSERT INTO {annotations} (nid, uid, note, created) VALUES (%d,%d,'%s',%d)",$nid$user->uid$notetime());
        
    drupal_set_message(t('Your annotation was saved.'));
    }
    ?>
ВложениеРазмер
Файл annotate.rar2.68 КБ

Комментарии

Аватар пользователя Azerot Azerot 24 марта 2009 в 15:02

Я писал уже про то, что эта книга из одни опечаток сделана, меня обкакали в итоге:
http://drupal.ru/node/25671
а то что я писал - в мусор. Ну да и наплевать.

2Автор: смотри и тебя в мусор щас определят!

Аватар пользователя asde@drupal.org asde@drupal.org 25 марта 2009 в 11:48

liveflow wrote:
Сгрузите с сайта издательства архив с примерами, там все правильно.

Примеры с сайта издательства 100% нерабочие и 70% не соответствуют книжным.
P.S Тут единственные рабочие примеры.

Аватар пользователя liveflow liveflow 27 марта 2009 в 10:16

Не поленился, еще раз поставил модуль annotate из второй главы. 100% рабочий демопример.
Возможно с процентом несоответствия с книжкой вы близки к истине. Но про "нерабочесть" точно пальцем в небо - поправьте цифру 100, если хотите быть хоть немножко объективны.

Кстати, возможно вы скачали примеры от предыдущей книги (про 5й друпал).

Аватар пользователя MR.Gold MR.Gold 20 ноября 2011 в 13:55

По поводу примера описанного выше (из этой ноды)чекбоксы на другие типы материалов не переключаются т.е. модуль работает только с типом материала page, что не совсем корректно. В чём может быть причина?

Аватар пользователя glu2006 glu2006 25 марта 2009 в 12:43

Да нормально все правильная книга заставляющая думать и искать что в ней не так :).
А то привыкли копипастить в слепую.
А пойти на друпал орг примеры посмотреть, а залезть в АПИ и сравнить с тем что в книжке и пометить карандашиком как топикстартер?
Я больше чем уверен что при создании своего меню у топикстартера нет вопросов для форумчан, а вот ответы он уже может и выдать :).

Вывод книга хорошая, заставляющая новичков думать и искать правильные решения в ошибочных примерах. Но ее бета версия не стоит таких денег за которые ее продают конечному потребителю.

Аватар пользователя Azerot Azerot 25 марта 2009 в 15:53

glu2006, я бы согласился с вами, но есть одно НО.
Новичок он на то и новичок, что ещё почти ничего не знает. Именно поэтому он не в состоянии найти ошибки, а вот наступить на них - запросто. В итоге ничего не работает, что делать непонятно! Да, можно, изучать исходники других модулей, засесть за словарь и переводить английские доки, но это равносильно вырыванию гланд не через горло, а простите через задницу.

Книги для начинающих должны быть вылизаны, вычитаны, а все примеры 100% отлаженны и рабочие! Вот для людей имеющих определённый уровень можно усложнять задачу и заставлять не тупо копировать!

Аватар пользователя glu2006 glu2006 10 ноября 2015 в 11:46

Azerot wrote:
Книги для начинающих должны быть вылизаны, вычитаны, а все примеры 100% отлаженны и рабочие! Вот для людей имеющих определённый уровень можно усложнять задачу и заставлять не тупо копировать!

Есть в этих словах правда :). Ноя сужу по собственному опыту. Я начинал учить 5-ку именно по книжке этого издательства причем не знал ни PHP ни всего другого, натыкался на не работающие примеры, и садился и искал почему он не работает. Психовал, ругался матом, попутно изучая английский лопатя и переворачивая кучу информации. Не спорю может я и потерял кучу времени, но зато все до чего дошел самостоятельно помню как отче наш.

А с большего как это уже не раз говорилось если человек чего-то хочет достичь он этого достигнет с помощью книги или без нее, с помощью советов бывалых или без них, убив на это год или месяц. Главное поставить цель и вперед на мины.
А то что ее халтурно перевели на русский язык и не проредактировали тексты и код так это вина только издательства "Вильямс", поскольку работают там разгильдяи переводчики Smile

И кто Вам сказал что эта книга для новичков?
у нее если вы обратили внимание на задней странице написан этакий слоган "Профессионалам от Профессионалов" (может там заложен и нейкий другой смысл но я его не нашел).

Там-же написано где можно взять все исходные коды примеров приведенных в книге, не работает вперед в глобальные просторы мировой сети. http://www.drupalbook.com/node/2
В общем книга нужна для того чтобы ее читать и самое главное осмысленно читать.

Аватар пользователя Azerot Azerot 27 марта 2009 в 9:16

> психовал, ругался матом, попутно изучая английский лопатя и переворачивая кучу информации. Не спорю может я и потерял кучу времени, но зато все до чего дошел самостоятельно помню как отче наш.

Видите, сами же согласны. Потеряли кучу времени! Ладно вам хватило упорства не бросить всё на полдороги, а представьте человека, которому нужно просто освоить CMS, не важно какую. Останется ли он с Drupal при таком раскладе или пойдёт поискать что полегче? Думаю, что наиболее вероятен последний вариант. И его трудно будет в этом упрекнуть.

Книга полезная, спору нет. Я, например, таки написал свой модуль по ней, прочитав буквально 50 страниц. Хотя и наступил на кучу грабель, но всё-таки учитывая, что немножко знаю и PHP и Drupal - все эти грабли успешно преодолел. Просто удручающе это выглядит для новичков, увы! Sad

Аватар пользователя glu2006 glu2006 27 марта 2009 в 9:39

Azerot wrote:
Ладно вам хватило упорства не бросить всё на полдороги, а представьте человека, которому нужно просто освоить CMS, не важно какую. Останется ли он с Drupal при таком раскладе или пойдёт поискать что полегче? Думаю, что наиболее вероятен последний вариант. И его трудно будет в этом упрекнуть.

А я и не буду его упрекать: "Нет стремления тогда зачем ты здесь?"
Вот и все что хочется ответить такому новичку.
Вы думаете книги на русском по Joomla или Wordpress или еще какой CMS переведены лучше? Smile
Очень много новичков купив книжку и даже толком не прочитав ее уже кричат "Я знаю кунг-фу" :).

Ладно, на сим прекращаю свой оффтоп. Поскольку разговор начинался про непорядок в книге, а закончился как всегда "Эээх молодежь" :).