[RISOLTO] Consiglio: creare form ad hoc o usare Views?

14 contenuti / 0 new
Ultimo contenuto
[RISOLTO] Consiglio: creare form ad hoc o usare Views?

Ciao a tutti.
Sto lavorando ad un progetto ed ormai il più è fatto. Ho cominciato quindi da poco ad addentrarmi nel theming. Premetto che prima di questo lavoro Drupal non lo sapevo usare ma con la pratica e l'ausilio di Pro Drupal Development (che sto leggendo) ho cominciato a capire alcune cose.
Ora, ho creato una views con alcuni filtri esposti tra cui una textfield "Taxonomy: Term ID (with depth)" con autocompletamento. Tutto funziona come dovrebbe. Il problema è che io vorrei personalizzare la grafica di quella casella creando una cosa simile all'immagine in allegato. Ho bisogno quindi di aggiungere div, classi, id, ecc., personalizzati.
Cosa è meglio fare? Trovare il modo di personalizzare i filtri esposti della view o creare personalmente il form tutto a mano?
Ovviamente, non ho la più pallida idea di come fare, né per personalizzare la view né per creare il form.

Con i css e firebug, scopri l'id e ti diverti, altrimenti semantic views ti aiuta a dare classi e tag ai vari elementi.

Ho provato con firebug, ho scoperto l'id ma quando aggiungo delle proprietà nel css (style.css di gardaland) non succede nulla. In più, clonando la vista, ho notato che Drupal assegna un id uguale alla textfield di entrambe le viste (edit-term-node-tid-depth-wrapper). Perciò, penso io, in questa maniera modificherei tutte le views, presenti e future (e non solo quella che mi interessa).
Con semantic views non riesco a dare classi ai filtri esposti ma solo ai risultati.

Non c'è un modo di creare un nodo, e visualizzare dentro ad esso la view, stampando "a mano" ogni filtro esposto?
Così potrei fare una cosa del genere:

<div class="search-box">
<div class="search-field">
<!-- codice da inserire per stampare il textfield -->
</div>
<div class="search-submit">
<!-- codice da inserire per stampare il pulsante submit -->
</div>
</div>
<div class="risultati-views">
<!-- codice da inserire per stampare il pulsante submit -->
</div>

benipulp wrote:
Ho provato con firebug, ho scoperto l'id ma quando aggiungo delle proprietà nel css (style.css di gardaland) non succede nulla. In più, clonando la vista, ho notato che Drupal assegna un id uguale alla textfield di entrambe le viste (edit-term-node-tid-depth-wrapper). Perciò, penso io, in questa maniera modificherei tutte le views, presenti e future (e non solo quella che mi interessa).

Ciao,
l'id potrebbe anche essere simile, ma il genitore di tutto questo (cioè la vista completa) ha un id univoco, che equivale al machine name della vista. Per cui, se via css ti riferisci all'id del filtro in questo modo:

#view_name #edit-term-node-tid-depth-wrapper{}

il problema che venga applicato alle altre viste non sussite!
Se, invece, vuoi customizzarti in modo più approfondito l'output della vista devi ricorrere al template della vista vera e propria... personalmente, non ho mai cambiato l'output del filtri esposti (ammesso che si riesca... non ho mai provato!)... in questo caso ti basta il solo css (un background al campo può bastare)
;)

ciao benipulp,
non devi semplicemente cambiare le classi e gli id che trovi nel tuo css, perché altrimenti modifichi tutte le viste che richiamano quelle classi. E mi sembra di aver capito che vuoi "temizzare" solo questa vista.
Puoi facilmente temizzare la tua vista associando le classi che vuoi (anche e soprattutto altre che creerai ad hoc).
Per fare questo vai nella gestione della tua vista e clicca su "Tema" ed individua quale è il tuo tpl.php da creare per avere il risultato che ti serve.
Una volta individuato crea il tuo file views-view-qualchecosa.tpl.php che si comporta come qualsiasi file dei temi.

Per maggiori informazioni al riguardo puoi cercare qui sul forum "temizzare viste" o simili ;)

buona fortuna e fammi sapere se va bene!

---
"Solo gli imbecilli non hanno dubbi"
"Ne sei sicuro?"
"Non ho alcun dubbio!"
(da Il dubbio di Luciano De Crescenzo)

@gioppy: giusto non ci avevo pensato!

@mauropixel: ora provo a cercare bene...

Ok, ho trovato il file da copiare e rinominare nel mio tema. Si tratta di "views-exposed-form.tpl.php" che si trova in "sites/all/modules/views/theme/". Il codice è il seguente:

// $Id: views-exposed-form.tpl.php,v 1.4.4.1 2009/11/18 20:37:58 merlinofchaos Exp $
/**
* @file views-exposed-form.tpl.php
*
* This template handles the layout of the views exposed filter form.
*
* Variables available:
* - $widgets: An array of exposed form widgets. Each widget contains:
* - $widget->label: The visible label to print. May be optional.
* - $widget->operator: The operator for the widget. May be optional.
* - $widget->widget: The widget itself.
* - $button: The submit button for the form.
*
* @ingroup views_templates
*/
?>
<?php if (!empty($q)): ?>
  <?php
   
// This ensures that, if clean URLs are off, the 'q' is added first so that
    // it shows up first in the URL.
   
print $q;
 
?>

<?php endif; ?>
<div class="views-exposed-form">
  <div class="views-exposed-widgets clear-block">
    <?php foreach($widgets as $id => $widget): ?>
      <div class="views-exposed-widget">
        <?php if (!empty($widget->label)): ?>
          <label for="<?php print $widget->id; ?>">
            <?php print $widget->label; ?>
          </label>
        <?php endif; ?>
        <?php if (!empty($widget->operator)): ?>
          <div class="views-operator">
            <?php print $widget->operator; ?>
          </div>
        <?php endif; ?>
        <div class="views-widget">
          <?php print $widget->widget; ?>
        </div>
      </div>
    <?php endforeach; ?>
    <div class="views-exposed-widget">
      <?php print $button ?>
    </div>
  </div>
</div>

Ho un bel problema però. Oltre alla casella di ricerca, ho altri filtri esposti (checkbox). Per inserire dei div e classi tra i vari filtri esposti, dovrei quindi stampare ogni elemento del form individualmente. Modificare quindi il template per fare in modo di avere:
<div class=""><print primo elemento del form></div><div class=""><secondo elemento del form></div>ecc.
Qui invece è tutto inserito in un foreach. E' che non so proprio quale possa essere il codice da usare per avere una cosa del tipo $form[0]['view'], $form[1]['view']..
Non so se mi sono spiegato....

puoi postare un'immagine della edit dei temi della vista?
Non ho mai temizzato un filtro esposto di questo tipo e non capisco quale possa il tpl per il form, penso che ce ne dovrebbe essere uno singolo per ogni campo che aggiungi alla vista. Se così fosse dovresti poter raggiungere il singolo campo e non il views-exposed-form.tpl.php

---
"Solo gli imbecilli non hanno dubbi"
"Ne sei sicuro?"
"Non ho alcun dubbio!"
(da Il dubbio di Luciano De Crescenzo)

Cosa intendi per immagine della edit dei temi della vista?
Questa per caso?

http://www.drupalitalia.org/sites/drupalitalia.org/files/img2.png

yes ;)
... vedi che tra i vadi tpl hai un views-view-field--search2.tpl.php e se non ricordo male volevi modificare lo stile della ricerca, dovrebbe essere questo

---
"Solo gli imbecilli non hanno dubbi"
"Ne sei sicuro?"
"Non ho alcun dubbio!"
(da Il dubbio di Luciano De Crescenzo)

No ma io voglio modificare solo i filtri esposti. E ho letto qui la soluzione. In un altro post di drupal.org ho anche letto che, dopo aver creato il file views-exposed-form--search2.tpl.php, non comparirà nella edit del tema della vista, ma sarà questo quello usato (per il tema dei filtri esposti).
Comunque vedo quello che riesco a fare con questo codice. Fortunatamente, i checkbox esposti hanno ognuno un id diverso. Più che altro volevo eliminare tutti quei div superflui che Views mi aggiunge in automatico....

Se qualcuno conosce un modo per stampare individualmente ogni filtro (così da permettermi di aggiungere dei div tra l'uno e l'altro) si faccia avanti!

Bene, ce l'ho fatta! Ho tolto il foreach e aggiunto queste stringhe:

<?php print $widgets['filter-term_node_tid_depth']->widget; ?>
<?php print $widgets['filter-field_vocab_value']->widget; ?>

"term_node_tid_depth" è il nome della textfield, mentre "vocab" il nome del filtro (sto usando Better Exposed Filters per le checkbox). In questo modo riesco a stampare un filtro alla volta e i miei problemi sono finiti.

Ecco, magari un'ultima cosa vorrei risolvere... come faccio a personalizzare la sola textfield di questa view senza modificare tutte le altre presenti nel sito?

Ok, il codice da inserire nel mio template è questo:

/**
* Format a textfield.
*
* @param $element
*   An associative array containing the properties of the element.
*   Properties used:  title, value, description, size, maxlength, required, attributes autocomplete_path
* @return
*   A themed HTML string representing the textfield.
*
* @ingroup themeable
*/
function phptemplate_textfield($element) {
  $size = empty($element['#size']) ? '' : ' size="'. $element['#size'] .'"';
  $maxlength = empty($element['#maxlength']) ? '' : ' maxlength="'. $element['#maxlength'] .'"';
  $class = array('form-text');
  $extra = '';
  $output = '';
  if ($element['#autocomplete_path'] && menu_valid_path(array('link_path' => $element['#autocomplete_path']))) {
    drupal_add_js('misc/autocomplete.js');
    $class[] = 'form-autocomplete';
    $extra =  '<input class="autocomplete" type="hidden" id="'. $element['#id'] .'-autocomplete" value="'. check_url(url($element['#autocomplete_path'], array('absolute' => TRUE))) .'" disabled="disabled" />';
  }
  _form_set_class($element, $class);
  if (isset($element['#field_prefix'])) {
    $output .= '<span class="field-prefix">'. $element['#field_prefix'] .'</span> ';
  }
  $output .= '<input type="text"'. $maxlength .' name="'. $element['#name'] .'" id="'. $element['#id'] .'"'. $size .' value="'. check_plain($element['#value']) .'"'. drupal_attributes($element['#attributes']) .' />';
  if (isset($element['#field_suffix'])) {
    $output .= ' <span class="field-suffix">'. $element['#field_suffix'] .'</span>';
  }
  return theme('form_element', $element, $output) . $extra;
}

Ma come faccio a modificare solo una determinata textfield?
Forse dovrei aggiungere un "if" dopo "function phptemplate_textfield($element) {" ma non conosco bene la sintassi da usare per dire "se ti trovi in una view di nome "search2" fai questo ... altrimenti continua con il codice normale"...

Alla fine ho risolto. Avendo aperto un altro topic per questa ultima questione, la soluzione la trovate qui.