Archive for ‘January, 2012’

It’s amazing – I’ve worked on dozens of Drupal projects (as far back as 4.7) as a PM, and never actually built a module myself. Wow. Now I’m going to have to learn!

Contents

Guides

Howto: block function

  • name it: give it a lowercase_underscore type name for module file name and function prefixes (make sure it’s not an existing theme name)
  • create folder and module file sites/all/modules/module_name/module_name.module
  • create module_name.info file
  • add module @file comment description
  • add a help hook: module_name_help function (returns text and breaks)
  • if it’s a block hook, add module_name_block_info (describe it to Drupal) : info, cache etc.
  • add content functions (get things from db. etc)
  • if it’s a block module: do a block view
    • use a switch($delta) – you might want more blocks later in the same module
    • do access checks – on content retrieval functions
    • do the db grab function to get stuff in a result
    • load up the $items array with a foreach loop
    • if it’s empty – return an apology
    • otherwise: pass data (as $items array) through ot the template function – choosing a format (lists etc… or whatever)
    • return the block

Configuration form

  • Impement a hook_menu function (module_name_menu) – to create a configuration form for the module
    • do not t(translate) it (automatically translated by drupal) – pass it an array of title, description, page callback (drupal_get_form), page arguments (current_posts_form – see below), access arguments and type.
    • Then return items.
  • now do the current_posts_form
    • use #variables and check the forms api reference for element attributes you can set.
    • variable_get(thing, def.val) to get/set default persistent variable (indexed on form name)
    • system_settings_form calls Drupal’s form api to do the work. (you don’t have to create a submit button… although we could if we wanted)
  • now do any necessary data validation
    • use &$form_state to capture and keep $_POST variables during form process
    • use ifs to validate values from the $form_state array

 

Permissions for custom pages

  • create module_name_permission hook
  • create private page callback hook
  • add $display variable to module_name_contents() function
    • this will enable block or page view

create page (private) view

  • use private function call for module_name_page hook
  • load items into array with module_name_contents hook (+display variable ‘page’)
  • add a ‘if no data’ option & return the page array
  • else, return page array *with double underscore after theme tag*
  • eg: item_list__module_name (this enables specific theming options by telling Drupal it’s a theme hook suggestion)

Notes on function names

  • private: _module_name_functionname
  • public: module_name_functionname
  • always check your function name isn’t the same as a hook name
  • if you’re implementing a hook: module_name_hookname
  • NB: page callbacks (very specific to module) are a good candidate for private

 

Creating a module action

  • first define the action using hook_actions_info
  • then create action functions module_name_description_of_action_action
  • optional form definition
Leave a comment

The aim is to create a staging setup which will allow continuous deployment for Drupal, which is something of a challenge in itself.

In this setup, I create three drupal installations (production, staging and development), all under git version control.

  • Here, I’m using the dev site as the canonical origin.
  • The staging site updates from that dev origin
  • The production site updates from the staging site.

Clear?

Contents

Git + Drupal basic setup

Guides

Git Basics

Git + Drupal

How-to

  • Set up a new site in ispconfig with:
    • PHP (not safe_mode)
    • Mysql databases
    • ssh access (preferable)
    • a new admin user for each site with ssh access for all accounts (preferable – not sure how to do this without that)
    • create a database for each site, note down dbname, usernames, passwords etc.

ssh to the web server

$dev-user sudo apt-get install git-core
$dev-user cd ~/ 
$dev-user git init
$dev-user git clone  http://git.drupal.org/project/drupal.git fooproject
$dev-user git checkout 7.0
$dev-user '''git remote rename origin drupal'''

Problem: http://drupal.org/node/803746 recommends ‘git remote rename origin drupal’ which throws an “error: Unknown subcommand: rename”. I found advice here: http://groups.google.com/group/github/browse_thread/thread/d17dba902727fff4 to edit .git/config (at the project root) and just make the name change manually. That worked fine.

$dev-user git remote add origin path/to/your/central/git/repo
$dev-user git checkout -b fooproject

on ISPconfig, I had to move the ‘fooproject’ directory to the pre-determined server path :web – but that worked fine, and I think Git is still happy with where the files are…

I also had to edit the .htaccess file (Ispconfig doesn’t gives us a 500 server error). I replaced the existing .htaccess with:

<IfModule mod_rewrite.c>  
RewriteEngine on
#RewriteBase /  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]  
#RewriteCond %{REQUEST_URI} !=/favicon.ico
</IfModule>

Then, I cloned the sites to the staging site, making sure to retain the error log directory used by ispconfig by default:

$staging-user mv ~/web/error ~/ (move the error log dir out of the way)
$staging-user rm -rf ~/web 
$staging-user 
$staging-user  git clone /path/to/production/repos web
$staging-user mv ~/error web/

I then repeated the process for the ‘production’ site, making sure it gets cloned from the staging site, not directly from the dev site.

Then set up and configure sites . At least that was easy!

Now we try it out, by installing a module:

$dev-user cd ~/web/sites/all/modules/
$dev-user wget http://ftp.drupal.org/files/projects/views-7.x-3.0-beta3.tar.gz
$dev-uesr tar -xvf views-7.x-3.0-beta3.tar.gz
$dev-user rm views-7.x-3.0-beta3.tar.gz
$dev-user git add views
$dev-user git commit -m "added views 3.0 beta"

then login again as the staging user

$staging-user git pull

And it should just pull down views nicely.

That’s our git repositories and Drupal instances set up, now we have to think about Staging.

Staging Setup

Staging is a significant issue with drupal

Guides

Process

drush install poormanscron
Leave a comment

In Anita Pomerantz’s canonical paper on preference for agreement and disagreement with assessments in conversation I found two fascinating examples of precisely the phenomena I was looking for in the ways people talk about art.

Pomerantz uses the example below to demonstrate what she calls ‘second-assessment
productions: agreement dispreferred’, by which she means that when someone
produces a self-deprecating assessment in conversation, it invites an agreement
or a disagreement with that self-deprecation – but generally a disagreement is
preferred.

As is often the case with this kind of conversational analysis, the evidence
for one action or response being preferred is found by observing what happens
when the ‘dispreferred’ action or response is supplied. In Pomerantz’s
examples of assessments, ‘dispreferred’ conversational responses, often
contradictions and disagreements, are characterised by delays, pauses, and
other avoidances or ‘softenings’ of the dispreferred response. It is in this
context that Pomerantz produces the example below, as evidence for structure of
how conversational participants tend to withhold what she calls ‘coparticipant
criticism’ – basically, worming their way around insulting each other’s
sensibilities.

However, this extract also shows some of the features of aesthetic
conversations that I intuitively shaped into my research question about how the
criteria for an assessment become relevant referents for sub-asessements in an
aesthetic evaluation.

Pomerantz identifies this entire exchange only as a series of deferrment turns,
in which D’s (dispreferred) critical assessment is delayed, softened or
otherwise minimised.

With my question about the criteria for judgement being negotiated in mind,
these exchanges seem to support the idea that a feature of these deferrments of
dispreferred responses is that they include a negotiation of the referents of
the assessments they precede:

In the exchange highlighted above, A offers up a print for assessment, D gives
a positive assessment (softening an immanent critical assessment, Pomerantz
suggests), and C interrupts, identifying one criterion for judgement: the
question of authorship. A, C and D then negotiate claims to knowledge of this
referent (the author of the print).

Two further criteria are then raised by A – the assessment that the print is
monetarily valuable, which is met with a silence (which Pomerantz sees as an
implicit marker for a dispreferred second assessment – in this case, a
disagreement). A then raises the rarity of the print “only a hundred of’m”,
which D acknowledges after with ‘Hrm’ after a further pause.

Pomerantz observes in this paper that acknowledgements of prior assessments do
not imply claims of access to a referent: by acknowledging A’s claim of the
rarity and value of the piece without agreeing or disagreeing, D acknowledges
only the claim, but (marked by a further pause) does not participate in
claiming to have that knowledge.

E then requests a clarification of the referent being assessed: “Which picture
is that.”, then interrupts D’s negative assessment, seemingly to raise a
further criterion for assessment of the print: the spelling of the word ‘Life’
in the print that A points out. E then seems to claim that “That’s all I wd
loo(hh)k fo(h)” in the print.

Finally, D delivers a critical assessment, raising several further criteria:

  • that this print belongs to a type of art that can be more or less
    ‘realistic’, and that D assesses this to be ‘less realistic’. This criterion is coupled with an assessment that D likes the ‘more realistic’ of this ‘type of art’
  • That the print belongs to a “magazine advertisement” type, which can be
    more or less “great”, and D implys an assessment that this print is less great.

I am provisionally thinking of aesthetic judgements as assessment sequences in
cases where the referent of the assessment is evidently ambiguous.

Although Pomerantz is only concerned with the overall structures of preference
in agreement and disagreement with assessments, this extract does seem to bear
out some of the assumptions in my research question: namely that in aesthetic
judgements, conversational participants seem to offer up candidates for
assessment criteria along with their assessments.

Other examples of assessment sequences in Pomerantz’s text that deal with more
self-evident referents do not seem to exhibit this characteristic, suggesting
that it may be useful to look at aesthetic judgements as a special case of
conversational interaction.

Another assumption in my research question is that as conversational
participants offer up candidate criteria as referents for their assessments,
the opportunity for ‘topical drift’ is extended. The discussion of one referent
may lead to another, and yet another, potentially replacing the subject of an
initial assessment with a sequence of second and third assessments of different
referents altogether.

In a note on a section about ‘upgrades’ (described in her paper as strong
agreements with assessments on sequential grounds), Pomerantz picks out an
exception to the upgrades she finds in the corpus that reinforce prior
assessments of the same referent: upgrades that also slightly modify the
referent, and then reinforce it:

In this extract A assesses as ‘nice’ the way two things appear together. B
upgrades the assessment to ‘lovely’, but generalises the referent to the two
things – not their appearance together.

Pomerantz identifies this topic shift as part of a softening of a later
dispreferred disagreement with an assessment: B eventually emphasises the
niceness being that the two pieces are separate – contradicting A’s initial
assesment.

Once again, in the interim between assessment and dispreferred disagreement, B
offers up the colours of the pieces (“blue en grey, en white”) as candidate
criteria for assessment, which A agrees with in this sequence.

Again, this seems to bear out some of the intuitions in my research question –
not only that a component of the conversational pragmatics of aesthetic
judgements is the proffering of multiple criteria for assessment, but also that
in this process, there is an opportunity for a shift in the referent being
assessed.

The qualification for these intitutions that I can take from Pomerantz’s paper
is that this proffering of alternate candidate criteria may be seen as a
specific case of deferring or delaying a dispreferred second assessment in a
sequence.

Leave a comment

I’ve started my literature review with Anita Pomerantz’s “Agreeing
and disagreeing with assessments: some features of preferred/dispreferred turn shapes
” to try and get a flavour of how ‘judgements of taste’ might look
through the lens of conversation analysis (CA).

Pomerantz begins her paper with the assertion that assessments are a
fundamental conversational feature of participation in an activity. She finds
evidence for this claim in the way that people decline to make assessments of things they haven’t participated in.

In the example below, this claim is demonstrated by B declining to deliver an expected assessment of the “dresses” by claiming lack of access to them: “I haven’t been uh by there-“.

Pomerantz then points out that a statement of having participated in something is somehow incomplete without a correlating assessment.

The above example intuitively bears this out: if L’s completion of this
sequence with “it’s really good” is missed out, the conversation would seem
stilted.

Reading Pomerantz’ detailed, CA account of the coordination of assessment patterns in speech alongside Kant and Hume’s philosophical
discourses on aesthetics and judgement offers some compelling but potentially incompatible insights.

Pomerantz’s observations of how preference structures work in assessments, namely that there are ‘preferred’ and ‘dispreferred’ responses to assessments
seems to map onto the way Kant uses ‘blame’ in judgements of taste.

Kant’s critique of aesthetic judgement asserts that an aesthetic judgement is
distinctive because we ‘blame’ others for not agreeing with us. Kant uses this
as a way of differentiating between judgements of the ‘agreeable’ and
judgements of taste: when something is ‘agreeable’ (such as, for
example, a cute puppy), we don’t argue the point with people who don’t like
dogs because, even when most people seem to find them agreeable, not everyone
has to like all kinds of puppies. However, when discussing aesthetic
judgements, we argue the point. For Kant, that willingness to argue marks out
an aesthetic judgement from other forms of judgement: a judgement that is (at
least potentially, in the mind of the judger) a universal judgement.

Pomerantz bases her claim that there are ‘preferred’ and ‘dispreferred’
responses to assessments on the regularly observable structures of how people
negotiate assessments in everyday conversation.

She identifies preferences for ‘second’ assessments that affirm their prior
assessments (or negate them, in the case of self-deprecations). She describes
what she calls a ‘preferred-action turn shape’: marked by immediate response,
lack of explanation, delay or requests for repetitions of clarifications.

By contrast, she demonstrates ‘dispreferred-action turn shapes’ being
consistently marked by conversational phenomena such as pauses, explanations,
laughter and seeming agreements: ‘Yes but… no but…’, (to borrow from Vicky Pollard), softening a contradiction (or the ‘dispreferred’ affirmation of a self-deprecation).

Could Kant’s idea of ‘blame’, the expectation or demand that others should
agree with us be equated in some way to the idea of a ‘preferred’ and a
‘dispreferred’ assessment? The problem with mapping an essentialist idea onto a phenomenological framework like CA is that everything starts to look like either a chicken or an egg. Are the conversational phenomena products of some underlying rule, or are Kant’s observations of cases in which we ‘blame’ each other for disagreement and argue the point based on observation of certain degrees of dispreference in talk?

This may point to a fundamental problem in how I am constructing my question: philosophical discourses such as Kant’s and Hume’s may simply be incompatible with analyses based on the phenomena of dialogue. I suspect I need to read a lot more philosophy and conversation analysis to sharpen my questions up to the point that these very different kinds of source materials can be brought into play in a useful way.

Leave a comment