Jump to content

Get module settings in module function


Recommended Posts

Hi guys, i give up.

Since last night, i try to get the module setting inside a module function. I do it as the many ways i have found on the forum and wiki and documentation but nothing works! I think i have a big stone in my head....

class CommentFilterAntispamguard extends CommentFilter implements Module, ConfigurableModule {

	public static function getModuleInfo() {
		return array(
			'title' => __('Comment Filter: Antispam Guard', __FILE__),
			'version' => 102,
			'summary' => __('Uses a couple of filters to protect your comments from spam.', __FILE__),
			'permanent' => false,
			'singular' => false,
			'autoload' => false,
			'requires' => 'FieldtypeComments',
			);
	}

	static public function getDefaultConfig(){
		return array(
                'require_email_author' => '',
                'honeypot' => '',
                'already_commented' => 'checked',
		'gravatar_check' => '',
		'bbcode_check' => 'checked',
		'advanced_check' => 'checked',
		'regexp_check' => '',
		'spam_ip_local' => '',
		'dnspl_check' => '',
		'approve_comment' => ''
        );

	public function __construct() {
		parent::__construct();
		$this->comment->ip = $this->get_client_ip();
		foreach(self::getDefaultConfig() as $key => $value) {
			$this->$key = $value;
		}
	}

	private static function _verify_comment_request($comment){

	  /* Kommentarwerte */
	  $ip = $comment->ip;
	  $url = $comment->website;
	  $body = $comment->text;
	  $email = $comment->email;
	  $author = $comment->cite;

	  /* Optionen */

	  /* Bereits kommentiert? */
	  if ( $data['already_commented'] && ! empty($email) && self::_is_approved_email($email) ) {
	    return;
	  }

	  /* Check for a Gravatar */
	  if ( $data['gravatar_check']
				&& ! empty($email)
				&& self::_has_valid_gravatar($email) ) {
	      return;
	  }

	  /* Bot erkannt
	  if ( ! empty($_POST['ab_spam__hidden_field']) ) {
	    return array( 'reason' => 'css' );
	  } */

	  /* Action time
	  if ( isset $this->data['time_check']
				&& self::_is_shortest_time() ) {
	    return array( 'reason' => 'time' );
	  } */

	  /* BBCode Spam */
	  if ( $data['bbcode_check'] && self::_is_bbcode_spam($body) ) {
	    return array( 'reason' => 'bbcode' );
	  }

	  /* Erweiterter Schutz */
	  if ( $data['advanced_check'] && self::_is_fake_ip($ip) ) {
	    return array( 'reason' => 'server' );
	  }

	  /* Regexp für Spam */
	  if ( $data['regexp_check'] && self::_is_regexp_spam(
					    array(
					      'ip'	 => $ip,
					      //'host'	 => parse_url($url, PHP_URL_HOST),
					      'body'	 => $body,
					      'email'	 => $email,
					      'author' => $author
					    ) ) ) {
	    return array( 'reason' => 'regexp' );
	  }

	  /* IP im lokalen Spam */
	  if ( $data['spam_ip_local'] && self::_is_db_spam($ip, $url, $email) ) {
	    return array( 'reason' => 'localdb' );
	  }

	  /* DNSBL Spam */
	  if ( $data['dnsbl_check'] && self::_is_dnsbl_spam($ip) ) {
	    return array( 'reason' => 'dnsbl' );
	  }
	}

	static public function getModuleConfigInputfields(array $data) {

		$inputfields = new InputfieldWrapper();

		$name = "require_email_author";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Require E-Mail');
		$f->description = __('Require the E-Mail from commenters.');
		$inputfields->add($f);

		$name = "honeypot";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Activate Honeypot');
		$f->description = __('Add a hidden Field to your Commentform to protect from Spambot.');
		$inputfields->add($f);

		$name = "already_commented";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Trust approved commenters');
		$f->description = __('Always approve previously approved users.');
		$inputfields->add($f);

		$name = "gravatar_check";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Trust Gravatar');
		$f->description = __('Automatically approve Comments from Authors with Gravatar. (Pleas note the Privacy hint)');
		$inputfields->add($f);

		$name = "bbcode_check";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('BBcode as Spam.');
		$f->description = __('Review the comment contents for BBCode links.');
		$inputfields->add($f);

		$name = "advanced_check";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Validate commenters IP');
		$f->description = __('Validity check for used ip address.');
		$inputfields->add($f);

		$name = "regexp_check";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Use regular expressions');
		$f->description = __('Predefined and custom patterns by plugin hook (not now!).');
		$inputfields->add($f);

		$name = "spam_ip_local";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Look in the local spam database');
		$f->description = __('Already marked as spam? Yes? No?.');
		$inputfields->add($f);

		$name = "dnspl_check";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Use public Spam database');
		$f->description = __('Use the public Spam database from https://stopforumspam.com to check for knowen Spamer IP\'s.');
		$inputfields->add($f);

		$name = "approve_comment";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldCheckbox');
		$f->attr('name', $name);
		$f->attr('checked', $data[$name] ? 'checked' : '' );
		$f->label = __('Auto Approve');
		$f->description = __('Automatically approve all comments without spam.');
		$inputfields->add($f);

		return $inputfields;

	}
}

I found many ways to get the settings inside the module. I read all of this posts:

and many more...

i have try

if ( $this->data['already_commented'] );
if ( $data['already_commented'] );
if ( isset($this->data['already_commented']) );
if ( isset($this->already_commented) );
if ( isset($field->already_commented) );

nothing works! While i use $this i get this Error:

Error: Using $this when not in object context (line 86 of site/modules/FieldtypeComments/CommentFilterAntispamguard.module)

I don't know what i can do!!!

Pleas help me, i'm despairing.

Link to post
Share on other sites

I am not sure what you are after, so a quick answer:

  • In PHP, you cannot refer to a static method using $this. you need self::staticMethodName()
  • Example of accessing module values (including getModuleConfigInputfields()) that are in a static method (ProcessBlog)

Edit: Also, I don't see where $data is coming from in your code, line #73

Edited by kongondo
  • Like 1
Link to post
Share on other sites

I have testet a lot of things and i don't know what is wrong... I look into many other modules and each module have a other solution for this problem.

I found this:

public function __construct() {
		parent::__construct();
		$this->set('appUserAgent', "ProcessWire/2 | AkismetCommentFilter/1"); 
		$this->set('apiKey', ''); 
	}

protected function verifyKey() {
		if(!$this->comment) throw new WireException("No Comment provided to CommentFilter"); 
		if(!$this->apiKey) throw new WireException("apiKey must be set to use this filter"); 
		$request = "key={$this->apiKey}&blog=" . urlencode($this->homeURL);
		$response = $this->httpPost($request, 'rest.akismet.com', '/1.1/verify-key');
		if($response[1] == 'valid') return true; 
		if($response[1] == 'invalid') throw new WireException("Invalid Akismet Key $request, " . print_r($response, true)); 
		// some other error
		return false; 
	}

static public function getModuleConfigInputfields(array $data) {

		$inputfields = new InputfieldWrapper();

		$name = "apiKey";
		if(!isset($data[$name])) $data[$name] = '';
		$f = Wire::getFuel('modules')->get('InputfieldText'); 
		$f->attr('name', $name); 
		$f->attr('value', $data[$name]); 
		$f->label = __('Akismet Key');
		$f->description = __('If you want to have comments automatically identified as spam, the Comments fieldtype can utilize the Akismet service to do this. In order to use it, you must enter an Akismet API key obtained from akismet.com. Use of this service is optional but recommended.'); // Akismet description

		$inputfields->append($f);

		return $inputfields;

	}

in the CommentFilterAkismet.module from Ryan and this:

// ------------------------------------------------------------------------
    // Init global configuration variables.
    // ------------------------------------------------------------------------
    private static $cacheMaxLifetime;
    private static $cssCachePrefix;
    private static $jsCachePrefix;
    private static $enableHTMLMinify;
    private static $developmentMode;
    private static $directoryTraversal;
    private static $domainSharding;
    private static $domainShardingSSL;
    private static $templateUseSSL;

public function init(){
 // ------------------------------------------------------------------------
        // Set module configuration
        // ------------------------------------------------------------------------
        self::$cssCachePrefix       = wire('sanitizer')->name($this->stylesheet_prefix);
        self::$jsCachePrefix        = wire('sanitizer')->name($this->javascript_prefix);
        self::$cacheMaxLifetime     = self::_sanitizeNumericCacheTime($this->max_cache_lifetime);
        self::$enableHTMLMinify     = ($this->html_minify == 1) ? true : false;
        self::$developmentMode      = ($this->development_mode == 1) ? true : false;
        self::$directoryTraversal   = ($this->directory_traversal == 1) ? true : false;
        self::$domainSharding       = self::_validateURL($this->domain_sharding);
        self::$domainShardingSSL    = self::_validateURL($this->domain_sharding_ssl);
}

 private static function _clearCache($force_all = false) {
       if(self::$developmentMode) return true;
}

(some code shortened) in the All in one Minify Module....

or

static protected $defaults = array(
    'fullname' => '',
    'color' => 'blue',
    'age' => 40
  );
  public function __construct() {
    // populate defaults, which will get replaced with actual
    // configured values before the init/ready methods are called
    $this->setArray(self::$defaults);
  }
  public function ready() {
    if($this->fullname && !count($this->input->post)) {
      $msg = "Hi $this->fullname! ";
      $msg .= "Your age: $this->age. ";
      $msg .= "Favorite color: $this->color.";
      $this->message($msg);
    }
  }

at https://processwire.com/blog/posts/new-module-configuration-options/

But nothing will work for me....

What is the best solution for getting setup variables inside the module and how to call this variables? In one of my modules i use the method set AIOM use. But there are some modules without global variables but with settings inside and call this settings in the module. I think its better to do

Link to post
Share on other sites

Thanks, this article i've already read. (see the first post)

I think i can not use the "config.module" because my module is not placed in a separate folder. At the moment i place my module inside the FieldtypeComment folder where the Akismet module is placed.

Did you even read our responses? :-) What do you mean by 'But nothing will work for me....' ??

yes i read it all and i try a lot of changes and tests in the background.

Non of the exemples worked on my code....

I delete everything and start from scratch.

Link to post
Share on other sites

In this block of code...

	private static function _verify_comment_request($comment){
 
	  /* Kommentarwerte */
	  $ip = $comment->ip;
	  $url = $comment->website;
	  $body = $comment->text;
	  $email = $comment->email;
	  $author = $comment->cite;
 
	  /* Optionen */
 
	  /* Bereits kommentiert?  @kongondo: Where is this $data coming from?*/
	  if ( $data['already_commented'] && ! empty($email) && self::_is_approved_email($email) ) {
	    return;
	  }

...where is $data coming from? It needs to come from somewhere...e.g.

private static function _verify_comment_request($comment, $data){

}
 

  • Like 1
Link to post
Share on other sites

You are right. This is a broken version of code...

Damn!!! Thanks kongondo, now i have seen what you meant in your first post...

  • In PHP, you cannot refer to a static method using $this. you need self::staticMethodName()

the _verify_comment_request() should not be static!!! I don't know why i have type this at night. I have only see the "public static function getModuleInfo()" and not the other!

Sorry guys i have a lot to learn and sleep more time.

Link to post
Share on other sites

You could always use the separate module config as long as your module is in any subdirectory. It's named after your modules, so there cannot be any conflicts and it makes things a heck of a lot more streamlined and less static-y.

Link to post
Share on other sites

You could always use the separate module config as long as your module is in any subdirectory. It's named after your modules, so there cannot be any conflicts and it makes things a heck of a lot more streamlined and less static-y.

thank you LostKobrakai, i will test this tonight.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By kongondo
      FieldtypeRuntimeMarkup and InputfieldRuntimeMarkup
       
      Modules Directory: http://modules.processwire.com/modules/fieldtype-runtime-markup/
      GitHub: https://github.com/kongondo/FieldtypeRuntimeMarkup
      As of 11 May 2019 ProcessWire versions earlier than 3.x are not supported
      This module allows for custom markup to be dynamically (PHP) generated and output within a page's edit screen (in Admin).
       
      The value for the fieldtype is generated at runtime. No data is saved in the database. The accompanying InputfieldRuntimeMarkup is only used to render/display the markup in the page edit screen.
       
      The field's value is accessible from the ProcessWire API in the frontend like any other field, i.e. it has access to $page and $pages.
       
      The module was commissioned/sponsored by @Valan. Although there's certainly other ways to achieve what this module does, it offers a dynamic and flexible alternative to generating your own markup in a page's edit screen whilst also allowing access to that markup in the frontend. Thanks Valan!
       
      Warning/Consideration
      Although access to ProcessWire's Fields' admin pages is only available to Superusers, this Fieldtype will evaluate and run the custom PHP Code entered and saved in the field's settings (Details tab). Utmost care should therefore be taken in making sure your code does not perform any CRUD operations!! (unless of course that's intentional) The value for this fieldtype is generated at runtime and thus no data is stored in the database. This means that you cannot directly query a RuntimeMarkup field from $pages->find(). Usage and API
       
      Backend
      Enter your custom PHP snippet in the Details tab of your field (it is RECOMMENDED though that you use wireRenderFile() instead. See example below). Your code can be as simple or as complicated as you want as long as in the end you return a value that is not an array or an object or anything other than a string/integer.
       
      FieldtypeRuntimeMarkup has access to $page (the current page being edited/viewed) and $pages. 
       
      A very simple example.
      return 'Hello'; Simple example.
      return $page->title; Simple example with markup.
      return '<h2>' . $page->title . '</h2>'; Another simple example with markup.
      $out = '<h1>hello '; $out .= $page->title; $out .= '</h1>'; return $out; A more advanced example.
      $p = $pages->get('/about-us/')->child('sort=random'); return '<p>' . $p->title . '</p>'; An even more complex example.
      $str =''; if($page->name == 'about-us') { $p = $page->children->last(); $str = "<h2><a href='{$p->url}'>{$p->title}</a></h2>"; } else { $str = "<h2><a href='{$page->url}'>{$page->title}</a></h2>"; } return $str; Rather than type your code directly in the Details tab of the field, it is highly recommended that you placed all your code in an external file and call that file using the core wireRenderFile() method. Taking this approach means you will be able to edit your code in your favourite text editor. It also means you will be able to type more text without having to scroll. Editing the file is also easier than editing the field. To use this approach, simply do:
      return wireRenderFile('name-of-file');// file will be in /site/templates/ If using ProcessWire 3.x, you will need to use namespace as follows:
      return ProcessWire\wireRenderFile('name-of-file'); How to access the value of RuntimeMarkup in the frontend (our field is called 'runtime_markup')
       
      Access the field on the current page (just like any other field)
      echo $page->runtime_markup; Access the field on another page
      echo $pages->get('/about-us/')->runtime_markup; Screenshots
       
      Backend
       

       

       
      Frontend
       

    • By kongondo
      Visual Page Selector
      Released 31 March 2016
      https://processwireshop.pw/plugins/visual-page-selector/
        As of 04 January 2018 ProcessWire versions earlier than 3.x are not supported   *******************************************************   ORIGINAL POST   ******************************************************* Introducing VPS, a commercial visual page field selector. 
      This is a pre-sale closed-beta version. This post is WIP and will be updated now and then.
      ############################
      Many ProcessWire users use the 'one image per page' principle to manage and reuse images across their sites. This works fine. However, for site editors who mainly work with images, especially for larger sites, it is sometimes difficult to remember the pages where particular images reside. This module helps to solve this challenge.
      Harnessing the awesomeness  that is ProcessWire, VPS provides a rich editing experience, enabling editors to search for, view, select, add, remove and delete page-images easily, in an easy to use and friendly interface. ProcessWire Lister is the workhorse behind the lightning-fast searches. Editors will be able to search for images by their descriptions, names, partial names, page names, templates, etc. 
      Current Features
      Single-image mode Full search Batch add/Remove/Delete Image/Delete Page in page fields Image Browser Selectable pages as per page field settings + Lister filters Grid and List View Draggable sorting Responsive (almost fully ..iframes!) Planned Features
      Multi-image mode (there are times you want to group similar images in multi-image field in one page; e.g. the back, front and side of a car photo) Configurable CSS on the fly resizing vs real image resizing (image resizing can quickly hog memory) Other as per feedback from beta testing FAQs
      When will this be available? 
      Soon.
      How much will it cost?
      Reasonably priced. Announcement soon.
      Where will I be able to buy this from?
      At all fine stores that stock quality ProcessWire products
      Do we really need another page field/inputfield select?
      See links below.
      What type of licenses will be available?
      Soon to be announced.
      Can I beta test this?
      Thanks for the interest but all available slots have been taken.
      Video (excuse the video quality please - too many takes....)
       
      Screens






      Previous Discussions
      https://processwire.com/talk/topic/10927-wishlist-select-pages-by-thumbnail/
      https://processwire.com/talk/topic/4330-get-image-from-other-pages-via-images-field/ https://processwire.com/talk/topic/417-extending-image-field/?p=6982 https://processwire.com/talk/topic/7073-profield-table-and-gallery/ https://processwire.com/talk/topic/3200-image-management-concerns-is-processwire-suitable-for-me/ https://processwire.com/talk/topic/425-file-manager/ https://processwire.com/talk/topic/10763-asset-manager-asset-selector/
    • By kongondo
      FieldtypeMatrix and InputfieldMatrix
      Modules Directory: http://modules.processwire.com/modules/fieldtype-matrix/
      GitHub: https://github.com/kongondo/FieldtypeMatrix 
      The module Matrix enables you to save data from a 2D-Matrix table. The rows and columns of the matrix table are made up of pages retrieved via a ProcessWire selector or via a page field selection of parent pages. The matrix values are made up of the data input in the matrix cells, i.e. the 'intersection of rows and columns'.
       
      Example Usage
      You have Products whose prices vary depending on colour, size, material, etc. Using the Fieldtype, you can create a table with rows made up of colours and columns made up of sizes the combination of each making up their respective values (in this case price). So rather than creating multiple text fields to do the following:
      Colour Size Price Red Small £10 Red Medium £20 Red Large £30 Red X-large £35 Green Small £9 Green Medium £15 Etc... You can instead have the following in one field:
      Small Medium Large X-Large Red £10 £20 £30 £35 Green £9 £15 Blue Etc... Yellow Purple If you set a selector in the Field's settings, to retrieve pages to build your matrix's rows and columns, it follows that all pages using the template the Fieldtype is attached to will have identical rows and columns. In some cases, this could be the intention. For instance, you might have 'Car' pages, e.g. Audi, Volvo, Ford, Citroen, Mazda, BWM, etc., each of which uses a 'Cars' template that has a single FiedltypeMatrix called 'car_attributes'. If you set a selector to build the Fieldtype's rows and columns, your users can easily compare the cars based on a combination of different values. The following matrix table best illustrates this:
      Type Engine Size Fuel Efficiency Carbon Emissions Warranty Road Tax Price 1994 Audi brand 1 values, etc. 2000 Audi brand 2 2006 Audi brand 3 2012 Audi brand 4 Each of your car pages would have similar matrices. 
      This allows you to make easy but powerful queries. Such a setup allows you to compare within and across car brands. Say you wanted to find out which car(s) offered the best value for money given certain parameters such as warranty, emissions etc. You can easily make such comparisons (see code below). You can also compare within one car type, e.g. which brand of BMWs does best in what area...The possibilities are endless.

      In the database, Rows and column pages data are stored as their respective page->id. Matrix-values store any data (varchar(255)).
       
      If instead you wanted a template's pages to each have a matrix built of different rows and columns, you would have to name a Multiple Page Field (attached to the same template as the as your matrix field) in the matrix field's settings. When editing those pages, your matrix table's rows and columns will be built using the published children pages of the 2 pages you select in the Multiple page field..
       
      The module allows the creation of matrix tables of any sizes (rows x columns). The rows and columns dynamically grow/shrink depending on the addition of row/column pages that match what you set in the matrix field's settings (see its 'Details Tab'). Please note that, if such pages are deleted/trashed/hidden/unpublished, their data (and presence) in the matrix are also deleted.
      Entering values in the matrix
      You have three choices:
      Manually entry Uploading a comma delimited (CSV) file. This can be delimited by other characters (tab, pipe, etc); not just commas Copy-pasting CSV values. (Tip: you can copy paste directly from an Excel spreadsheet. Such values will be 'tab-delimited'). In addition, if your server supports it, in the field's settings, you can enable the use of MySQL's fast LOAD DATA INFILE to read and save your submitted CSV values.
      Note that for large tables, you may have to increase your PHP's max_input_vars from the default 1000 otherwise PHP will timeout/return an error and your values will not be saved. I have successfully tested the module with up to ~3000+ values (10x350 table), the Fieldtype is not really optimised (nor was it intended) to handle mega large matrix tables. For such, you might want to consider other strategies. 
       
      Install
      Install as any other module.
       
      API + Output
      A typical output case for this module would work like this:
       
      The matrix's rows, columns and values are subfields of your matrix's field. So, if you created a field called 'products' of the type FieldtypeMatrix, you can access as:

      product.row, product.column and product.value respectively
       
      foreach($page->matrix as $m) { echo " <p> Colour: $m->row<br /> Size: $m->column<br /> Price: $m->value </p> "; } Of if you want to output a matrix table in the frontend: 
       
      //create array to build matrix $products = array(); foreach($page->matrix as $m) $products[$m->row][$m->column] = $m->value; $tbody ='';//matrix rows $thcols = '';//matrix table column headers $i = 0;//set counter not to output extraneous column label headers $c = true;//set odd/even rows class foreach ($products as $row => $cols) { //matrix table row headers (first column) $rowHeader = $pages->get($row)->title; $tbody .= "<tr" . (($c = !$c) ? " class='even' " : '') . "><td class='MatrixRowHeader'>" . $rowHeader . "</td>"; $count = count($cols);//help to stop output of extra/duplicate column headers foreach ($cols as $col => $value) { //matrix table column headers $columnHeader = $pages->get($col)->title; //avoid outputting extra duplicate columns if ($i < $count) $thcols .= "<th class='MatrixColumnHeader'>" . $columnHeader . "</th>"; //output matrix values $currency = $value > 0 ? '£' : ''; $tbody .= "<td>" . $currency . $value . "</td>"; $i++; } $tbody .= "</tr>"; } //final matrix table for output $tableOut = "<table class='Matrix'> <thead> <tr class=''> <th></th> $thcols </tr> </thead> <tbody> $tbody </tbody> </table>"; echo $tableOut; The module provides a default rendering capability as well, so that you can also do this (below) and get a similar result as the first example above (without the captions). 
      echo $page->matrix; Or this
      foreach($page->matrix as $m) { echo $m; } Finding matrix items
      The fieldtype includes indexed row, column and value fields. This enables you to find matrix items by either row types (e.g. colours) or columns (e.g. sizes) or their values (e.g. price) or a combination of some/all of these. For instance:
      //find all pages that have a matrix value of less than 1000 $results = $pages->find("products.value<1000"); //find some results in the matrix (called products) of this page $results = $page->products->find("column=$country, value=Singapore");//or $page->products->find("column=$age, value>=25"); //$country and $age would be IDs of two of your column pages Other more complex queries are possible, e.g. find all products that are either red or purple in colour, come in x-large size and are priced less than $50.

      Credits
      @Ryan on whose Fieldtype/InptufieldEvents this is largely based
      @charger and @sakkoulas for their matrix ideas
       
      Screens
       
      Field Details Tab

       
      Inputfield

      Larger matrix table

       
      Example output

    • By Pravin
      How to set the image quality as per desired..
      I tried using the above code but I get the original image size..
      <!--Content with Image left--> <?php $i = 2; foreach($page->page_content as $each) { if( $i%2 == 0 ){ ?> <section class="imageblock about-1"> <div class="imageblock__content col-md-6 col-sm-4 pos-left animated fadeInLeft"> <div class="background-image-holder"> <?php $option1 = array( 'quality' => 60, 'upscaling' => true, 'cropping' => true, ); $pravin= $each->single_image->size(790,650,$option1); ?> <img alt="image" src="<?php echo $pravin->url; ?>" /> </div> </div> <div class="container container-body"> <div class="row"> <div class="col-md-5 col-md-push-7 col-sm-8 col-sm-push-4 animated fadeInUp"> <?php echo $each->body; ?> </div> </div> <!--end of row--> </div> <!--end of container--> </section> <!--Content with Image on left--> <?php } else { ?> <!--Content with Image on right--> <section class="imageblock about-1"> <div class="imageblock__content col-md-6 col-sm-4 pos-right animated fadeInRight"> <div class="background-image-holder"> <?php $pravin= $each->single_image->size(790,650,$option1); ?> <img alt="image" src="<?php echo $pravin->url; ?>" /> </div> </div> <div class="container container-body"> <div class="row"> <div class="col-md-5 col-sm-8 animated fadeInUp"> <?php echo $each->body; ?> </div> </div> <!--end of row--> </div> <!--end of container--> </section> <?php } ++$i; } ?> <!--Content with Image on right-->  
    • By [Code] Specialist
      Hi Folks,
      I like to develop a Backend Module with extra tabs and nested fields. Is there any Example Code for my Idea ? 
      The Module should create new fields, a new Tab and several fields on it. AND... Last but not least the fields depend on each other by rules like "if checkbox $a then unfold area with Textfield 1+2 "
      If someone have a snippet for me to learn ... it would be soooo great. Thanks. 
      Michael
×
×
  • Create New...